<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;DkYBSXY4fyp7ImA9WhRREUw.&quot;"><id>tag:blogger.com,1999:blog-6757823</id><updated>2011-11-23T21:55:58.837-08:00</updated><category term="ethics" /><category term="mobile" /><category term="office2.0" /><category term="xml" /><category term="gtd" /><category term="java" /><category term="tool" /><category term="html5" /><category term="exist" /><category term="offline" /><category term="free will" /><category term="skype" /><category term="language" /><category term="tomcat" /><category term="intellij" /><category term="oracle" /><category term="realestate" /><category term="firefox" /><category term="orbeon" /><category term="travel" /><category term="iphone" /><category term="css" /><category term="hiking" /><category term="web2.0" /><category term="ie6" /><category term="unix" /><category term="html" /><category term="mac" /><category term="xpath" /><category term="health" /><category term="prediction" /><category term="hardware" /><category term="safari" /><category term="google" /><title>Alessandro Vernet's Blog</title><subtitle type="html">&lt;a href="http://twitter.com/#!/avernet"&gt;@avernet&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://avernet.blogspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>133</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/avernet" /><feedburner:info uri="avernet" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><logo>http://creativecommons.org/images/public/somerights20.gif</logo><feedburner:emailServiceId>avernet</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><entry gd:etag="W/&quot;C0MAQHg_eip7ImA9WhRTGUg.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-8437808745195944542</id><published>2011-11-10T10:47:00.001-08:00</published><updated>2011-11-10T10:57:21.642-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-11-10T10:57:21.642-08:00</app:edited><title>The Ideal Programming Language</title><content type="html">&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-FjL4roWOAW8/TrweII3P2tI/AAAAAAAADcw/lLrqeh8g63A/s1600/Escher_Waterfall.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="320" src="http://1.bp.blogspot.com/-FjL4roWOAW8/TrweII3P2tI/AAAAAAAADcw/lLrqeh8g63A/s320/Escher_Waterfall.jpg" width="250" /&gt;&lt;/a&gt;&lt;/div&gt;
My requirements for the &lt;i&gt;ideal programming language&lt;/i&gt;,&amp;nbsp;roughly&amp;nbsp;sorted by order of importance:&lt;br /&gt;
&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Can be used &lt;b&gt;equally well&lt;/b&gt; for code that will run on the &lt;b&gt;server-side&lt;/b&gt; (most likely targeting the JVM) and on the &lt;b&gt;client-side&lt;/b&gt; (for now, this means compiling to JavaScript). This is key for people to be able to use the language. Nowadays, a language that also comes with its own environment is unlikely to be adopted. [Unlike Haskell; like Dart]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Strongly typed&lt;/b&gt;, with &lt;b&gt;type inference across compilation units&lt;/b&gt;, i.e. not to force type declarations on "public APIs" (even if having them, most of the time, might be a good idea). [Unlike Scala; like Haskell]&lt;/li&gt;
&lt;li&gt;Provide &lt;b&gt;rich constructs&lt;/b&gt;, like case classes, traits, partial functions, continuations… The world is complex, and our programs try to model it, and the right constructs make the programmer's job easier, and the code simpler. (See the &lt;a href="http://www.infoq.com/presentations/Simple-Made-Easy"&gt;simple vs. easy&lt;/a&gt; distinction made by Rich Hickey.) [Like Scala]&lt;/li&gt;
&lt;li&gt;Adhere to the &lt;b&gt;off-side rule&lt;/b&gt;. Because syntax matters. [Like Python, Haskell, CoffeeScript, F#; unlike Scala, Dart…]&lt;/li&gt;
&lt;li&gt;Provide a &lt;b&gt;rich data type library&lt;/b&gt;. [Like Scala; unlike JavaScript]&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Compilation&lt;/b&gt; should be &lt;b&gt;fast&lt;/b&gt; enough that developers don't feel compiling/building as an additional, lengthy step that needs to happen before they can run code. I.e. when writing code running in the browser, programmers should be able to make a change in their editor, cmd-tab to the browser, reload the page, and see the change. [Unlike Scala]&lt;/li&gt;
&lt;li&gt;Don't force "object oriented" paradigms on programmers. E.g. the standard way to write a program shouldn't necessarily be to start defining a class. [Unlike Java, Scala]&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-8437808745195944542?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/sbbqbNc75LQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/8437808745195944542/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=8437808745195944542" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/8437808745195944542?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/8437808745195944542?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/sbbqbNc75LQ/ideal-programming-language.html" title="The Ideal Programming Language" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/-FjL4roWOAW8/TrweII3P2tI/AAAAAAAADcw/lLrqeh8g63A/s72-c/Escher_Waterfall.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2011/11/ideal-programming-language.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkIGQn08cSp7ImA9WhdQFk0.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-6166675706352095777</id><published>2011-08-17T12:11:00.000-07:00</published><updated>2011-08-17T12:15:23.379-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2011-08-17T12:15:23.379-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="free will" /><title>Is "free will" a fallacy? (Hint: the fallacy is in its definition)</title><content type="html">&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-GFa4kLQo_Wo/TkwQPB_3P6I/AAAAAAAADYg/yC2TaGhsjcQ/s1600/2971210465_6f81c903d6.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"&gt;&lt;img border="0" height="240" src="http://3.bp.blogspot.com/-GFa4kLQo_Wo/TkwQPB_3P6I/AAAAAAAADYg/yC2TaGhsjcQ/s320/2971210465_6f81c903d6.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
It is irrelevant how brilliant your demonstration is: if you start with an incorrect hypothesis, your conclusion has no value.&lt;br /&gt;
&lt;br /&gt;
Take Daniel Miessler article concluding &lt;a href="http://danielmiessler.com/blog/the-two-lever-argument-against-free-will"&gt;free will is an illusion&lt;/a&gt;, also &lt;a href="http://draft.blogger.com/goog_1765397162"&gt;mentioned&lt;/a&gt;&lt;a href="http://twitter.com/#%21/SamHarrisOrg/status/103130595357499393"&gt; by Sam Harris&lt;/a&gt;. His hypothesis is that "true (free) influence on the world"—whatever that "true (free)" designation means—requires the ability to &lt;i&gt;change the previous state of the world&lt;/i&gt; or to &lt;i&gt;change the laws that govern the universe&lt;/i&gt;.&lt;br /&gt;
&lt;br /&gt;
This is very much at odd with the common understanding of the word &lt;i&gt;influence&lt;/i&gt;. Say you fail to see a banana peel on the curb, slip on it, and fail. Wouldn't you say that the banana peel influenced your fall? You would, as without it, most likely, you wouldn't have fallen. And I assure you that the banana peel neither &lt;i&gt;changed the previous state of the world&lt;/i&gt; nor &lt;i&gt;changed the laws that govern the universe&lt;/i&gt;. &lt;br /&gt;
&lt;br /&gt;
Unfortunately, bending the meaning of words, or even worse, completely omitting definitions, too often plagues discussions on free will.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-6166675706352095777?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/VxUZilEQs34" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/6166675706352095777/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=6166675706352095777" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6166675706352095777?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6166675706352095777?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/VxUZilEQs34/is-free-will-fallacy-hint-no-fallacy-is.html" title="Is &quot;free will&quot; a fallacy? (Hint: the fallacy is in its definition)" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-GFa4kLQo_Wo/TkwQPB_3P6I/AAAAAAAADYg/yC2TaGhsjcQ/s72-c/2971210465_6f81c903d6.jpg" height="72" width="72" /><thr:total>7</thr:total><feedburner:origLink>http://avernet.blogspot.com/2011/08/is-free-will-fallacy-hint-no-fallacy-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUAHRHo-fyp7ImA9Wx9TF0s.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-7428206724417771602</id><published>2010-11-26T01:24:00.001-08:00</published><updated>2010-11-26T01:28:55.457-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-26T01:28:55.457-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="html5" /><title>Autocomplete and JavaScript Change Event</title><content type="html">&lt;p&gt;&lt;strong&gt;Different Sorts of Autocomplete&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to autocomplete in browsers, you need to make distinction between autocomplete for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Username/password&lt;/strong&gt; — Once you have a username and password saved for a certain login form, the browser will pre-fill the username and password fields with the saved values.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;General form fields&lt;/strong&gt; — Most browsers, including &lt;a href="http://support.mozilla.com/en-US/kb/Form+autocomplete"&gt;Firefox&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/ms533032%28VS.85%29.aspx"&gt;IE&lt;/a&gt;, and &lt;a href="http://www.google.com/support/chrome/bin/answer.py?answer=142893&amp;amp;hl=en-US"&gt;Chrome&lt;/a&gt;, provides a similar autocomplete interface for form fields: as you start typing in a field, the browser will provide a list of suggestions. If you select one, the value you select will be used to populate the field. (Chrome might, based on the choice you made, also populate other related fields.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/6900/resources/20101125-autocomplete.png" alt="Typical autocomplete UI" title=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The HTML Specification&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When it comes to DOM event, and in particular the &lt;code&gt;change&lt;/code&gt; event, there is a significant difference between those two cases: username/password fields are auto-filled immediately when the page is shown; for other fields, you explicitly select a value from a list and tab to another field. This is important in the context of the HTML specification. The HTML 4.01 specification &lt;a href="http://www.w3.org/TR/html401/interact/scripts.html#adef-onchange"&gt;says&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;The &lt;code&gt;onchange&lt;/code&gt; event occurs when a control loses the input focus and its value has been modified since gaining focus.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;My interpretation is that browsers should dispatch the &lt;code&gt;change&lt;/code&gt; event when users select a value from a list of suggestions, but not when browsers pre-fill the username and password fields, as in that case the username and password fields don't gain and loose the focus. &lt;a href="http://www.w3.org/TR/html5/common-input-element-attributes.html#event-input-change"&gt;HTML 5&lt;/a&gt; is more abstract (emphasis mine):&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;When the &lt;code&gt;change&lt;/code&gt; event applies, if the element does not have an activation behavior defined but uses a user interface that involves an explicit commit action, then any time &lt;em&gt;the user commits a change&lt;/em&gt; to the element's value or list of selected files, the user agent must queue a task to fire a simple event that bubbles named change at the input element, then broadcast &lt;code&gt;formchange&lt;/code&gt; events at the input element's form owner.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;HTML 4.01 talks about dispatching the &lt;code&gt;change&lt;/code&gt; event when the form field looses the focus, which makes sense for text fields, but doesn't for file selection fields (&lt;code&gt;&amp;lt;input type="file"&amp;gt;&lt;/code&gt;): in that case it make more sense to dispatch the &lt;code&gt;change&lt;/code&gt; event when the file has been selected, rather than wait for users to change the focus to another field. This is most likely why HTML5 talks about "users commiting the change" rather than "the control loosing the focus".&lt;/p&gt;

&lt;p&gt;Even with this HTML5 definition of the &lt;code&gt;change&lt;/code&gt; event, for the case of the username/password fields pre-filled by browsers as the page is loaded, I find it hard to argue that users "committed a change" by just loading the page. So based on my interpretation of the HTML 4.01 and HTML 5 specifications, I would expect browsers to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dispatch the &lt;code&gt;change&lt;/code&gt; event when users select a suggested value and tab to another field.&lt;/li&gt;
&lt;li&gt;Not dispatch the &lt;code&gt;change&lt;/code&gt; event to fields they pre-filled without users tabbing through the fields, such as the username/password fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Real World&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Expectations are rarely in line with reality, especially when it comes to browser behavior:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For username/password fields:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Firefox 4, IE 7, and IE 8 don't dispatch the &lt;code&gt;change&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;Safari 5 and Chrome 9 do dispatch the &lt;code&gt;change&lt;/code&gt; event.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For other form fields:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;IE 7 and IE 8 don't dispatch the &lt;code&gt;change&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;Firefox 4 does dispatch the change &lt;code&gt;change&lt;/code&gt; event when users select a value from a list of suggestions and tab out of the field.&lt;/li&gt;
&lt;li&gt;Chrome 9 does not dispatch the &lt;code&gt;change&lt;/code&gt; event.&lt;/li&gt;
&lt;li&gt;Safari 5 does dispatch the &lt;code&gt;change&lt;/code&gt; event.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can test this by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For username/password fields, load the &lt;a href="http://dl.dropbox.com/u/6900/resources/20101125-autocomplete-login.html"&gt;login test case&lt;/a&gt;. Enter a username/password, submit the form, tell the browser to remember the login, reload the form. On Firefox, Chrome, and Safari the password field comes pre-filled, but the change event is dispatched only by Chrome and Safari. On IE, the password will be pre-filled only after you enter the username, but even as you tab through the password field, no &lt;code&gt;change&lt;/code&gt; event is dispatched.&lt;/li&gt;
&lt;li&gt;For other form fields, use this &lt;a href="http://dl.dropbox.com/u/6900/resources/20101125-autocomplete-name.html"&gt;test case&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Workarounds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bottom line is that your JavaScript code can't rely on the &lt;code&gt;change&lt;/code&gt; event. If your code needs to know when the value of a field changes, you have two choices:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have some JavaScript code that runs at a regular interval, checks the value of all the fields, and calls your change handler when it notices that a value has changed.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/how_to_turn_off_form_autocompletion"&gt;Disable autocomplete&lt;/a&gt; by adding &lt;code&gt;autocomplete="off"&lt;/code&gt; on the &lt;code&gt;&amp;lt;form&amp;gt;&lt;/code&gt; element. This technique has been supported by browsers since IE 5 (March 1999) and Netscape 6.2 (October 2001), and now &lt;a href="http://www.w3.org/TR/html5/forms.html#attr-form-autocomplete"&gt;made its way&lt;/a&gt; into HTML5.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-7428206724417771602?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/YszUkHRCSFQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/7428206724417771602/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=7428206724417771602" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7428206724417771602?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7428206724417771602?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/YszUkHRCSFQ/autocomplete-and-javascript-change.html" title="Autocomplete and JavaScript Change Event" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>3</thr:total><feedburner:origLink>http://avernet.blogspot.com/2010/11/autocomplete-and-javascript-change.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUYASHs-eyp7ImA9Wx9TEU0.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-4275317309923487274</id><published>2010-11-18T11:03:00.001-08:00</published><updated>2010-11-18T11:05:49.553-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-18T11:05:49.553-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>Making readonly form fields easier to identify</title><content type="html">&lt;p&gt;Readonly form controls, or "&lt;a href="http://www.w3.org/TR/html5/association-of-controls-and-forms.html#enabling-and-disabling-form-controls"&gt;disabled&lt;/a&gt;" in the HTML parlance, can be hard to distinguish from fields users can type into. Firefox and IE are doing an equally bad job, and making the distinction would be close to impossible if the field was empty to start with:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/6900/resources/20101118-readonly-default.png" alt="How default readonly input and text area are rendered by IE 7 and Firefox 4" title=""&gt;&lt;/p&gt;

&lt;p&gt;Adding a grey background to disabled fields is a good way to help users distinguish between readonly (disabled) and read-write (non-disabled) form controls:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/6900/resources/20101118-readonly-background.png" alt="How readonly input and text area are rendered by IE 7 and Firefox 4 using a background color" title=""&gt;&lt;/p&gt;

&lt;p&gt;IE 7 onwards supports CSS &lt;a href="http://www.w3.org/TR/CSS21/selector.html#attribute-selectors"&gt;attribute selectors&lt;/a&gt;, so if you don't need to support IE 6, the following CSS will do the trick:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;textarea[disabled], input[disabled] { background-color: #eee }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;However, if you need to support IE 6, you'll need to decorate your readonly form controls with a class. Some frameworks, such as some &lt;a href="http://www.orbeon.com/"&gt;XForms implementations&lt;/a&gt;, do this automatically for you. For instance, if all your readonly form controls are automatically inside an element with the class &lt;code&gt;xforms-readonly&lt;/code&gt;, you can write:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;.xforms-readonly textarea, .xforms-readonly input { background-color: #eee }
&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-4275317309923487274?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/qaipIKqfn3w" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/4275317309923487274/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=4275317309923487274" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/4275317309923487274?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/4275317309923487274?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/qaipIKqfn3w/making-readonly-form-fields-easier-to.html" title="Making readonly form fields easier to identify" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2010/11/making-readonly-form-fields-easier-to.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8CRnc_fyp7ImA9Wx5aGEs.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-9219006223359025774</id><published>2010-11-15T14:41:00.000-08:00</published><updated>2010-11-15T14:41:07.947-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-15T14:41:07.947-08:00</app:edited><title>Indemnification</title><content type="html">&lt;p&gt;&lt;em&gt;(First, two words of disclaimer: &lt;a href="http://en.wikipedia.org/wiki/IANAL"&gt;IANAL&lt;/a&gt;—TINLA. Seriously.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you are selling software, your customers might occasionally ask you if you provide indemnification. In a nutshell, your customers are looking to be protected in case your software infringes on a third-party intellectual property, such as a patent or copyrighted code, and as a consequence your customers gets sued by this third party. By agreeing to provide indemnification coverage to your customers, you are telling them that if this were to happen, you would:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Defend them in court, and pay for &lt;strong&gt;legal fees&lt;/strong&gt; — hiring the legal team or covering legal cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Repair or replace&lt;/strong&gt; your product — changing your software as necessary, so it doesn't infringe anymore on any third-party intellectual property. Depending on how your indemnification clause is written, this may mean removing, instead of replacing, the infringing functionality.&lt;/li&gt;
&lt;li&gt;Pay for &lt;strong&gt;damages and settlement fees&lt;/strong&gt; — those being damages you occasioned to your customers and settlement fees your customers might have to pay to a third-party as a result of you infringing on that third-party intellectual property.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Indemnification clauses often include limitations:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;In scope&lt;/strong&gt; —&amp;nbsp;Each one of the above points (especially number 2 and 3) may or may not be included; if it is included, coverage is often limited.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In dollar amount&lt;/strong&gt; — A cap is often set to the value of the contract. For instance, for non volume licensing contracts, &lt;a href="http://www.microsoft.com/mscorp/execmail/2004/10-27platformvalue.mspx"&gt;Microsoft used to have a cap on damages and settlement fees&lt;/a&gt;. Microsoft later changed this policy to remove the cap for legal defense (point 1 above), but they are still &lt;a href="http://download.microsoft.com/download/9/D/0/9D0A6265-A509-416C-80AE-BB6C0A9D1B99/IP%20Indemnification%20Policy.docx"&gt;keeping a cap for damages and settlement fees&lt;/a&gt; (point 3 above). Similarly, &lt;a href="http://www.redhat.com/legal/open_source_assurance_agreement.html"&gt;Red Hat's indemnification caps&lt;/a&gt; their liability to the total fees paid by their client during the previous year.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;In time&lt;/strong&gt; — For instance, as mentioned earlier, Microsoft still has a cap a on how much they will pay for damages and settlement fees. That cap is set to the amount paid to them by their customer during the prior one or two years, depending on the cases. Similarly, and as mentioned earlier, Red Hat's total cumulative liability is capped to the total amount in payments made by their customer during the previous year.&lt;/li&gt;
&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-9219006223359025774?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/wsoMfRazvAQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/9219006223359025774/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=9219006223359025774" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9219006223359025774?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9219006223359025774?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/wsoMfRazvAQ/indemnification.html" title="Indemnification" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2010/11/indemnification.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cARXw8fip7ImA9Wx5aFU0.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-5570981674836098616</id><published>2010-08-12T20:09:00.000-07:00</published><updated>2010-11-11T10:44:04.276-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-11T10:44:04.276-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="google" /><title>iOS Mail for multiple email accounts with Gmail</title><content type="html">&lt;h3&gt;The setup&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You use two email addresses: you@a.com and you@b.com.&lt;/li&gt;
&lt;li&gt;All incoming email to both addresses is forwarded to your Gmail account: you@gmail.com.&lt;/li&gt;
&lt;li&gt;You setup Gmail to be able to send messages as either you@a.com or you@b.com.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;img src="http://dl.dropbox.com/u/6900/resources/20100908-ios-two-emails.png" alt="Two incoming SMTP, one IMAP" title=""&gt;&lt;/p&gt;

&lt;p&gt;With this setup, all your email arrives in a unique Gmail account, which can also access through IMAP. When creating a new message in the Gmail web app, you can choose which email should be used as the &lt;em&gt;from&lt;/em&gt; address (either you@a.com or you@b.com). When responding to a message, Gmail automatically preselects the address the message you are responding to was sent to, and allows you to override that choice. So far so good.&lt;/p&gt;

&lt;h3&gt;The problem&lt;/h3&gt;

&lt;p&gt;The only trouble with this setup is when using Gmail's mobile interface, in particular on the iPhone/iOS. The mobile interface behaves as the desktop interface, except it doesn't allow you to change the from address. When sending a new message, it is always sent from your default email (say you@a.com), which means you can't send a new message from you@b.com. Also, you can't override the email chosen by Gmail when responding to messages.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;iOS Mail only supports one email per account (unlike the OS X Mail.app) – If you want two email addresses, you'll need two incoming IMAP or POP servers. You can work around this by setting up a Dummy IMAP server as follows:&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;Account 1: you@a.com, Unique (real) IMAP, SMTP A.&lt;/li&gt;
&lt;li&gt;Account 2: you@b.com, Dummy IMAP, SMTP B.&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When sending an email, you want a copy saved in your Sent folder on your (Unique) IMAP server. You can set this up for you@a.com. But what about you@b.com? Storing outgoing email on Dummy IMAP isn't what you want. You can use the BCC functionality of Mail, and have Mail BCC you@b.com every time you send an email with that address. Unfortunately, at least for those of us using Gmail to handle their email you@b.com, Gmail doesn't seem to be able to forward incoming mail from and to you@b.com, maybe because it doesn't consider it as incoming mail but as sent mail. So you can't forward those BCC to you@gmail.com, to have them end up in the Sent folder of your unique IMAP server.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Conclusion&lt;/h3&gt;

&lt;p&gt;When using Mail, with the best possible setup, you can't get the emails sent from one of your emails to end up on your unique IMAP server. Unless controlling what email is used when sending message is paramount to you, and you are fine with, on a regular basis, using a desktop mail client to move the Sent messages from Dummy IMAP to Unique IMAP, you are better off using the Gmail mobile web app.&lt;/p&gt;

&lt;p&gt;Hopefully, one day, Google will add the ability for you to select the from email address in their mobile web app, as they already do in their desktop web app: we'll look back, and laugh at how complex it used to be, int the old days, to setup that old iOS Mail.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-5570981674836098616?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/WT1aWJRmuyY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/5570981674836098616/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=5570981674836098616" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5570981674836098616?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5570981674836098616?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/WT1aWJRmuyY/ios-mail-for-multiple-email-accounts.html" title="iOS Mail for multiple email accounts with Gmail" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2010/08/ios-mail-for-multiple-email-accounts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QASXs_eCp7ImA9Wx9TFE0.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-6091394494488638546</id><published>2010-07-27T14:00:00.000-07:00</published><updated>2010-11-21T21:55:48.540-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-11-21T21:55:48.540-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="tool" /><title>Spell It</title><content type="html">&lt;script type="text/javascript" charset="utf-8" src="http://yui.yahooapis.com/3.1.1/build/yui/yui-min.js"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;
    var ALPHABET = {
        "a": "Alpha",
        "b": "Bravo",
        "c": "Charlie",
        "d": "Delta",
        "e": "Echo",
        "f": "Fox",
        "g": "Golf",
        "h": "Hotel",
        "i": "India",
        "j": "Juliet",
        "k": "Kilo",
        "l": "Lima",
        "m": "Mike",
        "n": "November",
        "o": "Oscar",
        "p": "Papa",
        "q": "Quebec",
        "r": "Romeo",
        "s": "Sierra",
        "t": "Tango",
        "u": "Uniform",
        "v": "Victor",
        "w": "Whiskey",
        "x": "X-Ray",
        "y": "Yankee",
        "z": "Zulu"
    };
    YUI().use("node", "event", function(Y) {

        var inputControl = Y.one("#input");

        function updateSpelling() {
            var inputValue = inputControl.get("value");
            var outputValue = "";
            for (var charIndex = 0; charIndex &lt; inputValue.length; charIndex++) {
                var character = inputValue[charIndex].toLowerCase();
                if (character != " ") {
                    outputValue += character;
                    var word = ALPHABET[character];
                    if (! Y.Lang.isUndefined(word)) outputValue += " - " + word
                }
                outputValue += "&lt;br/&gt;";
            }
            var outputDiv = Y.one("#output");
            outputDiv.set("innerHTML", outputValue);
        }

        Y.on("keyup", updateSpelling, inputControl);
        updateSpelling();
        if (window.location.href == "http://avernet.blogspot.com/2010/07/spell-it.html") {
            inputControl.focus();
            inputControl.select();
        }
    });
&lt;/script&gt;
&lt;style type="text/css"&gt;
    #output { font-family: monospace; margin-top: 1em }
&lt;/style&gt;
&lt;div&gt;
    &lt;label for="input"&gt;Word to spell:&lt;/label&gt; &lt;input id="input" name="text" value="inconspicuous"&gt;
&lt;/div&gt;
&lt;div id="output"&gt;

&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-6091394494488638546?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/fRig2kVpmow" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/6091394494488638546/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=6091394494488638546" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6091394494488638546?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6091394494488638546?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/fRig2kVpmow/spell-it.html" title="Spell It" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2010/07/spell-it.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEUNQ3cycCp7ImA9WxNbFkU.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-2974440959686108591</id><published>2009-11-19T17:23:00.000-08:00</published><updated>2009-11-19T17:58:12.998-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-11-19T17:58:12.998-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><title>Running VirtualBox in Headless Mode</title><content type="html">&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 150px;" src="http://2.bp.blogspot.com/_mtKW2NpD7Rk/SwXwT6D7VMI/AAAAAAAADI4/9cnUBaS3ndc/s400/virtualbox.png" alt="" id="BLOGGER_PHOTO_ID_5405991152522056898" border="0" /&gt;I first started using Parallels on Mac OS X, later switched to VMware, and now use VirtualBox, which I love. But I have to say that I don't particularly fancy its UI. I find it inconvenient that you need to first hit special key (by default &lt;i&gt;command&lt;/i&gt;) to escape the VirtualBox environment. Frankly, I'd rather use Remote Desktop to connect to VirtualBox. And now I do.&lt;br /&gt;&lt;br /&gt;The process is rather simple. I'll start assuming that you already have a working VM setup in VirtualBox:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;You can have multiple VMs setup in VirtualBox. In my case, I have only one, named "Windows 7". To know the name of your VM, from the command line run:&lt;blockquote&gt;&lt;code&gt;VBoxManage list vms&lt;/code&gt;&lt;/blockquote&gt;&lt;/li&gt;&lt;li&gt;Once you know the name of your VM (which I'll assume to be "Windows 7"), start the VM with:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;VBoxHeadless -s "Windows 7" &amp;amp;&lt;/code&gt;&lt;/blockquote&gt;I like to start VirtualBox in the background, hence the &lt;code&gt;&amp;amp;&lt;/code&gt; at the end of the command line. This is because &lt;code&gt;VBoxHeadless&lt;/code&gt; doesn't output anything to the standard output after it has started, and you don't want to stop it by mistake by hitting ctrl-c, as you would loose the state of you VM. Instead you'll want to save the VM state (more on this below).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Start Remote Desktop. If you are on a Mac, Microsoft has a free &lt;a href="http://www.microsoft.com/mac/products/remote-desktop/default.mspx"&gt;Remote Desktop for OS X&lt;/a&gt;. Connect to the VM using Remote Desktop using the host name or IP of the machine running VirtualBox. For instance, if you are running VirtualBox and Remote Desktop on the same machine, that would be &lt;code&gt;localhost&lt;/code&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;To stop VirtualBox while saving the state of the VM, run: &lt;blockquote&gt;&lt;code&gt;VBoxManage controlvm "Windows 7" savestate&lt;/code&gt;&lt;/blockquote&gt; Next time you start VirtualBox (as in step 2 above), it will used that saved state.&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-2974440959686108591?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/eQBpWotQG3s" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/2974440959686108591/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=2974440959686108591" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2974440959686108591?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2974440959686108591?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/eQBpWotQG3s/running-virtualbox-in-headless-mode.html" title="Running VirtualBox in Headless Mode" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mtKW2NpD7Rk/SwXwT6D7VMI/AAAAAAAADI4/9cnUBaS3ndc/s72-c/virtualbox.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/11/running-virtualbox-in-headless-mode.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ak8CRHY5eSp7ImA9WxNXFU4.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-5252280630313159058</id><published>2009-10-02T18:37:00.000-07:00</published><updated>2009-10-02T20:01:05.821-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-10-02T20:01:05.821-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="offline" /><category scheme="http://www.blogger.com/atom/ns#" term="safari" /><category scheme="http://www.blogger.com/atom/ns#" term="iphone" /><title>Offline Storage with Safari (Offline iPhone Webapps)</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.flickr.com/photos/timmargh/54538216/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 225px;" src="http://4.bp.blogspot.com/_mtKW2NpD7Rk/Ssa-CPFD5AI/AAAAAAAADIQ/ddkpbpsSKwc/s400/54538216_25689b9d5d.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5388202949812151298" /&gt;&lt;/a&gt;&lt;dl&gt;&lt;dt&gt;Resources can have 3 states&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;You can think of every resource as being assigned one of the following 3 states by Safari based on your manifest: missing, cached, online. Cached resources are stored in the Safari store; Safari can display cached resources when offline. Online resources will be retrieved from the server when offline (sometimes also called white listed). Finally missing means that the resource is not in the cache and that Safari won't try to get it from the cache when offline, so loading that resource will fail.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;How states are assigned&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;If the HTML links to a manifest, by default the HTML is cached and all the other resources are missing. So you need to include every resource used by your page in the manifest to either tell Safari that it can be cached (images, CSS...), or that it should need to establish a connection to a server (end-points for Ajax requests).&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Checking the state of resources&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;To see what state Safari assigned to your resources, open the Web Inspector, go to the Resources tab, and switch to the view by Time. Resources that are missing will show in gray. It is harder to see the difference between resources that are cached and online. Most likely you'll notice that online resources take a longer time, and of course you can check your server log to see if a resource is loaded as you reload the page. For missing resources, you can also open the Activity window (from the Window menu); Safari will show a message in red "The URL can't be shown" next to missing resources.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Checking if caching is happening&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;You can check if any caching at all is happening by looking at the value of &lt;code&gt;window.applicationCache.status&lt;/code&gt;. In general the value will be 0 (&lt;code&gt;UNCACHED&lt;/code&gt;) if the page isn't cached and 1 (&lt;code&gt;IDLE&lt;/code&gt;) if it is.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;The &lt;code&gt;text/cache-manifest&lt;/code&gt; content type&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;What they the spec says about the &lt;code&gt;text/cache-manifest&lt;/code&gt; content type isn't a joke ;). Make sure that your manifest is served with the appropriate content type, or it will be ignored.&lt;/dd&gt;&lt;br /&gt;&lt;dt&gt;Same site policy for the manifest&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;You need to serve the manifest from the same site from which the page is served. If you link to a manifest on another server, Safari will just ignore it. In the manifest itself, you can however list resources loaded from other sites that you would like to be cached, for instance libraries you load from the &lt;a href="http://code.google.com/apis/ajaxlibs/"&gt;Google CDN&lt;/a&gt;.&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-5252280630313159058?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/5xPVUUfK8fo" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/5252280630313159058/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=5252280630313159058" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5252280630313159058?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5252280630313159058?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/5xPVUUfK8fo/offline-storage-with-safari-offline.html" title="Offline Storage with Safari (Offline iPhone Webapps)" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_mtKW2NpD7Rk/Ssa-CPFD5AI/AAAAAAAADIQ/ddkpbpsSKwc/s72-c/54538216_25689b9d5d.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/10/offline-storage-with-safari-offline.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEUCQX05cSp7ImA9WxNQGU8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-9045249187312001027</id><published>2009-09-25T17:26:00.000-07:00</published><updated>2009-09-25T17:51:00.329-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T17:51:00.329-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ie6" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>IE6 Bug: Relative Box After Float Doesn't Show</title><content type="html">Consider the following code where you have a floated element (in this case a &lt;code&gt;label&lt;/code&gt;), followed by a &lt;code&gt;div&lt;/code&gt; with &lt;code&gt;position: relative&lt;/code&gt;, containing an input field with a &lt;code&gt;width: 100%&lt;/code&gt;.&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;&lt;br /&gt;    &amp;lt;head&gt;&lt;br /&gt;        &amp;lt;style type="text/css"&gt;&lt;br /&gt;            .label { float: left; }&lt;br /&gt;            .div   { position: relative; }&lt;br /&gt;            .input { width: 100%; }&lt;br /&gt;        &amp;lt;/style&gt;&lt;br /&gt;    &amp;lt;/head&gt;&lt;br /&gt;    &amp;lt;body&gt;&lt;br /&gt;        &amp;lt;label class="label"&gt;Label&amp;lt;/label&gt;&lt;br /&gt;        &amp;lt;div class="div"&gt;&lt;br /&gt;            &amp;lt;input class="input" type="text"/&gt;&lt;br /&gt;        &amp;lt;/div&gt;&lt;br /&gt;    &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;The issue is that on IE6, the input field doesn't show:&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 154px;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/Sr1kUN6henI/AAAAAAAADHA/nu1ftZM_TXE/s400/fails-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5385571027900267122" /&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;This bug has been resolved in IE7, and you can easily work around it in IE6 by forcing the box to "have layout" (in IE, elements with &lt;code&gt;position: absolute&lt;/code&gt; have layout, but elements with &lt;code&gt;position: relative&lt;/code&gt; don't necessarily have layout). My favorite way for doing so it to add a &lt;code&gt;*zoom: 1&lt;/code&gt; on the box, which will give you the expected result:&lt;br /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 164px;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/Sr1jkv8nUrI/AAAAAAAADG4/SXCLt1ilpI8/s400/works.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5385570212402123442" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-9045249187312001027?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/M_jHNmCARr4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/9045249187312001027/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=9045249187312001027" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9045249187312001027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9045249187312001027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/M_jHNmCARr4/ie6-bug-relative-box-after-float-doesnt.html" title="IE6 Bug: Relative Box After Float Doesn't Show" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/Sr1kUN6henI/AAAAAAAADHA/nu1ftZM_TXE/s72-c/fails-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/09/ie6-bug-relative-box-after-float-doesnt.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkECQ3wyfSp7ImA9WxNQGU8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-501809966499066006</id><published>2009-09-24T16:25:00.000-07:00</published><updated>2009-09-25T17:24:22.295-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-25T17:24:22.295-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>CSS: Why Use Relative Positioning?</title><content type="html">The CSS &lt;code&gt;position&lt;/code&gt; can have 4 values: &lt;code&gt;static&lt;/code&gt; (the default), &lt;code&gt;relative&lt;/code&gt;, &lt;code&gt;absolute&lt;/code&gt;, or &lt;code&gt;fixed&lt;/code&gt;. &lt;a href="http://en.wikipedia.org/wiki/Comparison_of_layout_engines_%28CSS%29#trident_position"&gt;IE6 doesn't support fixed positioning&lt;/a&gt;, so that leaves you with 3 values. Static positioning leaves elements in the normal flow, so you are left with 2 really interesting values:&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;code&gt;relative&lt;/code&gt; – Leaves the element in the normal flow, but allows you to move it relative to that position using &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;left&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;&lt;code&gt;absolute&lt;/code&gt; – Takes the element out of the normal flow, and positions it relative to the top left corner of its closes positioned ancestor, i.e. the closest ancestor with a position set to &lt;code&gt;relative&lt;/code&gt; or &lt;code&gt;absolute&lt;/code&gt; (or &lt;code&gt;fixed&lt;/code&gt;).&lt;br /&gt;&lt;/ul&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;With this in mind, there are 2 main reasons to use a &lt;code&gt;relative&lt;/code&gt; positioning:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Obviously, you might want to move an element relative its positioning in the normal flow. So you would use &lt;code&gt;position: relative&lt;/code&gt; in conjunction with a &lt;code&gt;top&lt;/code&gt; and &lt;code&gt;left&lt;/code&gt; on an element. But in my experience, this is rarely needed.&lt;/li&gt;&lt;li&gt;More often, you want to position an inner box relative to an outer box. You do so by using &lt;code&gt;position: relative&lt;/code&gt; on the outer box and &lt;code&gt;position: absolute&lt;/code&gt; on the inner one, for instance to produce the result shown below, with the corresponding HTML immediately following:&lt;/ul&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 138px; height: 66px;" src="http://3.bp.blogspot.com/_mtKW2NpD7Rk/Sr1cxWpe6MI/AAAAAAAADGg/Ni1ag7MdF50/s400/outer-relative-1.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5385562732367898818" /&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"&gt;&lt;br /&gt;    &amp;lt;head&gt;&lt;br /&gt;        &amp;lt;style type="text/css"&gt;&lt;br /&gt;            .outer { position: relative;&lt;br /&gt;                     border: 2px solid #999; }&lt;br /&gt;            .inner { position: absolute; top: 1em; left: 1em; &lt;br /&gt;                     border: 2px solid #666;  }&lt;br /&gt;        &amp;lt;/style&gt;&lt;br /&gt;    &amp;lt;/head&gt;&lt;br /&gt;    &amp;lt;body&gt;&lt;br /&gt;        Outside outer&lt;br /&gt;        &amp;lt;div class="outer"&gt;&lt;br /&gt;            Outer&lt;br /&gt;            &amp;lt;div class="inner"&gt;Inner&amp;lt;/div&gt;&lt;br /&gt;        &amp;lt;/div&gt;&lt;br /&gt;    &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/code&gt;&lt;/pre&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;If you were to ignore the &lt;code&gt;position: relative&lt;/code&gt; on the outer element, you would get:&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 138px; height: 49px;" src="http://3.bp.blogspot.com/_mtKW2NpD7Rk/Sr1dIVRGk2I/AAAAAAAADGo/8mqxqNTEK3U/s400/outer-not-relative.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5385563127134196578" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-501809966499066006?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/bbnmKSPHZH8" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/501809966499066006/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=501809966499066006" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/501809966499066006?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/501809966499066006?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/bbnmKSPHZH8/css-why-use-relative-positioning.html" title="CSS: Why Use Relative Positioning?" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mtKW2NpD7Rk/Sr1cxWpe6MI/AAAAAAAADGg/Ni1ag7MdF50/s72-c/outer-relative-1.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/09/css-why-use-relative-positioning.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEACRXc9cSp7ImA9WxNRFUg.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-2012436102581671654</id><published>2009-09-09T20:15:00.000-07:00</published><updated>2009-09-09T20:19:24.969-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-09T20:19:24.969-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web2.0" /><title>Pushing My Twits to Facebook Considered Harmful</title><content type="html">&lt;a href="http://www.flickr.com/photos/gesamtbild/3170926064/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 150px; height: 152px;" src="http://4.bp.blogspot.com/_mtKW2NpD7Rk/SqhvhkS3TtI/AAAAAAAADGQ/D4eUqNKpEKY/s400/3170926064_e797553360_o.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5379672377363222226" /&gt;&lt;/a&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;Like many Twitter users, I always had a &lt;a href="apps.facebook.com/twitter/"&gt;Facebook application&lt;/a&gt; setup to pull &lt;a href="http://twitter.com/avernet"&gt;my twits&lt;/a&gt; and post them on Facebook as status updates. Thanks to this application, all my twits where making their way to Facebook, showing up in my friends' news feed. A couple of weeks ago, it became clear to me that there was a problem with pushing twits to my Facebook friends. So I stopped.&lt;br /&gt;&lt;br /&gt;Why? Simply, because the little pieces of information I publish on Twitter are interesting to me, but let's be realistic: what is interesting to me is just that; interesting to me; most likely it isn't interesting to most people in general, and to my Facebook friends in particular. There is nothing wrong with that, but there is something pretentious of me forcing this information on my Facebook friends. Yes, I know, you can opt-out and "hide" some of your friends on Facebook, so their updates don't pollute your news feed. But many don't know about this feature or are reluctant to take this measure. I would rather see people opt-in, as they do on Twitter by voluntarily "following" someone, than force people to opt-out.&lt;br /&gt;&lt;br /&gt;(Note that the title of this post is Pushing &lt;i&gt;My&lt;/i&gt; Twits to Facebook Considered Harmful. Even if you are pushing your twits to Facebook, what I say here may not apply to &lt;i&gt;you&lt;/i&gt;. But if this is something you are doing, you might want to ask yourself: "are my friends going to be interested in my twits?".)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-2012436102581671654?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/2qzcSWMp2Dw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/2012436102581671654/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=2012436102581671654" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2012436102581671654?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2012436102581671654?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/2qzcSWMp2Dw/pushing-my-twits-to-facebook-considered.html" title="Pushing My Twits to Facebook Considered Harmful" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_mtKW2NpD7Rk/SqhvhkS3TtI/AAAAAAAADGQ/D4eUqNKpEKY/s72-c/3170926064_e797553360_o.png" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/09/pushing-my-twits-to-facebook-considered.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkQBSXgyfSp7ImA9WxNXE0g.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-7121355335624478733</id><published>2009-08-25T14:59:00.000-07:00</published><updated>2009-09-30T16:45:58.695-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-30T16:45:58.695-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>ack: powerful command line search</title><content type="html">&lt;a href="http://betterthangrep.com/"&gt;&lt;img style="float:right; margin:0 0 10px 10px;cursor:pointer; cursor:hand;width: 156px; height: 164px;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SpRf4LR-zNI/AAAAAAAADGI/2-wPRf7drGQ/s400/ack.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5374025674065366226" /&gt;&lt;/a&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;a href="http://betterthangrep.com/"&gt;ack&lt;/a&gt; is a fantastic tool to do recursive searches in text files, such as in your source code. It is &lt;b&gt;simple&lt;/b&gt; to use and amazingly &lt;b&gt;fast&lt;/b&gt;. See the ack home page for installation instructions. I am on OS X without Macport and installed ack with:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;sudo perl -MCPAN -e 'install App::Ack'&lt;/code&gt;&lt;/blockquote&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;dl&gt;&lt;dt&gt;&lt;a name="ignore"&gt;&lt;/a&gt;Ignoring certain files&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Out of the box, ack will ignore "most of the crap you don't want to search" (quoting from their documentation!), but you might want to set it up to ignore more files. For instance, for every JavaScript file (&lt;code&gt;gaga.js&lt;/code&gt;) I have a minimized version of that file (&lt;code&gt;gaga-min.js&lt;/code&gt;) automatically generated for me. I am never interested in searching in those files. ack doesn't have an option for you to say which files you want to &lt;i&gt;ignore&lt;/i&gt;, but you can specify what files you want it to &lt;i&gt;include&lt;/i&gt;: &lt;code&gt;-G&lt;/code&gt;. This option takes a Perl regular expression. How to write a regular expression that matches any file except those ending with &lt;code&gt;-min.js&lt;/code&gt;? With a &lt;a href="http://www.regular-expressions.info/lookaround.html"&gt;negative look-behind regexp&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;(?&amp;lt;!-min\.js)$&lt;/code&gt;&lt;/blockquote&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;To have this used by default, add the following two lines to your &lt;code&gt;~/.ackrc&lt;/code&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;-G&lt;br /&gt;(?&amp;lt;!-min\.js)$ &lt;/code&gt;&lt;/blockquote&gt;&lt;/dd&gt;&lt;dt&gt;&lt;a name="type"&gt;&lt;/a&gt;Adding file types&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;ack only search in files that are of a "type" it knows about. In general, files are mapped to types by extension, but in some cases they can be mapped by their content. I ran into a case where ack would find what I look for in certain &lt;code&gt;.xpl&lt;/code&gt; files&lt;sup&gt;1&lt;/sup&gt;, but not others. The reason was that ack didn't know about the &lt;code&gt;.xpl&lt;/code&gt; extension, so it would ignore those files, except those that started with an XML declaration. For those files, even if it didn't recognize the extension, it would recognize the content and know it is dealing with an XML file.&lt;br /&gt;&lt;br /&gt;If you run into a similar situation and suspect this is your problem, run the following command which will list the files ack will search in, starting from the current directory:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;ack -f .&lt;/code&gt;&lt;/blockquote&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;After you find which file are ignored, add those to your &lt;code&gt;.ackrc&lt;/code&gt; so ack recognizes those files. For instance, the following parameters added to your &lt;code&gt;.ackrc&lt;/code&gt; will get ack to recognize &lt;code&gt;.xpl&lt;/code&gt; and &lt;code&gt;.xsl&lt;/code&gt; files as XML files:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;--type-add&lt;br /&gt;xml=.xpl,.xsl&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/dd&gt;&lt;/dl&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;sup&gt;1&lt;/sup&gt; &lt;code&gt;.xpl&lt;/code&gt; are the &lt;a href="http://www.orbeon.com/ops/doc/reference-xpl-pipelines"&gt;pipeline files&lt;/a&gt; we use in Orbeon Forms.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-7121355335624478733?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/HxlSRX9vzwg" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/7121355335624478733/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=7121355335624478733" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7121355335624478733?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7121355335624478733?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/HxlSRX9vzwg/ack-powerful-command-line-search.html" title="ack: powerful command line search" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SpRf4LR-zNI/AAAAAAAADGI/2-wPRf7drGQ/s72-c/ack.png" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/08/ack-powerful-command-line-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU4ARns6eip7ImA9WxFRGU8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-6136894727848559052</id><published>2009-08-24T12:25:00.000-07:00</published><updated>2010-05-03T16:05:47.512-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-05-03T16:05:47.512-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="unix" /><title>Git Tips</title><content type="html">&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer; width: 150px; height: 150px;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/So2sbWHgglI/AAAAAAAADGA/AvyG6j_tkHM/s400/got-git.jpg" alt="" id="BLOGGER_PHOTO_ID_5372139516316385874" border="0" /&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;Last updated: March 15, 2010&lt;br /&gt;&lt;br /&gt;A flurry of excellent documentation and great blog posts has been published about Git. But who doesn't need some additional tips on how to better use your source code management tool of choice? So here are a few that I found useful:&lt;br /&gt;&lt;br /&gt;&lt;dl&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;dt&gt;Table of contents&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;&lt;a href="#ignoring-files"&gt;Ignoring files&lt;/a&gt;&lt;br /&gt;&lt;a href="#push-warning"&gt;Getting rid of the warnings when pushing&lt;/a&gt;&lt;br /&gt;&lt;a href="#blame"&gt;Finding when and why that code was changed&lt;/a&gt;&lt;br /&gt;&lt;a href="#color"&gt;Mac OS X: colors for your terminal&lt;/a&gt;&lt;br /&gt;&lt;a href="#pull-requests"&gt;Handling pull requests&lt;/a&gt;&lt;br /&gt;&lt;a href="#rebase"&gt;Avoid "Merge Branch..." in the commit history&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;&lt;!--&lt;br /&gt;&lt;br /&gt;--&gt;&lt;dt&gt;&lt;a name="ignoring-files"&gt;&lt;/a&gt;Ignoring files&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;I always have a number of files in my projects that I have no intention of checking in, such as a TextMate project file (&lt;code&gt;orbeon-forms.tmproj&lt;/code&gt;) or scratch files I use for testing (&lt;code&gt;gaga.xhtml&lt;/code&gt;). Those files pollute the output of your &lt;code&gt;git status&lt;/code&gt;. Sure, you are smart enough to ignore them, but why not let Git do the ignoring for you? Do so by listing the files you want Git to ignore for this current repository in &lt;code&gt;.git/info/exclude&lt;/code&gt;.&lt;/dd&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;--&gt;&lt;dt&gt;&lt;a name="push-warning"&gt;&lt;/a&gt;Getting rid of the warnings when pushing&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;When running a &lt;code&gt;git push&lt;/code&gt; without specifying what branch to push, you'll get the warning message &lt;i&gt;You did not specify any refspecs to push&lt;/i&gt;. By default git pushes all the local branches for which there is a remote branch with the same name. It does so, but still tells you that this may not be what you want. To have git push only the current branch (and also  get rid of the error message every time you do a push), run:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git config --global push.default tracking&lt;/code&gt;&lt;/blockquote&gt;You could use &lt;code&gt;current&lt;/code&gt; instead of &lt;code&gt;tracking&lt;/code&gt;, but it won't have the desired effect when the name of your local branch doesn't match the name of the remote branch you want to push to. Really, this should &lt;a href="http://twitter.com/ebruchez/status/11486535760"&gt;be the default&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;--&gt;&lt;dt&gt;&lt;a name="blame"&gt;&lt;/a&gt;Finding when and why that code was changed&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;Run the following command and locate the piece of code you are interested in:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git blame your-file.ext&lt;/code&gt;&lt;/blockquote&gt;Copy the revision number (&lt;i&gt;rev&lt;/i&gt;) showing at the beginning of the line and run:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git log -1 -p &lt;i&gt;rev&lt;/i&gt;&lt;/code&gt;&lt;/blockquote&gt;The &lt;code&gt;-1&lt;/code&gt; tells Git you're only interested in that particular commit, and none of the previous commits. The &lt;code&gt;-p&lt;/code&gt; as in &lt;i&gt;patch&lt;/i&gt; gives you the changes to the code done in that commit.&lt;/dd&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;--&gt;&lt;dt&gt;&lt;a name="color"&gt;&lt;/a&gt;Mac OS X: colors for your terminal&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;First, for you terminal to support colors, add the following two lines to your &lt;code&gt;.bash_profile&lt;/code&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;export CLICOLOR=1&lt;br /&gt;export LSCOLORS=ExFxCxDxBxegedabagacad&lt;/code&gt;&lt;/blockquote&gt;Then enable colors in diff and status with:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git config --global color.diff true&lt;br /&gt;git config --global color.status true&lt;/code&gt;&lt;/blockquote&gt;&lt;/dd&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;--&gt;&lt;a name="pull-requests"&gt;&lt;/a&gt;&lt;dt&gt;Handling pull requests&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;(This is based on the &lt;a href="http://github.com/guides/pull-requests"&gt;GitHub documentation and example&lt;/a&gt;.) Start by adding the remote repository. The first &lt;code&gt;defunkt&lt;/code&gt; is the local name you give to the repository at the URL that directly follows. The &lt;code&gt;-f&lt;/code&gt; is to immediately fetch that repository (fetching retrieves the data from the remote repository to your local repository):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git remote add -f defunkt git://github.com/defunkt/grit.git&lt;/code&gt;&lt;/blockquote&gt;Checkout the code from your local repository to your working directory and at the same time create a branch named &lt;code&gt;defunkt&lt;/code&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git checkout -b defunkt&lt;/code&gt;&lt;/blockquote&gt;Now that your working directory is in the branch &lt;code&gt;defunkt&lt;/code&gt;, pull the latest code from the &lt;code&gt;master&lt;/code&gt; branch of the repository &lt;code&gt;defunkt&lt;/code&gt; to the working directory (if you just did the &lt;code&gt;git remote add -f&lt;/code&gt;, most likely there will be nothing new to pull):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git pull defunkt master&lt;/code&gt;&lt;/blockquote&gt;To avoid having to specify &lt;code&gt;defunkt master&lt;/code&gt; on the command line every time you do a &lt;code&gt;pull&lt;/code&gt; (of course you want to pull from the same repository and branch you originally got the data from!), run the two following commands. The first one defines &lt;code&gt;defunkt&lt;/code&gt; as the default repository for the your branch &lt;code&gt;defunkt&lt;/code&gt;. The second one defines the remote &lt;code&gt;master&lt;/code&gt; branch as the one you want to merge with the current branch. (It is a config for &lt;code&gt;merge&lt;/code&gt; because &lt;code&gt;pull&lt;/code&gt; runs a &lt;code&gt;fetch&lt;/code&gt; and a &lt;code&gt;merge&lt;/code&gt;.)&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git config branch.defunkt.remote defunkt&lt;br /&gt;git config branch.defunkt.merge refs/heads/master&lt;/code&gt;&lt;/blockquote&gt;Switch to your &lt;code&gt;master&lt;/code&gt; branch:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git checkout master&lt;/code&gt;&lt;/blockquote&gt;Merge the branch &lt;code&gt;defunkt&lt;/code&gt; into your current branch (&lt;code&gt;master&lt;/code&gt;). The merged commits from &lt;code&gt;defunkt&lt;/code&gt; will go to your local repository.&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git merge defunkt&lt;/code&gt;&lt;/blockquote&gt;Before you push the changes, you'll want to review and test them. You can see what you would send to the remote repository if you were to do a push now with:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git diff origin/master..master&lt;/code&gt;&lt;/blockquote&gt;If you make changes to the files in your working directory (say, to amend the changes made by the developer who sent you the pull request), you can see a diff between your working directory and the remote repository (which will include the changes your pulled plus your changes) with:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git diff origin/master&lt;/code&gt;&lt;/blockquote&gt;To only view a summary of what was changed (the &lt;i&gt;diffstat&lt;/i&gt; showing files names and how much was removed/added), add the &lt;code&gt;--stat&lt;/code&gt; parameter:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git diff --stat origin/master&lt;/code&gt;&lt;/blockquote&gt;&lt;/dd&gt;&lt;br /&gt;&lt;!--&lt;br /&gt;--&gt;&lt;dt&gt;&lt;a name="rebase"&gt;&lt;/a&gt;Avoid &lt;i&gt;Merge Branch...&lt;/i&gt; in the commit history&lt;/dt&gt;&lt;br /&gt;&lt;dd&gt;You do this by rewriting your local commits to be applied to the new state of your local branch as it will be after the changes you pulled from a remote source have been applied. You can do this in a single command:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git pull --rebase&lt;/code&gt;&lt;/blockquote&gt;You always want the rebase to be done when pulling changes, and would like to avoid having to put that &lt;code&gt;--rebase&lt;/code&gt; every time you do a pull? No problem, run the following just once (assuming you want to enable this for the &lt;code&gt;master&lt;/code&gt; branch):&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;git config branch.master.rebase true&lt;/code&gt;&lt;/blockquote&gt;Also see &lt;a href="http://adamblog.heroku.com/past/2008/6/30/rebasing_is_editing_commits/"&gt;Rebasing is Editing Commits&lt;/a&gt;, which provides background information on the subject.&lt;br /&gt;&lt;/dd&gt;&lt;br /&gt;&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-6136894727848559052?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/gjk4GC1X1W4" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/6136894727848559052/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=6136894727848559052" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6136894727848559052?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6136894727848559052?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/gjk4GC1X1W4/git-tips.html" title="Git Tips" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/So2sbWHgglI/AAAAAAAADGA/AvyG6j_tkHM/s72-c/got-git.jpg" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/08/git-tips.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0IDQng_cCp7ImA9WxJVE0U.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-3629735894245483965</id><published>2009-02-20T23:46:00.000-08:00</published><updated>2009-06-30T12:19:33.648-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-30T12:19:33.648-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web2.0" /><title>Creating a Blog, The Easy Way</title><content type="html">Tonight, I've been taking a few steps towards building a new web site. Blogs are passé; it's now all about Facebook and Twitter. But the easiest way to create a web presence is still to start a blog. So I've been looking at 3 contenders: Blogger, WordPress, and TypePad. I've been attracted to WordPress, and TypePad because I know Blogger. This very blog is on Blogger, which means that I am well aware of its shortcomings. So let's start with WordPress and TypePad.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WordPress&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SZ-yKrCxeoI/AAAAAAAADDM/PiMJT8TgXs4/s1600-h/wordpress-1.png"&gt;&lt;img style="display:block; margin: auto; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 259px;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SZ-yKrCxeoI/AAAAAAAADDM/PiMJT8TgXs4/s400/wordpress-1.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5305154782488525442" /&gt;&lt;/a&gt;&lt;br /&gt;WordPress feels like a more modern, more powerful version of Blogger. They can host your blog for free, and you pay $15/year to have your own domain, and another $15/year if you want to fully control the CSS on your blog. All this is very reasonable, but their interface confused the heck out of me. The look and feel is polished, but I just couldn't find how to do some basic things like adding and removing sidebars. I felt like the WordPress interface was the headlight, and I was the &lt;a href="http://www.urbandictionary.com/define.php?term=Deer+in+Headlights"&gt;deer&lt;/a&gt;. Not good.  Some will tell me I should have been more patient. Maybe; but the evening was short, and I said: next!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;TypePad&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtKW2NpD7Rk/SZ-67GqA1PI/AAAAAAAADDU/PlLNWPbhIpw/s1600-h/typepad.png"&gt;&lt;img style="display:block; margin:auto; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 260px;" src="http://2.bp.blogspot.com/_mtKW2NpD7Rk/SZ-67GqA1PI/AAAAAAAADDU/PlLNWPbhIpw/s400/typepad.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5305164410627609842" /&gt;&lt;/a&gt;&lt;br /&gt;I heard a lot of good things about TypePad, and so thought it would be an easy choice. As I started exploring TypePad, their &lt;a href="http://www.typepad.com/pricing/"&gt;pricing page&lt;/a&gt; stopped me in my endeavor. The most affordable plan that allows you to use your own domain costs $9/month, but it doesn't allow you to setup multiple authors, and you can't fully control the page layout. The next level which has those features is at $15/month, or $180/year. That is 6 times more expensive than WordPress, and 18 times more expensive than Blogger (more on Blogger below). All in all we're still talking about just &lt;span style="font-style:italic;"&gt;$180/year&lt;/span&gt;. If you're building a professional web site, this most likely won't stop you. If you're not, then you might be wondering if it is really worth paying 6 to 18 times more for TypePad. I didn't wonder for too long, and got back to Blogger.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Blogger&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Blogger has many shortfall, but it is huge. It feels like everyone, their mother, and their dog is using TypePad. This means that some shortcomings have been solved by that large community. Consider templates: the standard Blogger templates are either ugly, or tired, or both. But you can find hundreds of free templates out there. Blogger asks $10 to use your own domain, which is as reasonable as it gets. And this is all they ask. Once more, it looks like I'll be using Blogger.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-3629735894245483965?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/3Kx-m8QJRrc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/3629735894245483965/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=3629735894245483965" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/3629735894245483965?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/3629735894245483965?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/3Kx-m8QJRrc/creating-blog-easy-way.html" title="Creating a Blog, The Easy Way" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SZ-yKrCxeoI/AAAAAAAADDM/PiMJT8TgXs4/s72-c/wordpress-1.png" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/02/creating-blog-easy-way.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkcBQX4_eCp7ImA9WxVRFE4.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-5657232305718395371</id><published>2009-01-19T23:32:00.001-08:00</published><updated>2009-01-19T23:54:10.040-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-19T23:54:10.040-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="xml" /><category scheme="http://www.blogger.com/atom/ns#" term="html" /><category scheme="http://www.blogger.com/atom/ns#" term="css" /><title>HTML/CSS: Table inside table getting out containing cell with IE</title><content type="html">Consider this table with a &lt;code&gt;width: 100%&lt;/code&gt; displayed inside a table cell:&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt;   &amp;lt;body&gt;&lt;br /&gt;       &amp;lt;table style="width:100%; border: 1px solid red"&gt;&lt;br /&gt;           &amp;lt;tr&gt;&lt;br /&gt;               &amp;lt;td&gt;&lt;br /&gt;                   &amp;lt;div style="padding-left: 3em;&lt;br /&gt;                           padding-right: 3em"&gt;&lt;br /&gt;                       &amp;lt;table style="width: 100%;&lt;br /&gt;                               border: 1px solid blue"&gt;&lt;br /&gt;                           &amp;lt;tr&gt;&lt;br /&gt;                               &amp;lt;td&gt;Gaga&amp;lt;/td&gt;&lt;br /&gt;                           &amp;lt;/tr&gt;&lt;br /&gt;                       &amp;lt;/table&gt;&lt;br /&gt;                   &amp;lt;/div&gt;&lt;br /&gt;               &amp;lt;/td&gt;&lt;br /&gt;           &amp;lt;/tr&gt;&lt;br /&gt;       &amp;lt;/table&gt;&lt;br /&gt;  &lt;br /&gt;   &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/pre&gt;&lt;br /&gt;With IE, the table "gets out" of its containing cell. Notice that it is as if the width of the inner table was calculated without taking the padding into account, but its position inside the cell was taking the padding into account:&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_mtKW2NpD7Rk/SXU-FhpU_EI/AAAAAAAADCc/1M43n1tYNAg/HTML_CSS_%20Table%20inside%20table%20getting%20out%20containing%20cell%20with%20IE%20-%20Google%20Docs.png?imgmax=800" alt="HTML_CSS_ Table inside table getting out containing cell with IE - Google Docs.png" border="0" width="318" height="45" /&gt;&lt;br /&gt;The expected result is rather:&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_mtKW2NpD7Rk/SXU99mCI_eI/AAAAAAAADCY/DrRz09rufA8/ff-ok-1.png?imgmax=800" alt="ff-ok-1.png" border="0" width="309" height="45" /&gt;&lt;br /&gt;There are two ways to fix this:&lt;br /&gt;&lt;br /&gt;&lt;b&gt;The clean way&lt;/b&gt; – Switch the rendering from &lt;i&gt;quirks&lt;/i&gt; mode to &lt;i&gt;strict&lt;/i&gt; mode by changing the doctype. If you can, I'd recommend you do this. This means that in the above code, you would just replace the doctype declaration with:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"&lt;br /&gt;     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"&gt;&lt;/pre&gt;&lt;br /&gt;&lt;b&gt;The workaround way&lt;/b&gt; – Instead of defining the padding on a div, you put it directly on the outer cell, and remove the div, which gives you the following code.&lt;br /&gt;&lt;pre&gt;&amp;lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"&gt;&lt;br /&gt;&amp;lt;html xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;br /&gt; &amp;lt;body&gt;&lt;br /&gt;     &amp;lt;table style="width:100%; border: 1px solid red"&gt;&lt;br /&gt;         &amp;lt;tr&gt;&lt;br /&gt;             &amp;lt;td style="padding-left: 3em; padding-right: 3em"&gt;&lt;br /&gt;                 &amp;lt;table style="width: 100%;&lt;br /&gt;                         border: 1px solid blue"&gt;&lt;br /&gt;                     &amp;lt;tr&gt;&lt;br /&gt;                         &amp;lt;td&gt;Gaga&amp;lt;/td&gt;&lt;br /&gt;                     &amp;lt;/tr&gt;&lt;br /&gt;                 &amp;lt;/table&gt;&lt;br /&gt;             &amp;lt;/td&gt;&lt;br /&gt;         &amp;lt;/tr&gt;&lt;br /&gt;     &amp;lt;/table&gt;&lt;br /&gt; &amp;lt;/body&gt;&lt;br /&gt;&amp;lt;/html&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-5657232305718395371?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/Q5nN2bGPQaI" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/5657232305718395371/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=5657232305718395371" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5657232305718395371?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5657232305718395371?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/Q5nN2bGPQaI/htmlcss-table-inside-table-getting-out_19.html" title="HTML/CSS: Table inside table getting out containing cell with IE" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh4.ggpht.com/_mtKW2NpD7Rk/SXU-FhpU_EI/AAAAAAAADCc/1M43n1tYNAg/s72-c/HTML_CSS_%20Table%20inside%20table%20getting%20out%20containing%20cell%20with%20IE%20-%20Google%20Docs.png?imgmax=800" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2009/01/htmlcss-table-inside-table-getting-out_19.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Ck8FRng-fSp7ImA9WxdUFEQ.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-5903425907481427717</id><published>2008-07-31T00:50:00.000-07:00</published><updated>2008-07-31T00:53:37.655-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-07-31T00:53:37.655-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="realestate" /><title>Comparing Bubbles to Bubbles</title><content type="html">Do you remember that &lt;a href="http://avernet.blogspot.com/2008/07/and-yet-we-are-still-investing-in-real.html"&gt;New York Times chart&lt;/a&gt;? (Yea! I found a way to mention it another time!) On the chart, you can clearly see the boom of the 70s and the boom of the 80s. Each one is followed by a period of price correction which &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;brought back prices to the level before the boom&lt;/span&gt;.&lt;div&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://farm4.static.flickr.com/3076/2718505251_fca29fc28b_o.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5229071490122472994" /&gt;I have cut the part showing the boom of the 80s (on the left), and put it next to a much more detailed view (on the right, source: &lt;a href="http://en.wikipedia.org/wiki/Image:Cshpi-peak.svg"&gt;Wikipedia&lt;/a&gt;) that shows:&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;In blue&lt;/span&gt;: how prices evolved in the first half of the 90s, when the bubble of the 80s deflated.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;In red&lt;/span&gt;: how prices evolved since mid-2006, when the current bubble started deflating.&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;It is stunning to see how &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;much more brutal&lt;/span&gt; the current correction is. I hear some people saying: "well, during the boom of the 80s prices &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;inflated by 20%&lt;/span&gt; and a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;correction of 15%&lt;/span&gt; followed; during this boom prices &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;inflated by 100%&lt;/span&gt; so you have to expect a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;much, much more aggressive correction&lt;/span&gt;!"&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I hope those people are wrong. But I wouldn't advise you to base your investment choices on my hopes ;).&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-5903425907481427717?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/ntSsF5C84tc" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/5903425907481427717/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=5903425907481427717" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5903425907481427717?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5903425907481427717?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/ntSsF5C84tc/comparing-bubbles-to-bubbles.html" title="Comparing Bubbles to Bubbles" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/07/comparing-bubbles-to-bubbles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QFSH4_eyp7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-5820355429978128731</id><published>2008-07-30T00:20:00.000-07:00</published><updated>2008-11-06T18:35:19.043-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:19.043-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="realestate" /><title>And Yet, We Are Still Investing in Real Estate</title><content type="html">I have shown this New York Times chart to people over and over during the last few years. Yet, as time goes, I still fill compelled to share this with more people. A lot has been written about the real estate market, trying to "explain" why it was doing so well (a few years ago) and why it is doing so badly (now). But the simplicity of this chart is refreshing: it just shows how &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;home value adjusted for inflation&lt;/span&gt; has varied over the last &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;116 years&lt;/span&gt;, from 1890 to 2006, when this chart was published. (For a larger view, click on the chart. This will take you to original chart on the New York Times site.)&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.nytimes.com/imagepages/2006/08/26/weekinreview/27leon_graph2.html"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SI7LPGUMkCI/AAAAAAAACRM/IxL70Q9RqfI/s400/nytimes-home.gif" border="0" alt="" id="BLOGGER_PHOTO_ID_5228339677677522978" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;div&gt;Did you notice the hickey stick towards the end of the chart? I thought you did. When this chart was published, the market had reached its peak. Since then, home prices have gone done by about 15% on a national level. This real estate crisis is the big story, but compared to the doubling we had in the previous decade (a 100% increase), a 15% decline isn't a tragedy. Yet. Because since 2007 prices have been going down every month at a fairly constant pace, everyone is now wondering when it is going to stop.&lt;br /&gt;&lt;br /&gt;Let's look at it this way: forget for a second that we are talking about real estate. Imagine instead that you are are in your investment advisor office, and she is telling you about this fund you didn't know about. Let's call it the &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;RE fund&lt;/span&gt;:&lt;ul&gt;&lt;li&gt;She shows you above chart with the price of the RE fund over time.&lt;/li&gt;&lt;li&gt;She tells you that this fund has a long of history; that for sure it is not going to completely go away, but that (as history has proved) it might bring you fairly large gains or losses.&lt;/li&gt;&lt;li&gt;She warns you that the fund has gone up so much in the 10 years leading to 2006, not because any fundamentals have changed, but because people have been investing more and more in this fund, driving the value up.&lt;/li&gt;&lt;li&gt;She also mentions that a lot of those people buying the fund didn't have the money to do so in the first place. They have been borrowing money heavily for that purpose. Some have borrowed so much that they now can't even pay the interest on the amount they borrowed, and now have to sell.&lt;/li&gt;&lt;/ul&gt;At this point you might be running away from her office, wondering why both you and your investment advisor had to loose so much time talking about this crazy RE fund. But if you are still there, you thoughts about this fund could be summarized in 3 points:&lt;ol&gt;&lt;li&gt;Investing in the RE fund is now &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;highly risky&lt;/span&gt;. Since the mid-40s, the fund have seen two other booms: in the 70s and 80s. After each one of those booms, the value came down to the previous support level. In the last 10 years we have seen an incredible boom, which was not justified by any fundamental change; it was &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;bubble&lt;/span&gt;. Since 2006 the bubble has &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;started to deflate&lt;/span&gt;. Since the beginning of this year, this has been going at a rate of about 1% every month. And despite the fall, the fund has so far "only" lost 15% of it value since its peak, compared to a gain of 100% during the boom of the previous 10 years. Talk about a risky investment.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;This has proved, historically, to be a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;lousy investment&lt;/span&gt;. Setting aside what happened during the last 10 years, the fund stayed surprisingly in line with inflation. Since the mid-40s, it stayed in a band of 20%. Let's say you invested in the RE fund in 1950; after 50 years you would stand a gain (adjusted for inflation) of only 20%. &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;If you had invested $1.00, 50 years later you would have $1.20&lt;/span&gt;. Compare this to investing in the S&amp;amp;P 500: with $1 invested in 1950, 50 years later you would have $70. Very lousy investment indeed.&lt;/li&gt;&lt;li&gt;This is a fund that has a very high barrier to entry. A lot of first-time investors in the RE fund have to put almost all of their savings in it. In addition, they borrow about 5 times that amount and put all that borrowed money in the fund. Talk about &lt;span class="Apple-style-span" style="font-weight: bold; "&gt;lack of diversification&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;Now, tell me, would you invest in the RE fund? If you had money invested in the RE fund, would you keep it there?&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-5820355429978128731?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/QydaFkTXwtY" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/5820355429978128731/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=5820355429978128731" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5820355429978128731?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/5820355429978128731?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/QydaFkTXwtY/and-yet-we-are-still-investing-in-real.html" title="And Yet, We Are Still Investing in Real Estate" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SI7LPGUMkCI/AAAAAAAACRM/IxL70Q9RqfI/s72-c/nytimes-home.gif" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/07/and-yet-we-are-still-investing-in-real.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QFSHs6fCp7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-2101102451100192548</id><published>2008-07-18T12:03:00.000-07:00</published><updated>2008-11-06T18:35:19.514-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:19.514-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="orbeon" /><category scheme="http://www.blogger.com/atom/ns#" term="xpath" /><title>XPath: First Weekday Following a Given Date</title><content type="html">&lt;a href="http://flickr.com/photos/eliazar/407605908/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SIDuSz-vprI/AAAAAAAACQs/xHka9zrRk6I/s200/calendar.jpg" alt="" id="BLOGGER_PHOTO_ID_5224437574708209330" border="0" /&gt;&lt;/a&gt;You are given a date &lt;span class="Apple-style-span" style="font-style: italic;"&gt;d&lt;/span&gt;. If that date does not fall on a weekday, you would like to find the first weekday date that follows &lt;span class="Apple-style-span" style="font-style: italic;"&gt;d&lt;/span&gt;. The following XPath code will do the trick:&lt;br /&gt;&lt;br /&gt;&lt;pre style="clear: both;"&gt;for $start in xs:date('2008-07-19') return&lt;br /&gt;(: Get date plus two following dates, i.e. candidate dates :)&lt;br /&gt;(for $i in (0 to 2) return&lt;br /&gt;   $start + xs:dayTimeDuration(concat('P', $i, 'D')))&lt;br /&gt;(: Only keep date on week dates :)&lt;br /&gt;[number(format-date(., '[F0]', 'en', (), ())) le 5]&lt;br /&gt;(: Take first possible date :)&lt;br /&gt;[1]&lt;/pre&gt;&lt;div&gt;In the above expression, the date (7/19/2008) is just provided as a string, so you can quickly test this, for instance in the &lt;a href="http://www.orbeon.com/ops/sandbox-transformations/xpath/"&gt;XPath Sandbox&lt;/a&gt;. The expression uses the XSLT &lt;a href="http://www.w3.org/TR/xslt20/#function-format-date"&gt;format-date()&lt;/a&gt; function to find the day of the week for a given date. Unfortunately this function is strictly speaking not an XPath function, but some engine will bend the rule and still expose it to you for convenience, as does Orbeon Forms.&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;You can also check if a given date is a weekday with:&lt;/div&gt;&lt;div&gt;&lt;pre&gt;number(format-date(xs:date('2008-08-26'),&lt;br /&gt;   '[F0]', 'en', (), ())) le 5&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-2101102451100192548?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/3oi4aqDsLrk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/2101102451100192548/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=2101102451100192548" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2101102451100192548?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2101102451100192548?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/3oi4aqDsLrk/xpath-first-weekday-following-given.html" title="XPath: First Weekday Following a Given Date" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/SIDuSz-vprI/AAAAAAAACQs/xHka9zrRk6I/s72-c/calendar.jpg" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/07/xpath-first-weekday-following-given.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DEADSHg7eCp7ImA9WxBaFkk.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-2403337411188529307</id><published>2008-06-09T17:15:00.000-07:00</published><updated>2010-03-26T16:39:39.600-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2010-03-26T16:39:39.600-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><title>TextMate Keyboard Shortcuts</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_mtKW2NpD7Rk/SE3OrssuPSI/AAAAAAAACPk/H2TRA-7P32U/s1600-h/textmate.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://4.bp.blogspot.com/_mtKW2NpD7Rk/SE3OrssuPSI/AAAAAAAACPk/H2TRA-7P32U/s320/textmate.png" alt="" id="BLOGGER_PHOTO_ID_5210047594065968418" border="0" /&gt;&lt;/a&gt;Those who have been reading this blog know that I like IntelliJ and &lt;a href="http://avernet.blogspot.com/search/label/intellij"&gt;blogged about it&lt;/a&gt; a number of times in the past. But let's admit it: IntelliJ is a &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;big&lt;/span&gt; &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;guy&lt;/span&gt;. It is &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;heavy&lt;/span&gt;. Starting IntelliJ takes minutes. Even alt-tabbing to IntelliJ after not using it for a while can take minutes. And all this on a fairly top-of-the-line laptop. This led me to experiment with other editors, in particular TextMate.&lt;br /&gt;&lt;br /&gt;TextMate compares more to Emacs or SlickEdit. So it won't replace IntelliJ for everything, but I have been using it for a week and it worked quite well for simpler tasks. For those of you who would also be starting to use TextMate, I put below a list of the keyboard shortcuts I use the most. I hope you will find it useful, and if you have other suggestions please post them in the comments.&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Bundles&lt;sup&gt;1&lt;/sup&gt;&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Subversion: ^⇧ A&lt;br /&gt;Diff: ^⇧⌘ D&lt;br /&gt;&lt;a href="http://github.com/protocool/AckMate"&gt;AckMate&lt;/a&gt; (powerful "search in project" using &lt;a href="http://betterthangrep.com/"&gt;ACK&lt;/a&gt;): ⇧⌘ A&lt;br /&gt;&lt;a href="http://gitorious.org/git-tmbundle"&gt;Git&lt;/a&gt;&lt;sup&gt;2&lt;/sup&gt;: ^⇧ G&lt;br /&gt;&lt;a href="http://code.google.com/p/textmate-missingdrawer/"&gt;MissingDrawer&lt;/a&gt; (replaces the standard Project Drawer)&lt;br /&gt;&lt;a href="http://github.com/subtleGradient/javascript-tools.tmbundle"&gt;JavaScript Tools&lt;/a&gt;: ^⇧ V to run &lt;a href="http://javascriptlint.com/"&gt;JavaScript Lint&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Line/block operations&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Select current word: ^W&lt;br /&gt;Select current line: ⇧⌘L&lt;br /&gt;Duplicate: ^⇧ D&lt;br /&gt;Delete: ^⇧ K&lt;br /&gt;Move: ^⌘ up/down&lt;br /&gt;Re-indent: ⌥⌘ [&lt;br /&gt;Indent left: ⌘ [&lt;br /&gt;Indent right: ⌘ ]&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Find&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Find in project: ⇧⌘ F (but ack is better)&lt;br /&gt;Copy to find buffer: ⌘ E&lt;br /&gt;Go to file: ⌘ T&lt;br /&gt;Go to symbol: ⇧⌘ T&lt;br /&gt;Incremental search: ^s&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Copy/paste&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Paste previous: ⇧⌘ V&lt;br /&gt;Paste stack: ^⌥⌘ V&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Reveal and Project Drawer&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;In project: ^⌘ R&lt;br /&gt;In Finder: ^⇧⌘ R&lt;br /&gt;Move focus from editor to project drawer: ^⇥ &lt;br /&gt;Move focus from project drawer to editor: ⇧^⇥&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Bookmarks&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div&gt;Create bookmark: ⌘ F2&lt;br /&gt;Go to next bookmark: F2&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;XML&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;div&gt;Type tag pair: &amp;lt;⇥ (then type tag name, then ⇥ again)&lt;br /&gt;Insert closing tag: ⌥⌘ .&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;span class="Apple-style-span" style="font-style: italic;"&gt;Misc&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;Completion: Esc&lt;br /&gt;Show all the shortcuts that apply in the current context: ⌃⌘T&lt;br /&gt;Disable/enable check spelling as you type: ⌘⌥ ;&lt;br /&gt;For the sake of how it looks: the &lt;a href="http://jason-evers.com/code/code-like-i-do"&gt;green moleskin icon&lt;/a&gt;&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; To install a bundle, copy the &lt;code&gt;MyBundle.tmbundle&lt;/code&gt; directory in your &lt;code&gt;~/Library/Application Support/TextMate/Bundles&lt;/code&gt;.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; If you like me, your Git binaries are in &lt;code&gt;/usr/local/git/bin&lt;/code&gt;, after installing the Git bundle, set &lt;code&gt;TM_GIT&lt;/code&gt; to &lt;code&gt;/usr/local/bin/git&lt;/code&gt; (in the TextMate preferences, Advanced, Shell Variables).&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt; From the Green Moleskin package, I only use their gorgeous icon. Download the package, unzip it and you'll find the icon in &lt;code&gt;Green_Moleskine/Etext Icon/moleskine_textmate.ico&lt;/code&gt;. First &lt;code&gt;cp "Green_Moleskine/Etext Icon/moleskine_textmate.ico" /Applications/TextMate.app/Contents/Resources/TextMate.icns&lt;/code&gt;. Second, open the icon in Preview, select all, copy, go to the Finder, do Get Info on TextMate.app, click on the icon on the top left of the window, and paste.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-2403337411188529307?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/L6M_P_oS9kw" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/2403337411188529307/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=2403337411188529307" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2403337411188529307?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/2403337411188529307?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/L6M_P_oS9kw/textmate-keyboard-shortcuts.html" title="TextMate Keyboard Shortcuts" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_mtKW2NpD7Rk/SE3OrssuPSI/AAAAAAAACPk/H2TRA-7P32U/s72-c/textmate.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/06/textmate-keyboard-shortcuts.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQXg6eSp7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-7296519511557991132</id><published>2008-04-08T13:32:00.000-07:00</published><updated>2008-11-06T18:35:20.611-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:20.611-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web2.0" /><category scheme="http://www.blogger.com/atom/ns#" term="mac" /><title>Twitterrific Wishlist</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R-q0Up-bMZI/AAAAAAAACN8/WmepwrZ2DuQ/s1600-h/twitteriffic.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R-q0Up-bMZI/AAAAAAAACN8/WmepwrZ2DuQ/s320/twitteriffic.png" alt="" id="BLOGGER_PHOTO_ID_5182152588201243026" border="0" /&gt;&lt;/a&gt;&lt;a href="http://iconfactory.com/software/twitterrific"&gt;Twitterrific&lt;/a&gt; is a great little program. If you are a Twitter user and have a Mac, I can wholeheartedly recommend it to you. But it could be even better, so here is my wish list for Twitterrific:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;New feature:&lt;/span&gt; A new search or filter, so we can quickly see all the twits with a certain keyword, or from/to a certain person.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Consistency:&lt;/span&gt; Show outgoing direct messages in the timeline. Incoming direct messages can be shown, but the messages you send are never shown.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;Bug fix:&lt;/span&gt; The text field looses its focus when alt-tabbing to another application and then coming back to Twitterrific.&lt;/li&gt;&lt;li&gt;&lt;span style="font-style: italic;"&gt;New feature:&lt;/span&gt; Support for multiple Twitter accounts used at the same time. (From what I read this one is coming.)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-7296519511557991132?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/eANxJp7IUHk" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/7296519511557991132/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=7296519511557991132" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7296519511557991132?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/7296519511557991132?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/eANxJp7IUHk/twitterrific-wishlist.html" title="Twitterrific Wishlist" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R-q0Up-bMZI/AAAAAAAACN8/WmepwrZ2DuQ/s72-c/twitteriffic.png" height="72" width="72" /><thr:total>2</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/04/twitterrific-wishlist.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQ344fip7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-3447269045180635547</id><published>2008-04-07T16:05:00.000-07:00</published><updated>2008-11-06T18:35:22.036-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:22.036-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web2.0" /><title>Basecamp new Feature: "Reply by email"</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_mtKW2NpD7Rk/R_ph6Z-bMcI/AAAAAAAACOU/Y0VqSKXNmJw/s1600-h/basecamp.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://1.bp.blogspot.com/_mtKW2NpD7Rk/R_ph6Z-bMcI/AAAAAAAACOU/Y0VqSKXNmJw/s320/basecamp.png" alt="" id="BLOGGER_PHOTO_ID_5186565576903569858" border="0" /&gt;&lt;/a&gt;37 signals launched a new feature in Basecamp: the ability to reply to messages posted on Basecamp &lt;a href="http://37signals.blogs.com/products/2008/04/new-basecamp-fe.html"&gt;directly with your email client&lt;/a&gt;. This is great; in principle it should make Basecamp messages more useful, and I always like to see more features added to the products we are using (and paying for every month!).&lt;br /&gt;&lt;br /&gt;I gave it a try this morning. My assessment so far is that it doesn't work well enough to be useful. Until at least some of the issues are taken care of, &lt;span style="font-weight: bold;"&gt;I will not use this feature&lt;/span&gt; and I will &lt;span style="font-weight: bold;"&gt;not recommend that our clients use it&lt;/span&gt; either. Here are few show stoppers:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It doesn't deal well with end of lines. See for instance what other users will see when I post a message by sending a reply from Gmail:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R_pcQp-bMbI/AAAAAAAACOM/e4XHyFSIJHg/s1600-h/basecamp-reply.png"&gt;&lt;img style="border: 1px solid gray; margin: 0px auto 10px; display: block; cursor: pointer;" src="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R_pcQp-bMbI/AAAAAAAACOM/e4XHyFSIJHg/s400/basecamp-reply.png" alt="" id="BLOGGER_PHOTO_ID_5186559362085892530" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;When you reply to a message from your mail client, in most cases the mail client will quote the message and add before that something that reads: &lt;span style="font-style: italic;"&gt;On Mon, Apr 7, 2008 at 2:51 PM, such and such wrote&lt;/span&gt;. This line isn't removed by Basecamp. It will stay there at the end of all your messages.&lt;/li&gt;&lt;li&gt;If you try to get around this issue by just removing the entire quoted text before typing in your message, your message won't back posted. You will receive an email from Basecamp telling you your message wasn't posted, but that reply does not contain a &lt;span style="font-style: italic;"&gt;References&lt;/span&gt; header so it can be recognized as part of the same thread by your mail client, and it does not contain your message. So essentially you don't know &lt;span style="font-style: italic;"&gt;which message&lt;/span&gt; didn't go through.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-3447269045180635547?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/3HscRJ8Y1eE" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/3447269045180635547/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=3447269045180635547" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/3447269045180635547?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/3447269045180635547?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/3HscRJ8Y1eE/basecamp-new-feature-reply-by-email.html" title="Basecamp new Feature: &quot;Reply by email&quot;" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_mtKW2NpD7Rk/R_ph6Z-bMcI/AAAAAAAACOU/Y0VqSKXNmJw/s72-c/basecamp.png" height="72" width="72" /><thr:total>3</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/04/basecamp-new-feature-reply-by-email.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQ3o9fCp7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-9083560133017629948</id><published>2008-03-28T12:19:00.000-07:00</published><updated>2008-11-06T18:35:22.464-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:22.464-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="office2.0" /><title>Screen Sharing Software: Some Are Good, Most Are Bad</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_mtKW2NpD7Rk/R-wVuZ-bMaI/AAAAAAAACOE/CJK3W1JJR5g/s1600-h/screen-sharing.png"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_mtKW2NpD7Rk/R-wVuZ-bMaI/AAAAAAAACOE/CJK3W1JJR5g/s320/screen-sharing.png" alt="" id="BLOGGER_PHOTO_ID_5182541158187479458" border="0" /&gt;&lt;/a&gt;I recently tried a number of screen sharing applications and have been generally disappointed:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.yugma.com/"&gt;Yugma&lt;/a&gt; has been my favorite for a while, until Yugma came out with version 3. When it version 3 was first released I had a number of problems, which I finally &lt;a href="http://avernet.blogspot.com/2008/03/getting-yugma-to-run.html"&gt;managed to solve&lt;/a&gt;, but others I am using this tool with are having similar problems, and when they do it is in general the end of the story. Verdict: &lt;span style="font-style: italic;"&gt;failed&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.yuuguu.com/"&gt;Yuuguu&lt;/a&gt;, despite the ridiculous name, worked more often than Yugma. Unfortunately it has been very unreliable: the connection to the server is dropping on a regular basis, forcing all the participants to rejoin the meeting. Verdict: &lt;span style="font-style: italic;"&gt;failed&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dimdim.com/"&gt;DimDim&lt;/a&gt; doesn't support screen sharing on the Mac. It also does so many things, like providing document sharing and a shared white board, that I am worried they won't focus enough on screen sharing. I tried the it on Windows and found a number of refresh issues. Verdict: &lt;span style="font-style: italic;"&gt;failed&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://vyew.com/"&gt;Vyew&lt;/a&gt; is comparable to DimDim. Screen sharing didn't on a Mac from Firefox (the whole  interface got locked up) but it worked from Safari. They have a page with &lt;a href="http://vyew.com/forum/viewtopic.php?t=284"&gt;known bugs&lt;/a&gt;, which was unaccessible at the time of this writing. It works from Windows, but people on the other side see a resized view of the screen with is always either too large or too small depending on the size of your browser window. (There doesn't seem to be a "show in 1:1 button".) Also the interface is way to cluttered for my taste. Verdict: &lt;span style="font-style: italic;"&gt;close&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://meetmenow.webex.com/"&gt;WebEx MeetMeNow&lt;/a&gt; is WebEx "affordable" offering ($50/month per account), but it doesn't work on the Mac.  Verdict: &lt;span style="font-style: italic;"&gt;failed&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.gotomeeting.com/"&gt;GoToMeeting&lt;/a&gt;, like WebEx MeetMeNow is priced at $50/month, and like WebEx also doesn't work on the Mac.  Verdict: &lt;span style="font-style: italic;"&gt;failed&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.glance.net/"&gt;Glance&lt;/a&gt; does just screen sharing (I like that!). It is simple and works smoothly both on Mac and Windows. Pricing is reasonable at $50/month. It just lacks one crucial feature: the ability, as a host, to make one of the attendees the presenter. If you don't need this feature, this might be a good solution for you. Verdict: &lt;span style="font-style: italic;"&gt;close&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.livelook.net/"&gt;LiveLook&lt;/a&gt; is very much like Glance, without the need to install a software, but with the same limitation: the host can't make an attendee the presenter. You pay 2.5 cents per minute per attendee. So a 1 hour meeting with 3 other people will cost you $4.50. Verdict: &lt;span style="font-style: italic;"&gt;close&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The best I have found so far is &lt;a href="https://www.webhuddle.com/"&gt;WebHuddle&lt;/a&gt;. Here is what I like about it:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;It works both on Mac and Windows.&lt;/li&gt;&lt;li&gt;No installation is required; it runs entirely from your browser.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;It is based on open source software; it you wish, you can install WebHuddle on your own servers.&lt;/li&gt;&lt;li&gt;You can schedule meetings, send a link to participants. Participants don't have to register; they just need to enter their name and email to join.&lt;/li&gt;&lt;li&gt;You can switch to a full-color mode (called "JPEG mode"), so participants can see your screen exactly as you do.&lt;/li&gt;&lt;li&gt;You can make other participants the presenter, at which point they can share their screen.&lt;/li&gt;&lt;/ul&gt;WebHuddle isn't perfect: the UI has room for improvements, and you can't let another participant control &lt;span style="font-style: italic;"&gt;your&lt;/span&gt; mouse and keyboard. Still, if you use screen sharing, you should really &lt;a href="https://www.webhuddle.com/"&gt;give it a try&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;If you are using other screen sharing tools not mentioned here and that work well for you, please let me know in a comment below.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-9083560133017629948?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/afTVuCbXQjQ" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/9083560133017629948/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=9083560133017629948" title="6 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9083560133017629948?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/9083560133017629948?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/afTVuCbXQjQ/screen-sharing-software-some-are-good.html" title="Screen Sharing Software: Some Are Good, Most Are Bad" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mtKW2NpD7Rk/R-wVuZ-bMaI/AAAAAAAACOE/CJK3W1JJR5g/s72-c/screen-sharing.png" height="72" width="72" /><thr:total>6</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/03/screen-sharing-software-some-are-good.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQ3Yzfip7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-8664984961877373518</id><published>2008-03-27T10:03:00.000-07:00</published><updated>2008-11-06T18:35:22.886-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:22.886-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="mobile" /><title>Better Technology, More Facts, Better Politics</title><content type="html">&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://flickr.com/photos/janeladeimagens/1590055382/"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://3.bp.blogspot.com/_mtKW2NpD7Rk/R9nb51BE1XI/AAAAAAAACNk/xMkRURw6BxM/s320/chating.jpg" alt="" id="BLOGGER_PHOTO_ID_5177411033169712498" border="0" /&gt;&lt;/a&gt;&lt;a href="http://www.tuaw.com/2008/02/26/iphones-without-phone/"&gt;TUAW&lt;/a&gt; writes:&lt;br /&gt;&lt;blockquote&gt;The iPhone transforms people like me from insufferable know-it-alls to insufferable know-it-alls with the entire Internet in our pants. (Or fashionable handbag.) (Or manziere.) (BRO!) Google and Wikipedia don't equate to wisdom and understanding, but they provide inexhaustible streams of on-the-spot factoids. End those "Who's right?" arguments fast.&lt;/blockquote&gt;Most phones today are using GPRS for data, which is painfully slow. GPRS still does miracles when you are on the go and don't have any other option, but it is not "Internet at your fingertips". Because of this, you still rarely see people, and even geeks, take out their phone to check a fact during a discussion.&lt;br /&gt;&lt;br /&gt;All this of course will change with 3G, faster processors, and cheaper phones. We can now be confident that a few years from now we'll all have a phone in our pocket or purse that will enable us to very comfortably access the Internet.&lt;br /&gt;&lt;br /&gt;Will this change the nature of face-to-face conversations? Will the phone succeed in becoming a tool that enhances our face-to-face experience?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-8664984961877373518?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/dda2EL7175I" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/8664984961877373518/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=8664984961877373518" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/8664984961877373518?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/8664984961877373518?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/dda2EL7175I/better-technology-more-facts-better.html" title="Better Technology, More Facts, Better Politics" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_mtKW2NpD7Rk/R9nb51BE1XI/AAAAAAAACNk/xMkRURw6BxM/s72-c/chating.jpg" height="72" width="72" /><thr:total>5</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/03/better-technology-more-facts-better.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0QGQn0ycSp7ImA9WxRVEE8.&quot;"><id>tag:blogger.com,1999:blog-6757823.post-6615971169121972966</id><published>2008-03-21T10:32:00.000-07:00</published><updated>2008-11-06T18:35:23.399-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-06T18:35:23.399-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="web2.0" /><title>Twitter: A Few Things I Like About It</title><content type="html">&lt;ol&gt;&lt;li&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R5fWruJiZ3I/AAAAAAAACKU/1sUQSqAJ_BE/s1600-h/twitter.gif"&gt;&lt;img style="margin: 0pt 0pt 10px 10px; float: right; cursor: pointer;" src="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R5fWruJiZ3I/AAAAAAAACKU/1sUQSqAJ_BE/s320/twitter.gif" alt="" id="BLOGGER_PHOTO_ID_5158827944786945906" border="0" /&gt;&lt;/a&gt;It is &lt;span style="font-weight: bold;"&gt;simple&lt;/span&gt;. It &lt;span style="font-weight: bold;"&gt;doesn't impose&lt;/span&gt; much on you. It provides a layer of social network / public IM on top of what you already use. Unlike Facebook, it doesn't try to replace a lot of the tool you already use; it doesn't try to be the your only destination to do everything online.&lt;/li&gt;&lt;li&gt;It is &lt;span style="font-weight: bold;"&gt;public&lt;/span&gt;. Most of what is going on on Twitter is entirely public. It isn't siloed; it isn't made available to circle of friends you choose. The fact that every twit is public, archived, and searchable keeps people &lt;span style="font-weight: bold;"&gt;honest&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;140 characters forces all us to be &lt;span style="font-weight: bold;"&gt;concise&lt;/span&gt;, to go directly &lt;span style="font-weight: bold;"&gt;to the point&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;It is &lt;span style="font-weight: bold;"&gt;open&lt;/span&gt;: you can access or post on Twitter from a number of different software and devices. Use text messages, www.twitter.com from your desktop browser, m.twitter.com from the browser on your phone, or an application like &lt;a href="http://iconfactory.com/software/twitterrific"&gt;Twitterrific&lt;/a&gt; (native on the Mac) or &lt;a href="http://www.twhirl.org/"&gt;Twirl&lt;/a&gt; (AIR).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;You only see twits from people &lt;span style="font-style: italic;"&gt;you&lt;/span&gt; decide to follow. People can direct message you (send you a private twit), but only if &lt;span style="font-style: italic;"&gt;you&lt;/span&gt; follow them. This keeps &lt;span style="font-weight: bold;"&gt;spam out of the system&lt;/span&gt;.&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6757823-6615971169121972966?l=avernet.blogspot.com' alt='' /&gt;&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/avernet/~4/9l2EUDHPXfA" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://avernet.blogspot.com/feeds/6615971169121972966/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="http://www.blogger.com/comment.g?blogID=6757823&amp;postID=6615971169121972966" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6615971169121972966?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6757823/posts/default/6615971169121972966?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/avernet/~3/9l2EUDHPXfA/twitter-few-things-i-like-about-it.html" title="Twitter: A Few Things I Like About It" /><author><name>Alessandro Vernet</name><uri>http://www.blogger.com/profile/06085176014230803685</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="http://farm1.static.flickr.com/122/269903379_c4b40a3570.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/_mtKW2NpD7Rk/R5fWruJiZ3I/AAAAAAAACKU/1sUQSqAJ_BE/s72-c/twitter.gif" height="72" width="72" /><thr:total>0</thr:total><feedburner:origLink>http://avernet.blogspot.com/2008/03/twitter-few-things-i-like-about-it.html</feedburner:origLink></entry></feed>

