<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en" xml:base="http://www.symphonious.net/wp-atom.php">
	<title type="text">Symphonious</title>
	<subtitle type="text">Living in a state of accord.</subtitle>

	<updated>2008-11-28T15:05:54Z</updated>
	<generator uri="http://wordpress.org/" version="2.6.5">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://www.symphonious.net" />
	<id>http://www.symphonious.net/feed/atom/</id>
	

			<link rel="self" href="http://feeds.feedburner.com/symphonious" type="application/atom+xml" /><entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Support Sells]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/29/support-sells/" />
		<id>http://www.symphonious.net/?p=1031</id>
		<updated>2008-11-28T15:05:54Z</updated>
		<published>2008-11-28T15:05:54Z</published>
		<category scheme="http://www.symphonious.net" term="Apple" /><category scheme="http://www.symphonious.net" term="Product Management" />		<summary type="html"><![CDATA[
       Antonio Cangiano:
    


         In theory I could have been disappointed. After all, my visit didn’t fix the problem at hand, my expensive laptop seemed to be good as a door stopper, and repairing this thing could potentially [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/29/support-sells/">&lt;p&gt;
       &lt;a href="http://feeds.feedburner.com/~r/ZenAndTheArtOfRubyProgramming/~3/468369437/"&gt;Antonio Cangiano&lt;/a&gt;:
    &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
         In theory I could have been disappointed. After all, my visit didn’t fix the problem at hand, my expensive laptop seemed to be good as a door stopper, and repairing this thing could potentially be less advantageous than just buying a newer unit. Yet, as I arrived home, I told my wife that my next laptop would definitely be an Apple.
      &lt;/p&gt;
&lt;p&gt;
         The reason for this is that I saw a genuine effort to help me out, an unheard level of care for the customer and an willingness to do what’s right, even if it costs the company some money. The whole experience was very positive and I felt that the premium cost of Apple’s products is easily justified by this kind of support.
      &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
       The way you support your clients is a key part of any products and services your company provides. No matter how much you focus on quality, things will go wrong sometimes and your clients will have problems. Ironically, that’s your biggest chance to make them a fan for live because while people expect products to work all the time, they don’t expect support experiences to be much good. If you provide a great support experience, it surprises them and makes them notice.
    &lt;/p&gt;
&lt;p&gt;
       Two examples I’ve had recently really confirm that. &amp;#160;The first was with one of Ephox’s clients who were experiencing a lot of crashes. It had reached the point where the authors were unable to do any work and the content migration had pretty much completely stopped - their project timeline was dead in the water. Thankfully, they were extremely patient and friendly people so even in such a stressful time were really good to work with and I made sure I dropped everything and worked whatever hours were required to solve their problems. Most importantly though, I gave them copious status updates to make sure they knew exactly what was going on and give them the information that their bosses were going to ask for. We’ve solved the major issues and are still working to clean up some more minor issues, but they’ve already offered to give us a reference.
    &lt;/p&gt;
&lt;p&gt;
       The second case was with a Freecom Tough Drive I bought. It’s meant to be powered off the USB bus, but PowerBook G4s don’t supply enough power that way so the one I bought for my wife has sat in the drawer for quite a while. Recently though our regular backup drive failed so I really needed to get it working. Turns out they’ll ship you a free power adapter if you need it, you just have to email them. I did, and got a response within about 30 minutes to say the adapter would be in the mail asap. Needless to say, I’m seriously impressed and will be sticking with Freecom for any portable hard drives I need in the future.
    &lt;/p&gt;
&lt;p&gt;
       It’s easy to think of support as a cost centre for your business and something that should be outsourced, but the reality is that it’s one of the best opportunities for impressing your clients, building great word of mouth and perhaps most importantly, getting real world feedback on your products so you can make them better in the future.
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/468414210" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/29/support-sells/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/29/support-sells/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Swiss Christmas Break]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/25/swiss-christmas-break/" />
		<id>http://www.symphonious.net/?p=1026</id>
		<updated>2008-11-24T18:57:10Z</updated>
		<published>2008-11-24T18:45:30Z</published>
		<category scheme="http://www.symphonious.net" term="General" />		<summary type="html"><![CDATA[
       If you haven’t heard already, we’re spending our first Christmas away up in the Swiss Alps so we’ll be sure to get a white Christmas. &#160;We actually found a self guided tour from an Australian company which includes the hotel, Christmas lunch, a sleigh ride and a suggested [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/25/swiss-christmas-break/">&lt;p&gt;
       If you haven’t heard already, we’re spending our first Christmas away up in the Swiss Alps so we’ll be sure to get a white Christmas. &amp;#160;We actually found a self guided tour from an Australian company which includes the hotel, Christmas lunch, a sleigh ride and a suggested itinerary for exploring Switzerland. The train ticket they give us includes most of the travel around the country and discounts off the optional parts so we should wind up seeing quite a lot of the country.
    &lt;/p&gt;
&lt;p&gt;
       Anyway, we’ve got all the paper work so we thought we’d share it with you so you can see what we’ll be getting up to. The hotel contact details are in the PDF as well, but we’ll post our full contact details once we get there and know what room we’re in.
    &lt;/p&gt;
&lt;p&gt;
       Er, wrong blog… That link won’t work… &amp;#160;&lt;a href="http://www.thesuttons.name/"&gt;Look over there!&lt;/a&gt;
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/464168119" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/25/swiss-christmas-break/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/25/swiss-christmas-break/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Personally Identifiable]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/25/personally-identifiable/" />
		<id>http://www.symphonious.net/?p=1023</id>
		<updated>2008-11-24T16:37:12Z</updated>
		<published>2008-11-24T16:36:14Z</published>
		<category scheme="http://www.symphonious.net" term="Identity" />		<summary type="html"><![CDATA[
       Andy Baio did an experiment with Mechanical Turk which is somewhat interesting on it’s own, but what really caught my eye was:
    


         Upload a photo of yourself…
      

    [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/25/personally-identifiable/">&lt;p&gt;
       &lt;a href="http://waxy.org/2008/11/the_faces_of_mechanical_turk/"&gt;Andy Baio did an experiment with Mechanical Turk&lt;/a&gt; which is somewhat interesting on it’s own, but what really caught my eye was:
    &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
         Upload a photo of yourself…
      &lt;/p&gt;
&lt;p&gt;
         DON&amp;#39;T provide any identifiable information, like your name or email, since that&amp;#39;s a violation of MTurk policy.
      &lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
       When did technology take over so much that our face, the single most important aspect our brains use in identifying people, become not personally identifiable information?
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/464050938" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/25/personally-identifiable/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/25/personally-identifiable/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Debugging Deadlocks - Print All Stack Traces]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/" />
		<id>http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/</id>
		<updated>2008-11-24T11:00:18Z</updated>
		<published>2008-11-24T10:54:52Z</published>
		<category scheme="http://www.symphonious.net" term="Code and Geek Stuff" /><category scheme="http://www.symphonious.net" term="Java" />		<summary type="html"><![CDATA[
       One of the hardest types of bugs to track down is a deadlock situation. They are very time dependant which makes them intermitten, specific to a particular computer and configuration and generally impossible to reproduce in a debugger. Fortunately, at least in Java, it’s fairly easy to spot [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/">&lt;p&gt;
       One of the hardest types of bugs to track down is a deadlock situation. They are very time dependant which makes them intermitten, specific to a particular computer and configuration and generally impossible to reproduce in a debugger. Fortunately, at least in Java, it’s fairly easy to spot most of the situations where a deadlock is possible:
    &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        Calls to SwingUtilities.invokeAndWait
      &lt;/li&gt;
&lt;li&gt;
        Calls to Object.wait()
      &lt;/li&gt;
&lt;li&gt;
        synchronized blocks
      &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
       There might be a few others depending on the libraries you’re using, but starting with those three, in that order, is very likely to lead you to at least one point in the deadlock. &amp;#160;Just put an old fashioned System.err.println before and after each of those calls and you’ll quite quickly see where things are waiting forever.
    &lt;/p&gt;
&lt;p&gt;
       Deadlocks have to have at least two threads involved. To find the other one, you need to print the stack traces of all the other threads immediately before you actually hit the deadlock. &amp;#160;So once you’ve found one call that’s part of the deadlock, add a call to the method below just before it.
    &lt;/p&gt;
&lt;pre class="code"&gt;
&lt;span class="java_keyword"&gt;private&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_keyword"&gt;static&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_type"&gt;void&lt;/span&gt;&lt;span class="java_plain"&gt; printAllStackTraces&lt;/span&gt;&lt;span class="java_separator"&gt;()&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_type"&gt;Map&lt;/span&gt;&lt;span class="java_plain"&gt; liveThreads &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_type"&gt;Thread&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;getAllStackTraces&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_keyword"&gt;for&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;Iterator&lt;/span&gt;&lt;span class="java_plain"&gt; i &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; liveThreads&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;keySet&lt;/span&gt;&lt;span class="java_separator"&gt;().&lt;/span&gt;&lt;span class="java_plain"&gt;iterator&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;&lt;span class="java_plain"&gt; i&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;hasNext&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;      &lt;/span&gt;&lt;span class="java_type"&gt;Thread&lt;/span&gt;&lt;span class="java_plain"&gt; key &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;Thread&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt;i&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;next&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;
&lt;span class="java_plain"&gt;      &lt;/span&gt;&lt;span class="java_type"&gt;System&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;err&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;println&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;Thread &amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;+&lt;/span&gt;&lt;span class="java_plain"&gt; key&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;getName&lt;/span&gt;&lt;span class="java_separator"&gt;());&lt;/span&gt;
&lt;span class="java_plain"&gt;        &lt;/span&gt;&lt;span class="java_type"&gt;StackTraceElement&lt;/span&gt;&lt;span class="java_separator"&gt;[]&lt;/span&gt;&lt;span class="java_plain"&gt; trace &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;StackTraceElement&lt;/span&gt;&lt;span class="java_separator"&gt;[])&lt;/span&gt;&lt;span class="java_plain"&gt;liveThreads&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;get&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;key&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;        &lt;/span&gt;&lt;span class="java_keyword"&gt;for&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;int&lt;/span&gt;&lt;span class="java_plain"&gt; j &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_literal"&gt;0&lt;/span&gt;&lt;span class="java_separator"&gt;;&lt;/span&gt;&lt;span class="java_plain"&gt; j &lt;/span&gt;&lt;span class="java_operator"&gt;&amp;#60;&lt;/span&gt;&lt;span class="java_plain"&gt; trace&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;length&lt;/span&gt;&lt;span class="java_separator"&gt;;&lt;/span&gt;&lt;span class="java_plain"&gt; j&lt;/span&gt;&lt;span class="java_operator"&gt;++&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;            &lt;/span&gt;&lt;span class="java_type"&gt;System&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;err&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;println&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;\tat &amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;+&lt;/span&gt;&lt;span class="java_plain"&gt; trace&lt;/span&gt;&lt;span class="java_separator"&gt;[&lt;/span&gt;&lt;span class="java_plain"&gt;j&lt;/span&gt;&lt;span class="java_separator"&gt;]);&lt;/span&gt;
&lt;span class="java_plain"&gt;        &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
       You’ll get a whole bunch of threads and with a bit of digging around to see exactly what the code is doing in each thread you’ll probably find a pair of threads like below that are waiting on each other (package names removed to make things shorter):
    &lt;/p&gt;
&lt;pre&gt;
Thread Thread-14
 at Object.wait(Native Method) at java.lang.Object.wait(Object.java:474)
 at EventQueue.invokeAndWait(EventQueue.java:848)
 at SwingUtilities.invokeAndWait(SwingUtilities.java:1257)
 at CachingFileDownloader.run(CachingFileDownloader.java:204)
 at WorkerThread.run(WorkerThread.java:49)
Thread AWT-EventQueue-2
 at Object.wait(Native Method)
 at Object.wait(Object.java:474)
 at CachingFileDownloader.waitUntilDownloadComplete(CachingFileDownloader.java:290)
&amp;#60;snip&amp;#62;
&lt;/pre&gt;
&lt;p&gt;
       Yep, the swing thread is waiting on the download and the download thread is trying to do something on the swing thread via invokeAndWait. It’s actually trying to close the download progress dialog which can most likely just use an invokeLater, thus avoiding the deadlock.
    &lt;/p&gt;
&lt;p&gt;
       This is also a really good example of why I put SwingUtilities.invokeAndWait at the top of my hit list. Also, the actual call to invokeAndWait that I put the debugging above, wasn’t really involved in the deadlock, it just happened to need to wait on the Swing thread as well and wound up waiting forever because the other two threads were deadlocked with each other.
    &lt;/p&gt;
&lt;p&gt;
       As a side note, I think this is the first time since we started publishing the twice daily builds to my blog automatically that I’ve had a catastrophic failure where I couldn’t post at all. That’s not a bad run considering it’s been at least a couple of years living on the edge.
    &lt;/p&gt;
&lt;p&gt;
       Sigh, and upon hitting save I find that the debugging code I added above can cause security exceptions when triggered as part of our form submission process in Safari (but not FireFox) on OS X. So if you originally saw this post with no content, that would be why…
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/463756464" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/#comments" thr:count="6" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/24/debugging-deadlocks-print-all-stack-traces/feed/atom/" thr:count="6" />
		<thr:total>6</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[200 Means OK!]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/21/200-means-ok/" />
		<id>http://www.symphonious.net/?p=1014</id>
		<updated>2008-11-20T15:39:11Z</updated>
		<published>2008-11-20T15:39:11Z</published>
		<category scheme="http://www.symphonious.net" term="System Administration" />		<summary type="html"><![CDATA[
       While many web visionaries are busy advocating the correct use of ETags and URIs etc etc, I just wish people could get the very basics of HTTP right. &#160;I’m not even talking about mime-types here, just status codes would be a really good place to start.
   [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/21/200-means-ok/">&lt;p&gt;
       While many web visionaries are busy advocating the correct use of ETags and URIs etc etc, I just wish people could get the very basics of HTTP right. &amp;#160;I’m not even talking about mime-types here, just status codes would be a really good place to start.
    &lt;/p&gt;
&lt;p&gt;
       If you’re returning the page as requested, use 200.
    &lt;/p&gt;
&lt;p&gt;
       If you’re returning a server error, use 500.
    &lt;/p&gt;
&lt;p&gt;
       If the requested page doesn’t exist, use 404.
    &lt;/p&gt;
&lt;p&gt;
       If you can follow even just those three rules, you’ll make life so much easier for user agents. Anything about that is great too, but whatever you do, please get these basics right.
    &lt;/p&gt;
&lt;p&gt;
       Epic fail to IIS and IBM Portal on these points. &amp;#160;Something is seriously wrong with the internet…
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/459680338" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/21/200-means-ok/#comments" thr:count="2" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/21/200-means-ok/feed/atom/" thr:count="2" />
		<thr:total>2</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Hold The Phone&#8230;]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/18/hold-the-phone/" />
		<id>http://www.symphonious.net/?p=999</id>
		<updated>2008-11-18T08:34:00Z</updated>
		<published>2008-11-18T08:22:41Z</published>
		<category scheme="http://www.symphonious.net" term="General" />		<summary type="html"><![CDATA[
       James Duncan Davidson did the math and found he was better off without a land line phone:
    

      Once the numbers have been looked it, however, it makes more sense to just go all the way. Of course, if $2400 [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/18/hold-the-phone/">&lt;p&gt;
       &lt;a href="http://feeds.duncandavidson.com/~r/duncandavidson/blog/~3/456757186/cutting-the-landline.html"&gt;James Duncan Davidson did the math and found he was better off without a land line phone&lt;/a&gt;:
    &lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;
      Once the numbers have been looked it, however, it makes more sense to just go all the way. Of course, if $2400 per year was the only way to have decent access to the Internet, it’d be a different story. But it doesn’t need to cost that much anymore. So I’m cutting the twisted pair lines. Because, you know, they are historic and quant. Sure, a land line still sounds better than most mobile phone calls, but 3G calls are getting there in terms of clarity and on a good day sound as good to me as a land line. In a few years, they&amp;#39;ll be even better.
    &lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;
       Interestingly, I just got my phone bill from BT and am more glad than ever that I have a land line:
    &lt;/p&gt;
&lt;table cellspacing="0" summary="Number of calls categorized by destination type." border="1" cellpadding="0"&gt;
&lt;tr&gt;
&lt;th&gt;
          Call Destination
        &lt;/th&gt;
&lt;th&gt;
          Call Count
        &lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="50%"&gt;
          Daytime
        &lt;/td&gt;
&lt;td width="50%" style=" text-align: center;"&gt;
          13
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="50%"&gt;
          Mobile
        &lt;/td&gt;
&lt;td width="50%" style=" text-align: center;"&gt;
          9
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="50%"&gt;
          0870 and 0845
        &lt;/td&gt;
&lt;td width="50%" style=" text-align: center;"&gt;
          4
        &lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width="50%"&gt;
          International
        &lt;/td&gt;
&lt;td width="50%" style=" text-align: center;"&gt;
          &lt;strong&gt;102&lt;/strong&gt;
        &lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;
       Nearly all of those international calls are an hour long by the way, about 16 hours per month on the phone. Total cost: £25/month. Try doing that with a mobile phone!
    &lt;/p&gt;
&lt;p&gt;
       You could do it with VOIP which I’ve done in the past but the reliability is poor and the call quality is hit and miss. &amp;#160;With our land line we get consistently good connections and can use the phone without worrying about doing the tech support for it.
    &lt;/p&gt;
&lt;p&gt;
       You know, the way life should be…
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/456936368" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/18/hold-the-phone/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/18/hold-the-phone/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[A Scary Thought]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/17/a-scary-thought/" />
		<id>http://www.symphonious.net/?p=997</id>
		<updated>2008-11-17T09:29:21Z</updated>
		<published>2008-11-17T09:29:21Z</published>
		<category scheme="http://www.symphonious.net" term="Editors" /><category scheme="http://www.symphonious.net" term="Ephox" />		<summary type="html"><![CDATA[
       While reviewing some screen mockups for EditLive! today, it occurred to me just how limited an environment we’re forced to work in. It turns out that the default, and thus most common, size of a rich text area in IBM WCM is 740&#215;450 (note to Ephoxians, I mistakenly [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/17/a-scary-thought/">&lt;p&gt;
       While reviewing some screen mockups for EditLive! today, it occurred to me just how limited an environment we’re forced to work in. It turns out that the default, and thus most common, size of a rich text area in IBM WCM is 740&amp;#215;450 (note to Ephoxians, I mistakenly quoted this as 740&amp;#215;360 earlier so we have slightly more vertical space than I thought). &amp;#160;Even in my blog’s editing interface, the editor is 718&amp;#215;600.
    &lt;/p&gt;
&lt;p&gt;
       That doesn’t sound too bad until you realize that the iPhone has a screen that’s 480&amp;#215;320.
    &lt;/p&gt;
&lt;p&gt;
       Now an extra couple of hundred pixels width makes a huge difference, but when you look at how much time people spend trying to strip out functions and minimize UI in iPhone apps, it’s scary to think that we aim to pack the functionality of Microsoft Word into that kind of space.
    &lt;/p&gt;
&lt;p&gt;
       I think the only reason we manage it is by providing real drop down menus, whereas most in-browser editors just try to cram everything on to the toolbar. At least I know why UI design for EditLive! is such a challenge…
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/455796498" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/17/a-scary-thought/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/17/a-scary-thought/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Simpler Inline Editing In IWWCM]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/16/simpler-inline-editing-in-iwwcm/" />
		<id>http://www.symphonious.net/?p=994</id>
		<updated>2008-11-15T16:28:04Z</updated>
		<published>2008-11-15T16:26:41Z</published>
		<category scheme="http://www.symphonious.net" term="General" />		<summary type="html"><![CDATA[
       IWWCM has a component specifically to provide “inline editing” - in other words, adding links to content items so you can quickly edit, accept, reject or delete if you’re logged in as a user who has permission to do such things. &#160;I have two problems with this approach:
 [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/16/simpler-inline-editing-in-iwwcm/">&lt;p&gt;
       IWWCM has a component specifically to provide “inline editing” - in other words, adding links to content items so you can quickly edit, accept, reject or delete if you’re logged in as a user who has permission to do such things. &amp;#160;I have two problems with this approach:
    &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        You have to be logged in to see the links.
      &lt;/li&gt;
&lt;li&gt;
        The links affect the way the page looks so you don’t see the site the same way as normal visitors.
      &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
       Within a portal environment or even an intranet, neither of those problems really apply, but when you’re publishing out a public website they can be an issue.
    &lt;/p&gt;
&lt;p&gt;
       Fortunately, there’s nothing particularly special about the authoring component that provides these functions - it’s just a thin veneer over IWWCM remote access, which in turn is really just a defined set of URLs that you call to get stuff to happen. Thus, you can implement your own inline editing solution by generating those URLs wherever you want them.
    &lt;/p&gt;
&lt;p&gt;
       The tricky part is that the URLs have to include the document ID which is only available via WCM tags within an authoring component. With a little bit of custom code using the WCM API you can find the right ID and generate the URL you need:
    &lt;/p&gt;
&lt;pre class="code"&gt;
&lt;span class="java_operator"&gt;&amp;#60;%&lt;/span&gt;&lt;span class="java_plain"&gt;@ page &lt;/span&gt;&lt;span class="java_keyword"&gt;import&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;java.io.*&amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;%&lt;/span&gt;&lt;span class="java_plain"&gt;@ page &lt;/span&gt;&lt;span class="java_keyword"&gt;import&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;java.util.*&amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;%&lt;/span&gt;&lt;span class="java_plain"&gt;@ page &lt;/span&gt;&lt;span class="java_keyword"&gt;import&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;javax.servlet.*&amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;%&lt;/span&gt;&lt;span class="java_plain"&gt;@ page &lt;/span&gt;&lt;span class="java_keyword"&gt;import&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;com.ibm.workplace.wcm.api.*&amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;%&lt;/span&gt;&lt;span class="java_plain"&gt;@ page &lt;/span&gt;&lt;span class="java_keyword"&gt;import&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;com.ibm.workplace.wcm.api.exceptions.*&amp;quot;&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;%!&lt;/span&gt;
&lt;span class="java_type"&gt;String&lt;/span&gt;&lt;span class="java_plain"&gt; getContentId&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;String&lt;/span&gt;&lt;span class="java_plain"&gt; path&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_keyword"&gt;try&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_type"&gt;Workspace&lt;/span&gt;&lt;span class="java_plain"&gt; ws &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; WCM_API&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;getRepository&lt;/span&gt;&lt;span class="java_separator"&gt;().&lt;/span&gt;&lt;span class="java_plain"&gt;getAnonymousWorkspace&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;
&lt;span class="java_plain"&gt;    path &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; path&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;substring&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;1&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_type"&gt;int&lt;/span&gt;&lt;span class="java_plain"&gt; delimEntry &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; path&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;indexOf&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_type"&gt;String&lt;/span&gt;&lt;span class="java_plain"&gt; libName &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; path&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;substring&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;0&lt;/span&gt;&lt;span class="java_separator"&gt;,&lt;/span&gt;&lt;span class="java_plain"&gt; delimEntry&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;    ws&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;setCurrentDocumentLibrary&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;ws&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;getDocumentLibrary&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;libName&lt;/span&gt;&lt;span class="java_separator"&gt;));&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_type"&gt;DocumentIdIterator&lt;/span&gt;&lt;span class="java_plain"&gt; contentIdIterator &lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_plain"&gt; ws&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;findContentByPath&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;path&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_keyword"&gt;if&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;contentIdIterator&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;hasNext&lt;/span&gt;&lt;span class="java_separator"&gt;())&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;      &lt;/span&gt;&lt;span class="java_keyword"&gt;return&lt;/span&gt;&lt;span class="java_plain"&gt; contentIdIterator&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;next&lt;/span&gt;&lt;span class="java_separator"&gt;().&lt;/span&gt;&lt;span class="java_plain"&gt;toString&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;
&lt;span class="java_plain"&gt;    &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_keyword"&gt;catch&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_type"&gt;Throwable&lt;/span&gt;&lt;span class="java_plain"&gt; t&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;    t&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;printStackTrace&lt;/span&gt;&lt;span class="java_separator"&gt;();&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_keyword"&gt;return&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="java_separator"&gt;;&lt;/span&gt;
&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_operator"&gt;%&amp;#62;&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;&lt;/span&gt;&lt;span class="java_plain"&gt;script type&lt;/span&gt;&lt;span class="java_operator"&gt;=&lt;/span&gt;&lt;span class="java_literal"&gt;&amp;quot;text/javascript&amp;quot;&lt;/span&gt;&lt;span class="java_operator"&gt;&amp;#62;&lt;/span&gt;
&lt;span class="java_plain"&gt;function doKeyDown&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;event&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_keyword"&gt;if&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_plain"&gt;event&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;ctrlKey&lt;/span&gt;&lt;span class="java_operator"&gt;==&lt;/span&gt;&lt;span class="java_literal"&gt;1&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;&amp;#38;&amp;#38;&lt;/span&gt;&lt;span class="java_plain"&gt; event&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;altKey&lt;/span&gt;&lt;span class="java_operator"&gt;==&lt;/span&gt;&lt;span class="java_literal"&gt;1&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_operator"&gt;&amp;#38;&amp;#38;&lt;/span&gt;&lt;span class="java_plain"&gt; event&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;keyCode&lt;/span&gt;&lt;span class="java_operator"&gt;==&lt;/span&gt;&lt;span class="java_literal"&gt;69&lt;/span&gt;&lt;span class="java_separator"&gt;)&lt;/span&gt;&lt;span class="java_plain"&gt; &lt;/span&gt;&lt;span class="java_separator"&gt;{&lt;/span&gt;
&lt;span class="java_plain"&gt;    window&lt;/span&gt;&lt;span class="java_separator"&gt;.&lt;/span&gt;&lt;span class="java_plain"&gt;open&lt;/span&gt;&lt;span class="java_separator"&gt;(&lt;/span&gt;&lt;span class="java_literal"&gt;  &amp;quot;/wps/myportal/wcmAuthoring?wcmAuthoringAction=edit&amp;#38;docid=&amp;#60;%=
    getContentId(request.getPathInfo()) %&amp;#62;&amp;quot;&lt;/span&gt;&lt;span class="java_separator"&gt;,&lt;/span&gt;&lt;span class="java_literal"&gt;  &amp;quot;lwedit&amp;quot;&lt;/span&gt;&lt;span class="java_separator"&gt;);&lt;/span&gt;
&lt;span class="java_plain"&gt;  &lt;/span&gt;&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_separator"&gt;}&lt;/span&gt;
&lt;span class="java_operator"&gt;&amp;#60;/&lt;/span&gt;&lt;span class="java_plain"&gt;script&lt;/span&gt;&lt;span class="java_operator"&gt;&amp;#62;&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
       Now you have a magical bit of JavaScript that will popup the edit window whenever you type control-alt-E. If you’re not logged in it will prompt you to authenticate first, then take you to the edit page.
    &lt;/p&gt;
&lt;p&gt;
       PS: The code is rubbish, but it proves out the idea nicely.
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/454114673" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/16/simpler-inline-editing-in-iwwcm/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/16/simpler-inline-editing-in-iwwcm/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[The Trouble with the iPhone]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/13/the-trouble-with-the-iphone/" />
		<id>http://www.symphonious.net/2008/11/13/the-trouble-with-the-iphone/</id>
		<updated>2008-11-12T16:26:00Z</updated>
		<published>2008-11-12T16:26:00Z</published>
		<category scheme="http://www.symphonious.net" term="General" />		<summary type="html"><![CDATA[You&#8217;re sitting on the train listening to music on your iPhone. Your wife rings, you answer it and the girl sitting cross from you suddenly gives you an odd look. What went wrong?
When you have headphones in the iPhone makes no audible ringing noise. So people around you have no idea that you just took [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/13/the-trouble-with-the-iphone/">&lt;p&gt;You&amp;#8217;re sitting on the train listening to music on your iPhone. Your wife rings, you answer it and the girl sitting cross from you suddenly gives you an odd look. What went wrong?&lt;/p&gt;
&lt;p&gt;When you have headphones in the iPhone makes no audible ringing noise. So people around you have no idea that you just took a call. Not that Id change this but it does generate some odd looks. Especially when you answer with &amp;#8220;hey sweety&amp;#8221;. &lt;/p&gt;
&lt;p&gt;Oh well.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/450856904" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/13/the-trouble-with-the-iphone/#comments" thr:count="1" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/13/the-trouble-with-the-iphone/feed/atom/" thr:count="1" />
		<thr:total>1</thr:total>
	</entry>
		<entry>
		<author>
			<name>Adrian Sutton</name>
						<uri>http://www.symphonious.net</uri>
					</author>
		<title type="html"><![CDATA[Ephox Meme: 5 Favorite Features]]></title>
		<link rel="alternate" type="text/html" href="http://www.symphonious.net/2008/11/12/ephox-meme-5-favorite-features/" />
		<id>http://www.symphonious.net/?p=990</id>
		<updated>2008-11-11T15:46:14Z</updated>
		<published>2008-11-11T15:46:14Z</published>
		<category scheme="http://www.symphonious.net" term="Editors" /><category scheme="http://www.symphonious.net" term="Ephox" />		<summary type="html"><![CDATA[
       The Ephox bloggers have been way too quiet lately (myself included) so I thought I’d start an Ephox meme. What’s your 5 favorite features of any of Ephox’s products? &#160;They might be built in or plugins that we’ve developed, maybe even features of our internal systems that make [...]]]></summary>
		<content type="html" xml:base="http://www.symphonious.net/2008/11/12/ephox-meme-5-favorite-features/">&lt;p&gt;
       The Ephox bloggers have been way too quiet lately (myself included) so I thought I’d start an Ephox meme. What’s your 5 favorite features of any of Ephox’s products? &amp;#160;They might be built in or plugins that we’ve developed, maybe even features of our internal systems that make your life easier, but preferably something that our clients could get hold of (teasing people just isn’t nice).
    &lt;/p&gt;
&lt;p&gt;
       Here’s my list:
    &lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
        Built-in Image Editor. Particularly being able to resize an image and add rounded corners and drop shadow.
      &lt;/li&gt;
&lt;li&gt;
        Pop out window mode. More editing space is always good.
      &lt;/li&gt;
&lt;li&gt;
        Automatically detecting URLs on the clipboard and using them as the default value in the hyperlink dialog.
      &lt;/li&gt;
&lt;li&gt;
        Styles menu. Not that I use it on this blog, but having access to classes in the site style sheet make it so easy &amp;#160;to apply some really nice formatting with just a couple of clicks. &amp;#160;The styles package prototype we use internally a lot is particularly useful for this.
      &lt;/li&gt;
&lt;li&gt;
        The extensible APIs. It’s so nice to be able to quickly add support for footnotes, a shiny button generator or whatever I happen to want this week. I wish more clients used this functionality to make life easier for their users - even if it was just by providing a handful of simple templates they could insert.
      &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
       I tag &lt;a href="http://www.slackcoders.com/suneth/"&gt;Suneth&lt;/a&gt;, &lt;a href="http://people.ephox.com/damien/"&gt;Damien&lt;/a&gt; and &lt;a href="http://hamstaa.hbhau.net/"&gt;Brett&lt;/a&gt;…
    &lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/symphonious/~4/449654300" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://www.symphonious.net/2008/11/12/ephox-meme-5-favorite-features/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://www.symphonious.net/2008/11/12/ephox-meme-5-favorite-features/feed/atom/" thr:count="0" />
		<thr:total>0</thr:total>
	</entry>
	</feed>
