<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-31982987</id><updated>2011-11-13T06:58:57.418-05:00</updated><category term='cooking'/><category term='flash'/><category term='mail'/><category term='animals'/><category term='consumer'/><category term='funny'/><category term='westboro'/><category term='web'/><category term='apple'/><category term='campfire'/><category term='hydroottawa'/><category term='gatineau'/><category term='development'/><category term='scifi'/><category term='chapters'/><category term='privacy'/><category term='nature'/><category term='protocols'/><category term='adobe'/><category term='api'/><category term='osx'/><category term='chrome'/><category term='bsg'/><category term='electricity'/><category term='porn'/><category term='iphone'/><category term='bank'/><category term='ergonomics'/><category term='opensource'/><category term='banque'/><category term='espresso'/><category term='amazon'/><category term='windows'/><category term='performance'/><category term='tv'/><category term='eclipse'/><category term='recipes'/><category term='usability'/><category term='bmo'/><category term='restaurants'/><category term='linux'/><category term='business'/><category term='ant'/><category term='java'/><category term='recycling'/><category term='photography'/><category term='squirrel'/><category term='opentable'/><category term='security'/><category term='communication'/><category term='ux'/><category term='geek'/><category term='caprica'/><category term='pdf'/><category term='snowleopard'/><category term='ad'/><category term='consumer finance'/><category term='resume'/><category term='ui'/><category term='gvim'/><category term='bridgehead'/><category term='flickr'/><category term='software'/><category term='food'/><category term='ipod'/><category term='conversation'/><category term='mac'/><category term='entertainment'/><category term='design'/><category term='fido'/><category term='coffee'/><category term='fail'/><category term='health'/><category term='ottawa'/><category term='google'/><category term='subversion'/><category term='desjardins'/><title type='text'>oh, when will I start winning?</title><subtitle type='html'>Unsolicited opinions and a fair bit of technical stuff.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>95</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-31982987.post-2095147606979149503</id><published>2011-07-14T20:27:00.003-04:00</published><updated>2011-07-14T20:27:57.881-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='electricity'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='hydroottawa'/><title type='text'>Hydro Ottawa's new Time-of-Use rates</title><content type='html'>I received today the notice from Hydro Ottawa explaining their new Time-of-Use billing scheme.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Quick look at the new rates&lt;/h3&gt;My conclusion is that it seems to raise costs for the average use case, but it's possible to lower costs &lt;b&gt;&lt;i&gt;slightly&lt;/i&gt;&lt;/b&gt; compared to their current level by shifting usage to off-peak periods (though I think it's unrealistic to expect to be able to save money). The price for on-peak usage (6 hours per day on weekdays) rises a lot.&lt;br /&gt;&lt;br /&gt;The old "anytime" rate, on my latest bill (April-June), was 6.8 cents/KWh.&lt;br /&gt;&lt;br /&gt;The new rates are:&lt;br /&gt;Off-peak: 5.9 c/KWh&lt;br /&gt;Mid-peak: 8.9 c/KWh&lt;br /&gt;On-peak: 10.7 c/KWh&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5938650418/" title="Hydro Ottawa TOU Billing Analysis by JPDaigle, on Flickr"&gt;&lt;img alt="Hydro Ottawa TOU Billing Analysis" src="http://farm7.static.flickr.com/6137/5938650418_5ff81465fe_o.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Assuming a constant load (unrealistic), and weighting these rates by the number of hours a week they apply, you get a new composite weighted rate of 7.29 c/KWh, about 7% higher than the current "anytime" rates.&lt;br /&gt;&lt;br /&gt;If you want to keep paying the same amount as today, you'd have to have a usage profile solving for (X: off-peak, Y: mid-peak, Z: on-peak):&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;5.9X + 8.9Y + 10.7Z = 6.8&lt;/div&gt;&lt;div style="text-align: center;"&gt;(any point on that plane will yield the same cost as today's rate, but the practical application is unintuitive)&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;So with a weighted rate only 7% higher than today, I think it's not going to be terribly more expensive, as long as you make at least a token effort to move usage outside the On-Peak timespan.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Reporting&lt;/h3&gt;The reporting is actually pretty cool:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5938151253/" title="Screen shot 2011-07-14 at 7.34.12 PM by JPDaigle, on Flickr"&gt;&lt;img alt="Screen shot 2011-07-14 at 7.34.12 PM" height="340" src="http://farm7.static.flickr.com/6005/5938151253_ae9c3e7961.jpg" width="500" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;It presents hourly, daily, and monthly stats, and allows downloading the data as a spreadsheet. This is actually an improvement I've been wishing for for a long time, in contrast to the previous data, which only gave you monthly usage. Now I wish I could get the same data for my gas consumption.&lt;br /&gt;&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2095147606979149503?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2095147606979149503/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2095147606979149503' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2095147606979149503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2095147606979149503'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/07/hydro-ottawas-new-time-of-use-rates.html' title='Hydro Ottawa&apos;s new Time-of-Use rates'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm7.static.flickr.com/6005/5938151253_ae9c3e7961_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8945779391903816899</id><published>2011-07-04T17:27:00.001-04:00</published><updated>2011-07-04T17:31:11.750-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pdf'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>Non-saveable PDF forms</title><content type='html'>I think I just figured out why people create PDF forms that don't let you save the contents typed in, as annoying and unhelpful as that is.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5902179321/" title="PDF cannot save by JPDaigle, on Flickr"&gt;&lt;img src="http://farm7.static.flickr.com/6038/5902179321_05af223cb2_o.png" width="485" height="119" alt="PDF cannot save"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I'll bet they're trying to protect us from ourselves, reasoning that we will fill out the form with sensitive information such as SSN, date of birth, etc., and we can't be trusted to store the saved file securely. &lt;br /&gt;&lt;br /&gt;So they don't let us save it. It feels a little nanny-state, but I guess it's at least well-intentioned.&lt;br /&gt;&lt;br /&gt;Edit: I think there could be a niche market opportunity here for a little piece of software that allows writing anywhere on a PDF and ignores the do-not-save flag.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8945779391903816899?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8945779391903816899/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8945779391903816899' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8945779391903816899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8945779391903816899'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/07/non-saveable-pdf-forms.html' title='Non-saveable PDF forms'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6425441740189729517</id><published>2011-05-01T20:40:00.000-04:00</published><updated>2011-05-01T20:40:03.072-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='resume'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='opensource'/><title type='text'>Spruce Up Tech Resumes With Skill Timelines</title><content type='html'>A while back I had a bit of a chat with &lt;a href="http://twitter.com/#!/jkealey"&gt;Jason&lt;/a&gt; about making tech resumes more interesting by presenting information differently: The problem I aim to solve is that listing experience with a couple technology stacks as a laundry list of keywords doesn't automatically communicate how recent or deep that experience is (I don't really want to walk into an interview and get grilled about VB.NET, which I haven't used in 6 years.)&lt;br /&gt;&lt;br /&gt;I propose to improve things a bit by mapping whatever you'd currently include in a bullet list as a stacked timeline:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5678080260/" title="sample-screenshot by JPDaigle, on Flickr"&gt;&lt;img alt="sample-screenshot" height="139" src="http://farm6.static.flickr.com/5145/5678080260_b3a7e0c877.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I bashed out a bit of code to generate these graphs (&lt;a href="https://github.com/jpdaigle/skilltimeline"&gt;grab SkillTimeline on GitHub&lt;/a&gt;). An interesting requirement I had was that I wanted the output to be a vector graphic, as my resume is ultimately compiled to PDF by LaTeX. So I wrote something that would read in a plaintext file of skills and dates, auto-size everything properly, and generate an SVG document with the stacked timeline.&lt;br /&gt;&lt;br /&gt;The input looks like this (I wrote an EBNF grammar when planning out the project, but it's really just a string, a colon, then comma-separated date ranges):&lt;br /&gt;&lt;pre&gt;# Sample SkillTimeline input file.&lt;br /&gt;# Provide one skill per line, and comma-separated date ranges.&lt;br /&gt;&lt;br /&gt;SilverLight: 2010-2011.06&lt;br /&gt;JavaScript: 2010-2011.06&lt;br /&gt;C#: 2003.10-2006.06, 2009.01-2011.05&lt;br /&gt;ASP.NET: 2004.01-2006.06&lt;br /&gt;C: 2003.09-2005.12, 2009.01-2010.12&lt;br /&gt;Java: 2003.09-2011.06&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And the output looks something like:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5678090538/" title="Screen shot 2011-05-01 at 8.14.21 PM by JPDaigle, on Flickr"&gt;&lt;img alt="Screen shot 2011-05-01 at 8.14.21 PM" height="324" src="http://farm6.static.flickr.com/5269/5678090538_da1178d73e.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="https://github.com/jpdaigle/skilltimeline"&gt;Grab SkillTimeline on GitHub.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6425441740189729517?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6425441740189729517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6425441740189729517' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6425441740189729517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6425441740189729517'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/05/spruce-up-tech-resumes-with-skill.html' title='Spruce Up Tech Resumes With Skill Timelines'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5145/5678080260_b3a7e0c877_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2953487412870173693</id><published>2011-03-17T18:12:00.003-04:00</published><updated>2011-03-17T18:18:58.243-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bank'/><category scheme='http://www.blogger.com/atom/ns#' term='banque'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='desjardins'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Nouveau modèle de permissions pour les aggrégateurs financiers</title><content type='html'>Un &lt;a href="http://lapresseaffaires.cyberpresse.ca/economie/services-financiers/201103/15/01-4379305-prudence-avec-les-services-de-regroupement-de-comptes.php"&gt;récent article de CyberPresse&lt;/a&gt;&amp;nbsp;(que j'ai découvert &lt;a href="http://twitter.com/#!/MvtDesjardins/status/48428727633330176"&gt;via @MvtDesjardins&lt;/a&gt;, merci!) nous rappelle ce que l'on savait déjà: les aggrégateurs de transactions financières, bien qu'extrêmement utiles pour simplifier la gestion d'un budget (je suis un grand fan de &lt;i&gt;Mint&lt;/i&gt;, et autrefois de feu&amp;nbsp;&lt;i&gt;Wesabe&lt;/i&gt;), présentent certains risques théoriques.&lt;br /&gt;&lt;br /&gt;On y lit aussi un fait fort intéressant - et que j'ignorais jusqu'ici - soit que les institutions financières considèrent que l'acte de fournir à un aggrégateur comme &lt;i&gt;&lt;a href="http://mint.com/"&gt;Mint.com&lt;/a&gt;&lt;/i&gt; son NIP d'accès bancaire constitue un bris de confidentialité du NIP (les dégageant de leurs garanties vis-à-vis les opérations non autorisées).&amp;nbsp;[Note: Je ne sais pas comment une banque arriverait à prouver qu'un membre possède en effet un compte sur sur un quelconque aggrégateur de transactions&amp;nbsp;&lt;b&gt;&lt;i&gt;et&lt;/i&gt;&lt;/b&gt; a volontairement divulgué son code d'accès - la défense "ah, non, ce n'est pas mon compte, quelqu'un d'autre a dû voler mon NIP et l'enregistrer là-bas", semble plausible. C'est une discussion pour un autre jour.]&lt;br /&gt;&lt;br /&gt;De l'article:&lt;br /&gt;&lt;blockquote&gt;Ursula Menke n'en déconseille pas l'usage. "Nous suggérons des précautions, indique-t-elle. C'est une question de bien peser les risques et les bénéfices de ce genre de service."&lt;/blockquote&gt;&lt;br /&gt;C'est une recommendation totalement vide, car il n'y a en fait aucune précaution possible; soit on fait l'usage d'un tel service (en divulguant notre NIP à une tierce partie), ou on s'en passe complètement.&lt;br /&gt;&lt;br /&gt;La faute pour cette situation (que, je prédis, n'est que temporaire, car c'est réglable, bien qu'un peu difficile) repose sur les banques, qui voient leurs services en ligne évoluer à un rythme glacial comparé au reste de l'industrie des services sur le Web. Nous avons besoin de nouveaux&amp;nbsp;standards de transfert de données et de délégation de l'identification des usagers. Je m'explique: Le vrai problème dans tout ça, c'est qu'il n'y a actuellement aucune granularité dans le contrôle d'accès qu'un usager peut offrir aux tierces parties; c'est &lt;b&gt;&lt;i&gt;tout&lt;/i&gt;&lt;/b&gt; ou &lt;b&gt;&lt;i&gt;rien&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Il m'est actuellement impossible de fournir un accès &lt;b&gt;&lt;i&gt;lecture-seulement&lt;/i&gt;&lt;/b&gt;&amp;nbsp;de mes transactions financières. Je dois fournir à un aggrégateur de transactions l'accès total à tous mes comptes, et les systèmes de ma banque ou caisse populaire n'ont aucun moyen de différencier un service automatisé d'un réel usager et d'appliquer des permissions différentes le cas échéant.&lt;br /&gt;&lt;br /&gt;C'est un problème très commun dans notre industrie (en fait, &lt;i&gt;GMail&lt;/i&gt;, &lt;i&gt;Facebook&lt;/i&gt;, &lt;i&gt;Twitter&lt;/i&gt; et autres ont tous eu ce problème à leurs débuts et ont dû le surmonter), et pour lequel il existe des &lt;a href="http://hueniverse.com/oauth/"&gt;solutions relativement simples&lt;/a&gt;&amp;nbsp;(qui servent, au minimum, d'inspiration). N'importe-quelle archive d'informations personnelles de grande valeur pourrait me permettre de créer des jetons d'authentification afin de donner accès à un sous-ensemble de mes données à d'autres services. Du coup, on élimine &lt;b&gt;totalement&lt;/b&gt; la divulgation des crédentiels d'authentification aux tierces parties, on permet aux consommateurs d'offrir différentes permissions à différents services, et on peut rétracter l'accès d'un service à nos données sans impact sur les autres, en invalidant le jeton associé à ce service.&lt;br /&gt;&lt;br /&gt;Ça prendra sûrement des années, mais la balle est dans le camp des banques et des caisses populaires, qui sont les seuls à pouvoir régler ce problème.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2953487412870173693?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2953487412870173693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2953487412870173693' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2953487412870173693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2953487412870173693'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/03/modele-de-permissions-pour-les.html' title='Nouveau modèle de permissions pour les aggrégateurs financiers'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3570551874207850677</id><published>2011-03-02T22:05:00.000-05:00</published><updated>2011-03-02T22:05:22.331-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='ux'/><category scheme='http://www.blogger.com/atom/ns#' term='chrome'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><title type='text'>Fantastic UX Design: the Google Chrome Developer Console</title><content type='html'>Yet another example of where the simple Chrome UI betrays the huge amount of thought that must have gone into its design and development: this is a log console &lt;i&gt;done right&lt;/i&gt;.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you scroll to any point in the Chrome 10 developer console while new logs are being appended to it, the scrollbar position &amp;nbsp;stays where you are and the logs are locked in place for your inspection:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5492898491/" title="CropperCapture[391] by JPDaigle, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5052/5492898491_b4fb1e50eb.jpg" width="500" height="407" alt="CropperCapture[391]" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;However, if you scroll down to the very bottom of the window and release the scroll bar, then you get "tail -f" functionality - the window scrolls down automatically with new logs:&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5493491226/" title="CropperCapture[392] by JPDaigle, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5098/5493491226_55bb100f4a.jpg" width="500" height="407" alt="CropperCapture[392]" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To pick just one example to contrast, Wireshark used a toolbar button to control this behaviour (below), while Google Chrome "just works" and does the right thing without any clutter.&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5493508146/" title="wireshark_scr by JPDaigle, on Flickr"&gt;&lt;img src="http://farm6.static.flickr.com/5220/5493508146_662ec69f92_m.jpg" width="161" height="58" alt="wireshark_scr" /&gt;&lt;/a&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/31982987-3570551874207850677?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3570551874207850677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3570551874207850677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3570551874207850677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3570551874207850677'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/03/fantastic-ux-design-google-chrome.html' title='Fantastic UX Design: the Google Chrome Developer Console'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5052/5492898491_b4fb1e50eb_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7188562687148568544</id><published>2011-02-16T22:34:00.001-05:00</published><updated>2011-02-16T22:36:00.731-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee'/><category scheme='http://www.blogger.com/atom/ns#' term='business'/><title type='text'>Coffee Shop Subscriptions</title><content type='html'>It just occurred to me that I’ve never heard of a coffee shop subscription.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/5452087311/" title="Coffee loyalty cards by JPDaigle, on Flickr"&gt;&lt;img alt="Coffee loyalty cards" height="500" src="http://farm6.static.flickr.com/5132/5452087311_ea4cfda93e.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Many coffee shops already have loyalty cards, where each 10th coffee is free. This is going further (way further) in the same direction: offer a monthly all-the-lattes-you-can-drink subscription! Consider that repeat daily business is the name of the game for these places, and it’s a wonder that we’ve never seen it tried - can anyone figure out how to price the subscription to maximize revenue?&lt;br /&gt;&lt;br /&gt;A few thoughts:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;You’d have to tie it to an individual and make it non-transferable. I think you could profitably supply me with all the lattes I can drink for a fixed price, but there’s no way it’s profitable if I buy a single subscription for my entire office.&lt;/li&gt;&lt;li&gt;The right price from the consumer’s point of view would be a bit less than the cost of 18 lattes (5 per week x 4 weeks/month x 0.9 to account for loyalty cards).&lt;/li&gt;&lt;li&gt;The right price from the coffee shop’s point of view is higher than that - they’re taking a risk that I won’t start drinking three a day. I imagine they can do this because the marginal cost of making more lattes is small compared to their huge fixed costs.&amp;nbsp;&lt;/li&gt;&lt;li&gt;In exchange for this risk they’re getting guaranteed revenue, in advance, and the guarantee I won’t ever step foot in a competitor’s shop. You can have two loyalty reward cards and go to whichever shop is closest, but there’s no way you’d ever buy two subscriptions to competing shops.&lt;/li&gt;&lt;li&gt;To mitigate the risk of abuse you could ignore the one-a-day market and target only the two-a-day heavy purchasers (since there’s an upper limit to how much coffee it’s practical to consume). Price it below what it would cost to buy two a day for a month. You’ll probably convert a bunch of your one-a-day drinkers to the subscription for a little more.&lt;/li&gt;&lt;li&gt;You could market this as a conspicuous luxury item: make it a nice thick golden card that status-seeking scum-sucking yuppies will proudly flash at the register.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;div&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/31982987-7188562687148568544?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7188562687148568544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7188562687148568544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7188562687148568544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7188562687148568544'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2011/02/coffee-shop-subscriptions.html' title='Coffee Shop Subscriptions'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm6.static.flickr.com/5132/5452087311_ea4cfda93e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3796128974257189850</id><published>2010-05-25T10:13:00.000-04:00</published><updated>2010-05-25T10:13:42.922-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ad'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='flash'/><title type='text'>Dark Days</title><content type='html'>This is the first time I've ever seen an animated graphical ad right on one of Google's main properties.&lt;br /&gt;&lt;i&gt;And&lt;/i&gt; there's no link below the ad to report it as offensive.&lt;br /&gt;&lt;i&gt;And&lt;/i&gt; it's in Flash! Argh.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4638495905/" title="Animated graphical ad on google finance by JPDaigle, on Flickr"&gt;&lt;img alt="Animated graphical ad on google finance" height="240" src="http://farm5.static.flickr.com/4042/4638495905_a09fa87788.jpg" width="500" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3796128974257189850?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3796128974257189850/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3796128974257189850' title='32 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3796128974257189850'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3796128974257189850'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/05/dark-days.html' title='Dark Days'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4042/4638495905_a09fa87788_t.jpg' height='72' width='72'/><thr:total>32</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3515610547407588140</id><published>2010-04-08T17:20:00.000-04:00</published><updated>2010-04-08T17:20:34.115-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Window Management for Compulsive Neat-Freaks</title><content type='html'>&lt;p&gt;On the Mac, I'm a bit of a &lt;a href="http://www.irradiatedsoftware.com/sizeup/"&gt;SizeUp&lt;/a&gt; junkie - it becomes so much an intuitive part of your computing experience that its command keystrokes eventually get baked into your fingers' muscle memory. I bought a license, and after a few months of use, I couldn't even &lt;em&gt;tell you&lt;/em&gt; what the key bindings are, my fingers just... &lt;em&gt;know&lt;/em&gt; them.&lt;/p&gt;&lt;h2&gt;Praise for Winsplit Revolution&lt;/h2&gt;&lt;p&gt;As soon as I reach the office though (to sit down at a Windows XP workstation), I feel like my multi-monitor setup is messy and slow in comparison. This week's discovery of &lt;a href="http://www.winsplit-revolution.com/"&gt;Winsplit Revolution&lt;/a&gt; changed all that, it's exactly what I wanted it to be - "SizeUp for Windows". Now my obsessive-neatness tendencies are catered to and I can setup beautiful grids of terminals, browsers, and editors.&lt;/p&gt;&lt;p&gt;I'm not really one of those compulsive tweakers and customizers who &lt;em&gt;must&lt;/em&gt; absolutely change and configure every aspect of their graphical shell; I prefer when software just gets out of the way, lets me work and read, and doesn't obstruct my feeling of being in control of the machine. Windows itself, without keyboard shortcuts, makes you feel like you're interacting with a computer, not the apps themselves - the power of this kind of tool is that it gives you the illusion of apps reading your mind and moving to the right screen/edge/corner with a few twitches - the OS isn't standing in the way.&lt;/p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4503833606/" title="winsplit_grid by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2720/4503833606_0e883e88c7.jpg" width="500" height="156" alt="winsplit_grid" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3515610547407588140?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3515610547407588140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3515610547407588140' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3515610547407588140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3515610547407588140'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/04/window-management-for-compulsive-neat.html' title='Window Management for Compulsive Neat-Freaks'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2720/4503833606_0e883e88c7_t.jpg' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6587410415880724829</id><published>2010-03-12T00:42:00.001-05:00</published><updated>2010-03-12T00:42:54.544-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='gatineau'/><category scheme='http://www.blogger.com/atom/ns#' term='bsg'/><category scheme='http://www.blogger.com/atom/ns#' term='caprica'/><category scheme='http://www.blogger.com/atom/ns#' term='tv'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='scifi'/><title type='text'>Caprica: familiar places</title><content type='html'>I sat down to watch &lt;i&gt;Caprica&lt;/i&gt; this week (Season 1, Episode 6) and I was so surprised to recognize the location where the Graystone cocktail party was held!&lt;br /&gt;&lt;br /&gt;It's quite clearly filmed in Gatineau's &lt;a href="http://www.civilization.ca/"&gt;Canadian Museum of Civilization&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;The Graystones dancing (filmed in the great hall of the museum):&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4426641694/" title="Caprica Screenshot (Gatineau) by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2779/4426641694_e938a34522.jpg" width="500" height="282" alt="Caprica Screenshot (Gatineau)" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;For comparison, here's a shot of that hall; note the columns and totems in front of the window:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/rickharris/43556930/"&gt;&lt;img src="http://farm1.static.flickr.com/33/43556930_01992341ea.jpg"/&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-size:0.5em"&gt;Photo Credit: flickr user Яick Harris&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;This shot, a few seconds later, prominently features one of the museum's Inuit sculptures. If I recall correctly, it's somewhere up on the second floor.&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4425878519/" title="Caprica Screenshot (Gatineau!) by JPDaigle, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4048/4425878519_13451460e1.jpg" width="500" height="282" alt="Caprica Screenshot (Gatineau!)" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I wonder when this was shot - it looks like summer outside, which means if the view isn't retouched too much, it was shot before this winter?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6587410415880724829?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6587410415880724829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6587410415880724829' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6587410415880724829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6587410415880724829'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/03/caprica-familiar-places.html' title='Caprica: familiar places'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2779/4426641694_e938a34522_t.jpg' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5167018206032872429</id><published>2010-03-09T22:24:00.000-05:00</published><updated>2010-03-09T22:24:34.662-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bmo'/><category scheme='http://www.blogger.com/atom/ns#' term='mail'/><category scheme='http://www.blogger.com/atom/ns#' term='porn'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>BMO annual report: making your neighbours think you're getting porn since 2010</title><content type='html'>&lt;a href="http://www.flickr.com/photos/jpdaigle/4420900427/" title="BMO Annual Shareholders Report by JPDaigle, on Flickr"&gt;&lt;img alt="BMO Annual Shareholders Report" height="279" src="http://farm3.static.flickr.com/2762/4420900427_746a8d7aa8.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;My small apartment building has a single, shared, mailbox. What's running through the mind of my neighbours as they bring in BMO's annual report and leave it on my doorstep?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5167018206032872429?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5167018206032872429/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5167018206032872429' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5167018206032872429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5167018206032872429'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/03/bmo-annual-report-making-your.html' title='BMO annual report: making your neighbours think you&apos;re getting porn since 2010'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2762/4420900427_746a8d7aa8_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7111945209883635782</id><published>2010-02-23T23:41:00.000-05:00</published><updated>2010-02-23T23:41:37.638-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='windows'/><title type='text'>15 Minutes With Windows 7</title><content type='html'>&lt;span style="font-size: 5em;"&gt;&lt;br /&gt;i wanted to like it&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/techedlive/3930202683/"&gt;&lt;img src="http://farm4.static.flickr.com/3431/3930202683_a5fc3489be_m.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;Photo by: Flickr / techedlive&lt;/small&gt;&lt;br /&gt;&lt;br /&gt;Windows is weird, you know?&lt;br /&gt;&lt;br /&gt;It's all at once the huge commercial success everyone is using and develops for, and a retarded kid with down's syndrome everyone hates but you kinda-sorta-want to see him do something great. &lt;br /&gt;&lt;br /&gt;I've been using Windows XP at work for years, and I've totally skipped Vista. Hadn't even tried it (until 2 weeks ago). Sure, I don't &lt;i&gt;like&lt;/i&gt; XP, but I've grown accustomed to its rough edges and I can live with the bad parts (at least once &lt;a href="http://cygwin.com/"&gt;cygwin&lt;/a&gt; is installed).&lt;br /&gt;&lt;br /&gt;I'm setting up a new build server right now, and the machine just got racked up and paved with a fresh install of Windows 7. I was curious to see what 9 years of development time since XP have brought; I don't really care much about the look, I'm mostly interested in the GUI getting out of the way and letting me be productive. In this case, that means installing the latest JDK, Apache Ant, Subversion, CruiseControl, Cygwin, adding an ANT_HOME environment variable, adding Ant and the JDK tools to the $PATH, etc.&lt;br /&gt;&lt;br /&gt;I don't mean for this to be a contrived, unrealistic, test to point fingers... this is really what I need to do today: pull up a few terminals, install some dev tools, setup auto-builds, and get productive. I spend a &lt;strong&gt;LOT&lt;/strong&gt; of time at the command line, so this is the perfect test case for me: how good is the Windows 7 terminal after years with this old one: no tabbed shells, no resizing of the window, awkward copy and paste?&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4384131598/" title="cmd_noresize by JPDaigle, on Flickr"&gt;&lt;img alt="cmd_noresize" height="287" src="http://farm5.static.flickr.com/4049/4384131598_15b0f2cb54.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fast forward 9 years:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4384131628/" title="cmd_noresize_7 by JPDaigle, on Flickr"&gt;&lt;img alt="cmd_noresize_7" height="279" src="http://farm5.static.flickr.com/4005/4384131628_9396fe5701.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Drat.&lt;br /&gt;Still can't resize that window. But it looks prettier, right?&lt;br /&gt;&lt;br /&gt;Next let's add an ANT_HOME environment variable for this user and add the JDK tools to the PATH. This is really annoying in Windows XP because your PATH is probably a mile long and you can't resize the window:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4383371097/" title="path by JPDaigle, on Flickr"&gt;&lt;img alt="path" height="449" src="http://farm5.static.flickr.com/4008/4383371097_b28d561a8f.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe it's better now:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4383370761/" title="path_7 by JPDaigle, on Flickr"&gt;&lt;img alt="path_7" height="418" src="http://farm5.static.flickr.com/4046/4383370761_db702184f4.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;Well, it's more blue. And it... even took more clicks to get here.&lt;br /&gt;&lt;br /&gt;So that was a fun first 15 minutes with the latest and greatest.&lt;br /&gt;&lt;br /&gt;To be fair, I hear there's some really great system administration tools in there, so I'll stick with it and see... I wonder if there's a way, now, to see which processes have which files open, in a default OS install? You know, like lsof?&lt;br /&gt;&lt;br /&gt;Pre-emptive snarky comment:&lt;br /&gt;- Oh, I suppose editing your &lt;i&gt;~/.bashrc&lt;/i&gt; is faster? &lt;br /&gt;- Actually, yes, I'm pretty sure it is. (⌘+space, termi &amp;lt;ENTER&amp;gt;, vi .bashrc &amp;lt;ENTER&amp;gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7111945209883635782?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7111945209883635782/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7111945209883635782' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7111945209883635782'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7111945209883635782'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/02/15-minutes-with-windows-7.html' title='15 Minutes With Windows 7'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3431/3930202683_a5fc3489be_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7891410621191014663</id><published>2010-02-05T16:51:00.001-05:00</published><updated>2010-02-05T16:56:45.227-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fido'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><title type='text'>What made them think this was OK?</title><content type='html'>I've gotten SMS from &lt;a href="http://fido.ca/"&gt;Fido&lt;/a&gt; before to announce service or rate updates, and I've found it tolerable because it was probably the only way to reach their subscribers.&lt;br /&gt;&lt;br /&gt;This, however, is most definitely &lt;i&gt;not&lt;/i&gt; OK:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4333480736/" title="Fido spam by JPDaigle, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4003/4333480736_782f34ee28_o.jpg" width="320" height="480" alt="Fido spam" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Fido: Interrupting me with SMS spam that makes my phone ring, in order to ask for money for something &lt;i&gt;completely&lt;/i&gt; unrelated to my phone service is not acceptable under any circumstances. It is offensive, unprofessional, and disrespectful of our relationship.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7891410621191014663?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7891410621191014663/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7891410621191014663' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7891410621191014663'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7891410621191014663'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/02/what-made-them-think-this-was-ok.html' title='What made them think this was OK?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2395516310589137148</id><published>2010-01-13T01:00:00.000-05:00</published><updated>2010-01-13T01:00:55.280-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='bridgehead'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='privacy'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>GPS metadata in iPhone photos</title><content type='html'>I'm usually faaaar up on the "share everything with everyone" scale, but this actually surprised even me, and I should've known this already. I don't think the behaviour is wrong, but it's definitely something to be aware of. I'm talking about the location data in EXIF tags in photos taken with an iPhone 3G/3GS.&lt;br /&gt;&lt;br /&gt;I took the following photo at &lt;a href="http://bridgehead.ca/"&gt;Bridgehead&lt;/a&gt; last weekend.&amp;nbsp;Turns out if you email that photo to anyone from the phone and open it up, there's location metadata included in the file:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4270298881/" title="iPhone GPS EXIF by JPDaigle, on Flickr"&gt;&lt;img alt="iPhone GPS EXIF" height="500" src="http://farm5.static.flickr.com/4071/4270298881_c3e75a6830.jpg" width="435" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;OSX even includes a handy little "Locate" button in the inspector. Clicking it opens Google Maps in your default browser, which locates the photo pretty damn near where I actually took it:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4270300159/" title="iPhone GPS EXIF by JPDaigle, on Flickr"&gt;&lt;img alt="iPhone GPS EXIF" height="326" src="http://farm5.static.flickr.com/4072/4270300159_b559c0a197.jpg" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Spookily accurate.&lt;br /&gt;&lt;br /&gt;The potential usefulness of this is terrific and outweighs the downsides (think "view pictures posted in last 2 hours, taken near this fire"... crowdsourcing the news), but it's definitely worth keeping in mind from a privacy point of view.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2395516310589137148?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2395516310589137148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2395516310589137148' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2395516310589137148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2395516310589137148'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/01/gps-metadata-in-iphone-photos.html' title='GPS metadata in iPhone photos'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm5.static.flickr.com/4071/4270298881_c3e75a6830_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3274861288674928871</id><published>2010-01-11T22:13:00.000-05:00</published><updated>2010-01-11T22:13:55.746-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Les Grillades (Ottawa)</title><content type='html'>Today's food post is a bit weird: I'm giving a big thumbs up to a restaurant without being able to write much about what I had there, for the simple reason that I'm talking about &lt;a href="http://maps.google.com/maps/place?sourceid=chrome&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;q=les+grillades,+ottawa&amp;amp;fb=1&amp;amp;hq=les+grillades,&amp;amp;hnear=ottawa&amp;amp;cid=14211667250291652150"&gt;Les Grillades [85 Holland ave]&lt;/a&gt;, and they serve Lebanese food, which I'm not very acquainted with. So... here's my fantastically uninformed post about a Lebanese brunch.&lt;br /&gt;&lt;br /&gt;I went in for Sunday brunch with no idea what to expect, and let me tell you, this isn't a typical Ottawa greasy shawarma shack! This is a real restaurant.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4264101350/" title="Awesome Turkish Coffee by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2734/4264101350_920b6491f3.jpg" width="500" height="327" alt="Awesome Turkish Coffee" /&gt;&lt;/a&gt;&lt;br /&gt;We started off with a bit of turkish coffee.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4263348461/" title="IMG_9168 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2704/4263348461_f57161b44b.jpg" width="500" height="333" alt="IMG_9168" /&gt;&lt;/a&gt;&lt;br /&gt;A plate of fresh veggies awaited us as we sat down. Incredulous, I inquired of one of my Lebanese companions: "So you just eat... the onions... raw? Really?" I'm certainly not known for turning away from raw foods, so I dove in carefully with some green onion (verdict: not bad, but apologies for my breath afterwards):&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4263344943/" title="IMG_9167 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4069/4263344943_00ceb97268.jpg" width="500" height="354" alt="IMG_9167" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Then the brunch dishes started arriving. We didn't actually order anything specific, just "brunch". I was introduced to Labneh, a sort of strained yogurt (delicious!):&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4264104104/" title="IMG_9176 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4010/4264104104_81f036079d.jpg" width="500" height="313" alt="IMG_9176" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Some meat and cooked cheese:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4264107540/" title="IMG_9179 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2563/4264107540_e18f81c6be.jpg" width="500" height="333" alt="IMG_9179" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;And what was probably the best dish we tasted: this was made from fava beans, it was extremely tasty, and I was told the name (possibly 'Foul'), but it was unfamiliar and escapes me now:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4263366689/" title="IMG_9190 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm5.static.flickr.com/4037/4263366689_d65e560225.jpg" width="500" height="333" alt="IMG_9190" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;All in all, &lt;i&gt;loved&lt;/i&gt; it, and at around 100$ for a table of 6, quite reasonable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3274861288674928871?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3274861288674928871/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3274861288674928871' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3274861288674928871'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3274861288674928871'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/01/les-grillades-ottawa.html' title='Les Grillades (Ottawa)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2734/4264101350_920b6491f3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8225270949282871361</id><published>2010-01-01T22:36:00.003-05:00</published><updated>2010-01-01T22:45:41.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='recipes'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Tourtière HOWTO</title><content type='html'>Guests and co-workers have asked me to share the recipe for tourtière (meat pie) and for pie crust. I'm hoping this illustrated HOWTO can serve as the reference I point them to.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Pie Crust&lt;/h3&gt;These instructions are for 1 crust. You need 2 (top + bottom) per tourtière, so we'll make 4 of these. I make them individually in the food processor.&amp;nbsp;I use the same kind of crust for dessert pies as well, this works for everything.&lt;br /&gt;&lt;br /&gt;1.25 cups flour&lt;br /&gt;1/2 tsp salt&lt;br /&gt;1 tbsp sugar&lt;br /&gt;1 small stick of butter, chilled (~110 grams)&lt;br /&gt;~1/8th cup of ice water (as required)&lt;br /&gt;&lt;br /&gt;Combine the flour, salt, and sugar in the food processor.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2757/4234233051_df31efbe66.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Cut your chilled stick of butter into little pieces.&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4069/4235006682_e4d5238b6d.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Start the food processor and quickly throw in about one piece of butter per second. This should take about 10 seconds and break up the butter into tiny clumps. When you're finished, it should look like this:&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2698/4235008168_d9b0ee6e3a.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Add 1/8th cup ice water (or a little more, as required) in a very slow thin trickle while running the processor. The dough will rapidly start clumping up and after about 20-30s will form a single ball. Don't use too much water! It shouldn't stick to your fingers, it should stay in ball shape when handled.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2624/4235008868_d7f4d4efcd.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Press it lightly onto a counter, then wrap in wax paper and chill for 30 minutes. When you take it out of the fridge, let it stand for 5-10 minutes so it softens and is easier to work with.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2703/4235010094_a9750d2624.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Filling&lt;/h3&gt;(makes two)&lt;br /&gt;1 red onion, finely chopped&lt;br /&gt;1 white potato&lt;br /&gt;2 cloves of garlic&lt;br /&gt;2 lbs ground pork&lt;br /&gt;1/2 lb ground beef&lt;br /&gt;1/2 cup beef broth&lt;br /&gt;spices (basil, nutmeg, cinnamon, bay leaf, cloves)&lt;br /&gt;&lt;br /&gt;Dice your potato. Cook it in boiling water with a bit of salt for 10 minutes (until tender), then drain and reserve.&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4032/4234237107_e992ff983f.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Chop up the onion and mince the garlic.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2632/4235012168_59184e45e4.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;In a large skillet or casserole, cook the onion and garlic in a bit of vegetable oil until tender, about 3 minutes.&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4045/4234239335_91f13fcfeb.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Add the pork and beef. Let it cook on high heat about 5 minutes, stirring frequently. Add some salt and pepper, the spices, and the beef broth. Turn down the heat and simmer for 30 minutes, stirring from time to time to make sure all the meat cooks evenly and the beef gets mixed well with the pork. It looks like this when you just start cooking:&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2627/4234240179_e9b888e836.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;After 30 minutes, take the meat off the heat and let it cool down. Go back to your potatoes and mash them up:&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2740/4235016562_2fc85d7387.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Then combine them with the meat&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2631/4234246271_0d7b845cfa.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Roll the Crusts&lt;/h3&gt;While your meat mixture continues to cool, it's time to prepare the crusts.&amp;nbsp;Flour your work surface and plop down the first ball of dough. I like this cutting board, it has a gauge to help with shaping.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2768/4234244075_48a9da73fe.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Now roll it out so it's bigger than your pie tin. [Note: never buy a teflon rolling pin like this one, it's junk. Get a proper wooden one.]&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2705/4235018888_eaf1e37ab3.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Place it in your pan and run a knife gently around the edge to cut off the overflow.&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4067/4234245571_4c59c18c8e.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Spoon in your meat mixture into both bottom crusts. Brush some beaten egg onto the edges to help seal the top crust.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2604/4235021364_2eba037f8d.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Place the top crust on top, and brush the whole surface with some more beaten egg. Use a fork to texture the edges and seal both crusts shut together.&lt;br /&gt;&lt;img src="http://farm5.static.flickr.com/4024/4234248643_fb8a111925.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Bake at 375F for about 60 minutes.&lt;br /&gt;&lt;img src="http://farm3.static.flickr.com/2562/4235060162_97bb5dbe9b.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Done! Make this 1-2 days before you're ready to eat, it's better after a day or two.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8225270949282871361?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8225270949282871361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8225270949282871361' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8225270949282871361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8225270949282871361'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2010/01/tourtiere-howto.html' title='Tourtière HOWTO'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2757/4234233051_df31efbe66_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8049374176759376081</id><published>2009-12-24T01:56:00.002-05:00</published><updated>2009-12-24T01:58:06.249-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='google'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Nostalgia</title><content type='html'>Remember when this was the most minimalist, uncluttered homepage on the web?&lt;div&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4210657114/" title="google-ca-cluttered by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2765/4210657114_39611d5a2c.jpg" width="500" height="335" alt="google-ca-cluttered" /&gt;&lt;/a&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/31982987-8049374176759376081?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8049374176759376081/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8049374176759376081' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8049374176759376081'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8049374176759376081'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/12/nostalgia.html' title='Nostalgia'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2765/4210657114_39611d5a2c_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6617930903927138362</id><published>2009-11-16T23:08:00.005-05:00</published><updated>2009-11-16T23:16:19.546-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Design anti-pattern: "Results per page"</title><content type='html'>Can we please leave this behind:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4110693033/" title="results_per_page2 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2638/4110693033_14ba4cdca2_o.png" alt="results_per_page2" width="324" height="123" /&gt;&lt;/a&gt;&lt;br /&gt;Designers, &lt;span style="font-weight: bold; font-style: italic;"&gt;you&lt;/span&gt; drew up the results page, you &lt;span style="font-weight: bold; font-style: italic;"&gt;know&lt;/span&gt; how many results it scales to while remaining usable. So just pick that and be done with it.&lt;br /&gt;&lt;br /&gt;A lesser sin (also pictured) is choosing the sort order at query time. Just pick for me, and give me visual indicators that I can re-sort right on the results.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6617930903927138362?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6617930903927138362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6617930903927138362' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6617930903927138362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6617930903927138362'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/11/design-anti-pattern-results-per-page.html' title='Design anti-pattern: &quot;Results per page&quot;'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-619615586664117399</id><published>2009-11-12T00:59:00.008-05:00</published><updated>2009-11-12T01:10:44.985-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='coffee'/><category scheme='http://www.blogger.com/atom/ns#' term='bridgehead'/><category scheme='http://www.blogger.com/atom/ns#' term='espresso'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Learning with Bridgehead</title><content type='html'>&lt;img src="http://farm4.static.flickr.com/3166/2948903876_4e90cbdb8e.jpg" /&gt;&lt;br /&gt;Earlier this week, I had the immense pleasure of attending &lt;a id="trsx" href="http://bridgehead.ca/" title="Bridgehead's" &gt;Bridgehead's&lt;/a&gt; course on coffee / espresso. The crowd was awesome - all coffee lovers looking to take their espresso-making skills up a notch. Held at &lt;a id="kf4b" href="http://www.theurbanelement.ca" title="The Urban Element" &gt;The Urban Element&lt;/a&gt;, which I've been dying to visit for some time, the course covered two main topics:&lt;br /&gt;&lt;br /&gt;The first part (by &lt;a id="vkpq" href="http://twitter.com/_IanClark" title="Mr. Ian Clark" &gt;Mr. Ian Clark&lt;/a&gt;), on identifying flavour components of coffee, tasting demonstrations, etc., was interesting but of limited everyday use for me. I (and I suspect I'm &lt;i&gt;far&lt;/i&gt; from alone in this) tend to find one or two varieties of beans I like and always go back to those. Still, lots of fun.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4097672506/"&gt;&lt;img src="http://farm3.static.flickr.com/2512/4097672506_0958a0bb32.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The second half (by Laura Perry), gave me much to think about as I prepare my customary morning latte. When pulling an espresso shot, I've often been focused simply on trying to coax my equipment into getting the extraction time right, with little attention given to tamping technique and temperature control.&lt;br /&gt;&lt;br /&gt;Biggest discovery of the class? The amount of coffee Laura packs into a portafilter. I've probably been under-dosing my shots for years now!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/4096694071/"&gt;&lt;img src="http://farm3.static.flickr.com/2534/4096694071_a125728972.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-619615586664117399?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/619615586664117399/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=619615586664117399' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/619615586664117399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/619615586664117399'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/11/learning-with-bridgehead.html' title='Learning with Bridgehead'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3166/2948903876_4e90cbdb8e_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4194638523197563444</id><published>2009-09-15T08:59:00.002-04:00</published><updated>2009-09-15T09:02:32.903-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Feast of Fields Ottawa 2009</title><content type='html'>My &lt;a href="http://thefood.ca/2009/09/highlights-from-feast-of-fields-ottawa-2009/"&gt;guest post&lt;/a&gt; on Feast of Fields 2009 just went up on &lt;a href="http://www.thefood.ca"&gt;TheFood.ca&lt;/a&gt;! &lt;a href="http://thefood.ca/2009/09/highlights-from-feast-of-fields-ottawa-2009/"&gt;Check it out&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3916561725/" title="IMG_7962 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2484/3916561725_7d98b2e8ff_m.jpg" width="240" height="157" alt="IMG_7962" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4194638523197563444?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4194638523197563444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4194638523197563444' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4194638523197563444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4194638523197563444'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/09/feast-of-fields-ottawa-2009.html' title='Feast of Fields Ottawa 2009'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2484/3916561725_7d98b2e8ff_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3616260002998273624</id><published>2009-09-10T23:33:00.003-04:00</published><updated>2009-09-10T23:38:04.041-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Sensible Defaults</title><content type='html'>As developers, we hear over and over again about the importance of sensible defaults..&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3907892669/" title="welcome_to_itunes by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3502/3907892669_862bda71db_o.jpg" alt="welcome_to_itunes" height="128" width="346" /&gt;&lt;/a&gt;&lt;br /&gt;I can't say I find the iTunes 9 welcome screen terribly useful, but this is probably the first time I've &lt;span style="font-weight: bold; font-style: italic;"&gt;ever&lt;/span&gt; seen software with the correct default setting for "Show this window when $APP starts". (The correct answer, btw, is NO.)&lt;br /&gt;&lt;br /&gt;Maybe they finally learned something from all the backlash around Quicktime auto-starting on Windows?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3616260002998273624?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3616260002998273624/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3616260002998273624' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3616260002998273624'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3616260002998273624'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/09/sensible-defaults.html' title='Sensible Defaults'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6777431457210262251</id><published>2009-09-02T22:21:00.005-04:00</published><updated>2009-09-02T22:45:49.197-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='recycling'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Design I like: Ottawa recycling collection calendar</title><content type='html'>No complaining today - I'm so happy when I stumble across an element of visual design that's so well done I can't help but stop, smile, and consciously notice how pleasant it is. I'm doubly surprised and delighted if it's from the government, because, you know, bureaucratic design-by-committee isn't exactly renowned for its tasteful results.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3883299244/" title="Good Design: September Recycling Calendar by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3492/3883299244_e8148a4952.jpg" alt="Good Design: September Recycling Calendar" width="500" height="325" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I love how the grid itself doesn't contain a single written word.&lt;/li&gt;&lt;li&gt;I enjoy the simplicity of the blue/black lines indicating which type of recyclable materials are being collected this week. (Although this requires explanation if you're not from Ottawa - blue boxes are used for glass &amp;amp; plastic, black boxes for paper and cardboard.) I applaud the designer for targeting his work to his audience (Ottawa residents), for whom the blue/black bars are self-evident.&lt;/li&gt;&lt;li&gt;I have a soft spot for the cute leaf icon (indicating pickup of garden clippings, again, obvious if you live in Ottawa, so it's the know-your-audience principle again).&lt;/li&gt;&lt;li&gt;But most of all, the stroke of genius is the arrows indicating that the statutory holiday on September 7th offsets regular pickup dates by 24 hours. An incompetent designer would've required a paragraph of text to explain that. This author does it with a big orange X and five arrows. (Note how the arrows and the X are painted in the same orange to tie them together, and that orange isn't used anywhere else in the grid.)&lt;/li&gt;&lt;/ul&gt;I find this calendar extremely inspiring. Hat tip to you, anonymous designer. I've had Edward Tufte's &lt;i&gt;&lt;a href="http://www.amazon.ca/Visual-Display-Quantitative-Information/dp/096139210X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1251945620&amp;amp;sr=8-1"&gt;The Visual Display of Quantitative Information&lt;/a&gt;&lt;/i&gt; on my Amazon wishlist for a while, but I think noticing this tonight is the push I needed to finally go ahead and order.&lt;br /&gt;&lt;a href="http://www.amazon.ca/Visual-Display-Quantitative-Information/dp/096139210X/ref=sr_1_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1251945620&amp;amp;sr=8-1"&gt;&lt;img src="http://img.amazon.ca/images/I/41CZQ3YDSKL._SS500_.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6777431457210262251?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6777431457210262251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6777431457210262251' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6777431457210262251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6777431457210262251'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/09/design-i-like-ottawa-recycling.html' title='Design I like: Ottawa recycling collection calendar'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3492/3883299244_e8148a4952_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4363860450602999493</id><published>2009-08-25T17:42:00.000-04:00</published><updated>2009-08-25T17:43:15.442-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='snowleopard'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Pre-Order</title><content type='html'>&lt;a href="http://www.flickr.com/photos/jpdaigle/3856597047/" title="Pre-order by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2574/3856597047_c89daaba94_o.png" alt="Pre-order" height="283" width="663" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4363860450602999493?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4363860450602999493/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4363860450602999493' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4363860450602999493'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4363860450602999493'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/08/pre-order.html' title='Pre-Order'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2717355756538499609</id><published>2009-08-12T20:24:00.005-04:00</published><updated>2009-08-12T20:32:49.378-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='funny'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='conversation'/><title type='text'>Conversations with strangers</title><content type='html'>[JP walks into the sauna, two guys are just sitting.]&lt;br /&gt;&lt;br /&gt;Stranger 1: hey&lt;br /&gt;JP: hey [sits]&lt;br /&gt;Stranger 2: we're shooting a movie.&lt;br /&gt;JP: mm-hmm&lt;br /&gt;Stranger 2: it's called "Sweaty Fuckers 2"&lt;br /&gt;JP: hah&lt;br /&gt;Stranger 2: it's a porno&lt;br /&gt;JP: yeah, I wonder if a video camera would survive in this hot, humid environment&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;...&lt;br /&gt;Stranger 2: &lt;span style="font-weight: bold; font-style: italic;"&gt;THAT'S&lt;/span&gt; his comment? You've got nothing against the gay porno, but you want to know if the humidity would damage the camera?&lt;br /&gt;JP: pretty much; this is Kanata, dude&lt;br /&gt;&lt;br /&gt;This is so typical of conversations I have.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2717355756538499609?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2717355756538499609/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2717355756538499609' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2717355756538499609'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2717355756538499609'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/08/conversations-with-strangers.html' title='Conversations with strangers'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1853013291732847551</id><published>2009-07-09T17:49:00.008-04:00</published><updated>2009-07-09T18:27:46.355-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='eclipse'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><title type='text'>Eclipse: Find the Breakpoint!</title><content type='html'>Today's user experience callout is Eclipse JDT. Let's play find the breakpoint:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3704398593/" title="Find the breakpoints by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2557/3704398593_19f5a93df6_o.png" alt="Find the breakpoints" height="168" width="218" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Here's a hint:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3704398559/" title="Find the breakpoints by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2585/3704398559_5591766eff_o.png" alt="Find the breakpoints" height="283" width="292" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Maybe it's more obvious if you compare with a search hit that &lt;span style="font-style: italic;"&gt;doesn't&lt;/span&gt; have a breakpoint on the same line:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3704398587/" title="Find the breakpoints by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3473/3704398587_75509293a1_o.png" alt="Find the breakpoints" height="436" width="288" /&gt;&lt;/a&gt;&lt;br /&gt;(The breakpoint is on the top result)&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Solutions&lt;/h2&gt;The ideal solution would still draw both icons in the same amount of space. After playing around a bit with transparency on the search arrow (verdict: looked terrible), I've come up with two possibilities:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Draw everything as above, but when the mouse hovers near the search result arrow, fade it out to 20% opacity. Fade it back in to full opacity when the mouse leaves the area. (Lots of work.)&lt;/li&gt;&lt;li&gt;A much simpler option would be to move the search arrow about 5px to the left, and chop off its leftmost 3-4 pixels, as in this mockup, to allow seeing both a search result and a breakpoint:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3704786225/" title="Breakpoints (mockup) by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3447/3704786225_89d94a1f43_o.png" width="143" height="416" alt="Breakpoints (mockup)" /&gt;&lt;/a&gt;&lt;br /&gt;Neat, right? What do you think?&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/31982987-1853013291732847551?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1853013291732847551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1853013291732847551' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1853013291732847551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1853013291732847551'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/07/eclipse-find-breakpoint.html' title='Eclipse: Find the Breakpoint!'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-625795770129901752</id><published>2009-07-08T23:15:00.004-04:00</published><updated>2009-07-08T23:27:29.454-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='flickr'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>flickr uploadr</title><content type='html'>Ah yes, on the subject of usability:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3703307056/" title="flickr-uploader by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3499/3703307056_a64d4bf579.jpg" width="500" height="205" alt="flickr-uploader" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Does anyone else think the options should be "&lt;span style="font-weight:bold;"&gt;Stay here&lt;/span&gt;" and "&lt;span style="font-weight:bold;"&gt;Go to Flickr &amp;amp; Exit&lt;/span&gt;" ? I always end up hitting one of the two buttons, then ⌘+Q to quit uploadr.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-625795770129901752?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/625795770129901752/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=625795770129901752' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/625795770129901752'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/625795770129901752'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/07/flickr-uploadr.html' title='flickr uploadr'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3499/3703307056_a64d4bf579_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3569253908062292388</id><published>2009-07-08T23:07:00.002-04:00</published><updated>2009-07-08T23:13:02.630-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='usability'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ui'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='gvim'/><title type='text'>Drive me crazy, will you?</title><content type='html'>I'm a dock-on-the-left guy.&lt;br /&gt;I might &lt;span style="font-style: italic;"&gt;adore&lt;/span&gt; using OSX, but for some crazy reason, whenever I launch gvim, this happens:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3703299266/" title="gvim-placement by JPDaigle, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2607/3703299266_0c37e5eab6_o.png" alt="gvim-placement" width="640" height="571" /&gt;&lt;/a&gt;&lt;br /&gt;I have no idea why this is the &lt;span style="font-style: italic;"&gt;only&lt;/span&gt; app on my system that doesn't respect the dock's position when placing its window on startup. If anyone knows how to fix it... please post!&lt;br /&gt;&lt;br /&gt;And yes, I know this is a small thing to complain about. I have Windows XP at work, and OSX with a copy of gvim that randomly bounces around the screen every 60 seconds would &lt;span style="font-style: italic;"&gt;still&lt;/span&gt; be more pleasant to use.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3569253908062292388?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3569253908062292388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3569253908062292388' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3569253908062292388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3569253908062292388'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/07/drive-me-crazy-will-you.html' title='Drive me crazy, will you?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4217800766129594804</id><published>2009-07-04T17:30:00.003-04:00</published><updated>2009-07-04T17:31:15.724-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Overheard in Ottawa</title><content type='html'>"No, we were waiting for you at the *other* 'Pho Bo Ga La with a blue sign on Somerset'..."&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4217800766129594804?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4217800766129594804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4217800766129594804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4217800766129594804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4217800766129594804'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/07/overheard-in-ottawa.html' title='Overheard in Ottawa'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1551361429869422350</id><published>2009-05-02T23:00:00.003-04:00</published><updated>2009-05-02T23:05:12.979-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>This Week in Food</title><content type='html'>&lt;h2&gt;Ice Cream at The Piggy Market&lt;/h2&gt;&lt;p&gt;A few coworkers recommended I check out Pascale Berthiaume's (who provides the ice cream for the &lt;a href="http://www.flickr.com/photos/jpdaigle/3456764129/"&gt;&lt;em&gt;Wellington Gastropub&lt;/em&gt;&lt;/a&gt;) ice cream, now being sold in Westboro at &lt;a href="http://www.ottawacitizen.com/life/food/mile+Piggy+Market+goes+whole/1452410/story.html"&gt;&lt;em&gt;The Piggy Market&lt;/em&gt;&lt;/a&gt;. They're located in the rear half of the old, now defunct, &lt;em&gt;Westboro Market&lt;/em&gt;.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3495814966/" title="The Piggy Market by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3224/3495814966_d6a11ef781.jpg" width="500" height="333" alt="The Piggy Market" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I gave them a first visit this week to check them out, and so far I've a very positive impression of the place. I stopped in on my way home from work on Thursday, around 20:45. They had been closed for an hour and forty-five minutes, but they still let me in to buy ice cream as long as I paid cash (the charge machines and register were closed for the day); they get 6 out of 5 stars for service. Again, on a coworker's recommendation, I picked the Peanut Butter Salted Caramel flavour.&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3495812730/" title="Terrific Ice Cream by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3378/3495812730_ca1f119274.jpg" width="500" height="333" alt="Terrific Ice Cream" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Outstanding! And check out the ingredients: yolks, cream, sugar, peanut butter, caramel, salt, vanilla. That's it! Goes for 10$ a tub.&lt;/p&gt;&lt;h2&gt;Ron Eade on Butter Prices&lt;/h2&gt;&lt;p&gt;Omnivore's Ottawa &lt;a href="http://communities.canada.com/ottawacitizen/blogs/omnivore/archive/2009/04/29/ottawa-supermarket-specials-may-01-to-07.aspx"&gt;weekly supermarket specials roundup&lt;/a&gt; includes these few words from Mr. Eade:&lt;/p&gt;&lt;blockquote&gt;  &lt;p&gt;Anyway, my gold star of the week goes to three chain stores, Price Chopper, Food Basics and Superstore Loblaw for selling various brands of butter, salted or unsalted and sometimes both, at $2.97 to $2.99 a pound. Really, I can't understand how stores get away with charging $4 or more for a pound of churned animal fat. (I'll bet it has something to do with the government-sanctioned &lt;s&gt;cartel&lt;/s&gt; marketing board that controls milk prices. Reach for the sky, buddy, this is a stick-up.)&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Now a complaint like this about the price isn't too punchy in a vacuum - we need to put it in context to see if there's really anything to gripe about when it comes to butter prices! How does this compare to the rest of your grocery basket?&lt;/p&gt;&lt;p&gt;Agriculture and Agri-Food Canada provides a bit of &lt;a href="http://dairyinfo.gc.ca/index_e.php?s1=dff-fcil&amp;amp;s2=cons&amp;amp;s3=pe-pd&amp;amp;page=rpri-dpri"&gt;historical data for retail prices of various dairy products&lt;/a&gt;. &lt;/p&gt;&lt;p&gt;They also provide &lt;a href="http://www4.agr.gc.ca/resources/prod/doc/dairy/pdf/prof_butter_e.pdf"&gt;an overview of the butter sector&lt;/a&gt;, but this report is quite misleading; it significantly understates (by 50%!) the price of butter as they got the units wrong, claiming an average price of 3.84$/Kg in 2005. In Table 2, they present the AC Neilsen retail price survey data in $/Kg, adjusted to what I assume are 2006 dollars, but the Neilsen price survey measures the price &lt;strong&gt;per pound&lt;/strong&gt; of butter (454g). I wonder how many people noticed the error.&lt;/p&gt;&lt;p&gt;It's best to ignore the above report then, and go back to the original data, in nominal dollars per pound of butter. As we can see from the series representing the price of a pound of butter, retail has crept up towards the 4$ mark for the last few years, but the nominal price, from 2006-2008, has hardly increased.&lt;/p&gt;&lt;p&gt;I've plotted this data against milk prices and the Core &lt;a href="http://www.statcan.gc.ca/pub/62-001-x/2009003/tablesectlist-listetableauxsect-eng.htm"&gt;Consumer Price Index&lt;/a&gt; (which includes dairy products, btw), using 2004 as a baseline:&lt;img src="http://spreadsheets.google.com/pub?key=rF9HWV2jslgFyEWuH5O7h3g&amp;amp;oid=3&amp;amp;output=image" /&gt;&lt;/p&gt;&lt;p&gt;So it seems that although the price of butter has shot up a bit faster than core CPI around 2004-2005, it's been relatively flat even in nominal dollars over the last three years, meaning it's actually gotten &lt;em&gt;cheaper&lt;/em&gt; in real terms.&lt;/p&gt;&lt;p&gt;Hardly cause for panic! Happy cooking.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-1551361429869422350?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1551361429869422350/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1551361429869422350' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1551361429869422350'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1551361429869422350'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/05/this-week-in-food.html' title='This Week in Food'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3224/3495814966_d6a11ef781_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3419363904322077839</id><published>2009-04-15T00:44:00.007-04:00</published><updated>2009-04-15T01:07:18.075-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bsg'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='caprica'/><title type='text'>Caprica Pilot: They had Linux, DocBook and Windows on Caprica! (The Cylons probably rebelled after trying DocBook)</title><content type='html'>So now that BSG is gone, we can turn to the new &lt;span style="font-style: italic;"&gt;Caprica&lt;/span&gt; series for our murderous Cylon fix.&lt;br /&gt;&lt;br /&gt;I saw the first episode tonight and although the first fifteen minutes scared me a little (Oh no! It's &lt;span style="font-style: italic;"&gt;The OC&lt;/span&gt; in space!) it got a little better after that and I think it's promising; the musical score by Bear McCreary was top notch as always. I love how they finally flipped the bird at &lt;span style="font-style: italic;"&gt;Star Trek TNG&lt;/span&gt; 15 years after it ended: Screw you Gene Roddenberry - if we had holodecks, sex, drugs and indulging murderous fantasies are &lt;span style="font-style: italic; font-weight: bold;"&gt;EXACTLY&lt;/span&gt; what we'd use them for. &lt;a href="http://memory-alpha.org/en/wiki/Elementary%2C_Dear_Data_%28episode%29"&gt;Recreating Sherlock Holmes stories&lt;/a&gt; or a &lt;a href="http://memory-alpha.org/en/wiki/Cost_of_Living_%28episode%29"&gt;spa with mud baths staffed with creepy clowns&lt;/a&gt;? Not so much.&lt;br /&gt;&lt;br /&gt;Oh and I noticed this (large version linked): they apparently had DocBook, Linux and some old version of Windows on Caprica:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3443994378/" title="They had Linux, Windows and DocBook on Caprica! by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3304/3443994378_f55e14f22e.jpg" width="500" height="279" alt="They had Linux, Windows and DocBook on Caprica!" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3419363904322077839?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3419363904322077839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3419363904322077839' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3419363904322077839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3419363904322077839'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/04/caprica-pilot-they-had-linux-docbook.html' title='Caprica Pilot: They had Linux, DocBook and Windows on Caprica! (The Cylons probably rebelled after trying DocBook)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3304/3443994378_f55e14f22e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3269846224783590269</id><published>2009-04-13T00:04:00.004-04:00</published><updated>2009-04-13T00:13:45.467-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='api'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='campfire'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>CampfireJ: a Java API for posting to 37signals' Campfire</title><content type='html'>&lt;p&gt;My team at work has been considering trialing the &lt;a href="http://www.campfirenow.com/"&gt;Campfire&lt;/a&gt; app for intra-team communication. I've played with it a bit and so far I like it (a lot), but as with anything, adoption by the team is going to be the make-or-break factor.&lt;/p&gt;  &lt;p&gt;I found myself wishing, though, that I had a way to post messages and notifications to Campfire chatrooms from the command-line or from Ant build scripts, used by our continuous integration system. There's a &lt;a href="http://github.com/collectiveidea/tinder/tree/master"&gt;Ruby Campfire API&lt;/a&gt; already, but that doesn't really help me. So I wrote a simple Java API this weekend that posts messages over HTTP, with the self-imposed requirement it should have ZERO external dependencies outside the JRE. It's &lt;a href="http://github.com/jpdaigle/campfirej/tree/master"&gt;up here on Github&lt;/a&gt; and called CampfireJ; license is &lt;a href="http://en.wikipedia.org/wiki/WTFPL"&gt;WTFPL&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Programmatic usage should be pretty easy to figure out, and the javadocs will be generated by the build, but what I want to call attention to here are the command-line interface and the Ant task.&lt;/p&gt;  &lt;h2&gt;Command-Line&lt;/h2&gt;  &lt;p&gt;Once you have campfirej.jar, you can use it directly as a command-line app like this:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;$ java -jar campfirej.jar -u user -s subdomain -p password -r "Room 1" -m "Hello world" [--paste]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;This will send the message "Hello world" to the room "Room 1" on your Campfire subdomain. I'm using this from a script for Out-of-Office notifications, you can easily find other uses. I think a useful addition to the program would be to allow omitting the &lt;em&gt;-m&lt;/em&gt; argument and reading stdin for messages, that shouldn't be too hard to add.&lt;/p&gt;  &lt;h2&gt;Ant script&lt;/h2&gt;  &lt;p&gt;The real reason for hacking this together was so I could send Campfire notifications from a CruiseControl build/CI system, so I had to support sending from Ant. &lt;/p&gt;  &lt;p&gt;Here's a sample invocation from a build script:&lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;      &amp;lt;project name="campfirej-ant-test"&gt;&lt;br /&gt;        &amp;lt;taskdef &lt;br /&gt;          name="campfirej" &lt;br /&gt;          classname="ca.softwareengineering.campfirej.ant.CampfireJEcho" &lt;br /&gt;          classpath="_dist/campfirej.jar"/&gt;&lt;br /&gt;        &amp;lt;target name="test"&gt;&lt;br /&gt;          &amp;lt;campfirej&lt;br /&gt;            user="ant@example.com"&lt;br /&gt;            password="mypassword"&lt;br /&gt;            subdomain="campfirej"&lt;br /&gt;            room="Room 1"&lt;br /&gt;            failonerror="false"&lt;br /&gt;            paste="false"&lt;br /&gt;            message="Hello from ant" /&gt;&lt;br /&gt;        &amp;lt;/target&gt;&lt;br /&gt;      &amp;lt;/project&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;Cheers, and contact me with desired improvements, the library is just a few hours old so obviously it's not fully-featured yet.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3269846224783590269?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3269846224783590269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3269846224783590269' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3269846224783590269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3269846224783590269'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/04/campfirej-java-api-for-posting-to.html' title='CampfireJ: a Java API for posting to 37signals&apos; Campfire'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1357872954999298392</id><published>2009-03-25T18:24:00.003-04:00</published><updated>2009-03-25T18:57:47.275-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='opentable'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='restaurants'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Booking a table</title><content type='html'>This impressed me a lot, it's very slick:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3386219532/" title="Untitled by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3564/3386219532_4a8678b443.jpg" alt="" height="151" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;GMail managed to look into this restaurant confirmation email and see that it referenced an event at a specific time, so it created a link to add to my Google Calendar!&lt;br /&gt;&lt;br /&gt;Following the link to their website reveals, however, that reservations are done through some third-party widget that's not OpenTable.&lt;br /&gt;&lt;br /&gt;It's a shame that restaurants in Ottawa are fracturing their reservation systems across several providers like this, just like online classifieds for the city are fractured across &lt;a href="http://ottawa.kijiji.ca/"&gt;Kijiji&lt;/a&gt;, &lt;a href="http://ottawa.en.craigslist.ca/"&gt;Craigslist&lt;/a&gt; and &lt;a href="http://www.usedottawa.com/"&gt;UsedOttawa&lt;/a&gt;, reducing their utility for everyone. Restaurant reservations are the sort of service where these third-party hosted reservation service providers can hugely benefit from network effects. Once one service reaches a tipping point (like it seems OpenTable is achieving in some US cities), it will enable the creation of location-aware mobile apps and a whole bunch of other useful services for finding restaurants around you.&lt;br /&gt;&lt;br /&gt;It seems to me that as a restaurateur, you'd have see huge benefits from going with a large provider that's essentially advertising your restaurant for you by publicly listing availability of tables. You'd want to go for the dominant service that could offer this, which hasn't (yet?) happened with OpenTable in Ottawa...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-1357872954999298392?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1357872954999298392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1357872954999298392' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1357872954999298392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1357872954999298392'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/03/booking-table.html' title='Booking a table'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3564/3386219532_4a8678b443_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3764715544434851059</id><published>2009-03-11T23:12:00.003-04:00</published><updated>2009-03-11T23:20:59.077-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>That didn't take long</title><content type='html'>&lt;a href="http://www.flickr.com/photos/jpdaigle/3347636777/" title="Manchego by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3617/3347636777_1b5e7120af.jpg" width="500" height="333" alt="Manchego" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Wow, the Kanata Costco sells &lt;a href="http://www.quesomanchego.es/"&gt;Manchego cheese&lt;/a&gt; now. In three years it went from &lt;i&gt;unobtainable&lt;/i&gt; to &lt;i&gt;completely mainstream&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Three years ago, you could buy some 6-month and 12-month manchego at &lt;a href="http://www.labottega.ca/"&gt;&lt;i&gt;La Bottega&lt;/i&gt;&lt;/a&gt;. If, you know, you got lucky. Very lucky. And wanted to pay about 60 bucks a kilo.&lt;br /&gt;&lt;br /&gt;Now it's at Costco for 35$ a kilo.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3764715544434851059?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3764715544434851059/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3764715544434851059' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3764715544434851059'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3764715544434851059'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/03/that-didnt-take-long.html' title='That didn&apos;t take long'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3617/3347636777_1b5e7120af_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4772925384999601151</id><published>2009-03-10T17:45:00.002-04:00</published><updated>2009-03-10T17:48:02.655-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='protocols'/><category scheme='http://www.blogger.com/atom/ns#' term='geek'/><title type='text'>Resource Acquisition over Broadcast Channels (Geek Factor: 9/10)</title><content type='html'>I've converted most of my workplace to my RABC protocol when requesting favours / equipment. Here it is:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;    A PROTOCOL FOR RESOURCE ACQUISITION OVER BROADCAST CHANNELS&lt;br /&gt;                                v0.3&lt;br /&gt;&lt;br /&gt;ABSTRACT&lt;br /&gt;&lt;br /&gt;   This  document  provides  a message-exchange pattern (MEP) for&lt;br /&gt;   requesting and attributing resources over a  shared  broadcast&lt;br /&gt;   channel  (RABC),  such  as  an  electronic  mailing  list (see&lt;br /&gt;   RFC822, RFC2919).&lt;br /&gt;&lt;br /&gt;STATUS&lt;br /&gt;&lt;br /&gt;   This section describes the status of this document at the time&lt;br /&gt;   of its publication.&lt;br /&gt;&lt;br /&gt;   This document is the second public Working Draft of this spec-&lt;br /&gt;   ification.&lt;br /&gt;&lt;br /&gt;CONVENTIONS&lt;br /&gt;&lt;br /&gt;   The following nomenclature is defined:&lt;br /&gt;     Alice   Requester&lt;br /&gt;     Bob     Responder to Alice's request&lt;br /&gt;     Charlie Responder to Alice's request&lt;br /&gt;     Dave    Responder to Alice's request&lt;br /&gt;     L       Broadcast destination [email list or message board]&lt;br /&gt;     R       Resource being requested&lt;br /&gt;&lt;br /&gt;   Note that R need not be a physical resource, it may also be  a&lt;br /&gt;   service.   Examples of common resource requests include a ride&lt;br /&gt;   to a place of business, a piece  of  networking  equipment,  a&lt;br /&gt;   driver to pick up a food order, etc.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ANTI-PATTERNS&lt;br /&gt;&lt;br /&gt;   A  common  anti-pattern this protocol addresses is the lack of&lt;br /&gt;   notification provided  to  non-selected  responders  informing&lt;br /&gt;   them of which offer was selected:&lt;br /&gt;&lt;br /&gt;   (1) Alice -&gt; L          Request(R)&lt;br /&gt;   (2) Bob -&gt; Alice        Offer(R)&lt;br /&gt;   (3) Charlie -&gt; Alice    Offer(R)&lt;br /&gt;   (4) Dave -&gt; Alice       Offer(R)&lt;br /&gt;   (5) Alice -&gt; L          "Thanks!"&lt;br /&gt;&lt;br /&gt;   In  the  above example, before MESSAGE 5, Alice may or may not&lt;br /&gt;   have sent the private message:&lt;br /&gt;&lt;br /&gt;   (6) Alice -&gt; Bob        "Thanks, I'm using yours"&lt;br /&gt;&lt;br /&gt;   Charlie and Dave are now left wondering if the thanks was  di-&lt;br /&gt;   rected  to  them,  and  if not, which offer was accepted. From&lt;br /&gt;   their point of view, MESSAGE 5 was ambiguous.&lt;br /&gt;&lt;br /&gt;IMPLEMENTATION OF RABC&lt;br /&gt;&lt;br /&gt;   The only change required to the above pathological scenario is&lt;br /&gt;   for MESSAGE 5 to include an extra identifier. Requesters using&lt;br /&gt;   RABC to request a resource MUST include the identifier of  the&lt;br /&gt;   party  whose offer was accepted in their broadcast thanks mes-&lt;br /&gt;   sage. Any thanks expressed in this message is  implicitly  di-&lt;br /&gt;   rected at ALL offering responders, even if they are not named.&lt;br /&gt;&lt;br /&gt;   Sample exchange:&lt;br /&gt;&lt;br /&gt;   (1) Alice -&gt; L          Request(R)&lt;br /&gt;   (2) Bob -&gt; Alice        Offer(R)&lt;br /&gt;   (3) Charlie -&gt; Alice    Offer(R)&lt;br /&gt;   (4) Dave -&gt; Alice       Offer(R)&lt;br /&gt;   (5) Alice -&gt; L          "Thanks BOB, received R"&lt;br /&gt;&lt;br /&gt;ANONYMOUS THANKS&lt;br /&gt;&lt;br /&gt;   In some situations, a responder may wish to offer a  resource,&lt;br /&gt;   but  not  have that fact rebroadcast in the thanks message.  A&lt;br /&gt;   typical case for this would be if the responder  is  concerned&lt;br /&gt;   that  him offering a resource he's holding, albeit temporarily&lt;br /&gt;   (such as a piece of equipment), might publicly imply he didn't&lt;br /&gt;   really need that resource in the first place.&lt;br /&gt;&lt;br /&gt;   This  is solved by including a unique anonymous key in the Of-&lt;br /&gt;   fer message. There are no format restrictions on this key,  it&lt;br /&gt;   can  be  any  string the responder reasonably believes will be&lt;br /&gt;   unique given the size of L:&lt;br /&gt;&lt;br /&gt;   (1) Alice -&gt; L          Request(R)&lt;br /&gt;   (2) Bob -&gt; Alice        Offer(R, ANON_12345)&lt;br /&gt;   (3) Charlie -&gt; Alice    Offer(R)&lt;br /&gt;   (4) Dave -&gt; Alice       Offer(R)&lt;br /&gt;   (5) Alice -&gt; L          "Thanks ANON_12345, received R"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;RETRANSMISSION&lt;br /&gt;&lt;br /&gt;   It is allowable for a requester with an outstanding request to&lt;br /&gt;   repeat  this  request after a personally-defined timeout. When&lt;br /&gt;   repeating an unsatisfied request, a requester  MUST  reply  to&lt;br /&gt;   his  original  request  keeping intact its subject field. This&lt;br /&gt;   allows members of the  broadcast  channel  L  to  use  message&lt;br /&gt;   threading  features  in  their mail clients to easily collapse&lt;br /&gt;   request retransmissions into the original request's thread.&lt;br /&gt;&lt;br /&gt;   The retransmitted request thus replaces the original.  Members&lt;br /&gt;   of  L consider MESSAGE 1, MESSAGE 2 and MESSAGE 3 a single re-&lt;br /&gt;   quest.&lt;br /&gt;&lt;br /&gt;   (1) Alice -&gt; L          Request(R)&lt;br /&gt;   (2) Alice -&gt; L          RE: Request(R)&lt;br /&gt;   (3) Alice -&gt; L          RE: Request(R)&lt;br /&gt;   (4) Dave -&gt; Alice       Offer(R)&lt;br /&gt;   (5) Alice -&gt; L          "Thanks DAVE, received R"&lt;br /&gt;&lt;br /&gt;VERSION HISTORY&lt;br /&gt;&lt;br /&gt;   v0.1    jpdaigle        2008-05-20&lt;br /&gt;    Initial revision&lt;br /&gt;&lt;br /&gt;   v0.2    jpdaigle        2008-06-05&lt;br /&gt;    Added STATUS section, implicit thanks to IMPLEMENTATION&lt;br /&gt;&lt;br /&gt;   v0.3    jpdaigle        2009-03-10&lt;br /&gt;    Added anonymous thanks&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4772925384999601151?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4772925384999601151/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4772925384999601151' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4772925384999601151'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4772925384999601151'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/03/resource-acquisition-over-broadcast.html' title='Resource Acquisition over Broadcast Channels (Geek Factor: 9/10)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-9102618027330821316</id><published>2009-03-10T17:42:00.002-04:00</published><updated>2009-03-10T17:44:50.172-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ergonomics'/><title type='text'>Can I get some quiet?</title><content type='html'>It was too loud in my cube so I moved to the lunchroom to finish some doc reviews (no coding today). Of course, since the universe tends toward maximum irony, a bunch of coworkers decided the lunchroom would be the perfect place to start chatting away. Nice, thanks a lot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-9102618027330821316?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/9102618027330821316/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=9102618027330821316' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9102618027330821316'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9102618027330821316'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/03/can-i-get-some-quiet.html' title='Can I get some quiet?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8027956168043022241</id><published>2009-03-09T23:20:00.003-04:00</published><updated>2009-03-09T23:28:00.556-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Spotlight Effectiveness</title><content type='html'>What happens when you hit ⌘+space, then type "digi"?&lt;br /&gt;&lt;div id="photoImgDiv3342579263" style="width: 354px;" class="photoImgDiv"&gt; &lt;img src="http://farm4.static.flickr.com/3661/3342579263_66bd60b9e7.jpg?v=0" alt="Spotlight Effectiveness by you." title="" onload="show_notes_initially();" class="reflect" height="375" width="352" /&gt;&lt;/div&gt;&lt;br /&gt;And how effective is this "Top Hit"?&lt;br /&gt;&lt;img src="http://farm4.static.flickr.com/3664/3342579287_105543406c_o.png" /&gt;&lt;br /&gt;&lt;br /&gt;You'd think there would be some sort of frequency counter kicking in after the first hundred times I manually arrowed-down to the right result, to train whatever rule determines the &lt;span style="font-style: italic;"&gt;Top Hit&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8027956168043022241?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8027956168043022241/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8027956168043022241' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8027956168043022241'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8027956168043022241'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2009/03/spotlight-effectiveness.html' title='Spotlight Effectiveness'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-9072954708755814376</id><published>2008-12-23T16:10:00.003-05:00</published><updated>2008-12-23T16:30:36.484-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='osx'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='adobe'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>An icon can offend my aesthetic sensibilites</title><content type='html'>Using Mac OS X is, generally speaking, a visually pleasing experience. People (including, on several occasions, me) can go on and quibble about inconsistent use of &lt;a href="http://daringfireball.net/2007/06/brushed_metal_leopard"&gt;brushed metal&lt;/a&gt;, or unpredictable applicability of &lt;a href="http://daringfireball.net/2003/05/the_problems_with_clickthrough"&gt;click-through&lt;/a&gt;, but by and large the visuals (even for 3rd-party apps) are nice, consistent, unsurprising.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I've just realized how little it takes for the whole feeling of polish and friendliness to come crashing down.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3129564144/" title="Something is amiss by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3285/3129564144_822e932eb6_o.png" width="730" height="212" alt="Something is amiss" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There's something jarring in the above image. Can you spot it? Here, let me zoom in:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3128734263/" title="Visually Offensive Icon by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3104/3128734263_d72c6e64cf_o.png" width="541" height="519" alt="Visually Offensive Icon" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Oh my. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;They just had to put an ® symbol &lt;span class="Apple-style-span" style="font-style: italic;"&gt;RIGHT IN THE GODDAMN ICON&lt;/span&gt;? Think of how heartbroken the designer who drew the short straw had to be feeling after being forced to do this. So much work, so many iterations of the design, only to have it ruined at the last second when a lawyer reminded him that it wasn't enough to point out that the Adobe Reader logo was a registered trademark in the About screens &lt;span class="Apple-style-span" style="font-weight: bold;"&gt;and&lt;/span&gt; the documentation, you should remind people whenever they look at the icon too! Outstanding.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-9072954708755814376?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/9072954708755814376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=9072954708755814376' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9072954708755814376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9072954708755814376'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/12/icon-can-offend-my-aesthetic.html' title='An icon can offend my aesthetic sensibilites'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6882795769638600002</id><published>2008-12-07T15:26:00.005-05:00</published><updated>2008-12-07T15:36:08.027-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='squirrel'/><category scheme='http://www.blogger.com/atom/ns#' term='nature'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='animals'/><title type='text'>Caught one!</title><content type='html'>As an apartment dweller on the top floor of a triplex, I have no upstairs neighbours, only an unfinished attic above me. Since outdoor temperatures started dropping with the arrival of Winter, I've had a few uninvited houseguests making a ruckus up there.&lt;br /&gt;&lt;br /&gt;After a few (unsuccessful) attempts to look around with flashlights to see what was up there, my landlord and I eventually set a trap with some almonds and peanut butter.&lt;br /&gt;&lt;br /&gt;Today we caught ourselves our first attic-dwelling squirrel! &lt;a href="http://www.bigoven.com/38666-Squirrel-Jambalaya-recipe.html"&gt;I know what &lt;span style="font-style: italic;"&gt;I'm&lt;/span&gt; eating for dinner&lt;/a&gt;*!&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3089749027/" title="Got the little bugger! by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3099/3089749027_eb3fa4fa75.jpg" alt="Got the little bugger!" height="333" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*: Actually the squirrel is being driven away from the house and gently released into a park.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6882795769638600002?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6882795769638600002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6882795769638600002' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6882795769638600002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6882795769638600002'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/12/caught-one.html' title='Caught one!'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3099/3089749027_eb3fa4fa75_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-539077207997840218</id><published>2008-11-20T00:26:00.006-05:00</published><updated>2008-11-20T00:42:08.679-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='chapters'/><category scheme='http://www.blogger.com/atom/ns#' term='amazon'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><title type='text'>Chapters</title><content type='html'>has earned the unfortunate honour of being nothing more than a physical, browsable storefront for amazon.ca.&lt;br /&gt;&lt;br /&gt;I was in recently to wander amongst the stacks, when I picked this up:&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3045368694/" title="Book from Chapters by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3140/3045368694_9ee8a15e52.jpg" alt="Book from Chapters" height="375" width="500" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Looks tasty, but 55$? Out comes the iPhone...&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/3045366334/" title="Amazon.ca mobile by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3216/3045366334_9b30dd401b_o.jpg" alt="Amazon.ca mobile" height="480" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;You can order straight from the iPhone-optimized website; my stuff should be delivered to the office by Friday. The sad thing for Chapters is that I really don't see how they can effectively compete here. Amazon, with no physical locations (that Chapters location &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=chapters&amp;amp;mrt=all&amp;amp;sll=45.425476,-75.69341&amp;amp;sspn=0.009518,0.022659&amp;amp;g=rideau+%26+sussex,+ottawa,+on&amp;amp;ie=UTF8&amp;amp;ll=45.426618,-75.69211&amp;amp;spn=0.009518,0.022659&amp;amp;z=16&amp;amp;iwloc=A"&gt;at the corner of Rideau and Sussex&lt;/a&gt; has got to be pricy) and massive economies of scale, will always have lower overhead and be able to compete on price, so only shipping costs and delays can hurt them here, and I'm willing to wait 5 days for cookbooks.&lt;br /&gt;&lt;br /&gt;I suppose the sensible thing for the brick-and-mortar player in this race is to attempt to provide a better experience, but if you're selling books, I don't really see how you could do that... Ideas?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-539077207997840218?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/539077207997840218/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=539077207997840218' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/539077207997840218'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/539077207997840218'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/11/chapters.html' title='Chapters'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3140/3045368694_9ee8a15e52_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-538754747075423347</id><published>2008-10-30T21:01:00.002-04:00</published><updated>2008-10-30T21:03:43.077-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Thankful for the Executor Framework</title><content type='html'>&lt;p&gt;It is commonly said that a good framework makes common tasks easy to do, while keeping hard  things possible. Today, I'm reminded that a good related property is to prevent common errors.&lt;/p&gt;  &lt;h1&gt;&lt;span style="font-size:100%;"&gt;Whoops&lt;/span&gt;&lt;/h1&gt;  &lt;p&gt;My friend and fellow developer Jason  &lt;a href="http://blog.lavablast.com/post/2008/10/Gotcha-ASPNET-and-exceptions-in-asynchronous-threads.aspx"&gt;posts today&lt;/a&gt;  a chunk of hard-learned wisdom about spinning  off worker threads to perform asynchronous tasks in an ASP.NET application. It seems that if an exception bubbles up  to the top of the call stack, not only does the thread die (which is expected), but it takes  down the entire ASP.NET application, forcing it to restart, leading to a loss of in-memory  session state. OUCH, yes, and it's an easy bug to introduce.&lt;/p&gt;  &lt;h1&gt;&lt;span style="font-size:100%;"&gt;Making easy errors hard to make&lt;/span&gt;&lt;/h1&gt;  &lt;p&gt;This is why I'm thankful for the general design &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/Executor.html"&gt;Java's Executor Framework&lt;/a&gt; imposes on the developer, as it renders this sort of bug a bit harder to make.&lt;/p&gt;  &lt;p&gt;Using an executor service with the Callable&lt;v&gt; interface is pretty simple and it's generally easy  to work with:&lt;/v&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;You create a task to offload, as an instance of a Callable&lt;v&gt;,  with a call() method that's allowed to throw any Exception it wants.&lt;/v&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;You submit your Callable&lt;v&gt; to an executor service,  which spins off a thread for it if required,  and immediately returns you a Future&lt;v&gt; instance,  while the worker thread does its thing.&lt;/v&gt;&lt;/v&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Later, using the handle of that Future&lt;v&gt; instance,  you can query the result of the computation from your main thread  by calling get() on it.  If the task you spun off threw an exception from call(),  you get the exception only then (wrapped in an &lt;em&gt;ExecutionException&lt;/em&gt;), on the main thread,  where you're actually able to (and forced to) deal with it, since Future.get() declares itself as  throwing ExecutionException.&lt;/v&gt;&lt;/p&gt;&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/31982987-538754747075423347?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/538754747075423347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=538754747075423347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/538754747075423347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/538754747075423347'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/thankful-for-executor-framework.html' title='Thankful for the Executor Framework'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5966819622136181220</id><published>2008-10-26T22:29:00.001-04:00</published><updated>2008-10-26T22:29:33.178-04:00</updated><title type='text'>Postal codes on an iPhone</title><content type='html'>Canadian postal codes satisfy this regex: "[A-Z][0-9][A-Z] [0-9][A-Z][0-9]". Do you have any idea how annoying that is to type on an iPhone?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5966819622136181220?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5966819622136181220/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5966819622136181220' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5966819622136181220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5966819622136181220'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/postal-codes-on-iphone.html' title='Postal codes on an iPhone'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1768398209832057096</id><published>2008-10-26T16:58:00.002-04:00</published><updated>2008-10-26T17:05:50.516-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='protocols'/><title type='text'>Secret Santa Protocols</title><content type='html'>&lt;p&gt;Some friends and I are kicking off the holiday season early this year! Along with Jason Kealey and Etienne Tremblay of &lt;a href="http://www.lavablast.com/"&gt;LavaBlast Software&lt;/a&gt;, as well as their better halves, I've arranged to rent a &lt;a href="http://www.chaletsenmauricie.com/les-chalets/sacacomie-3452/"&gt;rather nice cottage&lt;/a&gt; in mid-December. We decided to hold a &lt;a href="http://en.wikipedia.org/wiki/Secret_Santa"&gt;Secret Santa&lt;/a&gt;  gift exchange over there, which brings us to this post.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2903950262/" title="Dinner by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3077/2903950262_30c2aff10f.jpg" alt="Dinner" height="500" width="333" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;How do you arrange a randomly-assigned Secret Santa event when the participants are  geographically distributed?&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Assignment of giver/recipient pairs is usually handled by drawing strips of paper from a hat,  an approach that obviously won't work here, when planning over email. So I started to think about how one could do this without relying on a trusted third-party. Is it possible for a group of peers,  communicating only through email, to each choose a random recipient and guarantee uniqueness of picks, while ensuring picks are not revealed to others, and no one ends up picking themselves? [My father,  over dinner the other day, helpfully pointed out that this is known as a &lt;a href="http://en.wikipedia.org/wiki/Derangement"&gt;derangement&lt;/a&gt; problem.]&lt;/p&gt;  &lt;h2&gt;The real-world pragmatic approach&lt;/h2&gt;  &lt;p&gt;We ended up going with the very pragmatic approach of relying on a trusted third-party (in this case  a simple computer program). I wrote a Java program that took the list (L) of 5 email addresses,  shuffled it (using &lt;code&gt;Collections.shuffle()&lt;/code&gt;), then sent an email to address L[i] containing  address L[(i+1) % 5], all without printing to the screen what it was doing, or logging anything. Once the program exited, there was no way for anyone to recover who got what address, and it guarantees that the final assignment is a &lt;em&gt;derangement&lt;/em&gt;: no person in the initial list gets themselves.&lt;/p&gt;  &lt;p&gt;Now, this is all well and good, but it's a boring solution because of its reliance on software. Is this doable with only five people talking over email? (Yes, it's a mostly academic exercise.) I've had  some ideas that go in the right direction, but haven't solved the problem of ensuring the final mapping is a derangement, other than running the process for multiple rounds, until no one declares they received themselves as an assignment.&lt;/p&gt;  &lt;h2&gt;Primitive: mapping IDs to gift recipients&lt;/h2&gt;  &lt;p&gt;The first primitive our protocol needs is a method of mapping an abstract identifier (say, a number) to an actual name. This is because since participants need to pick one of the 5 identifiers unsupervised, they must not know in advance which person this identifier will represent.&lt;/p&gt;  &lt;p&gt;This is the easy part: have everyone pick a unique value &lt;em&gt;i&lt;/em&gt; from the pool of identifiers [0-4]  (randomly or not) and remember it without disclosing it.  Your assigned name is then &lt;code&gt;L[(i+d) % 5]&lt;/code&gt;, where &lt;em&gt;d&lt;/em&gt; is the integer part of the  TSX composite index at market close the following day. The offset value &lt;em&gt;d&lt;/em&gt; is the same for everyone, is  not known in advance, and when we all exchange gifts we can audit that no one cheated and changed their chosen ID after knowing &lt;em&gt;d&lt;/em&gt;.&lt;/p&gt;  &lt;h2&gt;Independently choosing IDs&lt;/h2&gt;  &lt;p&gt;The above relies on everyone having independently picked a unique value for &lt;em&gt;i&lt;/em&gt;, and this is where things get interesting.&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;There are 3125 [5^5] sets of picks when done independently with no knowledge of the others.&lt;/li&gt;&lt;li&gt;Of those, only 120 [5!] contain unique, unduplicated, choices, or 3.84%.&lt;/li&gt;&lt;li&gt;Of those, only 44 are derangements, where no one ends up with themselves (1.408% of the total)&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;First approach: anonymous broadcast&lt;/h3&gt;  &lt;p&gt;If a means of anonymously broadcasting a message to the whole list is available, we can rapidly  constrain picks to the 120 cases where there are no duplicates. We'll then have a 36.7% chance [44/120]  of having a derangement in each round, so we should be able to settle on a solution in very few rounds.&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;We declare the round started, and the pool of legal choices to be {0, 1, 2, 3, 4}.&lt;/li&gt;&lt;li&gt;Everyone picks a random delay &lt;em&gt;d&lt;/em&gt; in [0; 3599] (with 5 participants, collisions are unlikely).&lt;/li&gt;&lt;li&gt;After &lt;em&gt;d&lt;/em&gt; seconds, pick a value in the pool of legal choices, and anonymously broadcast  "&lt;em&gt;n&lt;/em&gt; has been picked", everyone removes &lt;em&gt;n&lt;/em&gt; from the pool. (You can also just always choose the first  available number, that works equally well.)&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;Second approach: no anonymous broadcast&lt;/h3&gt;  &lt;p&gt;OK, so you don't have an anonymous remailer. No problem!&lt;/p&gt;  &lt;p&gt;I've devised a method to ensure the picks are independent, but it can take many rounds to work, as the expected success rate is only 120/3125. (And after that you still have the problem of restarting if you don't have a derangement.)&lt;/p&gt;  &lt;p&gt;I &lt;em&gt;think&lt;/em&gt; the following should work, but YMMV, I haven't proven it:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;We publish the list of 5 participants. Their order is unimportant.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;We publish 5 IDs. Let's use 5 prime numbers {3, 5, 7, 11, 13}. I don't think they need to be prime, but they must be picked to ensure that their product, known by all (in this case, P=15015) can only be achieved if you  pick EXACTLY one of each number, and this is easy to ensure if you take primes [&lt;em&gt;I think&lt;/em&gt;].&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Everyone independently picks an ID &lt;em&gt;i&lt;/em&gt; from the list, keeping it secret.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I'm first on the list. I choose a random &lt;strong&gt;large&lt;/strong&gt; integer &lt;em&gt;s&lt;/em&gt;. I compute &lt;em&gt;P' = i * s * P&lt;/em&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I hand off this product (&lt;em&gt;P'&lt;/em&gt;) to the second person on the list. The number she receives from me is  evenly divisible by 3, 5, 7, 11, 13 and P, so she has no way of knowing what my chosen &lt;em&gt;i&lt;/em&gt; is, or what value of &lt;em&gt;s&lt;/em&gt; I picked (there are 5 equiprobable possible values for &lt;em&gt;s&lt;/em&gt;, which tells her nothing).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;She multiplies &lt;em&gt;P'&lt;/em&gt; by her own chosen &lt;em&gt;i&lt;/em&gt;, and gives that to the third person on the list, and so on.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;The list wraps around and I'm sent a value from the 5th person on the list. If everyone picked a unique  value for &lt;em&gt;i&lt;/em&gt;, I get &lt;em&gt;s * i0 * i1 * i2 * i3 * i4 * P&lt;/em&gt; or, succinctly, &lt;em&gt;s * P&lt;sup&gt;2&lt;/sup&gt;&lt;/em&gt;. If I get  anything else, then I know there's a duplicate.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;I announce whether or not there was a duplicate. (I, or anyone else, can always lie, but then when gifts are exchanged we'd know someone lied - in the spirit of the holidays, the participants in this protocol are honest.)&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Phew. Each round has a 1.408% chance of working, so it could take a while. I have yet to find  a much better approach, so I think our little 30-line Java program was appropriate in this situation.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-1768398209832057096?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1768398209832057096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1768398209832057096' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1768398209832057096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1768398209832057096'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/secret-santa-protocols.html' title='Secret Santa Protocols'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3077/2903950262_30c2aff10f_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4384574079839277549</id><published>2008-10-21T20:18:00.002-04:00</published><updated>2008-10-21T20:22:11.239-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='cooking'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>This Week in Food</title><content type='html'>&lt;h2&gt;Will Ron Eade wake up with a head of lettuce in his bed?&lt;/h2&gt;&lt;p&gt;First up is &lt;a href="http://communities.canada.com/ottawacitizen/blogs/omnivore/archive/2008/10/14/finally-homemade-bread-i-am-proud-to-serve-and-eat.aspx"&gt;Ron Eade's column&lt;/a&gt; from Ottawa Citizen blogs, where he heaps some well-deserved praise on Kevin Mathieson (of &lt;a href="http://www.art-is-in-bakery.com/"&gt;Art-Is-In Bakery&lt;/a&gt;) for his bread. Eade says it's better than ACE bread (n.d.a.: no shit), and I for one am glad to note that the supply problems I was hurting from a year ago seem to be a thing of the past: whereas last year, getting your hands on Art-Is-In bread required much haste in returning home from the office, this year I find that retailers aren't consistently running out by late afternoon.&lt;/p&gt;&lt;p&gt;Eade calls New York Times' &lt;a href="http://www.nytimes.com/2006/11/08/dining/081mrex.html"&gt;Mark Bittman's bread recipe&lt;/a&gt; a good replica of Art-Is-In's, which I have to humbly disagree with. Bittman's recipe is good, it's my go-to recipe for homemade bread, but I hardly think it's close to equal to Mathieson's.&lt;/p&gt;&lt;p&gt;I think it's awesome that he can get away with &lt;a href="http://communities.canada.com/ottawacitizen/blogs/omnivore/archive/2008/10/14/finally-homemade-bread-i-am-proud-to-serve-and-eat.aspx"&gt;saying&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;I'm not kidding when I say you need a six- to eight-quart heavy cast-iron Dutch oven with lid. &lt;strong&gt;Every kitchen should have one&lt;/strong&gt;. &lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;p&gt;Yes, every kitchen should have one - but when &lt;em&gt;I&lt;/em&gt; say anything like that, people roll their eyes at me. If you're a newspaper columnist though...&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;Amate&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2952984048/" title="Amate in Wellington Village by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3272/2952984048_0efdafb2bd.jpg" alt="Amate in Wellington Village" height="500" width="333" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Got around to trying &lt;a href="http://ottawafoodies.com/vendor/1472"&gt;Amate&lt;/a&gt; (link goes to ottawafoodies.com) for some quick Mexican take-out. I came in a few minutes before they decided to shut down for the night, and ordered a tostada with some &lt;em&gt;puerco pibil&lt;/em&gt;. Unfortunately, I only got a tiny spoonful, maybe 40g, of pork but hey, what I tasted was good. I think they're still going through opening pains and are a bit disorganized, so it's not fair to say more at this time - let's give them a few more months.&lt;/p&gt;&lt;p&gt;I'll probably try my hand at making &lt;em&gt;puerco pibil&lt;/em&gt; myself (in more generous quantities) when I get a free afternoon.&lt;/p&gt;&lt;h2&gt;Malak Pastry&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2960828406/" title="Tasty Baclava by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3136/2960828406_24ebc29845.jpg" alt="Tasty Baclava" height="333" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;I've lived in Westboro for over a year and had never tried &lt;a href="http://malakpastry.com/"&gt;Malak Pastry&lt;/a&gt;, despite it being right at &lt;a href="http://maps.google.ca/maps?f=q&amp;amp;hl=en&amp;amp;geocode=&amp;amp;q=1809+carling+ave,+ottawa,+on&amp;amp;mrt=all&amp;amp;ie=UTF8&amp;amp;ll=45.37782,-75.7535&amp;amp;spn=0.009526,0.022659&amp;amp;z=16&amp;amp;g=1809+carling+ave,+ottawa,+on&amp;amp;iwloc=addr"&gt;Carling/Broadview&lt;/a&gt; - shame! It's a bakery offering up a range of baklawa (which I'll admit I know little about). I asked for the shopkeeper's recommendations and got a few samples to try before buying, and was incredibly impressed. Delicious! They weren't yet listed on &lt;a href="http://www.ottawafoodies.com/"&gt;OttawaFoodies&lt;/a&gt;, so I'm adding them presently.&lt;/p&gt;&lt;h2&gt;foods++;&lt;/h2&gt;&lt;p&gt;Finally, I've tried &lt;em&gt;sauerkraut&lt;/em&gt; (at a corporate event at the office, no less), bringing my 100 Food countdown (&lt;a href="http://jpdaigle.blogspot.com/2008/08/wake-up-call-for-foodie.html"&gt;previously blogged about&lt;/a&gt;) to 57% completion. Moving up 1% in two months is a rather pathetic pace, so I'm going to make a bigger effort.&lt;/p&gt;&lt;br /&gt;&lt;iframe src="http://spreadsheets.google.com/pub?key=pCG9C4DoISR5xFmyq6mr1Kw&amp;amp;output=html&amp;amp;gid=0&amp;amp;single=true&amp;amp;widget=true" frameborder="0" height="300" width="500"&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4384574079839277549?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4384574079839277549/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4384574079839277549' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4384574079839277549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4384574079839277549'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/this-week-in-food.html' title='This Week in Food'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3272/2952984048_0efdafb2bd_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7743549067057178679</id><published>2008-10-18T18:12:00.002-04:00</published><updated>2008-10-18T18:17:13.552-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Sure, but what year?</title><content type='html'>&lt;a href="http://www.flickr.com/photos/jpdaigle/2952985648/" title="Sure, but what year? by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3149/2952985648_2b8c15eabb.jpg" width="331" height="500" alt="Sure, but what year?" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;That's what I call optimistic. &lt;br /&gt;&lt;br /&gt;I really, really, wish I could afford one of those condos, the &lt;a href="http://www.westborostation.com/westboro.html"&gt;artist's renderings&lt;/a&gt; I've seen look pretty sweet. Also, expensive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7743549067057178679?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7743549067057178679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7743549067057178679' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7743549067057178679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7743549067057178679'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/sure-but-what-year.html' title='Sure, but what year?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3149/2952985648_2b8c15eabb_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2494452487800433702</id><published>2008-10-16T21:40:00.002-04:00</published><updated>2008-10-16T21:51:27.858-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Coffee Shop Technology</title><content type='html'>I'm sitting in the Westboro &lt;a href="http://www.bridgehead.ca"&gt;Bridgehead&lt;/a&gt;, working on a presentation on my MacBook Pro.&lt;br /&gt;Observations from the coffee shop:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A 50 year-old looking woman is texting. She's typing pretty fast, too.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;No one is wearing iPod headphones. Everyone is here to enjoy the atmosphere, I like that.&lt;/li&gt;&lt;li&gt;Among the people typing away on laptops, the Mac market share is 100%. ONE HUNDRED. Way to go Apple.&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/31982987-2494452487800433702?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2494452487800433702/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2494452487800433702' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2494452487800433702'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2494452487800433702'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/coffee-shop-technology.html' title='Coffee Shop Technology'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7612758679026001721</id><published>2008-10-08T13:40:00.003-04:00</published><updated>2008-10-08T13:44:48.229-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consumer finance'/><title type='text'>A bit of free money from ING Direct</title><content type='html'>&lt;a title="ING Direct" href="http://www.ingdirect.ca/en/" id="yflk"&gt;ING Direct&lt;/a&gt; is trying to beat the fray of banks that will be offering &lt;a title="TFSAs" href="http://www.budget.gc.ca/2008/pamphlet-depliant/pamphlet-depliant2-eng.asp" id="vbe6"&gt;TFSAs&lt;/a&gt; in January 2009. Even though, to the best of my knowledge, the federal government hasn't yet published the full TFSA rules and details, based on the details available now, banks are starting to jump in.&lt;br /&gt;&lt;br /&gt;Here's the announcement they made on October 7th:&lt;br /&gt;&lt;br /&gt;&lt;h2 style="margin-left: 40px;"&gt;&lt;/h2&gt;&lt;blockquote&gt;&lt;h2 style="margin-left: 40px;"&gt;&lt;span style="font-size:100%;"&gt;Earn special Bonus Interest between October 4th, 2008 and December 31st, 2008 and get saving tax-free earlier!&lt;/span&gt;&lt;/h2&gt; &lt;p style="margin-left: 40px;"&gt;Because we just couldn’t wait until January 1, 2009 – we’ll cover your taxes!&lt;/p&gt; &lt;h2 style="margin-left: 40px;"&gt;&lt;span style="font-size:100%;"&gt;Bonus Interest!&lt;/span&gt;&lt;/h2&gt; &lt;p style="margin-left: 40px;"&gt;While we can’t help you avoid taxes in 2008, we can pay you more than enough bonus interest to cover those taxes! Effective January 1, 2009, funds deposited in the promotional Tax-Free Investment Savings Account opened between October 4 and December 31 will be transferred to a new Tax-Free Savings Account so you won’t miss a minute of Tax-Free interest.&lt;/p&gt;  &lt;p style="margin-left: 40px;"&gt;Open an ING DIRECT promotional tax-free Investment Savings Account today and on December 31st we will double your interest payment. This should be enough to cover any tax you’ll need to pay on interest earned and will help you get a head start for tax-free saving in January.&lt;/p&gt; &lt;h2 style="margin-left: 40px;"&gt;&lt;span style="font-size:100%;"&gt;Tax-Free&lt;/span&gt;&lt;/h2&gt; &lt;p style="margin-left: 40px;"&gt;With the new Tax-Free Savings Account, any interest earned in an ING DIRECT Tax-Free Savings Account will not be taxed.&lt;/p&gt; &lt;/blockquote&gt;&lt;br /&gt;It seems this account is identical to their regular savings account, except it automatically gets registered as a TFSA on 1 January 2009, and on 31 December 2008, it gets a bonus interest payment equal to all the interest paid in the last 11 weeks of the year (from now until 31 December). They're marketing the bonus payment as a way to offset taxes paid on the regular portion of the interest in 2008, since TFSAs don't yet exist.&lt;br /&gt;&lt;br /&gt;I'm not normally a fan of trivial quarter-point rate chasing between banks, but assuming you've got a savings account at ING Direct already (I keep my emergency cash at ING), I see absolutely no downside to getting in on this.&lt;br /&gt;&lt;br /&gt;It took me about 2 minutes to login, create an anticipated TFSA, and transfer 5000$ from regular savings to the new account. At the current 3% rate, with monthly compounding, the expected interest on 5000$ between now and December 31st is around 35$, so they're giving away 35$ for two minutes of work.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7612758679026001721?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7612758679026001721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7612758679026001721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7612758679026001721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7612758679026001721'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/10/bit-of-free-money-from-ing-direct.html' title='A bit of free money from ING Direct'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-390888635413433495</id><published>2008-09-26T22:54:00.001-04:00</published><updated>2008-09-26T22:55:54.681-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='health'/><title type='text'>Dealing With a Cold</title><content type='html'>&lt;p&gt;Holy crap, what a crummy week. Caught a cold, saw productivity go down a bit, but was able to pull through without missing any work thanks in part to reading &lt;a href="http://www.educatedguesswork.org/2005/11/managing_the_co.html"&gt;Eric Rescorla's blog post about "Managing the Common Cold"&lt;/a&gt;. The guy is an engineer / security guru but he happens to post frequently about statistics and health, and in this case he's really on to something as he goes much further than the classic advice: "Oh just take a Tylenol Cold and stop whining":&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;Nasal sprays and &lt;em&gt;pseudoephedrine&lt;/em&gt; for congestion: He recommends &lt;em&gt;Flonase&lt;/em&gt;, which requires a prescription, but I've had luck this week with an OTC decongestant spray once a day (mindful of widely-reported acclimatation effects) and Advil Cold &amp;amp; Sinus. I feel kind of stupid for buying Advil, as it's just &lt;em&gt;ibuprofen&lt;/em&gt; and &lt;em&gt;pseudoephedrine&lt;/em&gt;, but it was recommended by a colleague; next time I'll go generic.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;em&gt;diphenhydramine hydrochloride&lt;/em&gt;, an antihistamine with sedative effects to help fall asleep: costs practically nothing in generic form. Quite effective.&lt;/p&gt;&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/31982987-390888635413433495?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/390888635413433495/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=390888635413433495' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/390888635413433495'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/390888635413433495'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/09/dealing-with-cold.html' title='Dealing With a Cold'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7798149950817947689</id><published>2008-09-24T14:31:00.002-04:00</published><updated>2008-09-24T14:35:40.557-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>The Absolutely Essential Software List for Mac Newbies</title><content type='html'>&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 13px; "&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;This is for my friend &lt;a id="w7vj" href="http://blog.lavablast.com/" title="Jason Kealey" style="color: rgb(85, 26, 139); "&gt;Jason Kealey&lt;/a&gt;, who finally got a MacBook Pro today. Welcome to the awesomeness of OSX :)&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;Newbies, here's the absolutely essential, grab-this-software-today stuff you want to go install:&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;ul style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="z22v" href="http://elan.plexapp.com/" title="Plex" style="color: rgb(85, 26, 139); "&gt;Plex&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="vg72" href="http://www.videolan.org/vlc/" title="Vlc" style="color: rgb(85, 26, 139); "&gt;Vlc&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="p6yj" href="http://growl.info/" title="Growl" style="color: rgb(85, 26, 139); "&gt;Growl&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="o3xa" href="http://www.adiumx.com/" title="Adium" style="color: rgb(85, 26, 139); "&gt;Adium&lt;/a&gt;&lt;/li&gt;&lt;li style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;a id="vb2g" href="http://www.blacktree.com/" title="Quicksilver" style="color: rgb(85, 26, 139); "&gt;Quicksilver&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;I still haven't found a perfect image editor. I'm thinking of dropping the cash for &lt;a href="http://www.pixelmator.com/"&gt;Pixelmator&lt;/a&gt;, but even on a new MBP it feels a bit sluggish... I'm still wrestling with the decision while my trial period ticks down.&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;&lt;br /&gt;&lt;/div&gt;&lt;div style="margin-top: 0px; margin-bottom: 0px; "&gt;The fact that this list is actually pretty small for me means OSX is, really, quite a bit more functional out of the box than Windows. Bundling of software with an operating system can be a bit contentious, but I think OSX generally gets at least this correct.&lt;/div&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7798149950817947689?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7798149950817947689/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7798149950817947689' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7798149950817947689'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7798149950817947689'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/09/absolutely-essential-software-list-for.html' title='The Absolutely Essential Software List for Mac Newbies'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7445325202108462747</id><published>2008-09-05T14:13:00.003-04:00</published><updated>2008-09-05T14:14:42.346-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Ask TUAW - Finding which processes own which network connections - Here, I'll Save You 30 Bucks</title><content type='html'>&lt;p&gt;A good question &lt;a href="http://www.tuaw.com/2008/09/05/ask-tuaw-finder-thumbnails-wifi-connection-manager-external-d/"&gt;popped up on Ask TUAW today&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Richard asks&lt;br /&gt;I have recently noticed that I have a fairly constant upload of 14-16 KB/s going on in the background (I'm using iSlayer's iStat menus), even though I haven't initiated any upload. I'm not now running any online backup apps. I've checked in Activity Monitor, and can't see anything very out of the ordinary there, although evidently I've missed something. Is there an easy way to see which applications/processes are using the network connection? Or should I get Little Snitch? It's quite annoying to see that the network connection is being used, and being unsure about what is using it. It's potentially disastrous when I'm using metered connections!&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Here's the answer TUAW gave:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;Little Snitch ($29.95) is probably the easiest way to go. There's also another recently released net monitoring application called ProteMac Meter ($29.95) which might be worth checking out. I don't recommend Glowworm FW as I've had serious problems with it under Leopard and have found others reporting similar difficulties. It may be that the demos of one of these application will be enough to find the source of your unknown network traffic.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Ummm, let me save you 30 bucks and a download, dude, OS X has everything you need built in:&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;lsof -i&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;Lists open sockets. Output looks like this, presto!&lt;/p&gt;  &lt;pre&gt;&lt;code&gt;COMMAND     PID     USER   FD   TYPE    DEVICE SIZE/OFF NODE NAME&lt;br /&gt;Quicksilv   784 jpdaigle  253u  IPv4 0x4baba68      0t0  TCP 192.168.1.121:64139-&gt;host44.hrwebservices.net:http (CLOSE_WAIT)&lt;br /&gt;SystemUIS 13716 jpdaigle   10u  IPv4 0x431a880      0t0  UDP *:*&lt;br /&gt;Mail      23859 jpdaigle   17u  IPv4 0x51cb270      0t0  TCP 192.168.1.31:55041-&gt;webaccess.hostedmail.net:imaps (ESTABLISHED)&lt;br /&gt;Mail      23859 jpdaigle   18u  IPv4 0x6d7d270      0t0  TCP 192.168.1.31:55043-&gt;webaccess.hostedmail.net:imaps (ESTABLISHED)&lt;br /&gt;Mail      23859 jpdaigle   23u  IPv4 0x8587e64      0t0  TCP 192.168.1.31:55049-&gt;webaccess.hostedmail.net:imaps (ESTABLISHED)&lt;br /&gt;Mail      23859 jpdaigle   26u  IPv4 0x58f8e64      0t0  TCP 192.168.1.31:55044-&gt;webaccess.hostedmail.net:imaps (ESTABLISHED)&lt;br /&gt;firefox-b 25763 jpdaigle   31u  IPv4 0x703266c      0t0  TCP 192.168.1.31:55088-&gt;64.26.141.78:http (ESTABLISHED)&lt;br /&gt;firefox-b 25763 jpdaigle   36u  IPv4 0x9779270      0t0  TCP 192.168.1.31:55089-&gt;64.26.141.71:http (ESTABLISHED)&lt;br /&gt;&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/31982987-7445325202108462747?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7445325202108462747/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7445325202108462747' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7445325202108462747'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7445325202108462747'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/09/ask-tuaw-finding-which-processes-own.html' title='Ask TUAW - Finding which processes own which network connections - Here, I&apos;ll Save You 30 Bucks'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-794417878075302476</id><published>2008-08-30T00:27:00.005-04:00</published><updated>2008-08-30T00:42:16.407-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fido'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='iphone'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Upgrading a Pay-as-You-Go Fido Account to an iPhone 3-Year Contract: Nontrivial</title><content type='html'>&lt;p&gt;There's probably nothing too original at this point about someone blogging about problems buying a new phone from Fido, but, well, this &lt;em&gt;particular&lt;/em&gt; problem, I haven't seen mentioned yet.&lt;/p&gt;  &lt;p&gt;Walked up to a Fido booth tonight thinking I'd buy a new phone (not important which one for this story, but gee, &lt;strong&gt;I think you can take a guess&lt;/strong&gt;). "In and out in 15 minutes", thought I. Ha. I've got to say though, the employees there, for all their trouble in getting things done, tried really hard and were so patient on the phone with the mothership (yes, the employees get put on hold for an hour too) that I really can't blame them at all.&lt;/p&gt;  &lt;p&gt;I'm with Fido on a &lt;em&gt;Pay-as-You-Go&lt;/em&gt; plan (prepaid airtime), and since I've been a customer for a while I have a bunch of rebate dollars (called FidoDollars) usable as credit towards new phones. Problem is, you can't walk into a Fido store and get your prepaid account converted to a 3-year contract while keeping the same phone number and already accumulated airtime credit. Can't be done, no matter how long the poor salespeople stay on hold with the customer service center trying to make it happen.&lt;/p&gt;  &lt;p&gt;There are two main options available if you're already a Fido customer on &lt;em&gt;Pay-as-You-Go&lt;/em&gt;, neither of them particularly appealing:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;p&gt;Buy the JesusPhone(TM) from the Fido store, have them activate it on a new phone number with a new account on a 3-year contract. You lose your existing phone number (well, it actually stays active on your old phone, but what use is that?) and get a new one. You can't use FidoDollars credit to help pay for the new phone, and you'll lose all your prepaid airtime when it expires. They have &lt;span style="font-style: italic;"&gt;absolutely no way&lt;/span&gt; to use your FidoDollars or transfer your prepaid airtime credit.&lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Have the Fido store order a JesusPhone(TM) (by phone, which takes over 30 minutes for some reason) for you from the customer service center. You can keep your phone number and use your FidoDollars to help pay for the new phone, and also any unused prepaid airtime will be credited to your monthly bill. Perfect, except they'll start billing you your monthly contract BEFORE you receive the new phone, and as the sales girl explained, you'll then have to call customer service when you do get the new phone up and running and get them to credit a pro-rated portion of the month. Also, it takes ~10-12 days and you have to pay the 250$ charge cash on delivery when you receive the new phone. Finally, to pour MORE salt on that wound, it won't even work out of the box because you must then drive back to the Fido store and have them transfer the phone number from your old SIM to your new SIM. But the cherry on the sundae is reserved for the Fido employees: as I learned, they don't make any commission on this sale even after working for an hour and a half trying to sort it out and spending an hour on the phone, because it's ultimately completed as a phone order.&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;How nice. I went with the second option. I'm expecting a package, for which I have no tracking number, to show up in around 10 days, with cash-on-delivery. Sweet.&lt;/p&gt;  &lt;p&gt;For the record, the Fido employees agreed this was completely ridiculous, they're just powerless to do anything about it.&lt;/p&gt;&lt;p&gt;I leave you with this piece of news, however: the voice plan I signed up for is a new plan just introduced this week (not yet advertised on their site), and it's fantastic: 17.50$ a month for 200 daytime minutes + unlimited evenings and weekends. I think this is the cheapest voice plan I've ever seen - add 30$ for 6GB of data and you're paying only 47.50$ + fees per month, which is actually really decent. Looking on their website, there's no plan anywhere even close to that cheap that offers unlimited evenings and weekends, so this is a &lt;span style="font-weight: bold; font-style: italic;"&gt;really&lt;/span&gt; great deal, I suppose it's a time-limited promotional offer, but I've got it locked in for 3 years now.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-794417878075302476?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/794417878075302476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=794417878075302476' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/794417878075302476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/794417878075302476'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/upgrading-pay-as-you-go-fido-account-to.html' title='Upgrading a Pay-as-You-Go Fido Account to an iPhone 3-Year Contract: Nontrivial'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8224381615825326679</id><published>2008-08-24T20:04:00.004-04:00</published><updated>2008-08-24T20:47:13.236-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Wake-up Call for the Foodie</title><content type='html'>&lt;p&gt;Or: I fail at omnivorism, apparently.&lt;/p&gt;&lt;p&gt;I know how much everyone hates blog memes that rely on propagating lists, but this one has merit as a device to instill humility in this foodie's psyche and renew my drive for exploration and experimentation. I'm talking, of course, about the &lt;a href="http://www.verygoodtaste.co.uk/uncategorised/the-omnivores-hundred/"&gt;Very Good Taste Omnivore's Hundred&lt;/a&gt;, a list of 100 foods that's making the rounds right now, billed as a collection of meals any self-respecting omnivore must have tried at least once.&lt;/p&gt;&lt;p&gt;Why am I calling this a wake-up call? Because I just went through the exercise and scored a rather pathetic &lt;em&gt;56%&lt;/em&gt;, forcing me to realize just how little I've really experienced. Try it yourself.&lt;/p&gt;&lt;p&gt;Here are the instructions from the original post:&lt;br /&gt;* Copy this list into your blog or journal, including these instructions.&lt;br /&gt;* Bold all the items you've eaten.&lt;br /&gt;* Cross out any items that you would never consider eating.&lt;br /&gt;* Optional extra: Post a comment &lt;a href="http://www.verygoodtaste.co.uk/uncategorised/the-omnivores-hundred/"&gt;here&lt;/a&gt; at www.verygoodtaste.co.uk linking to your results.&lt;/p&gt;&lt;p&gt;I'm crossing out Whole insects, Fugu, and Roadkill, so I'm really aiming for a score out of 97. Oh, and the insects thing is probably negotiable after a couple of drinks. I did my counting on Google Spreadsheets, so the following should get automatically updated whenever I check off something new.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;Update: ah of course, the iframe won't show up in RSS readers. You have to click to go to the real page.&lt;br /&gt;&lt;br /&gt;&lt;iframe width='500' height='300' frameborder='0' src='http://spreadsheets.google.com/pub?key=pCG9C4DoISR5xFmyq6mr1Kw&amp;output=html&amp;gid=0&amp;single=true&amp;widget=true'&gt;&lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8224381615825326679?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8224381615825326679/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8224381615825326679' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8224381615825326679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8224381615825326679'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/wake-up-call-for-foodie.html' title='Wake-up Call for the Foodie'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-115313722724168521</id><published>2008-08-24T13:55:00.001-04:00</published><updated>2008-08-24T13:59:44.382-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Kimchi</title><content type='html'>&lt;p&gt;I just want to post a pointer to Ron Eade's &lt;a href="http://communities.canada.com/ottawacitizen/blogs/omnivore/archive/2008/08/20/kimchi-the-national-korean-dish-michael-ois-update.aspx"&gt;recent blog entry&lt;/a&gt; about making kimchi at home. A quick perusal of the instructions reveal it's a fairly involved multi-step process, but overall it still seems simpler than I'd ever imagined.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I buy my kimchi at &lt;a href="http://maps.google.ca/maps?ie=UTF8&amp;amp;oe=utf-8&amp;amp;client=firefox-a&amp;amp;q=ottawa+168&amp;amp;fb=1&amp;amp;cid=14136312008926400061&amp;amp;li=lmd&amp;amp;z=14&amp;amp;iwloc=A"&gt;168 Market&lt;/a&gt; on Somerset, but they seem to only have a single variety and it's not quite as good as what they serve at, say, Seoul House. I've asked around and people seem to only be aware of &lt;em&gt;168 Market&lt;/em&gt; as a source, so perhaps I should try making my own someday - I'd just have to &lt;strong&gt;massively&lt;/strong&gt; scale down the quantities from Mr Eade's typical batch size!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-115313722724168521?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/115313722724168521/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=115313722724168521' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/115313722724168521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/115313722724168521'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/kimchi.html' title='Kimchi'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5682804694875184029</id><published>2008-08-13T21:22:00.009-04:00</published><updated>2008-08-13T21:40:24.553-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='fail'/><category scheme='http://www.blogger.com/atom/ns#' term='entertainment'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>What exactly are Dell and Costco selling here?</title><content type='html'>&lt;p&gt;&lt;br /&gt;Just got a weird little something in the mailbox: a Costco marketing email drew my attention with a rather unusual-looking picture of some Dell machines. I clicked on &lt;a href="http://www.costco.ca/Common/Search.aspx?search=dell0813&amp;Dx=mode+matchallpartial&amp;forcelang=en-CA&amp;Nr=P_CatalogName:BCCA&amp;Ns=P_Price|1||P_SignDesc1&amp;N=0&amp;whse=BCCA&amp;ViewAll=999&amp;Ntk=Text_Search&amp;Dr=P_CatalogName:BCCA&amp;Ne=4000000&amp;D=dell0813&amp;Ntt=dell0813=mode+matchallpartial&amp;Nty=1&amp;cm_mmc=CNEmail_EN_229-_-FOCUS-_-14-_-dell0813"&gt;to the website&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2761641968/" title="What's Costco Selling? by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3109/2761641968_94f959cc55_o.png" width="491" height="220" alt="What's Costco Selling?" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Hmm, that desktop image sure seems familiar, doesn't it?&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2761667398/" title="dell2 by JPDaigle, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3025/2761667398_4922902a1c_o.png" width="514" height="175" alt="dell2" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Perfect match! Who wants a Dell XPS with OSX? Maybe this is the Creative-Commons-licensed version of Apple's famous desktop image? ;-)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5682804694875184029?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5682804694875184029/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5682804694875184029' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5682804694875184029'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5682804694875184029'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/what-exactly-are-dell-and-costco.html' title='What exactly are Dell and Costco selling here?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3273434215390532544</id><published>2008-08-07T18:36:00.003-04:00</published><updated>2008-08-07T18:39:42.067-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Age is strictly a case of mind over matter. If you don't mind, it doesn't matter. --Jack Benny</title><content type='html'>I got ID'd at the LCBO this week. Youth is still mine. Made me happy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3273434215390532544?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3273434215390532544/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3273434215390532544' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3273434215390532544'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3273434215390532544'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/age-is-strictly-case-of-mind-over.html' title='Age is strictly a case of mind over matter. If you don&apos;t mind, it doesn&apos;t matter. --Jack Benny'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8722754035889191006</id><published>2008-08-03T15:39:00.001-04:00</published><updated>2008-08-03T15:39:55.270-04:00</updated><title type='text'>Visa Desjardins' fraud detection</title><content type='html'>Visa Desjardins has, for the second time in as many months, deemed some of my account activity suspicious. Since they're on the hook, financially, for unauthorized transactions I can understand them having a certain bias towards prudence, but in both cases when I spoke to a CSR, the reason stated was quite vague ("this activity doesn't fit your account's pattern").&lt;br /&gt;&lt;br /&gt;I would love to learn (out of personal interest, really, I'm not complaining!) about the decision rules or heuristics that apply here considering the two suspicious charges that were delayed this weekend.&lt;br /&gt;&lt;br /&gt;The first is a 25$ renewal of my Flickr Pro account, charged by Yahoo. The CSR said that getting a charge from an online service provider was flagged. Never mind that I've got monthly credit-card charges from my ISP for Internet access, and from rsync.net for storage space, and that my account has, in the past, seen charges from a large gaggle of other online sellers.&lt;br /&gt;&lt;br /&gt;The second is even more comical: it's a charge from a gas station in Kanata.&lt;br /&gt;&lt;a href="http://picasaweb.google.com/jpdaigle/HostedPhotos/photo#5230377894443972898"&gt;&lt;img src="http://lh5.ggpht.com/jpdaigle/SJYI-7djeSI/AAAAAAAAAkM/K2Sgoh6oxoY/s800/visa_desjardins_map.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The green placemark is the Esso station where I always fill up, it's at the corner of Solandt and March in Kanata, right next to the office. It was closed this week, so I went to the Shell station instead (the red placemark) 1200 meters away. That got me flagged. Really.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8722754035889191006?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8722754035889191006/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8722754035889191006' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8722754035889191006'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8722754035889191006'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/visa-desjardins-fraud-detection.html' title='Visa Desjardins&amp;#39; fraud detection'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jpdaigle/SJYI-7djeSI/AAAAAAAAAkM/K2Sgoh6oxoY/s72-c/visa_desjardins_map.png' height='72' width='72'/><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5193763052050806551</id><published>2008-08-02T15:37:00.001-04:00</published><updated>2008-08-02T15:37:58.367-04:00</updated><title type='text'>Good Sentences</title><content type='html'>From &lt;a href="http://fishbowl.pastiche.org/2008/08/02/dear_america_please_fix_your_country_so_i_can_visit_it_again"&gt;The Fishbowl&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;In the news this morning, US Department of Homeland Security regulations allow them to confiscate laptops at the border, or duplicate any data, without any suspicion of wrongdoing on the part of the laptop’s owner.&lt;br /&gt;&lt;br /&gt;It’s a very timely move by the DHS. You never know when someone might invent a global, unregulated data network that could allow evildoers to entirely bypass such checkpoints, making them nothing more than a sham way for border police to rake through people’s private data and copy their mp3 collections.&lt;br /&gt;[...]&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The scary thing is I don't really see a way to defend against this. Even if you take the nuclear option and wipe everything, putting it online, and cross the border with a squeaky-clean laptop, there's still a chance your hardware gets confiscated. I wonder if travel insurance would cover seizure of hardware by foreign customs?&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5193763052050806551?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5193763052050806551/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5193763052050806551' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5193763052050806551'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5193763052050806551'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/08/good-sentences.html' title='Good Sentences'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-9140250526288695999</id><published>2008-07-30T11:37:00.001-04:00</published><updated>2008-07-30T11:38:25.405-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>I Think Spolsky Missed a Detail About Starbucks Queueing</title><content type='html'>&lt;p&gt;This week saw the publication of another Inc.com article by the inimitable Joel Spolsky, and as usual it's a fun, geeky read. His &lt;strike&gt;ranting &lt;/strike&gt;analysis of the queueing and order taking procedures at Starbucks supplement a section about an instance of unfriendliness on the part of the staff, which I'll ignore in favour of concentrating on the (more interesting and less Godin-esque) part of the article on queueing procedures and order taking.&lt;/p&gt;  &lt;p&gt;Read the original article [&lt;a href="http://www.inc.com/magazine/20080801/how-hard-could-it-be-good-system-bad-system.html"&gt;http://www.inc.com/magazine/20080801/how-hard-could-it-be-good-system-bad-system.html&lt;/a&gt;]; I'm only reproducing a small, relevant portion here: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Her main job was to go down the line of people waiting to order and ask them what they wanted in advance of their arriving at the cash register. There, they would be asked to repeat their order before paying and finally joining the line of customers waiting for their drinks to appear. &lt;/p&gt;    &lt;p&gt;This premature order taking did not appear to improve the store's productivity. The cashiers still had to take the same number of orders, wait for the customers to fiddle with their purses for the correct change, and so forth. The coffee producers -- known theatrically in the trade as baristas -- still had to make the same number of drinks. The biggest benefit of the procedure, I thought, was that the barista got started on a drink a few seconds earlier, so people got their orders filled a little bit faster, even though the overall rate of output for the store was the same. &lt;/p&gt;    &lt;p&gt;A network engineer would say this was a situation of 'same bandwidth, lower latency' [...]&amp;quot; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I disagree! &lt;/p&gt;  &lt;h2&gt;Armchair Psychology&lt;/h2&gt;  &lt;p&gt;Firstly, I might have a bit of an issue with the claim of lowering perceived latency by reducing the gap between paying at the register and receiving your drink, because I believe I'd start measuring latency when first giving the order, not when paying. Let's ignore that though; Spolsky correctly assumes the early order-taking is useful in preventing customers from giving up and leaving when faced with a long line. This should be no surprise to anyone who's read Robert Cialdini's &lt;em&gt;Influence: The Psychology of Persuasion&lt;/em&gt; [&lt;a href="http://www.amazon.com/Influence-Psychology-Persuasion-Robert-Cialdini/dp/0688128165"&gt;http://www.amazon.com/Influence-Psychology-Persuasion-Robert-Cialdini/dp/0688128165&lt;/a&gt;] Once we've expressed a choice, painted a mental picture of ourselves as buying a cup of Starbucks coffee this morning, our internal need for self-consistency will force us to rationalize staying, even in the face of long lines. Seriously, read this book, it's an eye opener. &lt;/p&gt;  &lt;h2&gt;The Benefit of Longer Queues&lt;/h2&gt;  &lt;p&gt;Ahem, sorry for the digression - back to queueing. Joel states: &lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;[...] while not even increasing the total number of Frappuccino Blended Coffees that could be produced per unit of time?&amp;quot; &lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Aha, that's the thing! What's missing here is that the goal isn't to increase the Frappuccino throughput, it's to increase the total throughput across all drinks, and it's absolutely crucial to realize that the drinks are different, and have different preparation times. I think the point of the pre-order taking is to increase the job queue length, and that increasing total throughput by doing this is actually an achievable goal. &lt;/p&gt;  &lt;p&gt;Your typical Starbucks counter layout looks something like this in Canada (simplified): &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SJCKpt8b9gI/AAAAAAAAAkE/PWWEh1r5q_M/starbucks_queue%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="138" alt="starbucks_queue" src="http://lh4.ggpht.com/jpdaigle/SJCKp4RAJKI/AAAAAAAAAkI/2oq7_X2_Xis/starbucks_queue_thumb%5B2%5D.png" width="345" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Section A: 2 Espresso machines, steam wands for frothing milk, grinders.    &lt;br /&gt;Section B: 3 Thermos canisters of brewed drip coffee: light, medium, dark roast.     &lt;br /&gt;Section C: Cash registers, in front of which customers line up.     &lt;br /&gt;Job Queue: {DripDarkRoast, DripDarkRoast, Cappuccino, Latte, Cappuccino}&lt;/p&gt;  &lt;p&gt;There is no need to view the job queue as FIFO, in fact, it's intuitively obvious that reordering jobs depending on what's available at any moment (out of steamed milk - need to make more, out of ground coffee - need to grind more, etc) should improve the throughput somewhat. Now, assuming you have enough baristas, you can make 2 espresso-based drinks and 1 brewed coffee simultaneously. Maximum throughput will be achieved when all 3 execution units are kept fully busy, which means your drink pipeline should have at least two espresso drinks and one brewed coffee in it to guarantee full utilization after popping the next job off the queue, AND your staff must be allowed to reorder as they see fit. Practically speaking, since pouring a cup of drip coffee takes less time than paying for it, you should have much more than a single drip coffee job in the queue. &lt;/p&gt;  &lt;p&gt;So the expediter &lt;em&gt;can &lt;/em&gt;indeed cause the throughput to rise - It's clear to me that the job of the expediter is to increase the pipeline length to maximize the chance that all execution units are kept busy. One might argue that this can be done without an expediter, by having the cashiers simply take more orders and queueing them up, but that seems like it would be too much of a cognitive load: in addition to payment processing, they'd be forced to be perfectly aware of what's in the queue, who's busy, which machines are free, etc. The constant context-switching between smiling to customers, counting change, and checking the state of the queue would slow them down, which is why I think it makes sense to offload all of this decision-making to the expediter, who's then free to apply whatever algorithm she chooses in deciding whether to take more orders or pause.&lt;/p&gt;  &lt;h2&gt;The Smugness Corner&lt;/h2&gt;  &lt;p&gt;I frequently buy my morning coffee from &lt;a href="http://www.bridgehead.ca"&gt;Bridgehead Coffee&lt;/a&gt; in Ottawa, where the barista often sees me standing in line and starts making my usual drink before I get to the cashier to place my order, which results in incredibly low perceived latency. Go Bridgehead.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-9140250526288695999?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/9140250526288695999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=9140250526288695999' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9140250526288695999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9140250526288695999'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/07/i-think-spolsky-missed-detail-about.html' title='I Think Spolsky Missed a Detail About Starbucks Queueing'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/jpdaigle/SJCKp4RAJKI/AAAAAAAAAkI/2oq7_X2_Xis/s72-c/starbucks_queue_thumb%5B2%5D.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4096713778585705829</id><published>2008-07-25T18:23:00.006-04:00</published><updated>2008-07-26T02:07:19.309-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Performance investigation of Java's select() in Windows</title><content type='html'>Java has had &lt;i id="f9i2"&gt;select()&lt;/i&gt;-based I/O since (I believe) 1.4, through &lt;i id="f9i20"&gt;java.nio.channels.Selector&lt;/i&gt; and the supporting API. While network I/O over non-blocking &lt;i id="f9i21"&gt;SocketChannel&lt;/i&gt;s has been working fine in one of our [Solace Systems'] messaging software platforms for a long time, and at a more than acceptable throughput, I had never really attempted to precisely measure typical timings of &lt;i id="auxp"&gt;Selector.select()&lt;/i&gt; and &lt;i id="auxp0"&gt;SocketChannel.write()&lt;/i&gt;. That is, until this week, when a coworker coding against Winsock2 wanted to compare his timings against what we got doing similar work in Java. What I found was quite surprising...&lt;br /&gt;&lt;h2 id="tsyb"&gt;Test Design&lt;/h2&gt;To get an idea of timings, I quickly bashed out your basic "Hello World" of non-blocking-SocketChannel-using applications (which we'll call the client side), that simply streams data as fast as possible to a &lt;i id="s0c1"&gt;netcat (nc)&lt;/i&gt; instance in listen mode (the server side). In a Java program, we connect to a remote listening port that was created like so:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    nc -kl $PORT &gt; /dev/null&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then we register an interest set of &lt;i id="jodn"&gt;OP_WRITE &lt;/i&gt;on that channel, log the time offset (&lt;i id="kg_4"&gt;System.nanoTime&lt;/i&gt;), and &lt;span style="font-style: italic;"&gt;select()&lt;/span&gt;. Whenever this returns, we log the time and attempt to write an X kilobyte buffer to the socket, then select again, etc. We also log timings for time spent in &lt;i id="mi8g"&gt;write() &lt;/i&gt;and the number of bytes written in each call to &lt;i id="mi8g0"&gt;write()&lt;/i&gt;. We'll retry this test for several values of X, getting a sense of how much data is copied from our input buffer to the socket's output buffer on each call to &lt;i id="mi8g1"&gt;write()&lt;/i&gt;, and how long it takes &lt;i id="mi8g2"&gt;select()&lt;/i&gt; to return, indicating space in the socket's send buffer.&lt;br /&gt;&lt;h2 id="tsyb0"&gt;Results&lt;/h2&gt;First, here's the average time (over ~200 or so writes) spent in &lt;i id="u.f1"&gt;select()&lt;/i&gt;:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;WRITE SZ    AVG_TIME (us)&lt;br /&gt;1K          396011&lt;br /&gt;2K          654&lt;br /&gt;5K          846&lt;br /&gt;10K         1271&lt;br /&gt;100K        9332&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;First surprising result: The distribution is pretty much what you'd expect for a 100 mbit network, except for the 1K datapoint, which should just have made you spray coffee on your monitor. The 1K writes start off very fast for the first few samples (~500us), then hit a wall and only get woken up every 500000us, yielding a very, very slow transfer rate (2 KB/s). I initially thought this was due to Nagle preventing a small buffer to be sent before a timeout expired, but setting TCP_NODELAY on the socket had no effect on this behaviour. I can confirm using a packet dump that the server end immediately acks every packet we send to it, so it's not a question of the local TCP send window getting full.&lt;br /&gt;&lt;br /&gt;The second weird result is that on Windows, whenever you call SocketChannel.write(ByteBuffer), THE ENTIRE BUFFER GETS COPIED OFF AND REPORTED AS WRITTEN. You'd expect it to write only as many bytes as it can until filling up the local TCP send buffer (sized at &lt;i id="k4i4"&gt;SO_SNDBUF&lt;/i&gt;, which defaults at 8 KB, as we all know), then return that number, leaving the rest of your input buffer to be copied out on the next call to write(). In fact, that's my understanding of &lt;a title="Javadoc" href="http://java.sun.com/j2se/1.5.0/docs/api/java/nio/channels/SocketChannel.html#write%28java.nio.ByteBuffer%29" id="qv2c"&gt;the Sun documentation&lt;/a&gt; (emphasis mine):&lt;br /&gt;&lt;br /&gt;&lt;div id="ug:g1" style="margin-left: 40px;"&gt;Writes a sequence of bytes to this channel from the given buffer.&lt;br /&gt;&lt;/div&gt;&lt;p id="ug:g4" style="margin-left: 40px;"&gt; An attempt is made to write up to &lt;i id="ug:g5"&gt;r&lt;/i&gt; bytes to the channel,  where &lt;i id="ug:g6"&gt;r&lt;/i&gt; is the number of bytes remaining in the buffer, that is,  &lt;tt id="ug:g7"&gt;dst.remaining()&lt;/tt&gt;, at the moment this method is invoked.&lt;br /&gt;&lt;/p&gt;&lt;p id="ug:g11" style="margin-left: 40px;"&gt; Suppose that a byte sequence of length &lt;i id="ug:g12"&gt;n&lt;/i&gt; is written, where  &lt;tt id="ug:g13"&gt;0&lt;/tt&gt; &lt;tt id="ug:g14"&gt;&lt;=&lt;/tt&gt; &lt;i id="ug:g15"&gt;n&lt;/i&gt; &lt;tt id="ug:g16"&gt;&lt;=&lt;/tt&gt; &lt;i id="ug:g17"&gt;r&lt;/i&gt;.  This byte sequence will be transferred from the buffer starting at index  &lt;i id="ug:g18"&gt;p&lt;/i&gt;, where &lt;i id="ug:g19"&gt;p&lt;/i&gt; is the buffer's position at the moment this  method is invoked; the index of the last byte written will be  &lt;i id="ug:g20"&gt;p&lt;/i&gt; &lt;tt id="ug:g21"&gt;+&lt;/tt&gt; &lt;i id="ug:g22"&gt;n&lt;/i&gt; &lt;tt id="ug:g23"&gt;-&lt;/tt&gt; &lt;tt id="ug:g24"&gt;1&lt;/tt&gt;.  Upon return the buffer's position will be equal to  &lt;i id="ug:g25"&gt;p&lt;/i&gt; &lt;tt id="ug:g26"&gt;+&lt;/tt&gt; &lt;i id="ug:g27"&gt;n&lt;/i&gt;; its limit will not have changed.   &lt;/p&gt;&lt;p id="ug:g30" style="margin-left: 40px;"&gt;Unless otherwise specified, a write operation will return only after  writing all of the &lt;i id="ug:g31"&gt;r&lt;/i&gt; requested bytes.  Some types of channels,  depending upon their state, may write only some of the bytes or possibly  none at all.  &lt;i id="g_c-"&gt;&lt;b id="g_c-0"&gt;A socket channel in non-blocking mode, for example, cannot  write any more bytes than are free in the socket's output buffer.   &lt;/b&gt;&lt;/i&gt;&lt;/p&gt;&lt;i id="g_c-1"&gt;&lt;b id="g_c-2"&gt;&lt;br /&gt;&lt;/b&gt;&lt;/i&gt;&lt;h2 id="zs9n"&gt;Open Questions (Mystery!)&lt;br /&gt;&lt;/h2&gt;So, I'm left with two big questions:&lt;br /&gt;&lt;br /&gt;1. What's going on with the 1K writes? I tried &lt;i id="ux1w"&gt;TCP_NODELAY&lt;/i&gt; on that socket (Nagle's algorithm being the obvious culprit when small writes have huge latency), with no change: &lt;i id="unho"&gt;select()&lt;/i&gt; only wakes up once per 500ms. Also, it happens consistently on every single select. Since the local &lt;i id="ux1w0"&gt;SO_SNDBUF&lt;/i&gt; is 8K, even if there was something fishy going on around that 500ms pause in &lt;i id="ux1w1"&gt;select()&lt;/i&gt;, shouldn't you only get blocked for the full 500ms once per 8 writes? I've never seen this happen in a real-world production app though, so I'm willing to chalk it up to a quirk in my simplistic test code.&lt;br /&gt;&lt;br /&gt;2. Isn't it a bit strange that &lt;i id="e7ip"&gt;write()&lt;/i&gt; returns immediately and always reports writing the full buffer under Windows, even if you pass in a 100MB &lt;i id="pg56"&gt;ByteBuffer &lt;/i&gt;to be output with an &lt;i id="e7ip0"&gt;SO_SNDBUF&lt;/i&gt; of only 8K? On 2 UNIX systems I tried it on, it still wrote much, much more than the value of &lt;i id="u:ob"&gt;SO_SNDBUF&lt;/i&gt;, but the results were all over the place, they didn't always match the size of the input array (as I'd expect).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4096713778585705829?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4096713778585705829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4096713778585705829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4096713778585705829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4096713778585705829'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/07/performance-investigation-of-javas.html' title='Performance investigation of Java&apos;s select() in Windows'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2166824466629750231</id><published>2008-07-10T11:22:00.001-04:00</published><updated>2008-07-10T11:22:36.839-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Pimpin' thread dump utility class</title><content type='html'>&lt;p&gt;When you're looking at your source and wondering &amp;quot;how the &lt;em&gt;hell&lt;/em&gt; did I get here? Am I on the Swing worker thread, or...&amp;quot;, there's a few things you can do to make finding the answer easier.&lt;/p&gt;  &lt;p&gt;You've already looked at the call hierarchy with Ctrl+Alt+H, and you can't figure it out. One approach is to just slap down a breakpoint and restart under the Eclipse debugger, but if you put the breakpoint in a method that's called &lt;em&gt;commonly&lt;/em&gt;, and you're instead looking for the &lt;em&gt;uncommon &lt;/em&gt;hit, it's going to be &lt;em&gt;really&lt;/em&gt; annoying to have the debugger jump up every three seconds and click &amp;quot;nope, nope, next, etc&amp;quot; while looking at the call stack.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/59942231/"&gt;&lt;img src="http://farm1.static.flickr.com/25/59942231_cdc2d3fc72_m.jpg" /&gt;&lt;/a&gt;    &lt;br /&gt;AAAAUUUUUGH!!&lt;/p&gt;  &lt;p&gt;So here's the second option: good old printf debugging. Now there's no one-liner (that I know of) in Java to just dump the current stack (You could instantiate a &lt;em&gt;Throwable&lt;/em&gt; and tell it to print its stack in like 2 lines, but how ugly is that?), so &lt;a href="http://jpdaigle.googlepages.com/ThreadUtil.java"&gt;here's a little utility class (ThreadUtil.java)&lt;/a&gt; you can grab:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top"&gt;         &lt;pre&gt;import java.io.PrintStream;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Debugging utility class for printing current thread's stack trace.&lt;br /&gt; * &lt;br /&gt; * To print to STDOUT, just call {@link #printMyStackTrace()}. If using a&lt;br /&gt; * logging framework, instead call {@link #getMyStackTrace()} and log the&lt;br /&gt; * result.&lt;br /&gt; * &lt;br /&gt; * @author Jean-Philippe Daigle&lt;br /&gt; * &lt;br /&gt; */&lt;br /&gt;public class ThreadUtil {&lt;br /&gt;&lt;br /&gt;    private ThreadUtil() {&lt;br /&gt;    }&lt;br /&gt;    &lt;br /&gt;    /**&lt;br /&gt;     * Prints current stack to &lt;code&gt;System.out&lt;/code&gt;.&lt;br /&gt;     */&lt;br /&gt;    public static void printMyStackTrace() {&lt;br /&gt;        printMyStackTrace(System.out);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Prints current stack to the specified &lt;code&gt;PrintStream&lt;/code&gt;.&lt;br /&gt;     */&lt;br /&gt;    public static void printMyStackTrace(final PrintStream out) {&lt;br /&gt;        out.print(getMyStackTrace());&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    /**&lt;br /&gt;     * Gets current stack trace as a &lt;code&gt;String&lt;/code&gt;.&lt;br /&gt;     */&lt;br /&gt;    public static String getMyStackTrace() {&lt;br /&gt;        StackTraceElement[] ste_arr = dumpFilteredStack();&lt;br /&gt;        StringBuilder sb = new StringBuilder();&lt;br /&gt;        sb.append(getHeader()).append(&amp;quot;\n&amp;quot;);&lt;br /&gt;        for (StackTraceElement stackTraceElement : ste_arr) {&lt;br /&gt;            sb.append(&amp;quot;\t&amp;quot; + stackTraceElement + &amp;quot;\n&amp;quot;);&lt;br /&gt;        }&lt;br /&gt;        return sb.toString();&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static StackTraceElement[] dumpFilteredStack() {&lt;br /&gt;        StackTraceElement[] ste = Thread.currentThread().getStackTrace();&lt;br /&gt;&lt;br /&gt;        /*&lt;br /&gt;         * The first few elements in the stack will be in Thread.dumpThreads,&lt;br /&gt;         * and in the current class, so we need to skip that noise.&lt;br /&gt;         */&lt;br /&gt;        int i = 0;&lt;br /&gt;        for (i = 0; i &amp;lt; ste.length; i++) {&lt;br /&gt;            String cc = ste[i].getClassName();&lt;br /&gt;            if (!(cc.equals(&amp;quot;java.lang.Thread&amp;quot;) &lt;br /&gt;                || cc.equals(ThreadUtil.class.getCanonicalName())))&lt;br /&gt;                break;&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        StackTraceElement[] ste2 = new StackTraceElement[ste.length - i];&lt;br /&gt;        System.arraycopy(ste, i, ste2, 0, ste2.length);&lt;br /&gt;        return ste2;&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    private static String getHeader() {&lt;br /&gt;        final Thread ct = Thread.currentThread();&lt;br /&gt;        return String.format(&amp;quot;Thread: \&amp;quot;%s\&amp;quot; %s id=%s, prio=%s:&amp;quot;, &lt;br /&gt;            ct.getName(),&lt;br /&gt;            ct.isDaemon() ? &amp;quot;daemon &amp;quot; : &amp;quot;&amp;quot;,&lt;br /&gt;            ct.getId(), &lt;br /&gt;            ct.getPriority());&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2166824466629750231?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2166824466629750231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2166824466629750231' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2166824466629750231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2166824466629750231'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/07/pimpin-thread-dump-utility-class.html' title='Pimpin&amp;#39; thread dump utility class'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/25/59942231_cdc2d3fc72_t.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7054979112415995652</id><published>2008-07-08T22:05:00.001-04:00</published><updated>2008-07-08T22:08:36.980-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>How to steal a car</title><content type='html'>&lt;p&gt;I dropped off my car at the Honda dealership this morning to have them investigate the mysterious Check Engine light that came on yesterday. This post was inspired by what happened tonight when I swung by after work to pick up the car - I'm not chastising them for the security flaw, I mostly just find it charming and cute.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/1243686866/" title="car"&gt;&lt;img name="1243686866_bff64332e3.jpg" src="http://farm2.static.flickr.com/1326/1243686866_bff64332e3.jpg" style="border: 10px solid white;" height="295" width="500" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;I was there about two minutes, and this is the conversation as I remember it, see if you can spot the tiny flaw:&lt;/p&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;p&gt;[I enter the service area of the dealership and walk over to the clerk, then sit down in front of him. A car key is lying on the desk, sporting a little tag with my last name scrawled on it in big block letters: DAIGLE.]&lt;br /&gt;&lt;br /&gt;- Clerk: Hi!&lt;br /&gt;&lt;br /&gt;- JP: Hi, picking up my car...&lt;br /&gt;&lt;br /&gt;- Name?&lt;br /&gt;&lt;br /&gt;- Daigle&lt;br /&gt;&lt;br /&gt;- Oh yeah, just closing that file now, here's your key.&lt;br /&gt;&lt;br /&gt;- So what was wrong with it?&lt;br /&gt;&lt;br /&gt;- Coolant temperature sensor failed.&lt;br /&gt;&lt;br /&gt;- Huh.&lt;br /&gt;&lt;br /&gt;- Yeah, it was under warranty, so you're good to go!&lt;br /&gt;&lt;br /&gt;- Thanks, good night!&lt;br /&gt;&lt;br /&gt;[I exit the dealership, key in hand, and drive off.]&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;p&gt;Human beings are usually the weakest link in any security system :)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7054979112415995652?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7054979112415995652/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7054979112415995652' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7054979112415995652'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7054979112415995652'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/07/how-to-steal-car.html' title='How to steal a car'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm2.static.flickr.com/1326/1243686866_bff64332e3_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5045351191989450052</id><published>2008-06-30T15:32:00.001-04:00</published><updated>2008-06-30T15:32:14.867-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='entertainment'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>On WALL-E</title><content type='html'>&lt;p&gt;This contains a few spoilers, but nothing that would completely ruin the movie for you if you haven't already seen it.&lt;/p&gt;  &lt;p&gt;I saw WALL-E this weekend, and overall I thought it was pretty good. I'm a bit mystified by the torrent of &lt;a href="http://summize.com/search?q=wall-e"&gt;comments up on Twitter&lt;/a&gt; and in the blogosphere saying it's perfect in every way, the best movie of the year, it's fantastic, etc. It's certainly a great movie, but I wouldn't put it in genius territory quite yet (maybe I need to watch it another time?). I thought &lt;em&gt;The Incredibles &lt;/em&gt;and &lt;em&gt;Ratatouille &lt;/em&gt;were a bit better overall - we'll get to the big reason why in a second. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/jpdaigle/SGk0uBclNfI/AAAAAAAAAic/SBgGz9t00TQ/walle_johnny5%5B4%5D.jpg"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="266" alt="walle_johnny5" src="http://lh6.ggpht.com/jpdaigle/SGk0uvnGPRI/AAAAAAAAAig/sB3RsPiis6I/walle_johnny5_thumb%5B2%5D.jpg" width="547" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I have to admit I really liked the undoubtedly intentional homage to &lt;a href="http://en.wikipedia.org/wiki/Johnny_5"&gt;Johnny 5&lt;/a&gt;'s design (from &lt;a href="http://www.imdb.com/title/tt0091949/"&gt;Short Circuit&lt;/a&gt;, which was my favourite movie for a long time as a kid - you could tell even back then I'd become an engineer!). Also loved the Mac startup sound when WALL-E boots up, but that's been &lt;a href="http://www.slashfilm.com/2008/06/27/wall-e-easter-eggs/"&gt;covered to death already&lt;/a&gt;. &lt;/p&gt;  &lt;h2&gt;Nitpicking&lt;/h2&gt;  &lt;p&gt;1) The passengers on the ship are referred to as &amp;quot;shoppers&amp;quot;, which begs the question of how a population of 8-th generation travelers who don't seem to actually do any useful work can accumulate any assets to spend, and how those assets would have any value when the only trading partner is BNL. There appears to be a completely uniform distribution of &amp;quot;stuff&amp;quot; among the population, so there can be no interpersonal trade or bartering. How is the shipboard economy sustained? I would have loved to see a few hints on what their economy is like; as it is, I think we can just speculate and wait for the DVD with director's commentary. As an aside, I'm trying to think of examples in sci-fi literature of self-contained shipboard economies, and I'm coming up blank. I loved the ideas in Charles Stross' Accelerando, where the ship of (virtualized) explorers has no economy itself (the explorers and their physical environment being nothing more than a simulation), but the characters set up a kingdom which acts as a trust back in the originating solar system, tasked with making enough money to continue powering the ship remotely over decades. &lt;/p&gt;  &lt;p&gt;2) Why are they throwing garbage out into space? It seems clear the &lt;em&gt;Axiom &lt;/em&gt;ship, which has been out there for 700 years, is intended to function as a self-sustaining system, but if that's the case, they certainly can't afford to be throwing out materials at the rate at which we see them doing so during the movie. The movie does establish that the ship itself commands automated probes like the one that carried EVE, so perhaps we're meant to assume these probes also handle mining for raw materials. &lt;/p&gt;  &lt;p&gt;3) The ship lands at the end of the movie, and in scale, it's clear it's much smaller than a large city (it looks like it might be a few kilometers long, if even that). So where is the rest of humanity? My assumption today is that somehow, the lifestyle that led to the extreme consumerism of the race and the destruction of the environment also caused a gradual contraction of humanity's numbers down to a couple thousand, who finally decided to evacuate when BNL provided the opportunity. Again, maybe I missed some key hints, but I didn't see this addressed. &lt;/p&gt;  &lt;p&gt;4) How is it that even after seven centuries, atmospheric pollution hasn't died down? Part of the explanation could be that there's no vegetation to absorb any of it, but you'd think even then, over that length of time, the cycle of rain and evaporation would push it all down as water, and everything would end up in the oceans sooner or later, clearing the air. (But hey, what do I know about ecology, I'm a software guy. I'm sure over the coming days we'll get analysis by people who know how to answer this.) &lt;/p&gt;  &lt;h2&gt;WALL-E after the other Pixar masterpieces&lt;/h2&gt;  &lt;p&gt;My final gripe (all the above are just fun openings for speculation) is that the moralizing message in this one is quite a bit more blunt and in-your-face than it was in previous Pixar films. This is part of what made them charming, they weren't too blatant with their moralizing. Off the top of my head, I can think of a few 'lessons' imparted on the viewer by each movie, and there's always an obvious unoriginal one, as well as a less clich&amp;#233; secondary lesson. (Remember, this is just my opinion, and I certainly wasn't acing the literature and film analysis courses I took back when I was in school.) &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Finding Nemo &lt;/em&gt;had the tired, obvious lesson of &amp;quot;you can do great things no matter who you are, accept yourself along with the small imperfections&amp;quot; (the whole misshaped fin thing). It had more interesting, less obvious lessons about the treatment of animals, their natural habitat, and the value of sticking together as a family. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;The Incredibles &lt;/em&gt;had the best one: &amp;quot;When everyone's special, no one is&amp;quot;. This one theme, with Syndrome's jealousy, is a terrific teardown of the stupid, broken, touchy-feely politically correct &amp;quot;everyone's a winner&amp;quot; style of educating kids where somehow, everyone ends up with a prize at the end. Life isn't like that. Your precious little snowflakes aren't all winners. I love that the writers had the guts to put in that line about everyone being special. Its secondary topic, I think, was an examination of what it means to have an unfulfilling life, and though I adored this movie as it is, I've always thought a slightly darker ending, where Bob Parr ends up forced to go back to just surviving in the shadows, would have been more fitting. &lt;/p&gt;  &lt;p&gt;&lt;em&gt;Ratatouille&lt;/em&gt;? A bit harder to analyze, actually, and it seems the harder the Pixar movies make it to identify their central themes, the better the movie ends up being. &lt;em&gt;Ratatouille &lt;/em&gt;was, arguably, firstly about following your dream despite an unsupportive peer group (a bit similar to &lt;em&gt;Nemo &lt;/em&gt;in that respect), and secondly about the art and enjoyment of food, and the evilness of commoditizing and commercializing food preparation. Mmmm, tasty. I'm still not sure how the critic fits in.&lt;/p&gt;  &lt;p&gt;Finally, we get to &lt;em&gt;WALL-E&lt;/em&gt; which is the one I'm most likely to get wrong, because although I've seen &lt;em&gt;The Incredibles &lt;/em&gt;something like 8 times, I've seen &lt;em&gt;WALL-E &lt;/em&gt;but once. &lt;em&gt;WALL-E&lt;/em&gt; hits you over the head with an unsubtle full-throated shout of &amp;quot;stop consuming / wasting so much&amp;quot;, etc, etc. I thought showing the indoctrination of newborns in the school/nursery was quite nice (&amp;quot;B is for BNL, your very best friend&amp;quot;), but it was so brief it may whizz right by the youngest children in the audience [this isn't really a criticism, given my opinion about the film's lack of subtlety]. &lt;/p&gt;  &lt;p&gt;The deception and poor planning on the part of the BNL CEO (&amp;quot;stay the course!&amp;quot;) were likewise enjoyable, but not particularly clever or restrained. Showing the human race as lazy, unthinking pleasure-seekers is also in many respects apt, but at this point it's a smidgen tired and overused. (Though &lt;em&gt;WALL-E&lt;/em&gt; did it better than &lt;em&gt;Idiocracy&lt;/em&gt;, I must say.) The other part of the story worth talking about is the (&lt;em&gt;extremely cutely done&lt;/em&gt;) love between WALL-E and EVE, which has the novel property of unfolding between robots, but once more it's a familiar archetype: the dumpy, ugly guy falls in love with the hopelessly beautiful and refined female character who has no interest in him. He persists and eventually gets the girl - big surprise.&lt;/p&gt;  &lt;p&gt;It's certainly worth the 10$. Go see it, then come back and comment. I'm looking forward to seeing it another time, and hoping to go &amp;quot;OH! Of course! How stupid I've been!&amp;quot;, and changing my opinion about all the above. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5045351191989450052?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5045351191989450052/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5045351191989450052' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5045351191989450052'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5045351191989450052'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/on-wall-e.html' title='On WALL-E'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/jpdaigle/SGk0uvnGPRI/AAAAAAAAAig/sB3RsPiis6I/s72-c/walle_johnny5_thumb%5B2%5D.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3058140492029324744</id><published>2008-06-20T23:27:00.001-04:00</published><updated>2008-06-20T23:27:37.067-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>A Few Snapshots From Westfest 5</title><content type='html'>&lt;p&gt;Last weekend was Westfest 2008 (Westboro's annual music festival, in Ottawa), and due to a craaaaazy week at work I didn't really have time to post any snapshots until tonight (although they were &lt;a href="http://flickr.com/photos/jpdaigle/"&gt;on my Flickr feed&lt;/a&gt;, if you're following that). Here, enjoy!&lt;/p&gt;  &lt;p&gt;It pretty much rained the whole weekend (and &lt;strong&gt;every single day &lt;/strong&gt;this week - ugh!), so I only managed a few pics during a rare moment of sunshine:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2577275400/"&gt;&lt;img src="http://farm4.static.flickr.com/3092/2577275400_07cd275150.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ A few concertgoers hanging out&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2576446995/"&gt;&lt;img src="http://farm4.static.flickr.com/3127/2576446995_ab45e25e74.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ A hip-hop band out of Manitoba called &lt;em&gt;Grand Analog&lt;/em&gt;. They were actually pretty great!&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2576450679/"&gt;&lt;img src="http://farm4.static.flickr.com/3051/2576450679_fd9a309f25.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ Their lead singer, trying to rev up the crowd (not completely successful, but oh well)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2576450453/"&gt;&lt;img src="http://farm4.static.flickr.com/3027/2576450453_6e9033253f.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ I like this couple, they have the same weird hairdo and fit together so well&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2579728342/"&gt;&lt;img src="http://farm4.static.flickr.com/3025/2579728342_f104df7090.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ &lt;em&gt;The Candy Store&lt;/em&gt;, a new shop that just opened up on Richmond Rd. Haven't shopped there yet. (I'm not really a sweets and candy kind of guy - I'm sipping a blended nectarine/tofu shake as I write this.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2578910097/"&gt;&lt;img src="http://farm4.static.flickr.com/3125/2578910097_ef8a99148d.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;^^^ This kid was hilarious, more on him in a second&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2579750632/"&gt;&lt;img src="http://farm4.static.flickr.com/3264/2579750632_905f793863.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;So here's the story: the boy was in the American Apparel boutique, and being rather small and questionably behaved, he managed to sneak right into the display case. He then - and I am not making this up - started caressing the legs of the female mannequins. Then, he started pulling on clothes, on both the male and female mannequins. &lt;/p&gt;  &lt;p&gt;The depressing part of the story (for me) is that in a five-minute span, two different women asked me if he was my son. Ouch. To think that I'd have a kid already - that's a huge, depressing, dose of &amp;quot;you're not getting any younger&amp;quot;. Maybe my youthful good looks* are increasingly a thing of the past.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;*: Just &amp;quot;youthful looks&amp;quot; might be a bit more truthful, but who's counting ;)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3058140492029324744?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3058140492029324744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3058140492029324744' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3058140492029324744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3058140492029324744'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/few-snapshots-from-westfest-5.html' title='A Few Snapshots From Westfest 5'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3092/2577275400_07cd275150_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3989940256110400831</id><published>2008-06-20T15:36:00.001-04:00</published><updated>2008-06-20T15:36:01.143-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Java Devs: Gear Up! (a Shout Out to adaptj and tda)</title><content type='html'>&lt;p&gt;Found an &lt;strong&gt;awesome&lt;/strong&gt; tool today that I never knew existed, and it blew my mind. It's called &lt;a href="http://www.adaptj.com/main/download"&gt;StackTrace&lt;/a&gt;, from &lt;a href="http://www.adaptj.com/"&gt;adaptj&lt;/a&gt;. There's a free version you can launch using Java Webstart (JNLP). This thing is awesome at solving one small, but all too common problem: being unable to get a thread dump in a running JVM because you don't have the console that launched the java process. (Imagine someone on your QA team calls you up, and says that his nightly build of your app locked up - you ask him three questions: Did you start it with remote debugging enabled? no? Then did you enable log4j logging? no? Did you keep around the console that launched it? Ah, no again, of course. At this point you're usually screwed. But not anymore!)&lt;/p&gt;  &lt;p&gt;It looks like this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SFwGl1-yVmI/AAAAAAAAAiM/CdcCyPM5HJ8/CropperCapture%5B240%5D%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="455" alt="CropperCapture[240]" src="http://lh4.ggpht.com/jpdaigle/SFwGmnKRiuI/AAAAAAAAAiQ/4fkzW5ppek4/CropperCapture%5B240%5D_thumb%5B2%5D.png" width="604" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;When you start up StackTrace, click the little gear icon or go to Process &amp;gt; Select... and you get a list of all the java processes on your system. Select the desired one, click OK, then back on the main screen hit the &amp;quot;Thread dump&amp;quot; button.&lt;/p&gt;  &lt;p&gt;Boom. Instant thread dump of everything in that JVM instance. THIS. IS. HUGE.&lt;/p&gt;  &lt;p&gt;Second little discovery of the day is called &lt;a href="https://tda.dev.java.net/"&gt;tda&lt;/a&gt;. It's a thread dump analyzer that will open up a saved stack trace and show you exactly which threads own which monitors, and speed up a bit your task of slogging through pages and pages of stack traces. Give it a try:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SFwGnsPD6EI/AAAAAAAAAiU/ZjyghV9W-l4/CropperCapture%5B241%5D%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="378" alt="CropperCapture[241]" src="http://lh4.ggpht.com/jpdaigle/SFwGoPszzEI/AAAAAAAAAiY/X8Lu__wo2ew/CropperCapture%5B241%5D_thumb%5B2%5D.png" width="604" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3989940256110400831?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3989940256110400831/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3989940256110400831' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3989940256110400831'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3989940256110400831'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/java-devs-gear-up-shout-out-to-adaptj.html' title='Java Devs: Gear Up! (a Shout Out to adaptj and tda)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/jpdaigle/SFwGmnKRiuI/AAAAAAAAAiQ/4fkzW5ppek4/s72-c/CropperCapture%5B240%5D_thumb%5B2%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5496332007370023528</id><published>2008-06-09T17:03:00.001-04:00</published><updated>2008-06-09T17:03:45.967-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Is Bell's Torrent Throttling Sucking Less?</title><content type='html'>&lt;p&gt;n.d.a.: My ISP is &lt;a href="http://dsl.295.ca"&gt;295.ca&lt;/a&gt;, which is a DSL reseller affected by Bell's torrent throttling.&lt;/p&gt;  &lt;p&gt;Screenshot taken at 16:30 today from a terminal window, late afternoon being in the time period where torrents are normally getting throttled down to around 25 k/s:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/jpdaigle/SE2arpqwhOI/AAAAAAAAAiE/hThrdzoNts0/CropperCapture%5B238%5D%5B4%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="34" alt="CropperCapture[238]" src="http://lh5.ggpht.com/jpdaigle/SE2asHRv7aI/AAAAAAAAAiI/0of-DGZEi00/CropperCapture%5B238%5D_thumb%5B2%5D.png" width="640" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;185.9 kB/s!&lt;/strong&gt; (Sure, not great, but for a throttled connection during peak hours this is acceptable.)&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5496332007370023528?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5496332007370023528/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5496332007370023528' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5496332007370023528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5496332007370023528'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/is-bell-torrent-throttling-sucking-less.html' title='Is Bell&amp;#39;s Torrent Throttling Sucking Less?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jpdaigle/SE2asHRv7aI/AAAAAAAAAiI/0of-DGZEi00/s72-c/CropperCapture%5B238%5D_thumb%5B2%5D.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6006864274912713894</id><published>2008-06-06T18:10:00.001-04:00</published><updated>2008-06-06T18:11:09.069-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>A Lifesaver for Multi-Monitor Users</title><content type='html'>&lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2556253557/"&gt;&lt;img height="336" src="http://farm4.static.flickr.com/3014/2556253557_602531de19.jpg" width="508" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;If, like me, you're used to spending a lot of time in KDE on Linux, trying to move windows around on a large desktop (such as in a multi-monitor setup) on WinXP can be pretty frustrating because there's no native support for KDE's ALT+DRAG method of moving windows.&lt;/p&gt;  &lt;p&gt;KDE supporting this is &lt;strong&gt;&lt;em&gt;a very Good Thing&lt;/em&gt;&lt;/strong&gt;. &lt;a href="http://en.wikipedia.org/wiki/Fitts'_law"&gt;Fitts' Law&lt;/a&gt; predicts the time required to move a cursor to a target area as a function of the target's size and distance from the current cursor position. It implies that a very large target, close to the mouse pointer, will be much faster to access than a small one, especially if it's further away. &lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SEm14tU27wI/AAAAAAAAAhk/VcgYyrAJQC4/Clipboard02%5B4%5D.png"&gt;&lt;img height="188" alt="Clipboard02" src="http://lh6.ggpht.com/jpdaigle/SEm15lhWxnI/AAAAAAAAAho/PdCzr9T30Gs/Clipboard02_thumb%5B2%5D.png" width="500" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This explains why it's comparatively hard to move a window under Windows: the cursor has to move from its current position all the way to the top of the window to be moved, which is a wide but not very tall target. KDE's usability improvement is to allow the user to hold the ALT key, and click anywhere within the window, then drag it to a new location. [Which can even be to another virtual desktop, but lack of support for that in WinXP is another stupid annoyance that we'll complain about another time.] This makes the target area as large as the window, so you don't really need any fine motor skills, and the distance to target is often zero, because your pointer is already there.&lt;/p&gt;  &lt;p&gt;So here's what I came online to post about: howtogeek.com &lt;a href="http://www.howtogeek.com/howto/windows-vista/get-the-linux-altwindow-drag-functionality-in-windows/"&gt;posted an AutoHotKey script&lt;/a&gt; to enable this functionality in Windows. I've been running it for 3 days now without issues, so I'm giving it the thumbs up. &lt;a href="http://www.howtogeek.com/howto/windows-vista/get-the-linux-altwindow-drag-functionality-in-windows/"&gt;Get it now&lt;/a&gt;.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6006864274912713894?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6006864274912713894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6006864274912713894' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6006864274912713894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6006864274912713894'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/lifesaver-for-multi-monitor-users.html' title='A Lifesaver for Multi-Monitor Users'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3014/2556253557_602531de19_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8455586568688682686</id><published>2008-06-04T00:08:00.001-04:00</published><updated>2008-06-04T00:08:50.691-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='photography'/><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><title type='text'>The Economics of Consumer Photo Printers: Only Good for Homemade Porn?</title><content type='html'>&lt;p&gt;I just remembered that I meant to print out something at work today, and it's 11PM and I don't own a printer, so it's not happening today. But it got me thinking about laser printers, so I looked up a few on &lt;a href="http://www.costco.ca"&gt;costco.ca&lt;/a&gt; and &lt;a href="http://www.bestbuy.ca"&gt;bestbuy.ca&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/jpdaigle/SEYVRjU2MSI/AAAAAAAAAhM/9MIiS63h8fs/s1600-h/train_of_thought%5B7%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="213" alt="train_of_thought" src="http://lh5.ggpht.com/jpdaigle/SEYVSDU2MTI/AAAAAAAAAhQ/A5EyeCwxHwc/train_of_thought_thumb%5B5%5D.png?imgmax=800" width="304" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Checking out the laser printers, I saw a bunch of those little home photo printers, like the Canon Pixma series, and I got curious: how did the total operating cost of those things, once you factor in ink and photo paper, compare to my current solution: &lt;a href="http://www.photolab.ca"&gt;photolab.ca&lt;/a&gt;? &lt;/p&gt;  &lt;h2&gt;Are my Intuitions any Good?&lt;/h2&gt;  &lt;p&gt;Intuitively, I figured that buying your own printer and consumables would be expensive up front, but pictures would have a lower marginal cost, so once you amortized the cost over hundreds of prints, you'd eventually reach a break-even point after which owning the photo printer was the cheaper option. I did a bit of investigative work to try and locate this break-even point. Foreshadowing: my intuitions can be waaay off the mark.&lt;/p&gt;  &lt;h2&gt;Photolab's up First&lt;/h2&gt;  &lt;p&gt;First, the &lt;a href="http://www.photolab.ca"&gt;photolab.ca&lt;/a&gt; approach. The cost is exactly &lt;strong&gt;&lt;em&gt;0.19$ per 4x6 print&lt;/em&gt;&lt;/strong&gt; (it drops to 0.15$ if you order &amp;gt;100 at once, but let's ignore that and assume we're printing small batches every week). You then pick it up at a Loblaws or Superstore and pay on reception. I've used them and found the quality to be great [if you're in the Solace offices, all the pics you see in my cube are from there].&lt;/p&gt;  &lt;h2&gt;Buying a Pixma MP620&lt;/h2&gt;  &lt;p&gt;Next, let's choose a Canon photo printer to compare against. Best Buy has a few cheaper Pixma units, but they're all end-of-lifed and the Canon website doesn't sell ink anymore. Cheapest current-ish one I found is the &lt;a href="http://www.bestbuy.ca/catalog/proddetail.asp?logon=&amp;amp;langid=EN&amp;amp;sku_id=0926INGFS10092883&amp;amp;catid=25115"&gt;Pixma MP610&lt;/a&gt;, which looks like something I'd buy, and goes for 129.99$.&lt;/p&gt;  &lt;p&gt;Canon sells the 3-colour CMY cartridge pack for 64.99$ (site is not linkable, it's called &amp;quot;CLI-8 Colour Combo w./ PP-101 4x6 50 SH PK&amp;quot;), rated for 280 pages of letter paper at 5% coverage. In terms of surface area, a 4x6 print is equal to 0.2567 pages of letter paper, but since you're printing border-to-border instead of sparse text, you'll need 100% ink coverage. We can thus estimate that the cartridges will give us 54.542 4x6 prints, which is handy because coincidentally, the box includes 50 pages of 4x6 photo paper, so let's round that 54.542 down to 50 to account for the waste from cleaning the heads. This makes our cost per page &lt;strong&gt;&lt;em&gt;1.30$ per 4x6 print&lt;/em&gt;&lt;/strong&gt;. On top of the cost of the printer. That's not a typo.&lt;/p&gt;  &lt;h2&gt;Comparative Results&lt;/h2&gt;  &lt;p&gt;Now you know where this is going, but I thought it would be extra fun to graph these costs (assumes the cost-per-photo is evenly amortized, in reality the blue line would be a staircase curve):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SEYVSTU2MUI/AAAAAAAAAhU/JTsORJie688/s1600-h/photolab_ca_vs_canon_pixma_mp610%282%29%5B3%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="photolab_ca_vs_canon_pixma_mp610(2)" src="http://lh6.ggpht.com/jpdaigle/SEYVTTU2MVI/AAAAAAAAAhY/m6p6SCN5U1U/photolab_ca_vs_canon_pixma_mp610%282%29_thumb%5B1%5D.png?imgmax=800" width="454" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And here's what it looks like if a sales guy were to walk over and &lt;em&gt;GIVE YOU THE PRINTER FOR FREE&lt;/em&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.ggpht.com/jpdaigle/SEYVUDU2MWI/AAAAAAAAAhc/NRLxhbm3EKo/s1600-h/photolab_ca_vs_canon_pixma_mp610%5B5%5D.png"&gt;&lt;img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="324" alt="photolab_ca_vs_canon_pixma_mp610" src="http://lh3.ggpht.com/jpdaigle/SEYVUjU2MXI/AAAAAAAAAhg/XVJ3gAdunfQ/photolab_ca_vs_canon_pixma_mp610_thumb%5B3%5D.png?imgmax=800" width="454" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I think the conclusion we can draw from this is that the premium for home printing is huge, so I suppose it would only be worth it if:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;You regularly have a very pressing need for printouts and can't wait 24 hours for the lab to process your order, or &lt;/li&gt;    &lt;li&gt;You wish to get your printouts without an anonymous technician seeing them - &lt;em&gt;&lt;a href="http://www.youtube.com/watch?v=ona-RhLfRfc"&gt;wink wink nudge nudge&lt;/a&gt;&lt;/em&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/31982987-8455586568688682686?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8455586568688682686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8455586568688682686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8455586568688682686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8455586568688682686'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/06/economics-of-consumer-photo-printers.html' title='The Economics of Consumer Photo Printers: Only Good for Homemade Porn?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jpdaigle/SEYVSDU2MTI/AAAAAAAAAhQ/A5EyeCwxHwc/s72-c/train_of_thought_thumb%5B5%5D.png?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3352324558596116693</id><published>2008-05-27T00:08:00.001-04:00</published><updated>2008-05-27T00:08:26.043-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Random Notes from DemoCampOttawa9</title><content type='html'>&lt;p&gt;All right, I want to jot down a few comments about &lt;a href="http://barcamp.pbwiki.com/DemoCampOttawa9"&gt;DemoCampOttawa9&lt;/a&gt; before I go off to bed. Now, I'm a software developer. I'm not a startup entrepreneur, nor an investor, nor someone in any way qualified to comment about how insanely great or ridiculously and laughably stupid a business idea is, so I'll just stick to talking a tiny bit about what I saw tonight. Oh yeah, the &lt;a href="http://www.flickr.com/photos/jpdaigle/sets/72157605276663679/"&gt;pics are up on flickr right here&lt;/a&gt; if you're interested, the license is Creative-Commons, and sorry about the wacky colours, it was your typical low-light restaurant / bar room.&lt;/p&gt;  &lt;p&gt;DemoCampOttawa is a semi-regular series of meetings where members of the Ottawa high-tech community can go up on stage and show off hardware, software, services they're working on. &lt;a href="http://www.flickr.com/photos/jpdaigle/2526895822/"&gt;&lt;img src="http://farm4.static.flickr.com/3205/2526895822_95e7a9edd7.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First, a big congrats to &lt;a href="http://saunderslog.com/"&gt;Alec Saunders&lt;/a&gt; for being a smooth and lively host. A nice thing about this evening is that no one that presented was a slick, practiced, PR person - every single presenter was a techy, and that made for an accessible, informal feel.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2526885106/"&gt;&lt;img src="http://farm4.static.flickr.com/3245/2526885106_e9a4fbda61_m.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;First up was a presenter from &lt;a href="https://portal.simtonecdu.com/"&gt;SIMtone&lt;/a&gt;. From the demo, they basically seem to rent you a WinXP virtual machine running in a datacenter. You don't just connect over RDP however, they provide a light Java client that runs on very modest hardware that can give you access to your VM instance. The presenter didn't have time to explain how they balanced the hosted VMs across physical boxes, or how much CPU and bandwidth you're allowed to use, etc, but he was accessing it over WiMax and it seemed to work OK. [note: we have WiMax service in Ottawa???]&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;img src="http://farm4.static.flickr.com/3289/2526068119_d8a2c27517.jpg" /&gt; &lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2526887380/"&gt;&lt;img src="http://farm3.static.flickr.com/2140/2526887380_6f00b2e1ac.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;We got an engineer who implemented a GPU on a Xilinx FPGA. He had it running live on a demo board, but didn't go into much detail about whether he was generating the video signal himself too or if he had much extra hardware on there to do that, etc.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2526904380"&gt;&lt;img src="http://farm3.static.flickr.com/2365/2526904380_e270ece530.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This is Richard Mayer from &lt;a href="http://www.protecode.com/site/index.php"&gt;Protecode&lt;/a&gt;. He demo'ed an interesting Eclipse plugin and associated web service that fingerprints external code added to your development projects and tracks the licenses under which it's distributed. It seems the big value here is in the massive database of publicly-distributed code they've built up. Their software can identify not only third-party libraries and source files added to a project, but small chunks of code pasted in as well.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.flickr.com/photos/jpdaigle/2526902398/"&gt;&lt;img src="http://farm4.static.flickr.com/3260/2526902398_5143ded9c3.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Martin demoing &lt;a href="http://www.stockify.com"&gt;Stockify&lt;/a&gt;, a web app for evaluating value stocks. The app looks at historical P/E ratios and earnings growth of public companies.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2526072457/"&gt;&lt;img src="http://farm4.static.flickr.com/3231/2526072457_0e8e25a8ff.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;And finally, Joel and Pascal from &lt;a href="http://www.picsphere.com/"&gt;picsphere&lt;/a&gt;, which makes workflow-management software for event photographers. We've seen plenty of photo-workflow management apps before, but this one seemed to have novel ways of importing the pictures, keeping them tagged by subject, and allowing instant sales at the point of capture (from what I could see in the demo). They were pretty cool because they really didn't project the condescending elitism you usually get from &lt;strong&gt;&lt;em&gt;everyone &lt;/em&gt;&lt;/strong&gt;in the photography industry, they felt more like purveyors of software for a more regular-guy, amateurish market (and probably a much larger one, IMHO).&lt;/p&gt;  &lt;p&gt;Phew, that's it.&lt;em&gt;&amp;#160;&lt;/em&gt;I'll surely attend the next meetup, this was overall an interesting night.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3352324558596116693?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3352324558596116693/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3352324558596116693' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3352324558596116693'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3352324558596116693'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/05/random-notes-from-democampottawa9.html' title='Random Notes from DemoCampOttawa9'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3205/2526895822_95e7a9edd7_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4627737102367378323</id><published>2008-05-26T17:34:00.002-04:00</published><updated>2008-05-26T17:37:27.679-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>Does Google Desktop Search Have Selective Memory?</title><content type='html'>&lt;p&gt;For frequently used applications, I have shortcuts (that get indexed by &lt;a href="http://www.launchy.net/"&gt;Launchy&lt;/a&gt;) and/or aliases set up in &lt;a href="http://www.bayden.com/SlickRun/"&gt;SlickRun&lt;/a&gt;, which are both fantastic little productivity enhancers.&lt;/p&gt;  &lt;p&gt;When it comes to infrequently-used programs, however, I don't have shortcuts to them so I prefer to just use &lt;a href="http://desktop.google.com/"&gt;Google Desktop&lt;/a&gt; to search for the filename and click the first hit [essentially, I want to use Google Desktop as the '&lt;span style="font-family:Courier;"&gt;locate&lt;/span&gt;' command under unix]. Sometimes though, it doesn't find what I'm looking for, even though &lt;strong&gt;&lt;em&gt;IT'S RIGHT FRACKING THERE ON THE DRIVE&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.ggpht.com/jpdaigle/SDss5ov6cCI/AAAAAAAAAgc/7NcwB-jMG7k/google_desktop_1%5B7%5D.png"&gt;&lt;img style="border: 0px none ;" alt="google_desktop_1" src="http://lh5.ggpht.com/jpdaigle/SDss54v6cDI/AAAAAAAAAgk/mNwOQ_lyIck/google_desktop_1_thumb%5B5%5D.png" border="0" height="409" width="631" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.ggpht.com/jpdaigle/SDss6Yv6cEI/AAAAAAAAAgs/62qCmTdTOYU/CropperCapture%5B234%5D%5B8%5D.png"&gt;&lt;img style="border: 0px none ;" alt="CropperCapture[234]" src="http://lh4.ggpht.com/jpdaigle/SDss6ov6cFI/AAAAAAAAAg0/6UxL7xmz-Ww/CropperCapture%5B234%5D_thumb%5B6%5D.png" border="0" height="374" width="640" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;You might start thinking: "Aha, it just doesn't index filenames in .exe" (even though that would be awfully inconvenient), but that wouldn't be true either:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.ggpht.com/jpdaigle/SDss7Iv6cGI/AAAAAAAAAg8/graMrmB9w54/CropperCapture%5B235%5D%5B4%5D.png"&gt;&lt;img style="border: 0px none ;" alt="CropperCapture[235]" src="http://lh3.ggpht.com/jpdaigle/SDss7Yv6cHI/AAAAAAAAAhE/3nN0o_X-91o/CropperCapture%5B235%5D_thumb%5B2%5D.png" border="0" height="338" width="358" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Sigh.&lt;/p&gt;  &lt;p&gt;My tech isn't working the way I want it to tonight. When will I start winning?&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4627737102367378323?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4627737102367378323/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4627737102367378323' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4627737102367378323'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4627737102367378323'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/05/does-google-desktop-search-have.html' title='Does Google Desktop Search Have Selective Memory?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/jpdaigle/SDss54v6cDI/AAAAAAAAAgk/mNwOQ_lyIck/s72-c/google_desktop_1_thumb%5B5%5D.png' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4187323717179462546</id><published>2008-05-23T17:13:00.004-04:00</published><updated>2008-05-23T17:21:03.916-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Conflict!</title><content type='html'>This coming Monday (May 26th), there are two events in Ottawa, both starting at 19:00 :&lt;br /&gt;&lt;ul&gt;&lt;li&gt;A showing and then &lt;a href="http://ontario.sierraclub.ca/ottawa/showevent.php?id=1277"&gt;discussion panel&lt;/a&gt; on "&lt;a href="http://www.storyofstuff.com/"&gt;The Story of Stuff&lt;/a&gt;", presented by the Sierra Club Ottawa. The panelists include Tracey Clark, who's the managing director of Bridgehead coffee shops. I'd really like to sit in on this. &lt;/li&gt;&lt;li&gt;&lt;a href="http://barcamp.pbwiki.com/DemoCampOttawa9"&gt;DemoCampOttawa9&lt;/a&gt;, the tech event of the month for the Ottawa tech community.&lt;/li&gt;&lt;/ul&gt;Hmmm. I think I'll probably end up going with the nerds instead of the hippies, but this is one of those nights I really wish I could be in two places at once.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4187323717179462546?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4187323717179462546/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4187323717179462546' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4187323717179462546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4187323717179462546'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/05/conflict.html' title='Conflict!'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3279585508699014011</id><published>2008-05-19T00:19:00.002-04:00</published><updated>2008-05-19T00:22:10.903-04:00</updated><title type='text'>Non-Reciprocal Recognition</title><content type='html'>Confession: I see people. They recognize me. I don't recognize them. &lt;br /&gt;They'll remember me, I won't.&lt;br /&gt;sucks to be me&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3279585508699014011?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3279585508699014011/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3279585508699014011' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3279585508699014011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3279585508699014011'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/05/non-reciprocal-recognition.html' title='Non-Reciprocal Recognition'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2497957741377680653</id><published>2008-05-04T01:21:00.001-04:00</published><updated>2008-05-04T01:24:34.845-04:00</updated><title type='text'>A snack-sized bite of Java for tonight</title><content type='html'>&lt;h2&gt;With Java autoboxing, always pay attention to what your primitives get boxed into.&lt;/h2&gt;  &lt;p&gt;Here's an easy little bug to introduce if you don't pay attention: consider these methods of the &lt;strong&gt;Map&amp;lt;K, V&amp;gt;&lt;/strong&gt; interface:&lt;/p&gt; &lt;font face="Courier New"&gt;V put(K key, V value)    &lt;br /&gt;V remove(Object key)&lt;/font&gt;   &lt;p&gt;So you put a value into a map, and remove it. Easy enough. &lt;/p&gt;  &lt;h2&gt;Pop Quiz&lt;/h2&gt;  &lt;p&gt;So what does the following return?&lt;/p&gt;  &lt;pre&gt;public static String test() {&lt;br /&gt;    HashMap&amp;lt;Long, String&amp;gt; map = new HashMap&amp;lt;Long, String&amp;gt;();&lt;br /&gt;    final long some_key = 1;&lt;br /&gt;    map.put(some_key, &amp;quot;foo&amp;quot;);&lt;br /&gt;    return map.remove(1);&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;...&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Answer: null. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;This is why it's important to remember the definition of the &lt;strong&gt;put&lt;/strong&gt;, &lt;strong&gt;get&lt;/strong&gt; and &lt;strong&gt;remove&lt;/strong&gt; methods. While the &lt;em&gt;generified&lt;/em&gt; [nda - yes that's a word, according to the Sun docs] flavour of &lt;strong&gt;put(K, V)&lt;/strong&gt; ensures the key is an instance of &lt;strong&gt;K&lt;/strong&gt;, for whatever &lt;strong&gt;K&lt;/strong&gt; you declared for this generic map, the &lt;strong&gt;get&lt;/strong&gt; and &lt;strong&gt;remove &lt;/strong&gt;methods weren't generified and simply take an &lt;strong&gt;Object&lt;/strong&gt;. This can bite you, as in the above function, where autoboxing essentially caused the following calls to happen, though it probably wasn't the programmer's intent:&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;    map.put(new Long(1), &amp;quot;foo&amp;quot;);&lt;br /&gt;    map.remove(new Integer(1));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Even though Integer(1) and Long(1) have the same hashCode() value, they fail the equals() test, so key lookups when using the wrong wrapper class will always fail. The fix, of course, is to declare your keys as the right type when calling get() or remove(), and be careful, as the method signature will allow anything to be passed in, so you'll never know at compile-time you got it wrong.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Happy coding!&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2330447128/"&gt;&lt;img height="384" src="http://farm4.static.flickr.com/3062/2330447128_0d08786071.jpg" width="508" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2497957741377680653?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2497957741377680653/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2497957741377680653' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2497957741377680653'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2497957741377680653'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/05/snack-sized-bite-of-java-for-tonight.html' title='A snack-sized bite of Java for tonight'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3062/2330447128_0d08786071_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2479553394779422211</id><published>2008-04-29T13:03:00.001-04:00</published><updated>2008-04-29T13:03:14.144-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Rogers vs Bell</title><content type='html'>&lt;p&gt;So I was hanging out with a friend (who will remain nameless for reasons you'll see very soon) a while back, and I saw his new &lt;a href="http://your.rogers.com/store/wireless/products/pearl_promo.asp"&gt;BlackBerry Pearl&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;- So, you got a BlackBerry, huh?&lt;/p&gt;    &lt;p&gt;- Yeah man, it's great!&lt;/p&gt;    &lt;p&gt;- How do you find the Bell network?&lt;/p&gt;    &lt;p&gt;- Actually I'm with Rogers. Cheaper.&lt;/p&gt;    &lt;p&gt;- ...&lt;/p&gt;    &lt;p&gt;- ...&lt;/p&gt;    &lt;p&gt;- Dude, &lt;strong&gt;&lt;em&gt;&lt;font size="3"&gt;YOU WORK FOR BELL&lt;/font&gt;&lt;/em&gt;&lt;/strong&gt;, don't you get service for free or something?&lt;/p&gt;    &lt;p&gt;- Nope, it's still cheaper with Rogers&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;I was floored! If this isn't a great endorsement of Rogers Wireless, I don't know what is. (Yes, I know their data plans still suck, but it seems they &amp;quot;suck less&amp;quot; than the alternatives.) I can't imagine what it must be like working for a company that would treat its employees so poorly they'd sign a service contract with their biggest competitor.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2479553394779422211?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2479553394779422211/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2479553394779422211' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2479553394779422211'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2479553394779422211'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/04/rogers-vs-bell.html' title='Rogers vs Bell'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4842766442501687412</id><published>2008-04-20T23:05:00.001-04:00</published><updated>2008-04-20T23:05:17.198-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Argh! Missed it!</title><content type='html'>&lt;p&gt;Totally non-techie post today for food geeks: it seems that &lt;a href="http://www.labottega.ca/"&gt;La Bottega&lt;/a&gt; in Ottawa received a single Spanish &lt;em&gt;jam&amp;#243;n ib&amp;#233;rico&lt;/em&gt; last Friday. I missed my chance to buy a few slices, &lt;a href="http://communities.canada.com/ottawacitizen/blogs/omnivore/archive/2008/04/20/iberico-ham-update.aspx"&gt;reading about it&lt;/a&gt; only after the fact on Ron Eade's (the Citizen's food editor) blog, which I was only recently made aware of. Damn.&lt;/p&gt;  &lt;p&gt;It is easy to underestimate the significance of this news item, but thankfully, in his video post, Eade reminds us that this is quite notable, as it is the first time &lt;em&gt;jam&amp;#243;n ib&amp;#233;rico&lt;/em&gt; (made from pasture-fed black pigs of certified race) is available in Ottawa. In fact, until 2005, it was illegal to export it to North America, and since the ham must cure for three years before being ready to sell, it's only now starting to appear on our shores, and is a tad expensive (La Bottega was moving it at 200$ per kilogram).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2335311163/in/set-72157604127702949/"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="353" alt="2335311163_8c43106017" src="http://lh3.ggpht.com/jpdaigle/SAwEaxfTkOI/AAAAAAAAAe4/BLLarqy29w8/2335311163_8c43106017%5B5%5D.jpg?imgmax=800" width="520" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;[sure, I paid 30$ CAD for the plate above last month but look at that marbling!]&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;Ottawa food enthusiasts have no doubt noticed that much cheaper (but still delicious) &lt;em&gt;jam&amp;#243;n serrano&lt;/em&gt; has been available in local food shops for a while now, which is made from white pigs with less restrictions on feeding.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4842766442501687412?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4842766442501687412/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4842766442501687412' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4842766442501687412'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4842766442501687412'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/04/argh-missed-it.html' title='Argh! Missed it!'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/jpdaigle/SAwEaxfTkOI/AAAAAAAAAe4/BLLarqy29w8/s72-c/2335311163_8c43106017%5B5%5D.jpg?imgmax=800' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1713646216640547888</id><published>2008-04-13T01:12:00.001-04:00</published><updated>2008-04-13T01:12:24.786-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Is Deploying a Wireless Network More Secure Than Not Deploying One?</title><content type='html'>&lt;p&gt;Yes, I think it is. Long-winded explanation follows.&lt;/p&gt;  &lt;p&gt;Me: I'm a guy who loves to work on a laptop. I've owned my little Thinkpad since 2004. I have dragged it between Ottawa and Montreal dozens of times, hauled it through Spain and the United States while vacationing, it's been through several coffee shops in Ottawa, and even tonight, with three other computers in my apartment much faster than this one, I'm in the living room, writing this post on the faithful machine. If you call me up and need help with a build script or a complicated subversion operation, I'll run over to your cube with it and we can hack on the problem together, each on our own screen. Or anyway, I would if there were wireless network access points at the office.&lt;/p&gt;  &lt;p&gt;Which there aren't. &lt;/p&gt;  &lt;p&gt;(Yes, I'm well aware of the irony of working for a company that makes network equipment. No need to point it out.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2408709231/"&gt;&lt;img height="301" src="http://farm3.static.flickr.com/2038/2408709231_b4e585eb35.jpg" width="508" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The subject came up on Friday evening, as a bunch of us engineers were sitting around having a beer before leaving for the weekend. Someone (I swear it wasn't me this time) wondered out loud why in this day and age, we didn't have wireless APs at the office. Asked our CTO: &amp;quot;Why don't we just drive to Futureshop and spend the fifty bucks?&amp;quot;&lt;/p&gt;  &lt;p&gt;I suppose it's always been a &amp;quot;nice to have&amp;quot; feature of the office, never a true requirement, and commercial-grade WAPs are more expensive than the consumer versions from Linksys. I've also heard mentions that there might be concerns about the security of the setup, given that we lease a floor on a building housing a bunch of other companies. I realized after the discussion, however, that the security argument was bunk, and having no WLAN could actually put us at much greater risk than having one. &lt;/p&gt;  &lt;p&gt;It is an oft-repeated saying in security discussions that humans are often the weakest part of a security system. In his book &lt;a href="http://www.amazon.ca/Secrets-Lies-Digital-Security-Networked/dp/0471453803/ref=pd_bbs_1?ie=UTF8&amp;amp;s=books&amp;amp;qid=1208061760&amp;amp;sr=8-1"&gt;Secrets and Lies&lt;/a&gt;, security guru Bruce Schneier again reminds us, as he has before, that an inconvenient security system is self-defeating because humans will simply end up not using it. In Chapter 17, he relates this story:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;It has been said that the most insecure system is the one that isn't used. And more often than not, a security system isn't used because it's just too irritating. &lt;/p&gt;    &lt;p&gt;Recently I did some work for the security group in a major multinational corporation. They were concerned that their senior management was doing business on insecure phones - land lines and cellular - sometimes in a foreign country. Could I help? There were several secure-voice products, and we talked about them and how they worked. The voice quality was not as good as normal phones. There was a several-second delay at the start of the call while the encryption algorithm was initialized. The phones were a little larger than the smallest and sexiest cellular phones. But their conversations would be encrypted. &lt;/p&gt;    &lt;p&gt;Not good enough, said the senior executives. They wanted a secure phone, but they were unwilling to live with inferior voice quality, or longer call setup time. And in the end, they continued talking over insecure phones.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This is exactly the risk that an office takes by not deploying secure, properly configured WAPs managed by the IT team. Wireless networks are a convenience for many. There are some (albeit still rare) &lt;a href="http://www.apple.com/ca/macbookair/"&gt;laptops appearing that don't even have a network jack&lt;/a&gt; anymore; and this is just the beginning of that design trend. Sooner or later, someone will get fed up and install a rogue access point, connected to the corporate LAN, and quite possibly insecurely configured and allowing routing to every resource on the network. It may already have happened. Wishfully thinking otherwise is simply ignoring the human part of the equation, hardly good practice of security.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-1713646216640547888?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1713646216640547888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1713646216640547888' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1713646216640547888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1713646216640547888'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/04/is-deploying-wireless-network-more.html' title='Is Deploying a Wireless Network More Secure Than Not Deploying One?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2038/2408709231_b4e585eb35_t.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-144158805464400580</id><published>2008-04-06T03:23:00.004-04:00</published><updated>2008-04-07T23:09:35.312-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>A Firefox Search Plugin for the Ottawa Public Library</title><content type='html'>&lt;p&gt;The &lt;a href="http://www.biblioottawalibrary.ca/index_e.html" target="_blank"&gt;Ottawa Public Library&lt;/a&gt; has a very neat service where you can look up a book online, request it to be delivered to whichever branch is closest to you, and be notified by email when your the chosen tome is available for pickup. If a book is already checked out, you can simply request the next available copy to be delivered.&lt;/p&gt;  &lt;p&gt; &lt;a href="http://www.biblioottawalibrary.ca/index_e.html"&gt;&lt;img style="border: 0px none ;" alt="oplheader-logo" src="http://lh3.google.com/jpdaigle/R_h6Wjd4mzI/AAAAAAAAAdo/ga2eGNogvs8/oplheader-logo%5B9%5D.gif" width="269" border="0" height="83" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Seeing how I do quite a bit of reading these days, I set about creating a Firefox search plugin to easily search their catalog. In truth, I just wanted a quick way of looking up a book in the library catalog when I'm on Amazon.ca or I read a book recommendation on a blog.&lt;/p&gt;  &lt;h2&gt;Installing this search plugin&lt;/h2&gt;  &lt;ol&gt;   &lt;li&gt;Navigate to your Firefox profile directory (&lt;strong&gt;%APPDATA%\Mozilla\Firefox\Profiles\whatever&lt;/strong&gt;).&lt;/li&gt;    &lt;li&gt;If it's not already created, create a new folder called "&lt;strong&gt;searchplugins&lt;/strong&gt;" (without the quotes).&lt;/li&gt;    &lt;li&gt;Copy this file (&lt;a href="http://jpdaigle.googlepages.com/ottawa_public_library.xml"&gt;ottawa_public_library.xml&lt;/a&gt;) to the &lt;strong&gt;searchplugins&lt;/strong&gt; folder, then restart Firefox.&lt;/li&gt; &lt;/ol&gt;  &lt;h2&gt;Usage&lt;/h2&gt;  &lt;p&gt;It's dead simple. Open the search engines drop down menu and choose the new "Ottawa Public Library" option:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jpdaigle/R_h6XDd4m0I/AAAAAAAAAdw/MN03Ha9F20g/opl_search%5B8%5D.png"&gt;&lt;img style="border: 0px none ;" alt="opl_search" src="http://lh3.google.com/jpdaigle/R_h6Xjd4m1I/AAAAAAAAAd4/_EQtTTW1ty0/opl_search_thumb%5B4%5D.png" width="233" border="0" height="291" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Now type in keywords from the book's title and hit enter:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jpdaigle/R_h6ZDd4m2I/AAAAAAAAAeA/O4L3YX9Eqw4/opl_search2%5B4%5D.png"&gt;&lt;img style="border: 0px none ;" alt="opl_search2" src="http://lh5.google.com/jpdaigle/R_h6aDd4m3I/AAAAAAAAAeI/D9M1NYA7MSQ/opl_search2_thumb%5B2%5D.png" width="600" border="0" height="342" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This plugin does a search using the "Keywords in TITLE" option, as I thought that was the most useful. Hope you find this useful! Tell your geeky friends!&lt;/p&gt;  &lt;p&gt;Edit: ah yes, I forgot to say, the XML file includes a copy of the library's logo, taken from their &lt;em&gt;favicon.ico&lt;/em&gt; file. I haven't asked the city of Ottawa for permission to redistribute the icon, but I'm quasi-certain it wouldn't cause a problem. If I get complaints I'll put a new icon in there.&lt;/p&gt;  &lt;br /&gt;&lt;br /&gt;&lt;p&gt;Another update: There's been some interest in this, so here's an easier way to install: &lt;a href="javascript:window.external.AddSearchProvider('http://jpdaigle.googlepages.com/ottawa_public_library.xml')"&gt;Click here to install the Firefox search plugin for the Ottawa Public Library&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-144158805464400580?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/144158805464400580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=144158805464400580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/144158805464400580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/144158805464400580'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/04/firefox-search-plugin-for-ottawa-public.html' title='A Firefox Search Plugin for the Ottawa Public Library'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8198520986133517235</id><published>2008-04-03T00:27:00.001-04:00</published><updated>2008-04-03T00:27:48.550-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><title type='text'>Resolved: Boingo Refunds Their Double-Charge</title><content type='html'>&lt;p&gt;A couple co-workers have been asking me for an update, so here...&lt;/p&gt;  &lt;p&gt;Last weekend, I wrote a post (&lt;a href="http://jpdaigle.blogspot.com/2008/03/watch-out-for-boingo-wireless-in.html" target="_blank"&gt;link&lt;/a&gt;) about how after logging on to the Boingo wireless service from two different airports on the same day, I was charged twice despite having purchased a 24-hour pass. At that time, I contacted their phone service, where a customer rep explained it was normal, and advised me to read the user agreement next time.&lt;/p&gt;  &lt;p&gt;Luckily, I didn't have to do a credit card chargeback; as a result of my blog post, I was contacted by Boingo's PR firm, and apparently the phone rep I talked to was incorrect: what happened was simply a software glitch. They've refunded the second (erroneous) charge, so it looks like this was just a one-off problem, and not the shady business practice I initially suspected. Phew! All is now well.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8198520986133517235?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8198520986133517235/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8198520986133517235' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8198520986133517235'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8198520986133517235'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/04/resolved-boingo-refunds-their-double.html' title='Resolved: Boingo Refunds Their Double-Charge'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3147130018039857057</id><published>2008-03-31T18:03:00.001-04:00</published><updated>2008-03-31T18:03:27.356-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Read Jason's post about Stat(CVS|SVN) if you care about repository analysis</title><content type='html'>&lt;p&gt;My good friend Jason, one of the two talented developers that form micro-ISV &lt;a href="http://lavablast.com/"&gt;LavaBlast Software&lt;/a&gt;, just put up &lt;a href="http://blog.lavablast.com/post.aspx?id=593bb138-4b5f-4716-ad4a-c2067d4d0568"&gt;a post about exciting happenings in the StatCVS and StatSVN world&lt;/a&gt;. Although I'm no longer really involved with those projects, I'm happy to see these developments, and want to give a kudos to guys like Jason Kealey and Benoit Xhenseval and all their collaborators for all the great effort they've put in.&lt;/p&gt;  &lt;p&gt;As for myself, I'll be involved in more SVN-related tooling projects in the coming months, but I can't talk about that just now... :)&lt;/p&gt;  &lt;p&gt;I need to reply to Jason's conclusion about coming back to Java development, though, especially the note about explicitly creating Integer objects:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&amp;quot;Personally, I enjoy loading up a recent version of &lt;a href="http://www.eclipse.org/"&gt;Eclipse&lt;/a&gt; and working in Java once in a while because it helps me observe the best in both worlds. I much prefer coding in C# because of the easier string manipulation and the fact that everything is an object so you don't have to explicitly create an Integer object from your int to insert it into a collection. However, when working in VS.NET, I dearly miss the automatic incremental compilation feature that Eclipse runs when you save a file.&amp;quot;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;If it's been a little while since you've looked at Java, know that J2SE 1.5 brought a lot of great improvements especially in the &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/concurrent/package-summary.html"&gt;Concurrent&lt;/a&gt; and &lt;a href="http://java.sun.com/j2se/1.5.0/docs/api/java/util/Collections.html"&gt;Collections&lt;/a&gt; namespaces, as well as new language features. One such usability improvement is known as &lt;a href="http://java.sun.com/j2se/1.5.0/docs/guide/language/autoboxing.html"&gt;autoboxing&lt;/a&gt;, which means basic numeric types like &lt;em&gt;int&lt;/em&gt; or &lt;em&gt;float &lt;/em&gt;are automatically &amp;quot;boxed&amp;quot; into their object containers (Integer, Float, etc.) when required, like when adding an element to a collection, and &amp;quot;unboxed&amp;quot; when the native type is required. Just thought you'd like to know, Jason ;)&lt;/p&gt;  &lt;p&gt;[It goes without saying that you should always be mindful of the performance impact of creating a bunch of temporary objects like this! Operations on Integers are always going to be slow-ish because they're immutable, and new objects are created for every value you use.]&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3147130018039857057?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3147130018039857057/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3147130018039857057' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3147130018039857057'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3147130018039857057'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/read-jason-post-about-statcvssvn-if-you.html' title='Read Jason&amp;#39;s post about Stat(CVS|SVN) if you care about repository analysis'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6291046967336008578</id><published>2008-03-29T16:14:00.002-04:00</published><updated>2008-04-03T00:19:02.037-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='consumer'/><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Watch Out For Boingo Wireless in Airports (scam alert?)</title><content type='html'>&lt;p&gt;Be very, very careful with &lt;a href="http://boingo.com/"&gt;Boingo Wireless hotspots&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;On a recent trip from Madrid to Ottawa, I had a 6-hour layover in Newark Liberty Airport (EWR). I decided to go ahead and pay $7.95 USD for a 24-hour access pass on Boingo Wireless so I could catch up on news and mail, while passing the time. I didn't want to subscribe to anything (I'm not a frequent-flier, I just happened to want access that day), so I bought a day pass:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/jpdaigle/R-6jKDd4mxI/AAAAAAAAAdY/q0FznKVLOFM/CropperCapture%5B217%5D%5B5%5D.png"&gt;&lt;img style="border: 0px none ;" alt="CropperCapture[217]" src="http://lh4.google.com/jpdaigle/R-6jKTd4myI/AAAAAAAAAdg/QRstxMZcko8/CropperCapture%5B217%5D_thumb%5B3%5D.png" border="0" width="604" height="116" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's what it says:&lt;/p&gt;  &lt;p&gt;"Don't travel much? Get a Boingo AsYouGo account for just $7.95 per Connect Day for locations within the U.S. &amp;amp; Canada and $9.95 internationally. A Connect Day includes unlimited access in any location for 24 hours. No monthly fees apply."&lt;/p&gt;  &lt;p&gt;I used the pass I bought on March 24th, 2 hours 35 minutes in Newark (EWR) and then 5 minutes in Ottawa (YOW) while waiting for checked luggage to arrive (email addict!). Note that the plan description says "in any location", not "in any &lt;strong&gt;&lt;em&gt;single&lt;/em&gt;&lt;/strong&gt; location". Imagine my surprise when I found two charges on my credit card bill: one on March 24th (expected), and another one two days later on March 26th! I called customer service, and they refused to reverse the second charge, informing me that it was incurred when I logged in for a second time in another airport.&lt;/p&gt;  &lt;p&gt;I've reviewed the user agreement at [&lt;a title="https://signup.boingo.com/signup/DisplayBCA.app" href="https://signup.boingo.com/signup/DisplayBCA.app"&gt;https://signup.boingo.com/signup/DisplayBCA.app&lt;/a&gt;], especially Section 3, "Locations and usage", and at time of this writing, it doesn't appear to me to contain any language restricting usage of a day pass to a single location, or any warning that logging in from a second location during the same 24 hour period will result in a new charge. I've since written to their customer service to explain the situation and request a refund of that second charge. I'll update this post when I hear back from them.&lt;/p&gt;&lt;p&gt;UPDATE: Sounds like it was simply a software glitch! I've been refunded.&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6291046967336008578?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6291046967336008578/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6291046967336008578' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6291046967336008578'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6291046967336008578'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/watch-out-for-boingo-wireless-in.html' title='Watch Out For Boingo Wireless in Airports (scam alert?)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-1353117788549868256</id><published>2008-03-24T16:55:00.001-04:00</published><updated>2008-03-24T16:56:58.427-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='communication'/><category scheme='http://www.blogger.com/atom/ns#' term='web'/><title type='text'>Metro Madrid: You Fail at the Internet</title><content type='html'>&lt;p&gt;Exhibit A: Line 2 is closed between Banco Espana and Opera.&lt;/p&gt;  &lt;p&gt;&lt;a title="linea 2" href="http://www.flickr.com/photos/jpdaigle/2359297324/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2172/2359297324_d10ee24268.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;OK, no big deal, I heard about some sort of closure in the paper, but before I go out I want to look up which stations are closed, and what the current status of the line is. Should be some sort of notice on the website, right?&lt;/p&gt;  &lt;p&gt;Exhibit B: Metro Madrid's landing page, with current news items (March 23rd, 2 days after the line was partially shut down)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jpdaigle/R-gVNzd4mvI/AAAAAAAAAdI/_SMpXD-spIE/CropperCapture%5B19%5D%5B3%5D.png"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="362" alt="CropperCapture[19]" src="http://lh3.google.com/jpdaigle/R-gVOjd4mwI/AAAAAAAAAdQ/qMAV4ANcDC4/CropperCapture%5B19%5D_thumb%5B1%5D.png" width="644" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;You fail at the Internet. &lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-1353117788549868256?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/1353117788549868256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=1353117788549868256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1353117788549868256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/1353117788549868256'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/metro-madrid-you-fail-at-internet.html' title='Metro Madrid: You Fail at the Internet'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2172/2359297324_d10ee24268_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5155432949389059539</id><published>2008-03-20T09:40:00.001-04:00</published><updated>2008-03-20T09:41:49.323-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>User-Hostile Design</title><content type='html'>&lt;p&gt;This post is in the spirit of &lt;a href="http://blog.businessofsoftware.org/2008/02/the-attack-of-t.html" target="_blank"&gt;this fun one&lt;/a&gt;. I spent two nights in a hotel in beautiful Malaga (ES), and was confronted with these '&lt;em&gt;interesting&lt;/em&gt;' controls:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2345910338/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3110/2345910338_e0a3805a71.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Here's the equipment:&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;a href="http://www.flickr.com/photos/jpdaigle/2345081041/" target="_blank"&gt;&lt;img src="http://farm4.static.flickr.com/3230/2345081041_6740a3eeb6.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Both rotating knobs have a small unmarked button on them, which can be pushed in, then comes back out by itself immediately. I was not able to figure out what either of those buttons did.&lt;/p&gt;  &lt;p&gt;The left knob is marked with temperatures from 20C to 50C, so purportedly controls temperature, but there's no mark anywhere around it to act as a pointer, letting the user know which temperature is selected. Not that it matters much, I've tried spinning it in both directions, with and without holding the button, and never felt the temperature change from &amp;quot;warmish&amp;quot;. It spins much more easily in one direction than the other, leading me to believe the direction with the most resistance must be doing &lt;em&gt;something&lt;/em&gt;.&lt;/p&gt;  &lt;p&gt;The right knob selects the flow and function (showerhead, telephone-style showerhead, bathtub spigot, those 3 body jets on top, and the 4 jets below those [which I never managed to turn on]), by turning in one direction, which you can do if the flow is on high. Keep turning (harder) when the flow is on high and it will switch functions (yes, think about it). The functions are marked 'T', 'C', 'C', 'L', 'E' (how clear!), I don't know in which language those letters might stand for something. The button apparently does nothing. Since switching functions can only happen by spinning one way, if you miss the one you wanted, you have to go through the whole array once more, spraying water out of every one of those holes.&lt;/p&gt;  &lt;p&gt;WORST. SHOWER. CONTROLS. EVER.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5155432949389059539?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5155432949389059539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5155432949389059539' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5155432949389059539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5155432949389059539'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/user-hostile-design.html' title='User-Hostile Design'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3110/2345910338_e0a3805a71_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7912396449807980956</id><published>2008-03-19T13:47:00.001-04:00</published><updated>2008-03-19T13:47:32.883-04:00</updated><title type='text'>Must we really drive so fast on a narrow mountain road?</title><content type='html'>&lt;p&gt;You know those stories you keep seeing filed under &amp;quot;miscellaneous&amp;quot; with titles like &amp;quot;35 tourists plunged to their deaths in some other country blablabla&amp;quot;?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2345085715/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2381/2345085715_41b8963425.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Well now I get it. Took a bus ride in Spain - the roads are super narrow and winding, there's only a few feet between the road and certain death, and the driver is treating his bus like it's a sports car. I had white knuckles the first thirty minutes until I got desensitized to it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7912396449807980956?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7912396449807980956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7912396449807980956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7912396449807980956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7912396449807980956'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/must-we-really-drive-so-fast-on-narrow.html' title='Must we really drive so fast on a narrow mountain road?'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2381/2345085715_41b8963425_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-5309185314635195793</id><published>2008-03-05T23:18:00.001-05:00</published><updated>2008-03-05T23:18:52.149-05:00</updated><title type='text'>Best Blog I've Found This Year (So Far...)</title><content type='html'>&lt;p&gt;&lt;a href="http://lh4.google.com/jpdaigle/R89wqEiwU6I/AAAAAAAAAcg/nsSSb08FjKo/CropperCapture%5B13%5D%5B8%5D"&gt;&lt;img height="87" alt="CropperCapture[13]" src="http://lh6.google.com/jpdaigle/R89wqkiwU7I/AAAAAAAAAco/egDdUQBBsbE/CropperCapture%5B13%5D_thumb%5B6%5D" width="400" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.portfolio.com/views/blogs/odd-numbers" target="_blank"&gt;Odd Numbers&lt;/a&gt; blog by Zubin Jelveh. I find it similar in style to the winning formula of &lt;a href="http://freakonomicsbook.com/" target="_blank"&gt;Freakonomics&lt;/a&gt;: a collection of tidbits of economic commentary about a variety of subjects, and the sometimes unexpected incentives that drive everyday trends. It's a bit American-centric, but still highly entertaining and informative. I just lost the last three hours reading the archives, so subscribe now, you'll thank me later!&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-5309185314635195793?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/5309185314635195793/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=5309185314635195793' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5309185314635195793'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/5309185314635195793'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/03/best-blog-i-found-this-year-so-far.html' title='Best Blog I&amp;#39;ve Found This Year (So Far...)'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-9192978756740704307</id><published>2008-02-26T23:20:00.001-05:00</published><updated>2008-02-26T23:20:31.099-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ipod'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>A Tip on Performing Geographic Price Discrimination</title><content type='html'>&lt;p&gt;&lt;strong&gt;From&lt;/strong&gt;: JP    &lt;br /&gt;&lt;strong&gt;To&lt;/strong&gt;: Apple    &lt;br /&gt;&lt;strong&gt;Subject&lt;/strong&gt;: Pro Tip&lt;/p&gt;  &lt;p&gt;When doing geographic price discrimination, try not to spam the same email address with both mailings on the same day.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/jpdaigle/R8TlC097n8I/AAAAAAAAAcQ/VXEUFGKAjEs/price_discrimination2%5B8%5D"&gt;&lt;img height="101" alt="FAIL" src="http://lh6.google.com/jpdaigle/R8TlDk97n9I/AAAAAAAAAcY/lDMPvisu6cA/price_discrimination2_thumb%5B6%5D" width="600" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-9192978756740704307?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/9192978756740704307/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=9192978756740704307' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9192978756740704307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/9192978756740704307'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/tip-on-performing-geographic-price.html' title='A Tip on Performing Geographic Price Discrimination'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-7052405077864507612</id><published>2008-02-26T22:31:00.001-05:00</published><updated>2008-02-26T22:31:17.313-05:00</updated><title type='text'>TomTom Improves the Wake-from-Standby Process</title><content type='html'>&lt;p&gt;In February 2007, I left &lt;a href="http://www.historyofthebutton.com/2007/02/01/play-pause-icon-migrates-and-evolves/#comment-9901" target="_blank"&gt;the following comment&lt;/a&gt; on a &lt;a href="http://www.historyofthebutton.com/2007/02/01/play-pause-icon-migrates-and-evolves/" target="_blank"&gt;post&lt;/a&gt; about combined play/pause controls on the excellent &lt;a href="http://www.historyofthebutton.com/" target="_blank"&gt;History of the Button blog&lt;/a&gt;:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;cite&gt;Jean-Philippe Daigle&lt;/cite&gt; Says:       &lt;br /&gt;&lt;small&gt;&lt;a href="http://www.historyofthebutton.com/2007/02/01/play-pause-icon-migrates-and-evolves/#comment-9901"&gt;February 1st, 2007 at 8:51 pm&lt;/a&gt; &lt;/small&gt;&lt;/p&gt;    &lt;p&gt;The problem with a combined start/stop button is that many devices fail to provide proper feedback that the keypress has registered.&lt;/p&gt;    &lt;p&gt;If there&amp;#8217;s significant lag between the keypress and the action it is supposed to initiate, and no immediate feedback, the frustrated user pushes again, thus reverting the state to whatever it was before the interaction began. Discrete start/stop buttons, on the other hand, are idempotent and can afford multiple presses.&lt;/p&gt;    &lt;p&gt;Concrete examples (since you asked for some): This happens to me several times a week with my TomTom Go car-mounted GPS and the Motorola RAZR phone. Each of these devices has a single button for on/off, and requires holding it to invert the state of the device, but in both cases, there&amp;#8217;s no feedback whatsoever for a few seconds.&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;Happily, more than a year after the TomTom Go 700 has been superceded by better models, TomTom is still showing commitment to its customers with updates! With the latest software upgrade, they've fixed this little issue. Now, instead of just sitting there silently during boot, the screen's backlight is powered on immediately while the unit wakes up. Granted, it's a subtle piece of feedback, but it works - I no longer power it off with an unnecessary second press.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-7052405077864507612?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/7052405077864507612/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=7052405077864507612' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7052405077864507612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/7052405077864507612'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/tomtom-improves-wake-from-standby.html' title='TomTom Improves the Wake-from-Standby Process'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3081706999415595537</id><published>2008-02-23T18:05:00.001-05:00</published><updated>2008-02-23T18:05:24.246-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='performance'/><category scheme='http://www.blogger.com/atom/ns#' term='java'/><category scheme='http://www.blogger.com/atom/ns#' term='development'/><title type='text'>Performance Overhead of Non-Final Method Calls in Java</title><content type='html'>&lt;p&gt;Working with developers who care deeply about application performance, you get around to having frequent interesting discussions about the subject. We end up reviewing every frequent temporary object allocation, scrutinizing every usage of a mutex in the &lt;em&gt;fast-path&lt;/em&gt; for possible elimination, etc. Recently the topic was something really simple on the surface: people are afraid to call non-final instance methods, especially in situations where the method being called needs to be resolved to a particular superclass. Is this fear justified?&lt;/p&gt;  &lt;p&gt;There is evidence and wisdom out there pointing to a non-trivial performance penalty of non-final method calls: articles like &lt;a href="http://www.itu.dk/~sestoft/papers/performance.pdf"&gt;this one (PDF)&lt;/a&gt;, my boss' repeated assertions, and the &lt;a href="http://www.amazon.com/Java-TM-Platform-Performance-Strategies/dp/0201709694"&gt;Java Platform Performance&lt;/a&gt; book, if I recall correctly.&lt;/p&gt;  &lt;p&gt;Unfortunately (or fortunately?) I couldn't find, in a simple test, evidence to support these fears. I designed a test that performed a warm-up (to allow HotSpot to compile what it could after seeing how often I was calling specific methods), then used a &lt;em&gt;System.nanoTime()&lt;/em&gt; call right before and after a ten-million iteration loop that just calls an &amp;quot;increment a counter&amp;quot; instance method on an object.&lt;/p&gt;  &lt;h2&gt;Test Cases&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jpdaigle/R8Cmrk97n4I/AAAAAAAAAbw/Gg20MqCB4PE/java_perf%5B3%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="274" alt="java_perf" src="http://lh4.google.com/jpdaigle/R8CmsE97n5I/AAAAAAAAAb4/vROsqJbyO5M/java_perf_thumb%5B1%5D" width="425" border="0" /&gt;&lt;/a&gt;&amp;#160;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;There is a warmup period before any timing loop (it's also 10,000,000 calls).&lt;/li&gt;    &lt;li&gt;I'm not doing &lt;strong&gt;&lt;em&gt;any&lt;/em&gt;&lt;/strong&gt; object allocation in the timing loop, so the GC won't run and screw up our results.&lt;/li&gt;    &lt;li&gt;I ran the whole test suite 25 times and averaged the results.&lt;/li&gt;    &lt;li&gt;Just to be extra safe, I'm getting the counter value at the end of the 10,000,000-call loop to prevent any 'cleverness' from the compiler determining the end result is useless and not doing the call at all.&lt;/li&gt;    &lt;li&gt;The first two tests deal with trying a &lt;strong&gt;final &lt;/strong&gt;counter incrementing method in &lt;strong&gt;SingleClass&lt;/strong&gt;, as well as a &lt;strong&gt;non-final &lt;/strong&gt;counter incrementing method. &lt;strong&gt;SingleClass &lt;/strong&gt;is declared as final and cannot be subclassed.&lt;/li&gt;    &lt;li&gt;The second two test cases do the same as the first two, but calling all methods on &lt;strong&gt;SubClass&lt;/strong&gt;.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;The Results&lt;/h2&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jpdaigle/R8Cmsk97n6I/AAAAAAAAAcA/nUOYv2ba1yo/CropperCapture%5B213%5D%5B4%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="357" alt="CropperCapture[213]" src="http://lh3.google.com/jpdaigle/R8Cms097n7I/AAAAAAAAAcI/AKjY_oJF8PY/CropperCapture%5B213%5D_thumb%5B2%5D" width="524" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The conclusion seems to be: it doesn't matter at all what you do. I see a few explanations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;The common wisdom of there being a significant overhead to non-final method invocations may have been true in previous versions of the JVM, and modern JVMs may have levelled the playing field.&lt;/li&gt;    &lt;li&gt;My test was flawed in some way. (Doing a counter++ was so simple it got inlined?)&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/31982987-3081706999415595537?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3081706999415595537/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3081706999415595537' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3081706999415595537'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3081706999415595537'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/performance-overhead-of-non-final.html' title='Performance Overhead of Non-Final Method Calls in Java'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8137066484845407332</id><published>2008-02-19T00:59:00.002-05:00</published><updated>2008-02-19T01:25:06.109-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cooking'/><category scheme='http://www.blogger.com/atom/ns#' term='food'/><title type='text'>Towards an Efficient Pancake-Serving Strategy in Office Environments</title><content type='html'>&lt;h2&gt;Background&lt;/h2&gt;  &lt;p&gt;I was invited to sit in on a "Social Committee Meeting" at work [Solace Systems - ze cool message routing company that allows me to pay the bills]. I provided some constructive criticism of last year's pancake breakfast by pointing out that although a delightful time was had by all, surely the quality of the food would have been &lt;em&gt;even better &lt;/em&gt;if instead of thick store-bought pancake mix, we had prepared homemade batter for all the crêpes [if I recall correctly, it ended up being a mix of store / homemade, or perhaps it was all-store, I'm not 100% sure, but the dimensions of the final pancakes indicated the batter was likely a bit thick]. &lt;/p&gt;  &lt;p&gt;I was subsequently assigned the task of making the pancakes for all the engineering staff this year. Yay me and my big mouth.&lt;/p&gt;  &lt;h2&gt;Problem&lt;/h2&gt;  &lt;p&gt;After I expressed the opinion that the batter should be made fresh and cooked on the spot (just-in-time cooking), concerns were raised that it would be impossible to produce pancakes at an acceptable rate to feed all 30 or so expected attendees. Two options present themselves:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Find a way to make pancakes fast enough with the single heating element available (let's say we are shooting for 60 pancakes in 20 minutes or so). This is hard because there is no possible parallelism.&lt;/li&gt;    &lt;li&gt;Find an acceptable way to preserve pre-cooked pancakes and reheat them &lt;em&gt;in situ&lt;/em&gt; once at the office, without destroying their texture or flavour.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jpdaigle/R7pwNk97nyI/AAAAAAAAAbA/H7yf1-NiF-k/DPP_0001%5B6%5D"&gt;&lt;img style="border: 0px none ;" alt="DPP_0001" src="http://lh5.google.com/jpdaigle/R7pwO097nzI/AAAAAAAAAbI/SBnjVn3hMN4/DPP_0001_thumb%5B4%5D" border="0" height="399" width="520" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Test Procedure&lt;/h2&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;span style="font-family:Courier New;"&gt;&lt;strong&gt;jpdaigle@vitis:~$ make pancakes        &lt;br /&gt;make: *** No rule to make target `pancakes'.  Stop.&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;This weekend, I endeavoured to measure the rate at which I could cook pancakes (evaluating the feasibility of option 1), and, should an acceptable rate prove unattainable, I would experiment with pancake reheating.&lt;/p&gt;  &lt;p&gt;I used my usual batter recipe and a single well-seasoned pan at medium-high heat, starting to cook the first pancake at 13:15 EST on Sunday. I logged the time at which each pancake was completed and transferred to a holding plate.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jpdaigle/R7pwPE97n0I/AAAAAAAAAbQ/0J_MveG_nV8/CropperCapture%5B10%5D%5B6%5D"&gt;&lt;img style="border: 0px none ;" alt="CropperCapture[10]" src="http://lh4.google.com/jpdaigle/R7pwPk97n1I/AAAAAAAAAbY/70bdxbK9hXc/CropperCapture%5B10%5D_thumb%5B4%5D" border="0" height="291" width="483" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I completed seven (7) pancakes in 13 minutes, for an average of 111 seconds per pancake. The graph above demonstrates that the output rate remained mostly constant over the course of the experiment, which I interpret to mean the pan had attained its nominal temperature before I started cooking the first pancake, and there were no noticeable speed gains to be had as time wore on.&lt;/p&gt;  &lt;p&gt;At this rate, it would take nearly two hours to feed 30 engineers, assuming each desired two pancakes. Clearly, we had to consider Option 2.&lt;/p&gt;  &lt;p&gt;I decided to eat three (3) pancakes on Sunday to establish the "fresh pancake" baseline, and refrigerate the other four (4) for consumption on Monday, to determine what they'd taste like after 24 hours, and a chill / reheat cycle. [Note: I am well aware that a better approach would have been to bake a fresh batch on the second day, so that it may be compared directly to the 24-hour-old batch instead of relying on memory, but I ran out of flour and could not purchase any more on Monday, as it was a holiday in Ontario and all the shops were closed. Even if this had worked, we'd still be comparing different batches of batter, with possible variations in the egg/milk/flour ratios that are hard to control for.]&lt;/p&gt;  &lt;h2&gt;Results and Conclusion&lt;/h2&gt;  &lt;p&gt;Day 2: Of the four (4) remaining pancakes, I reheated the first two (2) in a microwave to test the naive approach. The result, however, was disappointing: the pancakes came out warm, but too damp and mushy. They did not meet the high standards for what I'd feel comfortable serving to my coworkers.&lt;/p&gt;  &lt;p&gt;The remaining two (2) pancakes were reheated in a very hot seasoned pan, about 15 seconds per side. I am pleased to report that although the final result is a pancake that is a bit drier than the original, it retained its taste and texture acceptably, and this method cuts the 111 seconds needed to cook a pancake down to 30 seconds to simply reheat it. It would allow us to feed 30 people in about a half hour, which points to a possible approach for the Solace pancake breakfast.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh4.google.com/jpdaigle/R7pwQk97n2I/AAAAAAAAAbg/DnjXlyXUpJw/DPP_0002%5B4%5D"&gt;&lt;img style="border: 0px none ;" alt="DELICIOUS" src="http://lh6.google.com/jpdaigle/R7pwRE97n3I/AAAAAAAAAbo/O3kcNj4rR-I/DPP_0002_thumb%5B2%5D" border="0" height="366" width="520" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Future Work&lt;/h2&gt;  &lt;p&gt;Find how to accompany the food with good espresso; I don't have any proposals here.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8137066484845407332?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8137066484845407332/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8137066484845407332' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8137066484845407332'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8137066484845407332'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/towards-efficient-pancake-serving.html' title='Towards an Efficient Pancake-Serving Strategy in Office Environments'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-772433585485634856</id><published>2008-02-18T23:20:00.001-05:00</published><updated>2008-02-18T23:22:02.167-05:00</updated><title type='text'>The Best Things in Life Are Free</title><content type='html'>&lt;p&gt;I decided to go out and have some fun this weekend. I wanted to be active a bit, but didn't feel like driving all the way out to Kanata (KRP, ugh) just to get to the gym.&lt;/p&gt;  &lt;p&gt;&lt;a title="Snowshoes" href="http://www.flickr.com/photos/jpdaigle/2270165578/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2367/2270165578_07f345630e.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Earlier this week, a coworker was talking about snowshoeing, so the bug bit me - I hadn't gone snowshoeing yet this winter, and I resolved not to let the season end without going out at least once. On Saturday, the weather report showed -11C for the afternoon, so I figured it would be safe to go out on the river a bit and enjoy nature, as well as a bit of peace and quiet outdoors. &lt;/p&gt;  &lt;p&gt;Most amazing weather all week:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2269363581/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2074/2269363581_6234c4f6a8.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;I packed up my camera, some water, snowshoes (&lt;em&gt;des raquettes, pour les francophones&lt;/em&gt;), and some warm clothing, and left home with no idea where exactly I was heading. I decided to start in Westboro and drive west on Richmond / Carling until I found an access to the river. Luckily, it didn't take long - I ended up parking in Britannia Park, and continued westward from there in the snow, on foot.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.flickr.com/photos/jpdaigle/2269377691/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2016/2269377691_e64226bd3e.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Ended up staying out until the sun started setting. I tested the ice a bit before venturing out, but it was &lt;em&gt;thick&lt;/em&gt;, so no worries. Didn't cross paths with a whole lot of people, but the few I did meet were out hiking or skiing too, and quite friendly.&lt;/p&gt;  &lt;p&gt;The weird thing about Ottawa is that the demographics really don't seem to be in my favour for meeting new people my age - Saturday was no exception; friendly people all around, but all in their 30s or 40s. I don't know where all the mid-twentysomethings are in this town.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-772433585485634856?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/772433585485634856/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=772433585485634856' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/772433585485634856'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/772433585485634856'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/best-things-in-life-are-free.html' title='The Best Things in Life Are Free'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2367/2270165578_07f345630e_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4183728027356688542</id><published>2008-02-12T22:17:00.001-05:00</published><updated>2008-02-12T22:17:53.492-05:00</updated><title type='text'>Reusable shopping bags are taking over the world!</title><content type='html'>&lt;p&gt;(and that's a good thing)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.theglobeandmail.com/servlet/story/RTGAM.20080211.wcomment0211/EmailBNStory/International/home" target="_blank"&gt;The Globe and Mail on the worldwide phasing out of disposable plastic bags&lt;/a&gt;, praising the remarkable grassroots, bottom-up effort.&lt;/p&gt;  &lt;p&gt;I went to Costco today (hence this post) to stock up on snacks for the office, and must say they deserve praise for coming around in the past year.&lt;/p&gt;  &lt;p&gt;About a year ago, I was in a Costco warehouse, shopping with one of those tough plastic/nylon bags sold by Loblaws. A short while later, I was accosted by an employee from store security, who informed me it was prohibited to use these bags while shopping, and that I'd have to get a cart. (Ironically, Costco actually sells reusable nylon shopping bags.) None too pleased, I wrote to customer service, identifying myself as someone who often went in to pick up just a few items, and for whom using a huge cart really makes no sense. I asked if the distribution of transaction sizes might reveal more like myself, for whom it might be justified to provide an alternative to the large carts. Happily, they took me seriously and replied that the average transaction size justified offering only large carts:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;&lt;em&gt;Thank you for your recent inquiry through Costco.ca, in response, the       &lt;br /&gt;daily average transaction at Costco ranges from $130 to $150 which is        &lt;br /&gt;why we only have the large carts.&amp;#160; We do appreciate the suggestion and        &lt;br /&gt;it has been sent to the appropriate management team for review and,        &lt;br /&gt;thank you again for taking the time to send this to us.&lt;/em&gt;&lt;/p&gt;    &lt;p&gt;&lt;em&gt;[...]&lt;/em&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;The part about &amp;quot;been sent to the appropriate management team for review&amp;quot; sounds like typical corp-speak, but it was apparently true, for a year later...&lt;/p&gt;  &lt;p&gt;Ahh, how nice it was today, when I decided to risk it and try again to shop with a Loblaws bag. I got to the register, declined the cashier's offer of a box, and she smiled warmly and said: &amp;quot;Ah! You've got a bag, even better!&amp;quot; Similar friendly attitude from the cart-inspection clerk at the exit.&lt;/p&gt;  &lt;p&gt;Thanks, Costco, you got it right. Impressive.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4183728027356688542?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4183728027356688542/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4183728027356688542' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4183728027356688542'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4183728027356688542'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/reusable-shopping-bags-are-taking-over.html' title='Reusable shopping bags are taking over the world!'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-583803663779072479</id><published>2008-02-09T00:52:00.001-05:00</published><updated>2008-02-09T00:52:27.356-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='westboro'/><category scheme='http://www.blogger.com/atom/ns#' term='ottawa'/><title type='text'>Westboro Market just died</title><content type='html'>&lt;p&gt;In local Ottawa news, the &lt;a href="http://lovewestboro.blogspot.com/2008/01/goodbye-groceries.html" target="_blank"&gt;Westboro Community Association's blog&lt;/a&gt; is reporting that Westboro Market has closed down.&lt;/p&gt;  &lt;p&gt;&lt;a title="westboro market" href="http://www.flickr.com/photos/jpdaigle/2207046679/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2400/2207046679_cea9924581.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;(I took the picture a week before they announced the closure - I had no idea at the time)&lt;/font&gt;&lt;/p&gt;  &lt;p&gt;This is a real loss for the community. Last year, Westboro Bakery, the lone bake shop in the neighbourhood, had to &lt;a href="http://www.canada.com/ottawacitizen/news/story.html?id=bb987b52-895b-41a7-965d-f19b5f8ddf5e&amp;amp;k=0" target="_blank"&gt;close its doors&lt;/a&gt; after seeing its rent raised to 3500$ a month. This year the still-young Westboro Market, which was the only source in the area for Art-Is-In bread, followed suit. Too bad, I really hope we don't get another sporting goods store.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-583803663779072479?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/583803663779072479/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=583803663779072479' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/583803663779072479'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/583803663779072479'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/westboro-market-just-died.html' title='Westboro Market just died'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2400/2207046679_cea9924581_t.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4726971910609131784</id><published>2008-02-07T23:06:00.002-05:00</published><updated>2008-02-12T22:22:19.212-05:00</updated><title type='text'>Signal to Noise: the tale of how the statsvn.org domain expired</title><content type='html'>&lt;p&gt;It was really &lt;em&gt;my fault&lt;/em&gt;, but I still blame Go Daddy :)   Read on...&lt;/p&gt;  &lt;p&gt;Go Daddy, probably the only domain registrar weird enough to make you think twice before opening one of their ads at work, tried to warn me by email that the statsvn.org domain was about to expire. In fact, they sent me 5 emails about it. Unfortunately, for reasons explained below, I had set a rule in Gmail to have emails from Go Daddy skip the inbox and get archived to a tag.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jpdaigle/R6vVNI-KrGI/AAAAAAAAAao/QbP1FFgY-00/CropperCapture%5B9%5D%5B3%5D"&gt;&lt;img style="border-width: 0px;" alt="CropperCapture[9]" src="http://lh5.google.com/jpdaigle/R6vVN4-KrHI/AAAAAAAAAaw/iYzKaQUggTQ/CropperCapture%5B9%5D_thumb%5B1%5D" border="0" height="214" width="534" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;A few facts about the email I've received from them over the past year:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Emails received from Go Daddy between April and December 2007: 74 &lt;/li&gt;    &lt;li&gt;Legitimate emails warning of expiration or confirming a purchase: 3 &lt;/li&gt;    &lt;li&gt;Quasi-"Spam" and promotional emails: 71 &lt;/li&gt;    &lt;li&gt;Ratio of important emails to promotional ones: &lt;strong&gt;0.0423&lt;/strong&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I think a ratio that incredibly low justifies having a rule to at least move those messages out of the way and defer reading to some later time. The statsvn.org domain expired on January 17, 2008, but kept resolving just fine for me, so I never noticed anything was wrong until I finally glanced at the 684 emails tagged "commercial" in my GMail account, sometime this afternoon. In a panic, I logged into the godaddy.com site to renew, only to discover that since my registration had expired, it had been removed from my admin panel. Crap.&lt;/p&gt;  &lt;p&gt;I called up their customer service, and I'm happy to say this is where things started looking up: no long wait times, no Indian call centers with impossible-to-understand operators! After five minutes I spoke to José, who politely informed me Verisign had the domain in some sort of grace period pool, and I could get it back by paying an 80$ penalty, on top of the registration fee. He accepted a DIGG coupon code for 10% off too :)&lt;/p&gt;  &lt;p&gt;Ka-ching. Renewed for two years, everything should be fixed in 72 hours. In this instance, due to the fees, it looks like the spam was profitable even if I never read a single line of it.&lt;/p&gt;  &lt;hr /&gt;  &lt;p&gt;statsvn.org is the domain name for the &lt;a href="http://statsvn.sourceforge.net/" target="_blank"&gt;statsvn project&lt;/a&gt;. The developer wiki is at &lt;a href="http://svn.statsvn.org/statsvnwiki" target="_blank"&gt;svn.statsvn.org/statsvnwiki&lt;/a&gt; (DNS issues notwithstanding).&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;EDIT (2008-02-12): The domain and all the subdomain configuration has been restored, and the &lt;a href="http://svn.statsvn.org/statsvnwiki/index.php/Main_Page"&gt;wiki &lt;/a&gt;is back up. (Even used it myself to copy-paste some command-line options when doing a StatSVN run yesterday.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4726971910609131784?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4726971910609131784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4726971910609131784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4726971910609131784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4726971910609131784'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/signal-to-noise-tale-of-how-statsvnorg.html' title='Signal to Noise: the tale of how the statsvn.org domain expired'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-4009314066744892018</id><published>2008-02-05T19:12:00.001-05:00</published><updated>2008-02-05T19:15:54.370-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='development'/><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><category scheme='http://www.blogger.com/atom/ns#' term='ant'/><title type='text'>Ant Tricks: how to find the SVN revision of a directory with Ant</title><content type='html'>&lt;p&gt;Here's a neat little recipe I wrote when trying to get the current SVN revision of a checked-out project into an Ant property. &lt;/p&gt;  &lt;p&gt;Why would you need to do this? &lt;/p&gt;  &lt;p&gt;Well, for example, you might want Ant to get the revision number of the source going into the build it's making and use it to name the output directory it creates when deploying your load. (ie: deploy the built library to &lt;font face="Courier New"&gt;/projects/myproject/build_svnXXXX/&lt;/font&gt;) You might also want to echo that revision number into some resource file to implement a &amp;quot;--version&amp;quot; type of command line option in your application, etc.&lt;/p&gt;  &lt;h2&gt;Sample Ant Target&lt;/h2&gt;  &lt;p&gt;&lt;font face="Courier New"&gt;&amp;lt;target name=&amp;quot;load-svn-revinfo&amp;quot; depends=&amp;quot;init-stage1&amp;quot;&amp;gt;     &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;property name=&amp;quot;tmpfilename&amp;quot; value=&amp;quot;tmpout.txt&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;delete file=&amp;quot;${tmpfilename}&amp;quot; failonerror=&amp;quot;false&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;exec executable=&amp;quot;svn&amp;quot; dir=&amp;quot;${basedir}/../&amp;quot; output=&amp;quot;${tmpfilename}&amp;quot;&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;arg line=&amp;quot;info --xml --username ${svn.username} --password ${svn.password} .&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;/exec&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;xmlproperty file=&amp;quot;${tmpfilename}&amp;quot; prefix=&amp;quot;svnprops&amp;quot;/&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;delete file=&amp;quot;${tmpfilename}&amp;quot; failonerror=&amp;quot;false&amp;quot; /&amp;gt;      &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160; &amp;lt;echo&amp;gt;REV IS: ${svnprops.info.entry(revision)}&amp;lt;/echo&amp;gt;      &lt;br /&gt;&amp;lt;/target&amp;gt;&lt;/font&gt;&lt;/p&gt;  &lt;h2&gt;How it Works&lt;/h2&gt;  &lt;p&gt;There are basically three steps:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Run an &amp;quot;svn info --xml&amp;quot; on your project sandbox and store the result to a temp file.&lt;/li&gt;    &lt;li&gt;Load the temp file into an Ant &amp;lt;xmlproperty/&amp;gt;, with the prefix &amp;quot;svnprops&amp;quot;, so we can refer to the revision later in our build script. &lt;/li&gt;    &lt;li&gt;Clean up the temp file.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Note that running &amp;quot;svn info --xml .&amp;quot; on your checkout directory will give you output like this:&lt;/p&gt;  &lt;table width="600" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td width="598"&gt;         &lt;pre&gt;&lt;font color="#ffffff"&gt;&lt;b&gt;&lt;span&gt;C:\dev\eclipse_workspace\HEAD_solsuite&amp;gt;&lt;/span&gt;&lt;/b&gt;&lt;i&gt;svn info --xml .&lt;/i&gt;&lt;br /&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot;?&amp;gt;&lt;br /&gt;&amp;lt;info&amp;gt;&lt;br /&gt;&amp;lt;entry&lt;br /&gt;   kind=&amp;quot;dir&amp;quot;&lt;br /&gt;   path=&amp;quot;.&amp;quot;&lt;br /&gt;   revision=&amp;quot;8617&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;url&amp;gt;svn://server/svn/repo/trunk&amp;lt;/url&amp;gt;&lt;br /&gt;&amp;lt;repository&amp;gt;&lt;br /&gt;&amp;lt;root&amp;gt;svn://server/svn/repo&amp;lt;/root&amp;gt;&lt;br /&gt;&amp;lt;uuid&amp;gt;6e0d6cc3-672d-0410-8be7-bcd0fe73158e&amp;lt;/uuid&amp;gt;&lt;br /&gt;&amp;lt;/repository&amp;gt;&lt;br /&gt;&amp;lt;wc-info&amp;gt;&lt;br /&gt;&amp;lt;schedule&amp;gt;normal&amp;lt;/schedule&amp;gt;&lt;br /&gt;&amp;lt;/wc-info&amp;gt;&lt;br /&gt;&amp;lt;commit&lt;br /&gt;   revision=&amp;quot;8617&amp;quot;&amp;gt;&lt;br /&gt;&amp;lt;author&amp;gt;jpdaigle&amp;lt;/author&amp;gt;&lt;br /&gt;&amp;lt;date&amp;gt;2008-02-05T21:08:30.585592Z&amp;lt;/date&amp;gt;&lt;br /&gt;&amp;lt;/commit&amp;gt;&lt;br /&gt;&amp;lt;/entry&amp;gt;&lt;br /&gt;&amp;lt;/info&amp;gt;&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;      &lt;/td&gt;&lt;br /&gt;    &lt;/tr&gt;&lt;br /&gt;  &lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Meaning that once that's loaded with &amp;lt;xmlproperty/&amp;gt;, we can refer to the SVN revision as &lt;font face="Courier New"&gt;${svnprops.info.entry(revision)}&lt;/font&gt;. Pretty cool, huh?&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-4009314066744892018?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/4009314066744892018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=4009314066744892018' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4009314066744892018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/4009314066744892018'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/02/ant-tricks-how-to-find-svn-revision-of.html' title='Ant Tricks: how to find the SVN revision of a directory with Ant'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-3030731953319592947</id><published>2008-01-31T23:30:00.001-05:00</published><updated>2008-01-31T23:40:59.173-05:00</updated><title type='text'>Testing my new 50mm f/1.8 lens and griping about the "Canadian Tax"</title><content type='html'>&lt;p&gt;Frustrated by how difficult it is to take even passable handheld indoor pictures with the kit lens that comes with the Canon Rebel XTi (an EF-S 18-55mm f/3.5-5.6), tonight, on my way out from work, I decided to get Canon's 50mm f/1.8 EF lens. I didn't exactly splurge, &lt;a href="http://www.henrys.com/webapp/wcs/stores/servlet/ItemsDisplay?storeId=10001&amp;amp;catalogId=10001&amp;amp;departmentId=10407&amp;amp;categoryId=10412&amp;amp;itemID=37134" target="_blank"&gt;at 120$ CAD&lt;/a&gt;, nevertheless I'm extremely impressed so far.&lt;/p&gt;  &lt;p&gt;&lt;a title="Eat fruit to stay healthy" href="http://www.flickr.com/photos/jpdaigle/2234188462/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2395/2234188462_cfbd48c661.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;This captures a heckuva lot more light than the kit lens; I don't know why they don't package something like this with the camera, and sell you a cheap zoom lens later on if you need it...&lt;/p&gt;  &lt;p&gt;What really gets my blood boiling though is the mysterious &amp;quot;Canadian Tax&amp;quot;: the premium we pay for seemingly every imported product (even counting prices before any sales tax has been applied). It's all the more frustrating because no satisfying explanations have been offered: every time a retailer attempts to put forward a justification, it does so in condescending corporate-speak or advances arguments that are rapidly demolished by others in the know.&lt;/p&gt;  &lt;p&gt;A few examples, starting with the very lens I bought tonight after shopping online and complaining about the local prices:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="497" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="133"&gt;&amp;#160;&lt;/td&gt;        &lt;td valign="top" width="158"&gt;&lt;strong&gt;Here in snowy Ontario&lt;/strong&gt;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;&lt;strong&gt;United States&lt;/strong&gt;&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="134"&gt;EF 50mm f/1.8 lens&lt;/td&gt;        &lt;td valign="top" width="157"&gt;120 CAD at &lt;a href="http://www.henrys.com" target="_blank"&gt;Henry's&lt;/a&gt;&lt;/td&gt;        &lt;td valign="top" width="204"&gt;74.09 USD at Amazon.com          &lt;br /&gt;(73.79 CAD)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;13&amp;quot; Macbook&lt;/td&gt;        &lt;td valign="top" width="157"&gt;1249 CAD&lt;/td&gt;        &lt;td valign="top" width="204"&gt;1099 USD         &lt;br /&gt;(1094.60 CAD)&lt;/td&gt;     &lt;/tr&gt;      &lt;tr&gt;       &lt;td valign="top" width="135"&gt;The excellent &lt;a href="http://www.amazon.ca/Code-Complete-Steve-McConnell/dp/0735619670/ref=pd_bbs_sr_1?ie=UTF8&amp;amp;s=gateway&amp;amp;qid=1201839600&amp;amp;sr=8-1" target="_blank"&gt;Code Complete&lt;/a&gt; book by Steve McConnell&lt;/td&gt;        &lt;td valign="top" width="157"&gt;34.64 CAD at Amazon.ca&lt;/td&gt;        &lt;td valign="top" width="204"&gt;29.99 USD at Amazon.com         &lt;br /&gt;(29.87 CAD)&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;&lt;font size="1"&gt;Although, to be fair...&lt;/font&gt;&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="499" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="130"&gt;&lt;font size="1"&gt;Doctor's visit&lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="157"&gt;&lt;font size="1"&gt;0&lt;/font&gt;&lt;/td&gt;        &lt;td valign="top" width="210"&gt;&lt;font size="1"&gt;Ha ha ha haa haa&lt;/font&gt;&lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-3030731953319592947?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/3030731953319592947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=3030731953319592947' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3030731953319592947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/3030731953319592947'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/01/testing-my-new-50mm-f18-lens-and.html' title='Testing my new 50mm f/1.8 lens and griping about the &amp;quot;Canadian Tax&amp;quot;'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2395/2234188462_cfbd48c661_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-6121182094435379877</id><published>2008-01-28T18:34:00.001-05:00</published><updated>2008-01-28T18:34:55.249-05:00</updated><title type='text'>Hiding .svn directories in the CruiseControl Status Page</title><content type='html'>&lt;p&gt;If you've got a &lt;a href="http://cruisecontrol.sourceforge.net/"&gt;CruiseControl&lt;/a&gt; installation and you're anything like me, you won't be happy unless your entire CruiseControl setup is revision-controlled and lives in your subversion repository. (&lt;a href="http://studios.thoughtworks.com/2007/11/8/configuring-cruisecontrol-the-cruisecontrol-way"&gt;Here's&lt;/a&gt; a good article on how to get you started and auto-update CruiseControl's config.xml using bootstrappers.)&lt;/p&gt;  &lt;h2&gt;The Problem&lt;/h2&gt;  &lt;p&gt;There's a small problem, however, with your entire CC configuration living in source control, as you've realized if you've ever pulled up the status page and seen this:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh6.google.com/jpdaigle/R55mmY-KqwI/AAAAAAAAAXM/w6KtpmE09SY/CropperCapture%5B199%5D%5B10%5D"&gt;&lt;img height="245" alt="Old and Busted" src="http://lh4.google.com/jpdaigle/R55mm4-KqxI/AAAAAAAAAXU/-gLBDRwD5fY/CropperCapture%5B199%5D_thumb%5B8%5D" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The status page blindly slurps up every directory under &lt;font face="Courier New"&gt;/cruisecontrol/logs&lt;/font&gt;, including the .svn directory. Whoops. I can see a few options:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Don't put the &lt;font face="Courier New"&gt;logs&lt;/font&gt; directory in source control, and remember to recreate it the next time we rebuild the machine.&lt;/li&gt;    &lt;li&gt;Do an &lt;strong&gt;svn export&lt;/strong&gt; to deploy the CruiseControl setup on our build machine.&lt;/li&gt;    &lt;li&gt;Patch the status page code to not show the &amp;quot;.svn&amp;quot; entry.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I went with option 3.&lt;/p&gt;  &lt;h2&gt;The Patch (For CruiseControl 2.7.1, Binary Distribution)&lt;/h2&gt;  &lt;p&gt;Under &lt;font face="Courier New"&gt;$CC_INSTALL/webapps/cruisecontrol/&lt;/font&gt;, open the file &lt;font face="Courier New"&gt;index.jsp&lt;/font&gt;. It's a simple 4-line patch. Near the top, we will add 3 lines:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="598"&gt;         &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160; final Date now = new Date();             &lt;br /&gt;&amp;#160;&amp;#160; final String dateNow = dateTimeFormat.format(now);              &lt;br /&gt; %&amp;gt;              &lt;br /&gt;+&amp;lt;%              &lt;br /&gt;+&amp;#160; final java.util.List ignoredLogDirs = Arrays.asList(new String[] {&amp;quot;.svn&amp;quot;, &amp;quot;CVS&amp;quot;});              &lt;br /&gt;+%&amp;gt;              &lt;br /&gt; &amp;lt;%              &lt;br /&gt;&amp;#160;&amp;#160; class SortableStatus implements Comparable {&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Then, scroll down to line 460 and change it:&lt;/p&gt;  &lt;table cellspacing="0" cellpadding="2" width="600" border="1"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="598"&gt;         &lt;p&gt;&lt;font face="Courier New" size="1"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; else {             &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; String[] projectDirs = logDir.list(new java.io.FilenameFilter() {              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; public boolean accept(File dir, String name) {              &lt;br /&gt;-&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (new File(dir, name).isDirectory());              &lt;br /&gt;+&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; return (new File(dir, name).isDirectory() &amp;amp;&amp;amp; !ignoredLogDirs.contains(name));              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; }              &lt;br /&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; });&lt;/font&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Save, refresh the page to test your changes, and safely commit the new version:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh5.google.com/jpdaigle/R55mnI-KqyI/AAAAAAAAAXc/eEmlnrMzBxs/CropperCapture%5B200%5D%5B5%5D"&gt;&lt;img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="244" alt="New Hotness" src="http://lh3.google.com/jpdaigle/R55mno-KqzI/AAAAAAAAAXk/L9bbldZvlL0/CropperCapture%5B200%5D_thumb%5B3%5D" width="480" border="0" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h2&gt;Quick Note&lt;/h2&gt;  &lt;p&gt;Now, if we wanted to be really fancy and do the 100% solution, we'd fix the same thing on the individual project pages, in the left-hand panel where a drop-down menu allows navigating to other projects. To do this, however, we'd need to look at the ProjectNavigationTag source, and it's not in the binary CruiseControl distribution, so that's out of scope for today.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-6121182094435379877?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/6121182094435379877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=6121182094435379877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6121182094435379877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/6121182094435379877'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/01/hiding-svn-directories-in-cruisecontrol.html' title='Hiding .svn directories in the CruiseControl Status Page'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-8763451340020981199</id><published>2008-01-28T00:30:00.001-05:00</published><updated>2008-01-28T17:51:21.468-05:00</updated><title type='text'>Western Digital My Book World Edition II Review</title><content type='html'>&lt;p&gt;OK, that's a pretty retarded name, it should be called "WD 1TB NAS" or something. But anyway, this post exists to answer the question: how is it?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://lh3.google.com/jpdaigle/R51oh4-KquI/AAAAAAAAAW8/9rMHHHfUtBY/wd_small%5B4%5D"&gt;&lt;img style="border: 0px none ;" alt="wd_small" src="http://lh5.google.com/jpdaigle/R51oiY-KqvI/AAAAAAAAAXE/sexp8NJKMTw/wd_small_thumb%5B2%5D" border="0" height="260" width="253" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;Shopping For a NAS&lt;/h2&gt;  &lt;p&gt;I recently started shooting in RAW mode and with every frame out of my DSLR taking ~9MB, I needed some safe storage options. My attention was drawn to the &lt;a href="http://www.wdc.com/en/products/Products.asp?DriveID=279" target="_blank"&gt;Western Digital My Book World Edition II&lt;/a&gt; (&lt;em&gt;&lt;strong&gt;dear god &lt;/strong&gt;&lt;/em&gt;the name!) because at 340$ CAD for a 500GB RAID-1 NAS device [or 1GB if configured as a spanning array], it's really cheap for what you get. I was almost put off by its &lt;a href="http://www.amazon.com/Western-Digital-WDG2NC10000N-Ethernet-External/dp/B000NKJ2X8/ref=pd_bbs_sr_2?ie=UTF8&amp;amp;s=electronics&amp;amp;qid=1201495111&amp;amp;sr=8-2" target="_blank"&gt;dismal rating on Amazon&lt;/a&gt; (2 out of 5 stars), but from reading the reviews, it seems many are complaining about the poor sharing software, not the drive itself. [An aside: a hardware device with piss-poor bundled software? Gee, what a surprise! If you want to setup a streaming media server, just setup your own service on a real machine; that the masses would be crazy enough to expose a mostly closed machine, with upgrade availability at the vendor's discretion, to the public Internet forces upon me the sad realization of how little people understand or care about tech. Ahem. Revenons à nos moutons.]&lt;/p&gt;  &lt;p&gt;The product page isn't particularly helpful, as it doesn't really tell you about the modes you can configure the device for, or the storage protocols it exposes.&lt;/p&gt;  &lt;h2&gt;Here's the info you need&lt;/h2&gt;  &lt;ul&gt;   &lt;li&gt;2 disks, 500GB each. ~455GiB available in RAID-1 mode, double that in spanning mode.&lt;/li&gt;    &lt;li&gt;Comes configured in a single 1TB spanning volume. For RAID-1 mode, you need to switch the mode and let it reformat the drives, which takes a few hours. (I went to bed after 2.5 hours, I didn't get to see the process complete, but it was done the next day.)&lt;/li&gt;    &lt;li&gt;Exposed Protocols: Storage is accessible through CIFS / SMB only. In fact, &lt;span style="font-family:Courier New;"&gt;nmap&lt;/span&gt; tells us the only ports open on it are 80 and 139.&lt;/li&gt; &lt;/ul&gt;  &lt;h2&gt;Setup&lt;/h2&gt;  &lt;p&gt;You'll want to configure it to use static IP settings rather than the default (acquire an address through DHCP). The setup can be performed through a web interface and it's pretty simple. Googling for how to mount it under Linux will point you to a few mostly unhelpful, ill-informed, &lt;em&gt;blind-leading-the-blind&lt;/em&gt;-style forum threads [though to be honest I didn't peruse many of them], so here's what works. They &lt;em&gt;seem&lt;/em&gt; to use Samba with CIFS unix extensions with everything owned by UID/GID 33, so I had to mount with &lt;strong&gt;&lt;em&gt;noperm&lt;/em&gt;&lt;/strong&gt; to get write access as an unprivileged user on my box:&lt;/p&gt;  &lt;table border="0" cellpadding="2" cellspacing="0" width="600"&gt;&lt;tbody&gt;     &lt;tr&gt;       &lt;td valign="top" width="600"&gt;         &lt;p&gt;&lt;span style="font-family:Courier New;"&gt;mount -t cifs \&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family:Courier New;"&gt;-o username=jp,password=,rw,uid=jp,noperm \&lt;/span&gt;&lt;/p&gt;          &lt;p&gt;&lt;span style="font-family:Courier New;"&gt;//192.168.1.104/PUBLIC ./wd&lt;/span&gt;&lt;/p&gt;       &lt;/td&gt;     &lt;/tr&gt;   &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt; &lt;/p&gt;  &lt;h2&gt;Test&lt;/h2&gt;  &lt;p&gt;As an informal test, I generated a 100MiB file with &lt;strong&gt;&lt;span style="font-family:Courier New;"&gt;dd&lt;/span&gt;&lt;/strong&gt; and copied it to a Windows Server 2003 CIFS share and to the &lt;strong&gt;&lt;em&gt;WD My Book&lt;/em&gt;&lt;/strong&gt;'s CIFS share, using &lt;strong&gt;&lt;span style="font-family:Courier New;"&gt;time&lt;/span&gt; &lt;/strong&gt;to measure real (wall) time. I'm only on a 100mbit switch, but I don't think the network is the bottleneck here:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;To W2K3 server's IDE disk: 34.8s (2.9 MiB/s)&lt;/li&gt;    &lt;li&gt;To WD My Book NAS: 23.4s (4.3 MiB/s)&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Read speeds were very similar so I didn't include them. While not exactly blazing fast, it beats copying to other machines on the LAN, so it will do nicely as a storage box for RAW camera files. At that speed, you could probably even do HD video playback over the network, but I haven't tested that. There's an included disk with some sort of subscription service for remote access, and I have no desire to test that either.&lt;/p&gt;  &lt;p&gt;All in all, don't let the negative Amazon comments spook you, it's a decent consumer-oriented storage box for the price.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-8763451340020981199?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/8763451340020981199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=8763451340020981199' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8763451340020981199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/8763451340020981199'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/01/western-digital-my-book-world-edition.html' title='Western Digital My Book World Edition II Review'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-571543175740612815</id><published>2008-01-27T02:10:00.001-05:00</published><updated>2008-01-27T02:11:52.538-05:00</updated><title type='text'>The Wake Up Apparatus</title><content type='html'>&lt;p&gt;My colleagues wouldn't exactly describe me as an &amp;quot;early riser&amp;quot;. Some spring out of bed, fully energized, at the first ring of their alarm - my boss, for example, I've caught bragging about his ability to be up at 5:30.&lt;/p&gt;  &lt;p&gt;As for myself, I appreciate the value of redundancy. Here's my setup; alas, I still don't wake up on schedule 100% of the time. Maybe we need a fourth stimulus?&lt;/p&gt;  &lt;p&gt;&lt;a href="http://flickr.com/photos/jpdaigle/2222618230/" target="_blank"&gt;&lt;img src="http://farm3.static.flickr.com/2243/2222618230_5c773a292a.jpg" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;Sequence is:&lt;/p&gt;  &lt;p&gt;07:15 Halogen Floodlight   &lt;br /&gt;07:30 Alarm 1    &lt;br /&gt;07:35 Alarm 2 &lt;/p&gt;  &lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;&lt;em&gt;PS: I'm not kidding.&lt;/em&gt;&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-571543175740612815?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/571543175740612815/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=571543175740612815' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/571543175740612815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/571543175740612815'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/01/wake-up-apparatus.html' title='The Wake Up Apparatus'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2243/2222618230_5c773a292a_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-31982987.post-2918485057874940774</id><published>2008-01-21T21:51:00.001-05:00</published><updated>2008-01-21T22:05:05.043-05:00</updated><title type='text'>Oh baby, why don't you call? I'm here by the phone</title><content type='html'>&lt;p&gt;Dear EVERY COMPANY EVER,&lt;/p&gt;  &lt;p&gt;Why is it so hard, when you promise to call, to actually do it? Oh, you break this promise all the time, and you survive year after year and get away with it because each and every last one of your competitors is equally bad. We care about customer service, but, one might suppose, not enough for it to actually make a difference.&lt;/p&gt;  &lt;p&gt;Off the top of my head, here's a list of those who have failed.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://bell.ca/home/"&gt;Bell Canada&lt;/a&gt;&lt;/strong&gt;: You promised to call me within 72h after opening a ticket to make an appointment for a tech to come out and test my dry loop line. Took you five days, and you never made an appointment, he just showed up &lt;em&gt;&amp;#224; l'improviste&lt;/em&gt; at 10:00 AM on a Saturday morning. Lucky I was home.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.starbucks.ca/en-ca/"&gt;Starbucks Canada&lt;/a&gt;&lt;/strong&gt;: I called you to get a quote for how much it would cost to supply beans, an automatic coffee machine, maintenance, etc for an office of 50 people. You promised to hand off my info to the Ottawa account manager, who'd call me right back. It's probably been a year. Still waiting.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://purolator.ca/"&gt;Purolator&lt;/a&gt;&lt;/strong&gt;: You lost a really expensive package headed for me a few years back. Over two weeks, promised 3 times to call me back with updates, never managed to do it even once without me calling you.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://enbridge.com/"&gt;Enbridge / DirectEnergy&lt;/a&gt;&lt;/strong&gt;: You assured me the repairman would call an hour before getting to my home, so I could leave work and head home to let him in. I must be getting wiser - I didn't believe it and stayed home from work. Good thing, too, as the phone never rang before the guy showed up.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://artoffurniture.ca/"&gt;Philip van Leeuwen&lt;/a&gt;&lt;/strong&gt;: You guys take the cake, you did it to me on two separate transactions. 2006: sofa delivery, instructions to call 60 minutes prior. I got a call on my cell from the delivery guys, waiting in front of my apartment, when no one answered the door. Rushed home fast enough. 2008: table delivery, 10am-2pm window, instructions to call 60 minutes prior. So of course they showed up at 9:30 without calling.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;&lt;a href="http://www.apple.com/ca/"&gt;Apple Canada&lt;/a&gt;&lt;/strong&gt;: You actually called me back when you said you would. &lt;em&gt;En fran&amp;#231;ais impeccable&lt;/em&gt;. &amp;lt;3 Apple.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/31982987-2918485057874940774?l=jpdaigle.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://jpdaigle.blogspot.com/feeds/2918485057874940774/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=31982987&amp;postID=2918485057874940774' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2918485057874940774'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/31982987/posts/default/2918485057874940774'/><link rel='alternate' type='text/html' href='http://jpdaigle.blogspot.com/2008/01/oh-baby-why-don-you-call-i-here-by.html' title='Oh baby, why don&amp;#39;t you call? I&amp;#39;m here by the phone'/><author><name>jpdaigle</name><uri>http://www.blogger.com/profile/11456023598470893300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='30' src='http://bp0.blogger.com/_--aH1Iip2P0/R5wXII-KqsI/AAAAAAAAAWw/eoEz9_tRqH4/S220/jp_80_75.png'/></author><thr:total>0</thr:total></entry></feed>
