<?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>Nick Chase, Private Programmer</title>
	<atom:link href="http://nicholaschase.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicholaschase.com</link>
	<description>Making the difficult easier since the turn of the century</description>
	<lastBuildDate>Sat, 02 Mar 2013 22:51:31 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Tag clouds and the value of visuals</title>
		<link>http://nicholaschase.com/2013/02/05/tag-clouds-and-the-value-of-visuals/</link>
		<comments>http://nicholaschase.com/2013/02/05/tag-clouds-and-the-value-of-visuals/#comments</comments>
		<pubDate>Tue, 05 Feb 2013 14:11:57 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1715</guid>
		<description><![CDATA[I&#8217;ve been looking into the various infographics sites trying to do something different (more on that in a future post) and I came across something interesting.  I was trying out some tag cloud services and realized just how powerful a visual look at your data can be. On my first shot, making a Wordle, I [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been looking into the various <a title="Free Infographics Sites" href="http://www.thinkforsuccess.com/2013/01/what-are-the-top-free-infographic-creation-sites/" target="_blank">infographics</a> sites trying to do something different (more on that in a future post) and I came across something interesting.  I was trying out some tag cloud services and realized just how powerful a visual look at your data can be.</p>
<p>On my first shot, making a <a title="Wordle tag cloud creator" href="http://www.wordle.net" target="_blank">Wordle</a>, I found that the most prominent word in my RSS feed wasn&#8217;t anything near what I would have guessed:</p>
<p><img src="/blogimages/nickchasewordletagcloud1.png" style="width:500px" /></p>
<p>&#8220;False&#8221;?  Really?  That&#8217;s the most prominent word?  Well, of course that&#8217;s not the image that I want to convey when someone comes to my blog.  For reference, here&#8217;s the Wordle without it:</p>
<p><img src="/blogimages/nickchasewordletagcloud2.png"  style="width:500px" /></p>
<p>I&#8217;m not really sure why &#8220;false&#8221; was <strong>that</strong> prominent; I&#8217;m sure it&#8217;d in the code examples, but &#8230; really? Ironically, with it gone, the most prominent term is &#8220;value&#8221; &#8212; which I&#8217;m happy to have associated with my blog.  </p>
<p>A second service, <a title="Word It Out tag creator" href="http://worditout.com" target="_blank">WordItOut</a>, doesn&#8217;t have the original &#8220;false&#8221; quite so prominent:</p>
<p><img src="/blogimages/nickchaseworditouttagcloud.png"  style="width:500px" /></p>
<p>So I might have missed it if I&#8217;d started out there.</p>
<p>But there&#8217;s yet another wrinkle to this.  A third service, <a title="Tagxedo" href="http://www.tagxedo.com" target="_blank">Tagxedo</a>, lets you arrange your tag clouds into an image.  I couldn&#8217;t find the Stormtrooper they were showing on the home page, but here&#8217;s the cloud based on Abe Lincoln:</p>
<p><img src="/blogimages/nickchasetagxedotagcloud.png" /></p>
<p>Now, I&#8217;m pretty sure this is based on the actual text on my home page rather than my feed, which is why my name is disturbingly prominent rather than the code terms in the other two clouds.  (<a href="http://notoomi.com" target="_blank">NoTooMi</a> also shows up nicely.)  But my point here is that adding this extra layer of visual is neat but distracts from the idea of making sense of the data.  (Of course, if all you&#8217;re interested in is a cool looking visual, go for it. Tagxedo is a great service.)</p>
<p>The moral here?  Visuals can be extremely useful, but be careful not to get TOO creative, or they&#8217;ll lose their power to show you the data you&#8217;ve actually come for.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2013/02/05/tag-clouds-and-the-value-of-visuals/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Why it&#8217;s a bad idea to build your business on someone else&#8217;s platform (hear that, Facebook?)</title>
		<link>http://nicholaschase.com/2013/01/02/why-its-a-bad-idea-to-build-your-business-on-someone-elses-platform-hear-that-facebook/</link>
		<comments>http://nicholaschase.com/2013/01/02/why-its-a-bad-idea-to-build-your-business-on-someone-elses-platform-hear-that-facebook/#comments</comments>
		<pubDate>Wed, 02 Jan 2013 16:33:16 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Social Media]]></category>
		<category><![CDATA[Web 2.0]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1708</guid>
		<description><![CDATA[I&#8217;ll be honest, it&#8217;s only lately I&#8217;ve been sucked into using Facebook much, and that&#8217;s just because my wife pulled me into it.  I really do try to avoid anything that soaks up my time without providing me much in return.  And to me, Facebook is just a morass of pictures of dogs needing rescuing [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ll be honest, it&#8217;s only lately I&#8217;ve been <del datetime="2013-01-02T16:14:25+00:00">sucked into</del> using Facebook much, and that&#8217;s just because my wife pulled me into it.  I really do try to avoid anything that soaks up my time without providing me much in return.  And to me, Facebook is just a morass of pictures of dogs needing rescuing and cute kitties.</p>
<p>My wife, however, is addicted to <a title="George Takei's Facebook feed" href="http://www.facebook.com/georgehtakei?fref=ts" target="_blank">George Takei&#8217;s Facebook feed</a>.  And it&#8217;s funny.  Very funny.  Thing is, she and I are both subscribed, but only she gets the posts.  I, apparently, am not in lucky 15%.  What lucky 15% is that, you ask?  Well, in case you missed it, only a very small percentage of your Facebook friends get your posts &#8212; unless you&#8217;re willing to pony up $200 per post to reach all of them.  Dangerous Minds has a great explanation of the problem, in which they ask if Facebook is <a title="Facebook as a bait and switch" href="http://dangerousminds.net/comments/facebook_i_want_my_friends_back" target="_blank"><strong>THE BIGGEST ‘BAIT N’ SWITCH’ <em>IN HISTORY?</em></strong></a></p>
<p>The root of it is this: when you build your business on Facebook &#8212; or any platform you don&#8217;t control &#8212; you are putting your time and money into building a presence for someone else, and then you&#8217;re at their mercy.  That&#8217;s the root of it.  Now, if you&#8217;re Pepsi, you don&#8217;t care.  $200 to promote a post is a rounding error.  But for small businesses&#8230; it&#8217;s different.</p>
<p>I&#8217;m not saying don&#8217;t make use of Facebook, or Twitter, or any other platform at your disposal.  I&#8217;m just saying that you need to control your own destiny, your own presence, your own content.  Sometimes that means you forego what seems like &#8220;easy&#8221; traffic for something more lasting.  Sometimes that means you take a chance and use someone else&#8217;s platform, knowing that you might have to pay to get that traffic back &#8212; or give it up altogether.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2013/01/02/why-its-a-bad-idea-to-build-your-business-on-someone-elses-platform-hear-that-facebook/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to use quotes in XPath/XSLT statements</title>
		<link>http://nicholaschase.com/2012/12/19/how-to-use-quotes-in-xpathxslt-statements/</link>
		<comments>http://nicholaschase.com/2012/12/19/how-to-use-quotes-in-xpathxslt-statements/#comments</comments>
		<pubDate>Wed, 19 Dec 2012 17:21:13 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1702</guid>
		<description><![CDATA[OK, this one frustrated me for a while, so once I got it licked I wanted to pass it on to anyone else in this situation. The problem is this:  You cannot embed a quotation mark or an apostrophe in a quoted string.   In other words, this may be the function that you want: [...]]]></description>
			<content:encoded><![CDATA[<p>OK, this one frustrated me for a while, so once I got it licked I wanted to pass it on to anyone else in this situation.</p>
<p>The problem is this:  You cannot embed a quotation mark or an apostrophe in a quoted string.   In other words, this may be the function that you want:</p>
<pre>substring-after(., 'XE "')</pre>
<p>But when you actually include it in the stylesheet, it becomes&#8230;</p>
<pre>&lt;xsl:value-of select="substring-after(., 'XE "')" /&gt;</pre>
<p>and that&#8217;s wrong.</p>
<p>You can&#8217;t escape it, either.  This is still wrong:</p>
<pre>&lt;xsl:value-of select="substring-after(., 'XE \"')" /&gt;</pre>
<p>The answer to this problem is to create a global variable, which doesn&#8217;t require the quote to be in quotation marks:</p>
<pre>&lt;xsl:stylesheet version="1.0"
            xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;

<strong>&lt;xsl:variable name="quot"&gt;"&lt;/xsl:variable&gt;</strong>
...</pre>
<p>You can then use the concat() function to include it in your string, as in:</p>
<pre>&lt;xsl:value-of select="substring-after(., concat('XE ', $quot))" /&gt;</pre>
<p>This way you can use the quotation mark anywhere in your stylesheet.  You can use the same method for any other character that&#8217;s difficult to add to expressions, such as the aposotrophe.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2012/12/19/how-to-use-quotes-in-xpathxslt-statements/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why events should happen on the server, not in the client</title>
		<link>http://nicholaschase.com/2012/11/28/why-events-should-happen-on-the-server-not-in-the-client/</link>
		<comments>http://nicholaschase.com/2012/11/28/why-events-should-happen-on-the-server-not-in-the-client/#comments</comments>
		<pubDate>Wed, 28 Nov 2012 13:58:26 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Programming tips]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Web Development]]></category>
		<category><![CDATA[Web Services]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1696</guid>
		<description><![CDATA[I have a guilty pleasure.  I like to game occasionally.  Not a lot, mind you; I have zero spare time.  But occasionally, when I&#8217;m waiting for something, I might pick up my iPad and play a game.  In particular, I like this game where you &#8230; well, I won&#8217;t tell you exactly what the game [...]]]></description>
			<content:encoded><![CDATA[<p>I have a guilty pleasure.  I like to game occasionally.  Not a lot, mind you; I have zero spare time.  But occasionally, when I&#8217;m waiting for something, I might pick up my iPad and play a game.  In particular, I like this game where you &#8230; well, I won&#8217;t tell you exactly what the game is, for reasons that will become apparent in a moment.</p>
<p>In this game, there are contests.  They run them every couple of weeks, and if you reach a certain goal a certain number of times, you get a reward, which you can use in the game.  The reward is normally something you&#8217;d either earn slowly (like one per day) or pay hard cash for.</p>
<p>Unfortunately, every time they run a contest and I participate, when it&#8217;s over, I have a problem.  That problem is a bug that causes the app to crash right after displaying a message that I&#8217;ve been awarded the Bronze level of prizes in the event.  First, this annoyed me; no matter what I did, I couldn&#8217;t get it to stop crashing, even following instructions from support.  But now, I welcome it.  Why?</p>
<p>Because every single time the app displays the message, I get my prize.</p>
<p>So far, since yesterday, I&#8217;ve been able to take my balance from 231 &#8230; let&#8217;s call them &#8220;stars&#8221;, to 1513 at last count.</p>
<p>Now, the company hasn&#8217;t lost any money off of me; I wouldn&#8217;t have spent hard cash for those stars, regardless of how useful they are in the game.  But I&#8217;m sure there are people who would have, and in any case, it illustrates a point:</p>
<p><strong>Never, ever, give the client app control it doesn&#8217;t need.</strong></p>
<p>The are only two reasons a client should control an aspect of your application, and even then, the client is subordinate to the server:</p>
<ol>
<li>If it&#8217;s directly related to the user experience.  For example, it&#8217;s perfectly reasonable to send raw data to the browser and have Javascript and CSS take care of displaying it in a way that&#8217;s customized for the user, rather than having the server customize a page for every single user.  (I&#8217;m not saying it&#8217;s always <strong>best</strong> to do that, I&#8217;m just saying it&#8217;s <strong>reasonable</strong>.)  In this case, the data is coming from the server, and, if you&#8217;re smart, so is the information needed to perform that customization.</li>
<li>In a game or other environment in which either presentation or data needs to react immediately to user action, you would obviously want user interactions to happen in the client for performance reasons; keeping things local prevents lag due to network latency.  But information about what happened needs to get back to the server for persistence, so if the client crashes information isn&#8217;t lost.</li>
</ol>
<p>Why is this so important?  It&#8217;s important for two reasons.</p>
<p>First, like it or not, you have no control over what happens in the client.  Sure, you can hope that only authorized users get their hands on it, and it&#8217;s not tampered with, and nobody creates a pirated version that does Bad Things.  But if you&#8217;re successful, those things are going to happen.  You need to deal with it, and you deal with it by safeguarding your users&#8217; data and experience in the environment you <strong>do</strong> control: the server.  Take my &#8220;stars&#8221; example; the company could easily prevent this problem by simply awarding the stars once, on the server, at the end of the game.  Then it doesn&#8217;t matter how many times the app displays the message and then crashes, because I am not getting 32 new stars every single time.  Even if they only wanted to add the stars once I&#8217;d logged in &#8212; for example, if it affected the leaderboard &#8212; they should still be checking &#8212;  <strong>on the server</strong> &#8212; whether they&#8217;d been added yet.</p>
<p>The second reason is more philosophical than technical.  It&#8217;s because as we move deeper into cloud, users are increasingly expecting a &#8220;access anywhere&#8221; mentality.  If an app crashes, or a device crashes, or they just move to something new, they want their experience to come with them.  And they can only do that if it&#8217;s on the server.</p>
<p>What do you think?  Do you prefer to have the client manage things?  Or are there other reasons one way or the other that I haven&#8217;t thought about?</p>
<p>Update:  Shortly after this post, the game was finally updated so that it doesn&#8217;t crash.  Hopefully they fixed the architecture, too!  (Of course, now I have to earn my stars the hard way. <img src='http://nicholaschase.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> )</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2012/11/28/why-events-should-happen-on-the-server-not-in-the-client/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to use a Java ResourceBundle and properties file</title>
		<link>http://nicholaschase.com/2012/09/03/how-to-use-a-java-resourcebundle-and-properties-file/</link>
		<comments>http://nicholaschase.com/2012/09/03/how-to-use-a-java-resourcebundle-and-properties-file/#comments</comments>
		<pubDate>Mon, 03 Sep 2012 20:17:55 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[NoTooMi]]></category>
		<category><![CDATA[Programming tips]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Year of Living Socially]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1679</guid>
		<description><![CDATA[OK, one thing that I put off learning for a long time is how to use Java ResourceBundles.  It just seemed like something complicated that I didn&#8217;t really need to do.  After all, I could always just drop information into a standard file and read that, right?  But this approach has its limitations, as pointed out [...]]]></description>
			<content:encoded><![CDATA[<p>OK, one thing that I put off learning for a long time is how to use Java <code>ResourceBundle</code>s.  It just seemed like something complicated that I didn&#8217;t really need to do.  After all, I could always just drop information into a standard file and read that, right?  But this approach has its limitations, as pointed out handily in this <a title="Smartly load your properties" href="http://www.javaworld.com/javaqa/2003-08/01-qa-0808-property.html" target="_blank">article</a>:</p>
<ul>
<li>Setting absolute file locations is a Bad Thing, so knowing where to find them can be tricky.</li>
<li>Setting relative file locations can be a problem too, as they are relative to the JVM, which can be anywhere.</li>
<li>Easily providing localization &#8212; different text for different languages &#8212; can be an issue, as you have to programmatically determine which file to use.</li>
</ul>
<p>No, instead, you&#8217;re better off using a <code>ResourceBundle</code> backed by a properties file and fortunately it&#8217;s actually pretty easy, as you&#8217;ll see in this post, where I use it to configure <a title="NoTooMi" href="http://beta.notoomi.com" target="_blank">NoTooMi</a>&#8216;s logging properties.  Using a properties file gives you a couple of advantages:</p>
<ul>
<li>As long as the properties file is somewhere in your classpath, you don&#8217;t have to worry about exactly where it is.</li>
<li><code>ResourceBundle</code>s can automatically pick the right file, depending on what locale you&#8217;re looking for.</li>
</ul>
<p>So today I&#8217;ve decided that I&#8217;ve gotten sufficiently complicated in my logging scheme on NoTooMi that it&#8217;s time for me to break this out into a <code>ResourceBundle</code>.</p>
<p><span id="more-1679"></span></p>
<p>I&#8217;ve already done this for basic properties that change between my development machine and the server, such as the locations of key files, or whether or not certain services are enabled, but until now I&#8217;ve been configuring logging right in my <code>Utility</code> class, like so:</p>
<pre>    public static void logMessage(String message, String set) {
        HashMap printLogs = new HashMap();
        printLogs.put("hidethis", false);
        printLogs.put("StartListeners", false);
        printLogs.put("SaveSiteStreams", false);
        printLogs.put("SaveSiteStreamListener", false);
        printLogs.put("QueryString", false);
        printLogs.put("SetVariables", false);
        printLogs.put("LinkedInUserService", false);
        printLogs.put("UserService", false);
        printLogs.put("Nugget", false);
        printLogs.put("NuggetStream", false);
        printLogs.put("User", false);
        printLogs.put("API", true);
        printLogs.put("Display", false);
        printLogs.put("TSS", false);
        printLogs.put("Utility", false);
        printLogs.put("Facebook", false);

        if (printLogs.get(set) == null || printLogs.get(set)) {
            System.out.println(set + ": " + message);
        }
    }</pre>
<p>The advantage here is that I can get pretty granular on my logging,  turning things on and off at will.  So rather than having a simple <code>System.out.println()</code> statement, I would have something like:</p>
<pre>public void onStatus(long forUser, Status status) {

        String textToSave = forUser+"|nugget|"+
                                DataObjectFactory.getRawJSON(status);

        <strong>Utility.logMessage(textToSave, "SaveSiteStreamListener");</strong>

        parentObj.writeToFile(textToSave);
    	if (isNewStream){
            parentObj.killOldStream();
            isNewStream = false;
        }
        parentObj.streamIntact = true;
    }</pre>
<p>So if I want to see these messages in the log, I can; but I can easily turn them off.</p>
<p>That is, I can turn them off by completely recompiling and redeploying the <code>Utility</code> class.</p>
<p>Clearly not ideal.</p>
<h2>Creating a properties file</h2>
<p>So instead, what we want to do is create a simple text file that has all of those values, then read it and populate the <code>printLogs HashMap</code>.</p>
<p>Start by creating a new file called (in my case) NoTooMiLogging.properties.  Save it somewhere on the classpath.  In my case, I&#8217;m simply adding it to the <code>src</code> directory.</p>
<p>Add in your values as name-value pairs.  For me, that means:</p>
<pre>hidethis=false
StartListeners=false
SaveSiteStreams=false
SaveSiteStreamListener=false
QueryString=false
SetVariables=false
LinkedInUserService=false
UserService=false
Nugget=false
NuggetStream=false
User=false
API=true
Display=false
TSS=false
Utility=false
Facebook=false</pre>
<h2>Create a servlet that runs on startup</h2>
<p>Next, create a new class to load all this data.  For me, it&#8217;s going to be a servlet so I can have it load when NoTooMi starts up:</p>
<pre>package com.notoomi.setup;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class SetLoggingProperties extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
                              throws ServletException, IOException {
           response.getWriter().println("Working!");
    }
}</pre>
<p>To make this servlet run when the server starts up, you need to make sure it&#8217;s got <code>load-on-startup</code> set. (Note that being set to 0 is fine, as long as it&#8217;s set.)</p>
<pre>&lt;web-app ...&gt;
...
    &lt;servlet&gt;
        &lt;display-name&gt;Set Logging Properties&lt;/display-name&gt;
        &lt;servlet-name&gt;SetLoggingProperties&lt;/servlet-name&gt;
        &lt;servlet-class&gt;com.notoomi.cloudy.setup.SetLoggingProperties&lt;/servlet-class&gt;
        <strong>&lt;load-on-startup&gt;0&lt;/load-on-startup&gt;</strong>
    &lt;/servlet&gt;
    &lt;servlet-mapping&gt;
        &lt;servlet-name&gt;SetLoggingProperties&lt;/servlet-name&gt;
        &lt;url-pattern&gt;/SetLoggingProperties&lt;/url-pattern&gt;
    &lt;/servlet-mapping&gt;
&lt;/web-app&gt;</pre>
<p>In order to get the servlet to <strong>do</strong> something when it loads, we need to put the code into the <code>init()</code> method. (In addition to the <code>doGet()</code> and <code>doPost</code> methods, servlets have <code>init()</code> and <code>destroy()</code>methods, which run when they&#8217;re created and destroyed, respectively.)</p>
<h2>Load the ResourceBundle</h2>
<p>To load the properties file, add the following method to your servlet:</p>
<pre>...
public class SetLoggingProperties extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        ResourceBundle labels = 
               <strong>ResourceBundle.getBundle("NoTooMiLogging");</strong>
    }
...</pre>
<p>Notice that I specified the name as just <code>NoTooMiLogging</code>, and not <code>NoTooMiLogging.properties</code>. We&#8217;re basically treating it a class, and since I put it in the <code>src</code> directory, it&#8217;s not part of a package.</p>
<p>If I wanted to do localization, I could call a french version:</p>
<pre>...
public class SetLoggingProperties extends HttpServlet {

    public void init(ServletConfig config) throws ServletException {
        ResourceBundle labels = 
               <strong>ResourceBundle.getBundle("NoTooMiLogging", "fr");</strong>
    }
...</pre>
<p>In this case, it&#8217;d be looking for <code>NoTooMiLogging_fr.properties</code>.</p>
<p>Once we&#8217;ve loaded the file, getting the keys out of it is actually pretty easy, as you can see from this code lifted almost directly from the <a title="Java ResourceBundle documentation" href="http://docs.oracle.com/javase/tutorial/i18n/resbundle/propfile.html" target="_blank">ResourceBundle documentation</a>:</p>
<pre>...
public void init(ServletConfig config) throws ServletException {
        ResourceBundle labels = 
               ResourceBundle.getBundle("NoTooMiLogging");
        Enumeration bundleKeys = labels.getKeys(); 
        while (bundleKeys.hasMoreElements()) { 
            String name = (String)bundleKeys.nextElement(); 
            String value = labels.getString(name); 
            System.out.println("key = " + name + ", " + 
                               "value = " + value); 
        }
    }
...</pre>
<p>Once we&#8217;ve got the bundle, we can pull all of it&#8217;s name-value pairs, or keys. We can then iterate through those keys, first getting the name, then using that name to pull the value from the complete set. Now when you start up the web application, you should see the list of values:</p>
<pre>key = User, value = false
key = StartListeners, value = false
key = UserService, value = false
key = Display, value = false
key = hidethis, value = false
key = Nugget, value = false
key = Facebook, value = false
key = QueryString, value = false
key = Utility, value = false
key = SaveSiteStreams, value = false
key = TSS, value = false
key = API, value = true
key = LinkedInUserService, value = false
key = SetVariables, value = false
key = SaveSiteStreamListener, value = false
key = NuggetStream, value = false</pre>
<p>Now we have easy access to the values, and an easy way to add new ones &#8212; simply add a new line to the properties file. So to finish it off, I just have to hook it up to the <code>Utility</code> class.</p>
<h2>Loading values into the Utility class</h2>
<p>First I&#8217;ll do what I should have done in the first place and make the <code>printLogs HashMap</code> a static variable:</p>
<pre>    public static HashMap printLogs = null;
    public static void logMessage(String message, String set) {
        if (printLogs.get(set) == null || printLogs.get(set)) {
            System.out.println(set + ": " + message);
        }
    }</pre>
<p>From there, we just need to load the values into <code>printLogs</code>:</p>
<pre>        Utility.printLogs = new HashMap();
        while (bundleKeys.hasMoreElements()) {
            String name = (String)bundleKeys.nextElement();
            String value = labels.getString(name);
            Utility.printLogs.put(name, new Boolean(value).booleanValue());
        }</pre>
<p>To make sure we&#8217;ve got it right, we can set the <code>doGet()</code> method to show us:</p>
<pre>    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
           response.setContentType("text/html");
           Iterator it = Utility.printLogs.keySet().iterator();
           while(it.hasNext()) {
               String name = (String)it.next();
               String value = Utility.printLogs.get(name).toString();
               response.getWriter().println(name + ": " + 
                                            value + "&lt;br /&gt;");
           }
    }</pre>
<p>And that takes care of it!</p>
<h2>Summary</h2>
<p>So to use a properties file to configure logging on NoTooMi, we&#8217;re taking the following steps:</p>
<ol>
<li>Create a static <code>HashMap</code> to hold the property values.</li>
<li>Make a file, called <code>NoTooMiLogging.properties</code>, and save it to the classpath.</li>
<li>Add the properties to this file as name-value pairs.</li>
<li>Create a servlet that runs when the server starts.</li>
<li>In the <code>init()</code> method, use the properties file to load the <code>ResourceBundle</code>, then loop through the values and populate the <code>HashMap</code>.</li>
</ol>
<p>Now, this is definitely better than some other ways of setting properties, but it&#8217;s probably not the best option. What are your favorites?</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2012/09/03/how-to-use-a-java-resourcebundle-and-properties-file/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to patch open source software</title>
		<link>http://nicholaschase.com/2012/05/23/how-to-patch-open-source-software/</link>
		<comments>http://nicholaschase.com/2012/05/23/how-to-patch-open-source-software/#comments</comments>
		<pubDate>Wed, 23 May 2012 15:44:20 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Programming tips]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1604</guid>
		<description><![CDATA[As a developer, I very often use open source software, but sometimes you run into a situation where the binary (that&#8217;s that package you just download and stick in your classpath) needs to be patched. Maybe it&#8217;s an obscure bug fix that you need that hasn&#8217;t been released yet, or maybe it&#8217;s a feature that&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>As a developer, I very often use open source software, but sometimes you run into a situation where the binary (that&#8217;s that package you just download and stick in your classpath) needs to be patched.  Maybe it&#8217;s an obscure bug fix that you need that hasn&#8217;t been released yet, or maybe it&#8217;s a feature that&#8217;s still on the trunk (that&#8217;s the &#8220;main&#8221; stream of code).</p>
<p>Very often when you read about these situations, the author will just say, &#8220;apply this patch&#8221; or &#8220;this has been fixed in this Jira&#8221;, which is great, but unless you work with a team or on a major project, it&#8217;s not something you do every day.</p>
<p>Fortunately, it&#8217;s not as difficult as it would seem to be.  Here&#8217;s how you do it.</p>
<p>In my case, I ran into a situation where I needed to apply a patch to <a href="http://nutch.apache.org/">Apache Nutch</a> to add parameter support to its integration with <a href="http://lucene.apache.org/solr/">Solr</a>.  Now, this is a Java project, but I suspect the steps are pretty much the same (at least concept-wise) for other languages. So here are the steps:</p>
<p>1)  Download the source.  Typically, you do this in the same location where you got the binaries.  In my case, I downloaded <a href="http://www.alliedquotes.com/mirrors/apache/nutch/apache-nutch-1.4-src.zip">http://www.alliedquotes.com/mirrors/apache/nutch/apache-nutch-1.4-src.zip</a>.</p>
<p>2)  Uncompress the source to an accessible directory.</p>
<p>3)  Download the relevant patch.  In this case, it was <a href="https://issues.apache.org/jira/secure/attachment/12505095/NUTCH-1213.diff">https://issues.apache.org/jira/secure/attachment/12505095/NUTCH-1213.diff</a>.  You&#8217;ll want it in the same directory as the <code>src</code> directory.</p>
<p>4)  If you&#8217;re on Windows, you&#8217;re going to need <a href="http://www.cygwin.com/install.html">Cygwin</a>; make sure that you install &#8220;patch&#8221;, which is under &#8220;Utils&#8221;.</p>
<p>5)  Run the patch like so:</p>
<pre>patch < NUTCH-1213.diff</pre>
<p>In my case, the utility wasn't finding the source files, so I had to type the location, but that's (usually) not a huge deal.</p>
<p>6)  At this point you have patched the source, but you still need to create the binaries you'll need to actually run the software.  This may sound intimidating, but it's not.  Most open source software includes some easy way to build it because the developers need to do that all the time.  In the case of Java projects it's usually in the form of a configuration file for <a href="http://maven.apache.org/">Maven</a> (<code>pom.xml</code>) or <a href="http://ant.apache.org/">Ant</a> (<code>build.xml</code>).</p>
<p>Nutch has both, and I already have Ant on my system, so the next step is to make sure that <code>JAVA_HOME</code> and <code>ANT_HOME</code> are set to their proper locations (use your actual locations):</p>
<pre>export JAVA_HOME=/cygdrive/c/sw/jdk1.7.0_02
export ANT_HOME=/cygdrive/c/sw/apache-ant-1.8.3</pre>
<p>Then you can run the build:</p>
<pre>cd &lt;directory with build.xml&lt;
$ANT_HOME/bin/ant</pre>
<p>You should see a long string of messages that tell you what happened. Hopefully at the end you'll see this message:</p>
<pre>BUILD SUCCESSFUL</pre>
<p>If not, take a look at the actual errors and see what's going on; usually it's something simple, like a missing system variable.</p>
<p>If everything works, you're done.  You've now got a patched version of that open source software that's so useful!</p>
<p>Not so tough, right?  </p>
<p>Now, I confess, I've only done this for Java projects.  Anybody have a good resource for other languages?</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2012/05/23/how-to-patch-open-source-software/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>It&#8217;s good to be old</title>
		<link>http://nicholaschase.com/2012/02/01/its-good-to-be-old/</link>
		<comments>http://nicholaschase.com/2012/02/01/its-good-to-be-old/#comments</comments>
		<pubDate>Wed, 01 Feb 2012 14:19:36 +0000</pubDate>
		<dc:creator>Nick Chase</dc:creator>
				<category><![CDATA[Programming tips]]></category>
		<category><![CDATA[Web 2.0]]></category>
		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1589</guid>
		<description><![CDATA[There was a time &#8212; not that long ago, really &#8212; when I was the up-and-coming kid in the office. I was young, I was hip, I was on top of everything new. I was the one who, in 1995, went to the people running the interactive agency where I was working and said, &#8220;You [...]]]></description>
			<content:encoded><![CDATA[<p>There was a time &#8212; not that long ago, really &#8212; when I was the up-and-coming kid in the office.  I was young, I was hip, I was on top of everything new.  I was the one who, in 1995, went to the people running the interactive agency where I was working and said, &#8220;You know, guys, we really should start looking into building websites for people.  It&#8217;s going to be big.&#8221;</p>
<p>Now I find myself working with people who weren&#8217;t even born yet when Star Wars was in the theaters.  Heck, they were in diapers when the web was born.</p>
<p>At the ripe old age of 43, I find myself feeling like the grand old man.</p>
<p>Not that I&#8217;m not still on top of things, always chasing the latest technology wave.  (OK, I admit it, I hate texting.  But that&#8217;s just because &#8230; well, honestly, I&#8217;m not sure why it is.  Maybe I&#8217;m just anti-social.)</p>
<p>So this past week, as I was trying to solve a problem in creating eBooks that would be &#8220;cross-platform&#8221; &#8212; meaning a single <a href="http://en.wikipedia.org/wiki/EPUB" target="_blank">ePub</a> (the format used by iBooks) that would convert to a reasonable <a href="http://en.wikipedia.org/wiki/.mobi" target="_blank">.mobi</a>, if you&#8217;re interested &#8212; I was glad to find that for once, my age was an asset.</p>
<p>Turns out that the Mobi format, which is used for Kindles, is based on old &#8212; and I mean O-L-D &#8212; HTML standards.  Like, pre-HTML4 stuff.  No CSS (for the most part), no nothing.  So while Apple is pushing ePub3, which lets you create all kinds of interactive eBooks, I was dealing with a format that doesn&#8217;t even let you use an image as a link.</p>
<p>At this point, I have seen many younger programmers give up.  &#8220;Sorry, can&#8217;t do it,&#8221; they say.  It&#8217;s a phrase I hear all the time, and it&#8217;s starting to get on my nerves.  Sure, there are times when you can&#8217;t do something.  Some things are just impossible.  (Like getting around full justification in iBooks, if the user has it turned on.  Grrrrrrr.)</p>
<p>But I don&#8217;t, in general, give up that easy.  So here is a technique for displaying a text link in a Mobi file, while the ePub displays an image link.</p>
<p>The situation is this:  I&#8217;m programmatically generating an ePub, which is then run through <a href="http://calibre-ebook.com/" target="_blank">Calibre</a> to create a Mobi file.  The relevant HTML looks like this:</p>
<pre>&lt;a class="indexTopLink" href="index.html#top">
   &lt;img class="indexTop" width="100" height="0" src="backToTop.png"/>
&lt;/a>
&lt;a class="textTopLink" href="index.html#top">top&lt;/a></pre>
<p>So you&#8217;ve got two links in the HTML.  The <code>height</code> attribute on the arrow image &#8212; yes, Virginia, we used to actually set height and width on the actual image, back when dinosaurs roamed the earth &#8212; tells the Mobi reader to render the image with a height of 0, so it&#8217;s invisible, but the <code>width</code> attribute makes it wide enough to provide some spacing.  Then the Mobi reader displays the text link, which actually works.</p>
<p>Now we deal with the ePub.  We add some CSS:</p>
<pre>.indexTop {
   height: 24px;
   width: 100px;
}
.textTopLink { 
   position: relative; 
   left: -9990px;
}</pre>
<p>The first rule tells the ePub reader to over-ride the image attributes and display the image at the correct size, so it&#8217;s visible.  The second tells it to move the text link over to the left so that it&#8217;s not.</p>
<p>Because the Mobi reader ignores the <code>class</code> attribute these rules are ignored, so we have an image link for ePub, and a text link for the Mobi.</p>
<p>And all with techniques that fell out of favor long before a lot of today&#8217;s web programmers even started college.</p>
<p>It&#8217;s good to be the grand old man.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2012/02/01/its-good-to-be-old/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Success&#8221; is a relative term</title>
		<link>http://nicholaschase.com/2011/12/31/success-is-a-relative-term/</link>
		<comments>http://nicholaschase.com/2011/12/31/success-is-a-relative-term/#comments</comments>
		<pubDate>Sat, 31 Dec 2011 15:27:18 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1577</guid>
		<description><![CDATA[OK, so right about this time last year, I was announcing the Year of Living Socially, in which I was planning to: #1 — Really focus on just three content areas I think are important. They are cloud computing and social media, which I believe will be big in 2012, and intelligent search, which I’ve [...]]]></description>
			<content:encoded><![CDATA[<p>OK, so right about this time last year, I was announcing the <a target='_blank' href="http://nicholaschase.com/2010/12/31/embarking-on-the-year-of-living-socially/">Year of Living Socially</a>, in which I was planning to:</p>
<blockquote><p>#1 — Really focus on just three content areas I think are important. They are cloud computing and social media, which I believe will be big in 2012, and intelligent search, which I’ve been championing in one way or another for a long, long time. (I’ll get more into exactly how I define each of those topics in future posts.)</p>
<p>#2 — Finally build a project I’ve been kicking around for years: an information aggregator that tames the information overload that gets worse every year. (The project has yet to be named, but I’ll talk about what it actually does — and solicit feedback and priorities — in a future post.) I will build this out in public, with deadlines anybody can see. I probably won’t open-source the code itself, but I will likely write articles and tutorials about the different technologies I use as I go along.</p>
<p>#3 — Implement best practices for using social media, including regular postings to Twitter and either LinkedIn, Facebook, or both. (I’ll do the analysis in a future post.)</p></blockquote>
<p>I did set some ground rules, though.  In doing that, I would also have to keep these things in mind:</p>
<blockquote><p>First and foremost, client work can’t suffer; I’m a professional and if you’re paying me to do something, you take top priority. (Plus I have a family and they can’t suffer, so this will also have to be ‘the year of living within time management best practices’.)</p>
<p>Second, I’ll be using open-source and publicly available software, preferably cloud-based, unless there’s a good reason not to for a particular task, which will be a discussion in and of itself.</p>
<p>Third, all decisions, from what software development methodology to what search solution to use, will be made “in public”, so to speak, with analysis and conclusions out there for everyone to see.</p></blockquote>
<p>So the big question is, how did I do?</p>
<p>Well, from the outside, it looks very much like the answer is &#8220;not too well&#8221;, but it&#8217;s actually not as bad as it looks.</p>
<p>#1 &#8212; I was right about cloud, social, and search being on the rise, and I did actually focus on those three technologies in 2011.  About 2/3 of the work I did involved either search or social media, and just about everything was cloud-related in one way or another (if you&#8217;re really generous in your definition of &#8220;cloud&#8221;.)  Unfortunately, most of that was client work that I couldn&#8217;t post here.</p>
<p>#2 &#8212; I did actually build the project, NoTooMi, and quietly launch a first beta of it.  Unfortunately, it was built on a product that has subsequently changed its architecture (I knew that was a risk when I built it) so I need to rebuild a few parts of it before I can relauch.  Also, while it does integrate Twitter, I haven&#8217;t yet finished Facebook integration, so it looks a little anemic right now.  I&#8217;m hoping to have a public version up in the next couple of weeks.</p>
<p>#3 &#8212; OK, I&#8217;ll admit it, I definitely fell down on the job here as far as regular postings to Twitter and Facebook.   (I did get my LinkedIn profile filled out enough that I picked up a client from it, however.)It&#8217;s my personality; I don&#8217;t like to talk unless I have something to say, and I get a little weirded out about whether people want to actually hear it.  I promise to try and loosen up in 2012. </p>
<p>And what about the requirements?  How did I do there?</p>
<p>#1 &#8212; Well, giving client work the priority definitely worked.  There was not one instance all year in which client work suffered because of this project.  If anything, it&#8217;s the opposite; I&#8217;ve been so busy with client work this year that I haven&#8217;t had time to do what I wanted on NoTooMi.  (I even got my <a href="http://www.intersectionunlimited.com" target="_blank">corporate website</a> redesigned and rewritten.)</p>
<p>And on the personal front, I&#8217;m happy to say that while my last remaining children at home drive me nuts at times (which is, I suppose, their job) my marriage is better than ever, and after all these years, that&#8217;s saying something, especially since we spent November opening Sarah&#8217;s gift shop to try and beat the Christmas rush.  (Website to come shortly; we barely got the doors open in time.)  (Oh, and for you Doctor Who fanfic fans, Sarah and I were finally were able to launch a <a href="http://www.fanfiction.net/s/6881892/1/The_Long_Road_Home">huge and ambitious story</a> I&#8217;ve wanted to write for a couple of years.  When it&#8217;s done we&#8217;re going to tackle a novel.  Seriously.)</p>
<p>#2 &#8212; NoTooMi is based on Apache Solr, so in that respect, yes, it&#8217;s based on open source.  And the service that I built it on was indeed cloud-based.  And it worked pretty well, too, but now it looks like I&#8217;m going to bring it back to pure Solr.  But I admit that thanks to client requirements on something else I have been seduced by <a target="_blank" href="http://www.jetbrains.com/idea/">IntelliJ</a> and have been using it instead of <a href="http://www.eclipse.org" target="_blank">Eclipse</a> as my programming environment.  Sorry guys.</p>
<p>and #3 &#8230; Well, yeah, not so much.  Sorry about that.  See #1.</p>
<p>So where do we go from here?  Well, first, I&#8217;m going to try and get out of my head a little bit and not worry so much about whether I&#8217;m boring people.  If I find it interesting, I&#8217;ll post it.  I would like to think that there are people out there who are interested by the same things I&#8217;m interested by.</p>
<p>And I am also going to try and obsess a little less about what I do write.  One piece of advice I got from a book about blogging was to do short tips &#8212; and to get good at just banging them out.   I learn about a ton of different little things over the course of a year.  Not every post about them has to be a tutorial.  Just a quick tip will do.  Really.  (Nick takes a deep breath&#8230;.)</p>
<p>As far as technologies, &#8220;cloud&#8221; is still a great buzzword, but I think that it&#8217;s pretty well established at this point, as least as far as I&#8217;m concerned, so I&#8217;m going to start focusing on mobile, which is where I think the bulk of innovation will be in the next couple of years.  I spent the last couple of weeks really delving into eBooks as a prelude to app-building (tips, I know, tips!), so I&#8217;m hoping to have something to show for mobile in 2012.</p>
<p>OK, so those are my goals for 2012.  As for measurable objectives:</p>
<ol>
<li>Post something, somewhere, once a week.</li>
<li>Get my new office at the store furnished and ready for receiving clients. (It&#8217;s cool, there&#8217;s a separate room and a back entrance just for me.)</li>
<li>Launch a private beta of NoTooMi before March 1.</li>
<li>Go to public beta before July 1.</li>
<li>Finish the Doctor Who arc we&#8217;ve been working on, and start planning a novel.</li>
<li>Publish at least one &#8220;pay to download this&#8221; item, whether it&#8217;s a mobile app or a <a target="_blank" href="http://mashable.com/2011/12/30/kindle-singles-dick-babcock/?utm_source=feedburner&#038;utm_medium=email&#038;utm_campaign=Feed%3A+Mashable+%28Mashable%29">Kindle Single</a>, even if it&#8217;s also available here for free.</li>
</ol>
<p>So that&#8217;s where I am today.  How did you do on your goals for 2011, and what are you planning for 2012?</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2011/12/31/success-is-a-relative-term/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Case Study In Social Media Customer Service Done Right:  Enterprise Rent-A-Car</title>
		<link>http://nicholaschase.com/2011/04/18/a-case-study-in-social-media-customer-service-done-right-enterprise-rent-a-car/</link>
		<comments>http://nicholaschase.com/2011/04/18/a-case-study-in-social-media-customer-service-done-right-enterprise-rent-a-car/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 18:30:52 +0000</pubDate>
		<dc:creator>Nick Chase</dc:creator>
				<category><![CDATA[Social Media]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1558</guid>
		<description><![CDATA[It&#8217;s nice to hear about social media case studies, but maybe it&#8217;s even better to experience one first-hand. This past Saturday, on the freeway about an hour from home, my transmission quit. After coasting about an mile and a half to an exit, I called AAA, and they made arrangements for me to speak with [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s nice to hear about social media case studies, but maybe it&#8217;s even better to experience one first-hand.</p>
<p>This past Saturday, on the freeway about an hour from home, my transmission quit.  After coasting about an mile and a half to an exit, I called AAA, and they made arrangements for me to speak with Enterprise Rent-A-Car about getting transportation while my van was in the shop.  Because it was Saturday afternoon, none of the local offices were open, so I wound up making a reservation at the airport.</p>
<p>Two problems there.  The first was immediately obvious: Enterprise&#8217;s slogan, &#8220;We&#8217;ll pick you up&#8221;, only applies to the local offices, so I had to get someone to drive me to the airport.  OK, I understood that.  But when I got to the airport, I discovered the second problem: the airport locations won&#8217;t rent on a debit card unless you&#8217;re flying in and out.  The agent was apologetic, but there was nothing he could do.</p>
<p>Fortunately my sister-in-law had waited with us.  &#8216;No problem,&#8217; I thought.  &#8216;We&#8217;ll go home, and I&#8217;ll call my local office and get a ride on Monday morning.&#8217;  I&#8217;ve rented with Enterprise dozens of times; because I&#8217;m the only driver in the house, &#8220;We&#8217;ll pick you up&#8221; makes them my rental agency of choice.</p>
<p>Unfortunately, when I went to book that car for this morning, I was horrified to see that there were no cars available at the two closest offices.  The nearest office with a car was 25 minutes away, and I was definitely out of their territorial range.</p>
<p>And that&#8217;s where social media comes in.  Frustrated, I <a href="http://twitter.com/#!/NickChase/status/59772341433020417" target="_blank">tweeted</a>:</p>
<blockquote><p>The one downside of living in the country is that when your car breaks down, you pray Enterprise has a car. Naturally, they don&#8217;t. Sigh.</p></blockquote>
<p>A few minutes later, I found the following @mention from <a title="Enterprise Rent-A-Car" href="http://twitter.com/#!/enterprisecares" target="_blank">@enterprisecares</a>:</p>
<blockquote><p><a title="Nicholas Chase" href="http://twitter.com/NickChase" target="_blank">@NickChase</a> We are listening. Is there anything we can help with? If yes, please tweet/follow us &amp; I&#8217;ll DM our contact information (amanda)</p></blockquote>
<p>Surprised, I did as they asked, and, receiving the customer care email address, explained the situation to them.  By this time I&#8217;d made a reservation at the distant location (hoping I could find someone to take me down there), and Amanda told me she&#8217;d email over there and make sure they did everything they could to help.</p>
<p>And that&#8217;s exactly what they did.  This morning I called, and true to her word, Amanda (or someone) had let the office know my situation.  &#8220;Mister Chase, we are going to do whatever it takes to get you going here today,&#8221; Paula said.  &#8220;What time do you have to have the car by?&#8221;</p>
<p>Turns out that cars were in short supply because of hail damage here in North and South Carolina, and that was why my local office was sold out.  But not only did they find me a car, they did indeed come and pick me up, and I was able to do everything I needed to do today.</p>
<p>And I&#8217;m very glad, because I like Enterprise, and didn&#8217;t like feeling badly about using them.</p>
<p>So the moral of the story is this:  Pay attention to what&#8217;s being said about you.  Because Enterprise Rent-A-Car spent the resources to monitor social media, they were able to turn a frustrated (and vocal) customer from a source of negative sentiment to a champion of their brand.</p>
<p>What are you doing to monitor what&#8217;s being said about you?</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2011/04/18/a-case-study-in-social-media-customer-service-done-right-enterprise-rent-a-car/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The curse of a busy schedule</title>
		<link>http://nicholaschase.com/2011/02/20/the-curse-of-a-busy-schedule/</link>
		<comments>http://nicholaschase.com/2011/02/20/the-curse-of-a-busy-schedule/#comments</comments>
		<pubDate>Sun, 20 Feb 2011 23:54:18 +0000</pubDate>
		<dc:creator>Nicholas Chase</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://nicholaschase.com/?p=1554</guid>
		<description><![CDATA[Twenty years or so ago, I was working a full-time job and running an online science fiction magazine. At the same time, I got a new puppy, who constantly needed to go out, in the winter, in Ohio. Eventually, I got pneumonia, and had to slow down for a couple of weeks. This time it&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Twenty years or so ago, I was working a full-time job and running an online science fiction magazine.  At the same time, I got a new puppy, who constantly needed to go out, in the winter, in Ohio.  Eventually, I got pneumonia, and had to slow down for a couple of weeks.</p>
<p>This time it&#8217;s three clients, NoTooMi, the Year of Living Socially, and a new cat (whom I love, but to whom I&#8217;m seriously allergic) but the results are the same; I&#8217;ve been down with pneumonia, but I&#8217;m just about back in business, so please forgive me for the break in posting.</p>
<p>I&#8217;ve actually accomplished a lot since February 5; more to come as I write things up into postings, and NoTooMi starts showing its head.</p>
]]></content:encoded>
			<wfw:commentRss>http://nicholaschase.com/2011/02/20/the-curse-of-a-busy-schedule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
