<?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-15431842</id><updated>2012-01-26T00:13:46.104-08:00</updated><category term='autoconf'/><category term='Mach'/><category term='CLR'/><category term='gdb'/><category term='debugging'/><category term='Xcode'/><category term='background image'/><category term='smartcard'/><category term='AppleScript'/><category term='TFS'/><category term='public domain'/><category term='osascript'/><category term='cheese'/><category term='economy'/><category term='bailout'/><category term='ClickOnce'/><category term='Finder'/><category term='Instruments'/><category term='Tiny Kitchen'/><category term='encryption'/><category term='recipe'/><category term='Planet Money'/><category term='Delta'/><category term='patent'/><category term='bootcamp'/><category term='iPhone'/><category term='iTunes'/><category term='loans'/><category term='intellectual property'/><category term='gcc'/><category term='exception'/><category term='0xE8000001'/><category term='error'/><category term='dtrace'/><category term='macaroni'/><category term='Silverlight'/><title type='text'>TechnoSloth</title><subtitle type='html'>…or, what happens when a programmer follows the virtues of laziness, impatience and hubris.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Nathan Herring</name><uri>https://profiles.google.com/111096047037894992075</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-8YYv3v3e4IE/AAAAAAAAAAI/AAAAAAAAKT0/rlk2K7bFvik/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>68</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-15431842.post-5537851329408001838</id><published>2012-01-25T18:43:00.000-08:00</published><updated>2012-01-26T00:13:46.119-08:00</updated><title type='text'>Proactive Legislation</title><content type='html'>The recent SOPA/PIPA debacle has me marvelling, not at the hamfisted nature of the MPAA, but at the vast, disparate collection of internet companies, startups, luminaries in the fields of CS, and privacy, and forward-thinking individuals and the effort that was brought to bear on our various legislators. For the most part, it was a loose organization of people and enterprises acting on their own, and the concerted nature of the blackout seemed to be a avalanche where small important actors triggered the event rather than ran it. And the amount of effort and energy that went into it was pretty staggering.&lt;br /&gt;&lt;br /&gt;Just think if that amount of energy was put into &lt;i&gt;writing&lt;/i&gt; legislation rather than merely &lt;i&gt;blocking&lt;/i&gt; legislation?&lt;br /&gt;&lt;br /&gt;Providing our congress-critters alternative legislation, completely drafted, seems like it could be far better than MPAA-, RIAA-, Big Oil, Big &lt;i&gt;Whatever&lt;/i&gt; providing a significant amount of the guidance as to what the laws should be enacted. We should have our own groups put together ideas, crafting and analysing and reshaping laws to be ultimately given to legislators to introduce in their fora, and then be there to guide them as they try to reshape them to discuss our choices (especially when we chose otherwise).&lt;br /&gt;&lt;br /&gt;The problem is that Big &lt;i&gt;Whatever&lt;/i&gt; works. Fragmented groups of self-interested individuals and corporations never seem to form a cohesive movement, and only act in concert when threatened and then only from each of their own fears. There is no such thing as Big People or Big Citizenry. If there were, we'd ship the vast majority of Congress home and replace it with people willing to do our bidding, and change the laws to better ensure that they did so. As it stands, Big Citizenry politics is a study in waveform superposition -- it's only when there's enough people who happen to be aligned, when there's a "rogue wave" of citizen support for change, that we stand any chance of making progress. And Congressional rules increasingly impede progress, so that any such wave is likely to dissipate before any action is completed.&lt;sup&gt;&lt;small&gt;1&lt;/small&gt;&lt;/sup&gt; So we have to be strategic when such a wave occurs, and dismantle the structure Big Everyone-Else has created.&lt;br /&gt;&lt;br /&gt;Projects like &lt;a href="http://rootstrikers.org/"&gt;RootStrikers&lt;/a&gt; are on the right track, but the larger "we" need a game plan. First, we have to strike at the things that impede political change:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Cut the flow of money from lobbyists to congress-critters in all arenas: gifts, election donations, PACs, superPACs.&lt;/li&gt;&lt;li&gt;Replace or remove old and anti-democratic Congressional rules: (secret) holds, anything that means we have to have a supermajority to pass anything, anything that requires that every piece of legislation take some undue amount of time and prevent discussion/handling of alternative legislation.&lt;sup&gt;&lt;small&gt;2&lt;/small&gt;&lt;/sup&gt;&lt;/li&gt;&lt;li&gt;Improve the ability to hold congress-critters accountable to their campaign statements and their vows in office. This requires a bit more noodling on my part (and I'll take suggestions), but I'm thinking having some kind of contract-like device that allows something short of impeachment happen when they don't follow up at all or, worse, go directly against what they claimed they would do in office. (Can you say, "Transparency?" I knew you could.)&lt;/li&gt;&lt;/ol&gt;Second, we need to strike at the things that greatly facilitate Big Brother&lt;sup&gt;&lt;small&gt;3&lt;/small&gt;&lt;/sup&gt;:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Strengthen privacy transparency requirements. Companies need to be extremely transparent about what of your data is consumed (even if not the special sauce of how).&lt;/li&gt;&lt;li&gt;Strengthen minimum privacy requirements. Companies need to limit what they record about people that is ephemeral to their actual service, and not share it with other companies without explicit approval (that isn't buried in some arcane Terms of Service).&lt;/li&gt;&lt;li&gt;Decentralize. While this isn't a government thing entirely, nor should it be mandated,&amp;nbsp; having a best-practices document and easy how-tos to ensure you don't have all of your online presence stuck in a company's monolithic service umbrella, and that some things are explicitly separated so as to ensure that collusion of several companies &lt;i&gt;and&lt;/i&gt; the government (I'm looking at you, AT&amp;amp;T) are required to perform clandestine domestic spying.&lt;/li&gt;&lt;/ol&gt;Third, we need to strike at the things that inhibit technical progress:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Overhaul the Copyright office. Restore expiration terms to their original values, making considerations for increased lifespans of the creators. Set up iron-clad fair use examples and put the onus of responsibility on the creator to show at least some infringement before issuing take-downs. Make bad take-downs cost you (e.g., a Copyright version of SLAPP).&lt;/li&gt;&lt;li&gt;Overhaul the Patent offices. Require Software Patent Bonds, monies put in by big corporations when applying for patents, that get paid out to finders when said approved patents are later found to have prior art–don't make the system perversely set up to make it so that creators want to &lt;i&gt;not&lt;/i&gt; look at the set of other patents to avoid the triple penalty for possible infringement (if someone finds out). Clean the house of bad patents and figure out how better to interoperate with international patents.&lt;/li&gt;&lt;li&gt;Fix the state of anti-logic/anti-science education. It's impossible to get things done when you're not operating with people even remotely attempting to be rational actors.&lt;/li&gt;&lt;/ol&gt;&lt;ol&gt;&lt;/ol&gt;Then there's a swath of other things I would get at (healthcare, taxation), but I'll save that for another day.&lt;br /&gt;&lt;br /&gt;The remaining question is who or what group(s) is/are best set up to provide a cohesive set of legislation to enact these things, and full logistics support to shepherd them through a narcissistic, divisive Congress? And how do we rally the Big Citizenry to support them? How do we start this avalanche?&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;&lt;small&gt;1&lt;/small&gt;&lt;/sup&gt;To some extent this is a good thing, so that rational thought and consideration drive change rather than instinct and reaction, to avoid the perverse and destructive tendencies of the latter two (e.g., post-911 security theater), not to mention the cost of vacillation when the needle swings back the other way. I just think the knob has been adjusted too far.&lt;br /&gt;&lt;sup&gt;&lt;small&gt;2&lt;/small&gt;&lt;/sup&gt;Even the operating system vendors have finally gotten on the bandwagon of not running blocking operations on the main/UI thread. Legislation should have deadlines for congresspeople to consume, understand, and hear back from their constituents, but it shouldn't require spinwaiting; the filibuster should not stall other legislation.&lt;br /&gt;&lt;sup&gt;&lt;small&gt;3&lt;/small&gt;&lt;/sup&gt;Government or even corporate strongarming via data collection, aggregation and mining will always be possible. Making every internet service required to have some backdoor putatively for "organized crime" or more recently "the terrorists" just allows entities like the FBI/NSA/CIA/police to selectively target individuals or communities it takes issue with for harassment in the form of selective prosecution.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-5537851329408001838?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/5537851329408001838/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=5537851329408001838' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5537851329408001838'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5537851329408001838'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2012/01/proactive-legislation.html' title='Proactive Legislation'/><author><name>Nathan Herring</name><uri>https://profiles.google.com/111096047037894992075</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-8YYv3v3e4IE/AAAAAAAAAAI/AAAAAAAAKT0/rlk2K7bFvik/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-6955394212907441198</id><published>2011-12-14T18:29:00.000-08:00</published><updated>2011-12-14T18:29:50.767-08:00</updated><title type='text'></title><content type='html'>Courtesy of &lt;a href="http://boingboing.net/2011/12/13/trailer-tuesday-2-slothvill.html"&gt;BoingBoing&lt;/a&gt;, it appears there is &lt;a href="http://slothville.com/"&gt;sloth orphanage&lt;/a&gt;. That is all.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-6955394212907441198?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/6955394212907441198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=6955394212907441198' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6955394212907441198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6955394212907441198'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2011/12/courtesy-of-boingboing-it-appears-there.html' title=''/><author><name>Nathan Herring</name><uri>https://profiles.google.com/111096047037894992075</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-8YYv3v3e4IE/AAAAAAAAAAI/AAAAAAAAKT0/rlk2K7bFvik/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-807464742507766561</id><published>2011-03-03T09:47:00.000-08:00</published><updated>2011-03-03T10:30:12.885-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planet Money'/><title type='text'>[Non]recourse loans</title><content type='html'>NPR&amp;rsquo;s &lt;a href="http://www.npr.org/series/94427042/planet-money"&gt;Planet Money&lt;/a&gt; had a podcast describing differences between &lt;a href="http://en.wikipedia.org/wiki/Nonrecourse_debt"&gt;nonrecourse loans&lt;/a&gt;, which Americans traditionally have, and &lt;a href="http://en.wikipedia.org/wiki/Recourse_loan"&gt;recourse loans&lt;/a&gt;, which everyone else traditionally has. The pros for nonrecourse loan systems is that borrowers are more willing to take risks, and thus capitalize on them, increasing the general wealth, at the cost of finding it slightly harder to find banks willing to make loans and general extra volatility of the system with regards to speculative prices. The pros for recourse loan systems is that banks are more willing to make loans, so finding them might be easier, and the consequences of a default give incentive to the potential borrowers to be more conservative, reducing volatility.&lt;br /&gt;&lt;br /&gt;What is left out of the discussion is that these systems are not in isolation. The fact that the vastly increased volatility of the nonrecourse mortgage market in the United States has been the single largest factor in the most recent financial crisis weighs in on the pros and cons, since the negative effects of that crisis has sent ripple effects across the Atlantic.&lt;br /&gt;&lt;br /&gt;The problem, as I see it, is that we have an iterated prisoners&amp;rsquo; dilemma: Whereas the recourse-loan-based societies might enjoy relative stability of their markets if they were in isolation, the fact that we&amp;rsquo;re all in the same boat means that if other societies &amp;ldquo;defect&amp;rdquo; to become nonrecourse-loan-based, then the volatility spills over, the value the recourse-loan-based societies are expecting from stability is decreased. In effect, it means that there&amp;rsquo;s a new pressure to cause further &amp;ldquo;defections&amp;rdquo;&amp;mdash;the reward for increased capital risk now costs less, since they&amp;rsquo;re already incurring some volatility.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-807464742507766561?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.npr.org/blogs/money/2011/03/01/134168778/the-tuesday-podcast-discipline-and-forgiveness?ft=1&amp;f=93559255' title='[Non]recourse loans'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/807464742507766561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=807464742507766561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/807464742507766561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/807464742507766561'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2011/03/nonrecourse-loans.html' title='[Non]recourse loans'/><author><name>Nathan Herring</name><uri>https://profiles.google.com/111096047037894992075</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh4.googleusercontent.com/-8YYv3v3e4IE/AAAAAAAAAAI/AAAAAAAAKT0/rlk2K7bFvik/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3504490771903027964</id><published>2010-08-19T17:29:00.000-07:00</published><updated>2010-08-19T17:30:55.397-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mach'/><title type='text'>Unexpected Mach port refcounts</title><content type='html'>I recently found two cases where it was not obvious to me that I would have had ownership of a reference of a Mach port, and resulted in a Mach port “leak”:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;code&gt;mach_thread_self()&lt;/code&gt; implies adding a &lt;code&gt;MACH_PORT_RIGHT_SEND&lt;/code&gt; on the thread port. It must be followed with a matching &lt;code&gt;mach_port_deallocate&lt;/code&gt; call when the reference is no longer needed.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Mach messages received from the kernel after registering with &lt;code&gt;thread_swap_exception_ports&lt;/code&gt; may contain Mach ports, depending on the flavor of message. Any such ports must be deallocated by the receiver. If you pass the message along, then you can get away with just transferring ownership along as well, presuming that the next mach port in the chain wants a sufficiently similar flavor of exception message as you do.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;In our case, the extra un-deallocated references to the thread port would eventually turn into dead names after the thread died, but would never go away. As a result, if you went through enough threads over enough time, you’d starve your application for Mach ports and it would go unresponsive, crash, or otherwise terminate. In addition, we would incur (via the exception messages) ever increasing refcount on the task port, with somewhat unclear implications.&lt;sup&gt;1&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;Although I was able to use the dtrace example earlier to do some early diagnostics, since &lt;code&gt;mach_port_allocate&lt;/code&gt; was not the only generator of Mach ports in the process (e.g., the kernel when sending us exception messages), it was not sufficient. Instead, I ended up using Apple’s own sample, &lt;a href="http://developer.apple.com/mac/library/samplecode/MachPortDump"&gt;MachPortDump&lt;/a&gt;, in combination with some strategically placed breakpoints in gdb to try and narrow down when the ports were coming into existence, and what the ports actually were.&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;It really is too bad that Apple deems these APIs to be unworthy of documenting. Admittedly, only a few developers really need to get down into this nitty-gritty, but if the only choices are reading the 17-year-old &lt;a href="http://www.amazon.com/Programming-Under-Mach-UNIX-Systems/dp/0201527391?ie=UTF8&amp;amp;tag=capstan&amp;amp;link_code=btl&amp;amp;camp=213689&amp;amp;creative=392969" target="_blank"&gt;Programming Under Mach&lt;/a&gt;&lt;img alt="" border="0" height="1" src="http://www.assoc-amazon.com/e/ir?t=capstan&amp;amp;l=btl&amp;amp;camp=213689&amp;amp;creative=392969&amp;amp;o=1&amp;amp;a=0201527391" style="border: none !important; margin: 0px !important; padding: 0px !important;" width="1" /&gt; whose API references are out-of-date and whose code samples don’t deallocate these ports either, reading the darwin source (not an option for me), pestering ADC, or stumbling around in the dark, I can wager what will happen, and what the quality of the resulting products will be on the OS. Perhaps the consumers will lay the blame at the application developer’s feet, or at Apple’s, or both. In any case, it makes it hard to do things the right way, which I’m pretty sure we all want. (Or at least want slightly more than doing it the wrong way — not doing it at all isn’t an option.)&lt;br /&gt;----&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;What does happen when you wrap the refcount number on a Mach port? Hm…&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;MachPortDump just lists what ports are in the process and what kind/rights it has, not what the port is related to. You have to be a little creative to figure out what the port being incremented belongs to, e.g., &lt;code&gt;(mach_port_t)pthread_mach_thread_np((pthread_t)pthread_self())&lt;/code&gt; to figure out what the current thread’s port is. AFAICT, there’s no Mac OS X analog to &lt;code&gt;netmsgserver&lt;/code&gt; to annotate ports.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3504490771903027964?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3504490771903027964/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3504490771903027964' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3504490771903027964'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3504490771903027964'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/unexpected-mach-port-refcounts.html' title='Unexpected Mach port refcounts'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7685760122782874185</id><published>2010-08-11T12:39:00.000-07:00</published><updated>2010-08-11T12:40:09.660-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Instruments'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><category scheme='http://www.blogger.com/atom/ns#' term='dtrace'/><title type='text'>Recording the thread ID in Mac OS X Instruments</title><content type='html'>Hidden in the depths of the &lt;a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man1/dtrace.1.html"&gt;man page for &lt;code&gt;dtrace(1)&lt;/code&gt;&lt;/a&gt;, there is a reference to a new built-in variable, &lt;code&gt;tid&lt;/code&gt;:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;&lt;b&gt;tid&lt;/b&gt; A uint64_t thread ID of the currently executing thread…&lt;/code&gt;&lt;/blockquote&gt;What this means is that it’s trivial to log the thread ID associated with a call, which is incredibly useful for multi-threaded applications. (Can you say, “GCD?” I knew you could.) In a custom probe, you can record it as follows:&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_WSa-jToSUFw/TGL8GJlg9JI/AAAAAAAAACw/5AlqdFesWZE/s1600/InstrumentsThreadID.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="11" src="http://1.bp.blogspot.com/_WSa-jToSUFw/TGL8GJlg9JI/AAAAAAAAACw/5AlqdFesWZE/s400/InstrumentsThreadID.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7685760122782874185?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7685760122782874185/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7685760122782874185' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7685760122782874185'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7685760122782874185'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/recording-thread-id-in-mac-os-x.html' title='Recording the thread ID in Mac OS X Instruments'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_WSa-jToSUFw/TGL8GJlg9JI/AAAAAAAAACw/5AlqdFesWZE/s72-c/InstrumentsThreadID.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-1651057129605203690</id><published>2010-08-09T13:05:00.000-07:00</published><updated>2010-08-09T13:07:28.970-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mach'/><category scheme='http://www.blogger.com/atom/ns#' term='exception'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><category scheme='http://www.blogger.com/atom/ns#' term='debugging'/><title type='text'>Thread-based thread-level Mach exception handler and debugging</title><content type='html'>Apple implemented an awesome feature in their version of gdb in Xcode 3.2 (SnowLeopard is minimum OS requirement) for those (I hope few) of us&lt;sup&gt;1&lt;/sup&gt; who (1) have implemented a thread-based Mach exception handler, (2) actually use it with a mask for EXC_BREAKPOINT to conditionally self-handle breakpoints, and (3) still want to be able to debug the result: &lt;code&gt;thread dont-suspend-while-stepping&lt;/code&gt;. The problem that occurs is that when gdb is stepping (either by user specified command or in an attempt to get to a safe-to-read-objc state), it freezes all the other threads in your task. Normally, this is exactly what you want&amp;mdash;isolation from the other aspects of your program while you inspect and complete something under the watchful eye of the debugger.&lt;sup&gt;2&lt;/sup&gt; However, if one of those threads is the thread that is set up to handle a thread-level exception by looping receiving messages off of a Mach port, its Mach port gets sent the message (before gdb&amp;rsquo;s, which is a task-level exception handler, which gets second shot at such exceptions), and the thread never is woken up to handle it, so gdb deadlocks. Enter &lt;code&gt;thread dont-suspend-while-stepping&lt;/code&gt;. You tell it to not bother suspending your exception thread, and now it is awake to handle the exception message, deal with it, and respond back to the kernel. Then, unless it intercepts a temporary breakpoint or a single-step exception that wasn&amp;rsquo;t set by it, the Mach exception message will then be sent to gdb&amp;rsquo;s handler, and then gdb will resume control nicely. If you want to do this automagically, you can set yourself a breakpoint on thread entry function for your exception-handling thread, have it prevent its own suspension, and then continue on. The general code to run would be:&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;thread dont-suspend-while-stepping on -port ((mach_port_t)pthread_mach_thread_np((pthread_t)pthread_self()))&lt;/code&gt;&lt;/blockquote&gt;&lt;code&gt;&lt;a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/pthread_self.3.html"&gt;pthread_self()&lt;/a&gt;&lt;/code&gt; will return the current pthread, and then &lt;code&gt;pthread_mach_thread_np&lt;/code&gt; will return the Mach port given a pthread.&lt;br /&gt;----&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; At the moment, I suspect that the people who are actually doing this are&lt;ul&gt;&lt;li&gt;us, i.e., Mac CoreCLR&lt;/li&gt;&lt;li&gt;Java&lt;/li&gt;&lt;li&gt;Flash&lt;/li&gt;&lt;/ul&gt;It&amp;rsquo;d be interesting to know if there were yet others, especially if there&amp;rsquo;s any likelihood you&amp;rsquo;ll find yourself in a browser process-space. There are some unfortunate interactions that occur when each of these apps either stomp on each others&amp;rsquo; exception handling registration, or try to forward messages along the &amp;ldquo;chain&amp;rdquo; of handlers. To wit, if you&amp;rsquo;re calling &lt;code&gt;thread_set_exception_ports&lt;/code&gt;, you&amp;rsquo;re &lt;em&gt;definitely&lt;/em&gt; doing it wrong, and if you&amp;rsquo;re calling &lt;code&gt;thread_swap_exception_ports&lt;/code&gt;, it&amp;rsquo;s only that it&amp;rsquo;s &lt;em&gt;very likely&lt;/em&gt; that you&amp;rsquo;re doing it wrong. Less so if you&amp;rsquo;re doing it on entry/exit of your special code. Much more so otherwise.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; It&amp;rsquo;s not a panacea, in that if you have complicated timing issues between two threads, you&amp;rsquo;ll need to be a little more inventive.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-1651057129605203690?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/1651057129605203690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=1651057129605203690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1651057129605203690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1651057129605203690'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/thread-based-thread-level-mach.html' title='Thread-based thread-level Mach exception handler and debugging'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4023422883445764194</id><published>2010-08-05T11:58:00.000-07:00</published><updated>2010-08-05T11:58:06.226-07:00</updated><title type='text'>Dipping my toes into Cocoa again</title><content type='html'>Last time I did any significant Cocoa programming was prototyping a &lt;a href="http://developer.apple.com/mac/library/samplecode/InstallerPluginSample/Introduction/Intro.html"&gt;Installer-plug-in&lt;/a&gt;-style modular pane system for implementing one&amp;rsquo;s own &lt;a href="http://developer.apple.com/mac/library/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGInstallationsUpdates/XHIGInstallationsUpdates.html#//apple_ref/doc/uid/TP40002722-TPXREF23"&gt;Setup Assistant&lt;/a&gt;, in our case, a Mac Office Setup Assistant. I think it was a toss-up between the Hypercard-like architecture of the system or the product ID &lt;a href="http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/TextEditing/Tasks/FieldEditor.html"&gt;field editor&lt;/a&gt; which I liked more. But I left the team to head to the CLR before it was complete, and it&amp;rsquo;s unclear how much of that work was used, cherry-picked, or thrown out for Mac Office 2008.&lt;br /&gt;&lt;br /&gt;Since then, the clients of my code have almost all been C++, and my memories of .nibs and actions and outlets have faded. Last week, though, one of the partners using Cocoa reported an issue. I sat down to try and write a simple Cocoa version of our C++ client (with some actual UI) and knew enough to know I didn&amp;rsquo;t remember enough to sit down and do it. Perhaps if I had spent more than a few months developing Cocoa UI a few years back, it would have stuck better. I popped open my &lt;a target="_blank"  href="http://www.amazon.com/Cocoa-Programming-Mac-OS-2nd/dp/0321213149?ie=UTF8&amp;tag=capstan&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Cocoa&amp;reg; Programming for Mac&amp;reg; OS X (2&lt;small&gt;&lt;sup&gt;nd&lt;/sup&gt;&lt;/small&gt; ed.), &lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=capstan&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321213149" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt; and bogged down nigh immediately: quite a bit had transpired in the &lt;a href="http://developer.apple.com/iphone/library/releasenotes/DeveloperTools/RN-InterfaceBuilder/index.html"&gt;Interface Builder&lt;/a&gt; world since 2004. I don&amp;rsquo;t remember any &lt;code&gt;@prototype&lt;/code&gt; or &lt;code&gt;@synthesize&lt;/code&gt;. So, I shelved the project, ordered the &lt;a target="_blank"  href="http://www.amazon.com/Cocoa-Programming-Mac-OS-3rd/dp/0321503619?ie=UTF8&amp;tag=capstan&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;3&lt;small&gt;&lt;sup&gt;rd&lt;/sup&gt;&lt;/small&gt; edition&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=capstan&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=0321503619" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt; (published in 2008), and worked on other projects.&lt;br /&gt;&lt;br /&gt;Now that it&amp;rsquo;s arrived, I&amp;rsquo;m looking forward to sitting down with it, Xcode, and Interface Builder and making a simple CoreCLR loading application. It will have use beyond this simple reproduction case, I wager.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4023422883445764194?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4023422883445764194/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4023422883445764194' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4023422883445764194'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4023422883445764194'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/dipping-my-toes-into-cocoa-again.html' title='Dipping my toes into Cocoa again'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-8138840087427679524</id><published>2010-08-04T10:26:00.000-07:00</published><updated>2010-08-04T10:27:50.754-07:00</updated><title type='text'>No such thing as a Microsoft permalink, part 2</title><content type='html'>While I&amp;rsquo;m at it, let me remind us all of some interesting HTTP result codes&lt;sup&gt;1&lt;/sup&gt;:&lt;ul&gt;&lt;li&gt;&lt;a href="http://en.wikipedia.org/wiki/HTTP_301"&gt;301&lt;/a&gt;: Moved Permanently&lt;/li&gt;&lt;li&gt;307: Temporary Redirect, or alternatively &lt;a href="http://en.wikipedia.org/wiki/HTTP_302"&gt;302&lt;/a&gt;: Found (elsewhere; continue to use this link in the future though, as it may get moved)&lt;/li&gt;&lt;li&gt;410: Gone&lt;/li&gt;&lt;/ul&gt;Microsoft has enough storage capability and page-identity capability (GUIDs anyone?) that we could &lt;em&gt;always&lt;/em&gt; respond with one of the above HTTP results for any link that we have &lt;em&gt;ever&lt;/em&gt; put up on our public websites. The first would be in the event of a reorganization of content. The second would be for whatever forward links we&amp;rsquo;d created, even if &amp;ldquo;Temporary&amp;rdquo; would be a bit of a misnomer. (i.e., it&amp;rsquo;s rather &amp;ldquo;perhaps temporary&amp;rdquo; or &amp;ldquo;not guaranteed to be permanent&amp;rdquo;). The last was for content that ended its lifecycle and it and its forward links have finally become deprecated.&lt;br /&gt;&lt;br /&gt;In fact, we could go one further and provide warnings in some fashion to &amp;ldquo;near permanent&amp;rdquo; and forward links that are about to become deprecated. We could take advantage of the &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.46"&gt;§14.46 Warning&lt;/a&gt; header, e.g., Warning code 299: Miscellaneous persistent warning, where the warning text warns (in the character set of the sender) that this particular URL will &amp;ldquo;die&amp;rdquo; on such-and-such a date, and give another constructed URL to use to get more information. (And that URL could give the Microsoft&amp;rsquo;s content deprecation policy, if any, along with perhaps a form where you can give it a URL and it can return its deprecation date.) Alternatively, we could do something more simply, and have any such to-be-deprecated links redirect (via 307) to a URL whose namespace specifically indicates its imminent deletion, e.g., http://www.microsoft.com/to-be-deleted-20010804/&lt;em&gt;someidentifier&lt;/em&gt;.aspx. Either of these two mechanisms could be used by external parties who wanted to ensure the persistence of Microsoft content upon which they depend.&lt;br /&gt;&lt;br /&gt;Heck, we could go even one further, and spin off a 3&lt;small&gt;&lt;sup&gt;rd&lt;/sup&gt;&lt;/small&gt; party Windows Live/Azure service that did the persistence automatically for a fee, so that Microsoft is no longer responsible for ancient, deprecated content, except in that it supports our own cloud services: Microsoft Web Vault.&lt;br /&gt;&lt;br /&gt;In any case, 3&lt;small&gt;&lt;sup&gt;rd&lt;/sup&gt;&lt;/small&gt; party publishers could use these mechanisms if&lt;sup&gt;2&lt;/sup&gt; they wanted to ensure their publications don&amp;rsquo;t become obsolete too early. &lt;br /&gt;----&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; See also &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html"&gt;RFC 2616 §10&lt;/a&gt;.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Not always a good assumption. Publishers like people to buy successive editions of their software documentation at least as much as software publishers like people to buy successive editions of their software.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-8138840087427679524?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/8138840087427679524/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=8138840087427679524' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/8138840087427679524'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/8138840087427679524'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/no-such-think-as-microsoft-permalink.html' title='No such thing as a Microsoft permalink, part 2'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4357135757368293147</id><published>2010-08-03T17:03:00.000-07:00</published><updated>2010-08-03T17:10:25.267-07:00</updated><title type='text'>No such thing as a Microsoft permalink</title><content type='html'>As far as I can tell, anyway. While reading 3&lt;small&gt;&lt;sup&gt;rd&lt;/sup&gt;&lt;/small&gt; party documentation&lt;sup&gt;1&lt;/sup&gt; about our own technology, I often run into links to &lt;a href="http://msdn.microsoft.com"&gt;msdn.microsoft.com&lt;/a&gt; that are &lt;a href="http://en.wikipedia.org/wiki/HTTP_404"&gt;404&lt;/a&gt;s. I know that internally, we use redirection links when we expect content to move over the course of the lifespan of a product that might need to use it (e.g., for help support), but it seems silly to force publishers to do the same. Should it also be their responsibility, in the case where MSDN does a content reorg and deprecates old content, keep a local cache on their own website to support their own books? It would be seriously nice if there were (1) a way to request a permalink&lt;sup&gt;2&lt;/sup&gt;, and (2) be able to instantly tell whether a URL link was a permalink or an ephemeral link, to know whether or not it should go into a publication / blog post / etc.&lt;br /&gt;----&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; e.g., &lt;a target="_blank"  href="http://www.amazon.com/Professional-JavaScript-Netscape-Enterprise-LiveConnect/dp/B0000B0SXY?ie=UTF8&amp;tag=capstan&amp;link_code=btl&amp;camp=213689&amp;creative=392969"&gt;Professional JavaScript&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=capstan&amp;l=btl&amp;camp=213689&amp;creative=392969&amp;o=1&amp;a=B0000B0SXY" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important; padding: 0px !important" /&gt;, which I ended up borrowing from one of the authors. Thanks, &lt;a href="http://twitter.com/supdegrave"&gt;Stuart&lt;/a&gt;!&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Or at least one that had a specifically determinable lifetime that the publisher could then caveat in the introduction, or take steps to do the caching I mentioned before.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4357135757368293147?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4357135757368293147/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4357135757368293147' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4357135757368293147'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4357135757368293147'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/no-such-thing-as-microsoft-permalink.html' title='No such thing as a Microsoft permalink'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3769074806102852720</id><published>2010-08-02T11:16:00.000-07:00</published><updated>2010-08-02T11:30:59.164-07:00</updated><title type='text'>Monday is the day to take on the hard task</title><content type='html'>Having read recently about &lt;a href="http://www.paulgraham.com/top.html"&gt;The Top Idea in Your Mind&lt;/a&gt; (thanks &lt;a href="http://twitter.com/michaelmcdaniel"&gt;McMichael&lt;/a&gt;!) and reading about getting things done, I am positing that the best day to work on the hard task is Monday. (And yes, I realize that I&amp;rsquo;m procrastinating right now&amp;mdash;baby steps.)&lt;br /&gt;&lt;br /&gt;I&amp;rsquo;ve gotten to the point in my work/life-balance where I can actually put my work down at the end of the day on Friday (eventually) and largely not consider it until Monday. This is an improvement over having my wife wondering why I&amp;rsquo;ve sequestered myself in the office to connect to work over VPN and twiddle some bits. On the other hand, since I don&amp;rsquo;t do a prep-time for work Sunday night (and I may yet adopt this behavior), on Monday morning, I&amp;rsquo;m generally thinking only of personal Deep Thoughts&amp;trade; rather than the work break-through I might be needing.&lt;br /&gt;&lt;br /&gt;This comes to, until now, what had been my general Monday workday makeup: 75% reading through new e-mail and re-reading through last week's e-mail and piece-wise following up on the low-priority but small-cost items that I could accomplish. 25% contemplation of the actual task for which I&amp;rsquo;m either planning, or worse planning to plan. My estimation is that I don&amp;rsquo;t actually &amp;ldquo;page in&amp;rdquo; enough context by the end of the day for good analysis, and so it&amp;rsquo;s only Tuesday where I actually start useful work on the hard problems.&lt;br /&gt;&lt;br /&gt;Thus, I have the intuition that pushing the small bits until Tuesday (or later) is the right way. Even if I don&amp;rsquo;t make real progress on Monday, spending enough time to fully consider the problem allows for a Monday night dream-solve and Tuesday morning shower-revelation, and probably sets the stage for even better progress on Tuesday.&lt;br /&gt;&lt;br /&gt;The little bits are always something that can be dealt with in the interstices that inevitably occur during planning and development. (There&amp;rsquo;s a reason to have multiple machines and/or multiple source control enlistments simultaneously&amp;mdash;parallel processing for the win!) And since they don&amp;rsquo;t need the same context switch, or have the same priority, best to postpone them until you&amp;rsquo;re already on a roll.&lt;br /&gt;&lt;br /&gt;Now, to buckle down and implement this plan&amp;hellip;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3769074806102852720?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3769074806102852720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3769074806102852720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3769074806102852720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3769074806102852720'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/08/monday-is-day-to-take-on-hard-task.html' title='Monday is the day to take on the hard task'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3136146477449176255</id><published>2010-01-29T12:20:00.000-08:00</published><updated>2010-02-28T10:35:15.428-08:00</updated><title type='text'>How little Johnny application doesn’t play well with others</title><content type='html'>Spotted &lt;a href="http://stevenf.tumblr.com/post/359224392/i-need-to-talk-to-you-about-computers-ive-been"&gt;this post&lt;/a&gt; on the &lt;a href="http://ranchero.com"&gt;ranchero.com&lt;/a&gt; &lt;a href="http://ranchero.com/xml/rss.xml"&gt;RSS feed&lt;/a&gt; about New World vs. Old World computing, making the argument that Old World desktops are all-purpose machines, vs. New World computers (currently, mainly the iPhone/iPod) are more narrow-purpose machines, and even when they have more than one purpose, the purposes tend to be siloed and sandboxed.&lt;br /&gt;&lt;br /&gt;Notwithstanding the arguments about the computational and energy savings of only running one app (and limited system services) at a time, there&amp;rsquo;s a good reason for the siloed/sandboxed nature of these applications, and that is that by default, applications do not work well together on an Old World desktop. Despite the best attempts by platform designers to engineer a product where you generally don&amp;rsquo;t step on other apps&amp;rsquo; toes, and best practices published that try to bridge the gap between the platform&amp;rsquo;s strictures and programs&amp;rsquo; capabilities, apps step on each other all the time. They incorrectly rely on shared state&lt;sup&gt;1&lt;/sup&gt;, or worse, destructively edit shared state that happens to work fine (for them). They are not uniform in the way that they share data between applications (copy/pasteboards and the formats provided, file system and the file formats of the files, sockets and the protocols that run over them). The data you want in one app might be data (perhaps slightly tweaked) that you want in another app, but unless you&amp;rsquo;re a Excel or Perl&lt;sup&gt;2&lt;/sup&gt; wizard, getting from &lt;em&gt;A&lt;/em&gt; to &lt;em&gt;B&lt;/em&gt; is a whole lot of work. Even in systems designed by the same company to work together sometimes fail in these regards, especially as their feature sets and complexity grow&lt;sup&gt;3&lt;/sup&gt;. Lastly, there is no nice model for assigning execution control to applications; customers rarely know when some hidden plug-in is monopolizing their system and causing scrolling or typing to slow to a crawl. How many times have you just wanted to read one e-mail, but some untold number of system agents conspire to time-share your processor enough to steal time from what you really need to do?&lt;br /&gt;&lt;br /&gt;And that&amp;rsquo;s when you actually &lt;em&gt;trust&lt;/em&gt; the application to run on your box. For most software manufacturers, you can generally trust that they didn&amp;rsquo;t mean to do any harm (and yet they still do). Then there&amp;rsquo;s the class of app-makers who write apps that are just-useful-enough that you install them and all the malware / exploits / junk that came along for the ride. Since the average Joe doesn&amp;rsquo;t know the difference necessarily, he&amp;rsquo;s either afraid to click on the utility that might just solve his problem, or he&amp;rsquo;s opening up his system to possible attack vectors by clicking on the utility, or he&amp;rsquo;s incurring the not-insubstantial overhead&lt;sup&gt;4&lt;/sup&gt; of running anti-virus/anti-spyware programs.&lt;br /&gt;&lt;br /&gt;The siloed approach capitalizes on the generally limited way these programs communicate their data by making &lt;em&gt;that&lt;/em&gt; the choke point&amp;ndash;data flows can be to internet site(s) or the user through UI, and that&amp;rsquo;s it. No tromping on other apps&amp;rsquo; data. No mismatched communication with another app on the same box through the traditional pathways (and even web services don&amp;rsquo;t work since you won&amp;rsquo;t have both apps up at the same time). There still may be issues about spyware, and it&amp;rsquo;s unclear whether an app validation service such as Apple&amp;rsquo;s could clearly tell whether a user&amp;rsquo;s privacy would (possibly) be violated. But for the most part, you running an app means pretty much that you can only really take down your own app, and spend as much battery as you want doing so. Siloing means pushing the problem of communicating that data between local services to be between cloud services (e.g., &lt;a href="http://facebook.com"&gt;Facebook&lt;/a&gt; and &lt;a href="http://twitter.com"&gt;twitter&lt;/a&gt; integration), where there&amp;rsquo;s now a whole new playfield where cloud apps won&amp;rsquo;t play well with others. But it does mean that your local box will do as well as its purpose-driven cloud support will do, and without interference. And that means a lot.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Can you say, &amp;ldquo;registry&amp;rdquo;? (Or machine state, but that&amp;rsquo;s not a problem solved by New World machines either.)&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;Insert any reasonably advanced script language that parses (regexes) strings and byte data and permutes the same.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;Not that Microsoft has any examples of these. ;0&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt;Both in money and human/computer time.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3136146477449176255?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://stevenf.tumblr.com/post/359224392/i-need-to-talk-to-you-about-computers-ive-been' title='How little Johnny application doesn&amp;rsquo;t play well with others'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3136146477449176255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3136146477449176255' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3136146477449176255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3136146477449176255'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/01/how-little-johnny-application-doesn.html' title='How little Johnny application doesn&amp;rsquo;t play well with others'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3973896871757293734</id><published>2010-01-29T10:15:00.000-08:00</published><updated>2010-08-09T13:09:25.322-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ClickOnce'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR'/><title type='text'>Running ClickOnce apps at startup</title><content type='html'>We use an internal tool to keep a watchful eye on the various bug databases we might have bugs in, to get notifications when new ones come in and to provide a fairly reasonable summary UI. This was internally released as a &lt;a href="http://msdn.microsoft.com/en-us/library/t71a733d(VS.80).aspx"&gt;ClickOnce&lt;/a&gt; &lt;small&gt;(&lt;a href="http://en.wikipedia.org/wiki/ClickOnce"&gt;Wikipedia&lt;/a&gt;)&lt;/small&gt; application using .NET. I thought it best to put it in the startup group to run on login, but found after working a number of times, it stopped launching at some point. Turns out, this is because you can&amp;rsquo;t put the application reference in the Startup items since it might move as later versions get installed. Instead, follow &lt;a href="http://keithelder.net/blog/archive/2009/04/18/how-to-run-a-clickonce-application-on-startup.aspx"&gt;this article&lt;/a&gt; by Keith Elder to create a regular old internet shortcut and get the right behavior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3973896871757293734?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://keithelder.net/blog/archive/2009/04/18/how-to-run-a-clickonce-application-on-startup.aspx' title='Running ClickOnce apps at startup'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3973896871757293734/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3973896871757293734' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3973896871757293734'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3973896871757293734'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/01/running-clickonce-apps-at-startup.html' title='Running ClickOnce apps at startup'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2199257984750580255</id><published>2010-01-08T18:45:00.001-08:00</published><updated>2010-01-08T18:45:59.301-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Tiny Kitchen'/><title type='text'>Ellen's Black Beans and Rice recipe</title><content type='html'>---begin-tinykitchen---&lt;br /&gt;Title: Black Beans and Rice&lt;br /&gt;Serves: 8-10&lt;br /&gt;&lt;br /&gt;1 lb black beans&lt;br /&gt;1 lb smoked link sausage&lt;br /&gt;0 - ham hocks (optional)&lt;br /&gt;2 - onions (diced)&lt;br /&gt;1 can RoTel tomatoes &amp; green chilis&lt;br /&gt;1 tsp Tony Chachere's Creole seasoning&lt;br /&gt;1 can chopped tomatoes (large can)&lt;br /&gt;&lt;br /&gt;Prepare black beans according to instructions on bag for quick cooking, drain, then cook in pressure cooker. Fry/steam the smoked link sausage in a frying pan, drain, and cut into small pieces. To the beans add the sausage, ham hocks, onions, tomato &amp; green chilis, creole seasoning, and chopped tomatoes. Cook long and slow, simmering until sauce thickens. If you use a crock pot, leave beans uncovered so sauce can cook down. Serve over rice with salsa and sour cream.&lt;br /&gt;---end-tinykitchen---&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2199257984750580255?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2199257984750580255/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2199257984750580255' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2199257984750580255'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2199257984750580255'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2010/01/ellens-black-beans-and-rice-recipe.html' title='Ellen&apos;s Black Beans and Rice recipe'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2852123773489684331</id><published>2009-11-16T15:11:00.000-08:00</published><updated>2009-11-16T15:12:49.155-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Delta'/><category scheme='http://www.blogger.com/atom/ns#' term='gcc'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='intellectual property'/><title type='text'>Delta is my friend</title><content type='html'>I think it was a couple years ago when working for the CLR and running into what appeared to be a compiler issue in a newer version of gcc. Zipping up the entire enlistment and shipping it to Apple would have been a rube mistake: (1) Microsoft doesn&amp;rsquo;t really want its source disseminated unnecessarily, even if the partners have a limited non-disclosure agreement. (2) Even the youngest tester knows the mantra: get a small, simple repro.&lt;br /&gt;&lt;br /&gt;Suffice it to say that our source code is rather complex (and probably a small factor more than it need be). Generating a giant .ii file and then culling it manually to keep the reproduction while shedding intellectual property is a soul crushing problem. You can make some educated guesses at what is causing the compiler to behave oddly, but sometimes those guesses are ill-founded, and there&amp;rsquo;s no easy way to get to minimal repro.&lt;br /&gt;&lt;br /&gt;Enter &lt;a href="http://delta.tigris.org"&gt;Delta&lt;/a&gt;, which Mike Stump of Apple pointed out to me. It takes the tedium out of reducing the reproduction down to a minimal one, making the obfuscation/renaming process usually much easier (unless something about the names themselves are problematic).&lt;br /&gt;&lt;br /&gt;You start with your giant reproduction: &lt;code&gt;g++ &lt;em&gt;flags flags flags&lt;/em&gt; -c &lt;em&gt;file&lt;/em&gt;.ii&lt;/code&gt;, where &lt;code&gt;&lt;em&gt;file&lt;/em&gt;.ii&lt;/code&gt; is the preprocessed version of your source (i.e., replacing the &amp;ldquo;&lt;code&gt;-c&lt;/code&gt;&amp;rdquo; with &amp;ldquo;&lt;code&gt;-E&lt;/code&gt;&amp;rdquo; at the gcc line). In our cases, this can be something like 1.8 MB of text file. You then write a simple &amp;ldquo;interestingness&amp;rdquo; decider script, e.g., that gcc succeeds in compiling the source, but that the output contains a particular warning. Then you run Delta in several iterations, and it selectively removes parts of the source file, tests the file for (continued) interestingness, and if it is still interesting, it caches the smaller result, and keeps going, looking for more text it can remove and still have the repro intact. Several hours later (of the computer&amp;rsquo;s time rather than your own), it can knock the size down to a few K of text, and then the whole problem becomes much more tractable.&lt;br /&gt;&lt;br /&gt;I&amp;rsquo;ve probably had to post only six or so bugs that fell into this category, but Delta has saved me tremendous time and effort.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2852123773489684331?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://delta.tigris.org' title='Delta is my friend'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2852123773489684331/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2852123773489684331' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2852123773489684331'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2852123773489684331'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/11/delta-is-my-friend.html' title='Delta is my friend'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3827449669713029616</id><published>2009-11-16T10:23:00.001-08:00</published><updated>2010-01-29T15:36:49.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='background image'/><category scheme='http://www.blogger.com/atom/ns#' term='Finder'/><category scheme='http://www.blogger.com/atom/ns#' term='AppleScript'/><category scheme='http://www.blogger.com/atom/ns#' term='osascript'/><title type='text'>Getting background pictures on disk images to “stick”</title><content type='html'>As a part of working on an installer for &lt;a href="http://www.blogger.com/www.teachtown.com"&gt;TeachTown&lt;/a&gt;, I ran into a problem where we were trying to make an automated build process for the installer and making a nice disk image for the installer: the process of assigning a background image via AppleScript would work in the moment, but after you &lt;code&gt;hdituil detach&lt;/code&gt;ed the image, it would vanish. e.g.,&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;osascript -e 'tell app "Finder" to set background picture of icon view options of container window of disk "&lt;em&gt;disk_name&lt;/em&gt;" to POSIX file "&lt;em&gt;full_path_to_image_file_on_disk_image&lt;/em&gt;"'&lt;br /&gt;hdituil detach /Volumes/&lt;em&gt;disk_name&lt;/em&gt;&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;We found that running &lt;code&gt;sync&lt;/code&gt; wouldn’t help, but that if we waited a while (e.g., &lt;code&gt;sleep 5&lt;/code&gt;), it would usually “take.” Well, Apple replied with the Magic™: The Finder doesn’t commit the changes made to Finder metadata immediately to disk, and whereas if you told the Finder to eject the disk, it would know better, write its metadata and &lt;em&gt;then&lt;/em&gt; eject, but for whatever reason &lt;code&gt;hdiutil detach&lt;/code&gt; would just unmount the disk image out from under the Finder and it wouldn’t necessarily have known to write the metadata first.&lt;br /&gt;&lt;br /&gt;Workaround and/or fix: Use the &lt;code&gt;update disk&lt;/code&gt; verb to force the Finder to write out the metadata. e.g.,&lt;br /&gt;&lt;blockquote&gt;&lt;code&gt;osascript -e 'tell app "Finder" to update disk "&lt;em&gt;disk_name&lt;/em&gt;"'&lt;/code&gt;&lt;/blockquote&gt;&lt;br /&gt;That should make sure that background image and icon size/placement settings that you made get committed before the &lt;code&gt;detach&lt;/code&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3827449669713029616?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3827449669713029616/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3827449669713029616' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3827449669713029616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3827449669713029616'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/11/getting-background-pictures-on-disk.html' title='Getting background pictures on disk images to &amp;ldquo;stick&amp;rdquo;'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-410811017723449594</id><published>2009-10-13T16:17:00.001-07:00</published><updated>2009-11-16T14:51:57.637-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Xcode'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='gdb'/><title type='text'>Avoiding strange gdb errors in SnowLeopard</title><content type='html'>If you&amp;rsquo;re suddenly experiencing the following warnings when loading a binary &lt;blockquote&gt;&lt;code&gt;unable to read unknown load command 0x80000022&lt;/code&gt;&lt;/blockquote&gt; and the following error when running your binary &lt;blockquote&gt;&lt;code&gt;Error calling thread_get_state for GP registers for thread 0x14855lxerror on line 207 of "/SourceCache/gdb/gdb-768/src/gdb/macosx/i386-macosx-nat-exec.c" in function "fetch_interior_register": (os/kern) invalid argument (0x4)&lt;/code&gt;&lt;/blockquote&gt; then it&amp;rsquo;s very likely you&amp;rsquo;re running the wrong version of gdb. In my case, I have both Xcode 3.0 and Xcode 3.2 installed, since the former is the &amp;ldquo;officially supported&amp;rdquo; toolset (i.e., what the build lab is using to produce our products). Unfortunately, our build environment, in an attempt to keep you from accidentally using the wrong tools / SDK to build the product, will set the path to include the official toolset&amp;rsquo;s &lt;code&gt;/usr/bin&lt;/code&gt; (e.g., &lt;code&gt;/Xcode3.0/usr/bin&lt;/code&gt;) before &lt;code&gt;/usr/bin&lt;/code&gt;. Thus, I was accidentally getting the older version of gdb, which doesn&amp;rsquo;t work quite right on SnowLeopard.&lt;br /&gt;&lt;br /&gt;Fix: Use the Xcode 3.2 (or later) version of gdb.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-410811017723449594?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/410811017723449594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=410811017723449594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/410811017723449594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/410811017723449594'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/10/avoiding-strange-gdb-errors-in.html' title='Avoiding strange gdb errors in SnowLeopard'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-1603639443240216058</id><published>2009-08-31T21:23:00.000-07:00</published><updated>2009-11-16T14:51:42.887-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='autoconf'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR'/><title type='text'>Rich support for multiple (versions of) OSes: autoconf?</title><content type='html'>After many years of working on multi-platform applications (and now also multi-platform platforms), I find it incredibly difficult to try to be rich on all of them, and not either drastically increase the cost of production (with regards to testing resources) or reduce overall quality (screwed up boundary cases, where the &amp;ldquo;boundary&amp;rdquo; is much, much closer than one&amp;rsquo;d like to customer uses). One of the longer term issues that especially affects the Mac platform for Silverlight is our mechanism for building the CoreCLR.&lt;br /&gt;&lt;br /&gt;What we&amp;rsquo;re building today is highly related to &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=3A1C93FA-7462-47D0-8E56-8DD34C6292F0&amp;displaylang=en"&gt;Rotor v1&lt;/a&gt; and &lt;a href="http://www.microsoft.com/downloads/details.aspx?FamilyId=8C09FD61-3F26-4555-AE17-3121B4F51D4D&amp;displaylang=en"&gt;Rotor v2&lt;/a&gt;. The Rotor project was the shared source release of the Common Language Infrastructure, aka SSCLI. Rotor v1 was fairly multi-platform because Microsoft really wanted to show that their new CLI was a realizable technology on alternative platforms. It was released under the shared source license so that academics could peer under the covers and that, despite a facile JIT-compiler and garbage collection mechanism, the system would work and also how it would work. Figuring they&amp;rsquo;d proved their point&lt;sup&gt;1&lt;/sup&gt;, the Rotor update to v2 was hamstrung further &amp;mdash; they needn&amp;rsquo;t have it work on all platforms. The nice framework they had built and managed to allow for building Rotor v1 on multiple platforms had suffered bitrot and would build on nothing but Windows.&lt;br /&gt;&lt;br /&gt;Fast forward several years and past an internal project that never saw the light of day, and you get to the inception of the Silverlight project. They had a mechanism that would (mostly) build something for FreeBSD, and with some minor tweaks, would build for Mac OS X&lt;sup&gt;2&lt;/sup&gt;. Furthermore, another (defunct) team had gone through the effort to port the commercial JIT-compiler for x86 and the commercial garbage collector to GNU, so they had most of what they needed to start working&lt;sup&gt;3&lt;/sup&gt;. Several teammates and I worked on this for a couple of years before it was picked up by the Silverlight team for the 2.0 release. Over the course of that time, some effort went into not completely destroying the ability to build on other OSes. That said, the only shipping product that was using the Rotor project at all was the Mac version of the CoreCLR&lt;sup&gt;4&lt;/sup&gt;. I am positive that not only that you could not build our CoreCLR on other platforms using our source, but that I, myself, included code and/or improper #ifdefs that would make it not work. Not by design, but simply by not having a product for that platform.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mono-project.com"&gt;Mono&lt;/a&gt;/&lt;a href="http://www.mono-project.com/Moonlight"&gt;Moonlight&lt;/a&gt; is both a blessing and a curse in this regard. As much as I might have wanted a business proposition that would have put a Microsoft-written CoreCLR on more platforms than just MacOS, the environment was/is not ripe for such an idea. The great deal we have with the Mono project means we&amp;rsquo;re likely to get the platform on many, many more OSes than Microsoft proper would have been willing to fund. On the other hand, the &amp;ldquo;curse&amp;rdquo; side is that there really is no other platform than MacOS for the &lt;code&gt;autoconf&lt;/code&gt;-based/multi-platform-aware/multiplatform-capable build system to build. No reason at all to have all this extra gook.&lt;br /&gt;&lt;br /&gt;In fact, this gook gums up the works somewhat. We broke a whole bunch of original assumptions when we finally released the Mac OS CoreCLR. We went from the &lt;code&gt;autoconf&lt;/code&gt; premise that you&amp;rsquo;re building on the machine that the built code is meant to run on. Instead, we wanted to run on systems 10.4 and up, independently of whether we were building on 10.4, 10.5, or even pre-releases of 10.6&lt;sup&gt;5&lt;/sup&gt;. Furthermore, we wanted to be warned of potential future issues on 10.5 and later. As this to the idea, before it was deprecated, that we might build x86 on ppc and vice versa, that there are build tools that we need to create to actually build the product, and then there&amp;rsquo;s the product itself. The former need to run on the current operating system (even if through some kind of emulation &amp;mdash; e.g., if on x86_64, ppc (if Rosetta is installed) and x86 are valid build tool architectures) and the latter need to have the cross-OS-version behavior we want (i.e., not using any deprecated APIs for one of the later OSes, and selectively using new-OS APIs via &lt;a href="http://developer.apple.com/mac/library/documentation/Darwin/Reference/ManPages/man3/dlsym.3.html"&gt;&lt;code&gt;dlsym&lt;/code&gt;&lt;/a&gt; or &lt;a href="http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFBundleRef/Reference/reference.html"&gt;&lt;code&gt;CFBundleFunctionPointerForName&lt;/code&gt;&lt;/a&gt; or weak-linking. If we had gotten it right (bwahaha), we&amp;rsquo;d&amp;rsquo;ve cached &lt;code&gt;config.guess&lt;/code&gt; files for other architectures and made sure the built products would Actually Run&amp;trade; on the platforms for which they were built&lt;sup&gt;6&lt;/sup&gt;. As it stands now, we have this overly complicated system that, yes, allows us to actually use 10.5 compilers to build the stack canary support into the applications we use on 10.4 (and not when we're building using the 10.4 compilers, which is purely an internal testing mechanism), but it also means we pass all sorts of extra grik around:&lt;ul&gt;&lt;li&gt;Mac OS SDK&lt;/li&gt;&lt;li&gt;Min ver (currently 10.4)&lt;/li&gt;&lt;li&gt;TBD: Max ver (as max as we can get it)&lt;/li&gt;&lt;li&gt;-arch flag for &lt;code&gt;gcc&lt;/code&gt; (since &lt;code&gt;autoconf&lt;/code&gt; cannot guess this with any utility uniformly across 10.4/10.5/10.6)&lt;/li&gt;&lt;/ul&gt; Plus, we use this external mechanism to enforce these same things on our partners&amp;rsquo; Xcode projects (not everyone made the decision to use the same build system for both Window &amp; Mac, much less the NTBuild system that we inherited) &amp;mdash; we invoke &lt;code&gt;xcodebuild&lt;/code&gt; with the specific SDK and various other #defines we want.&lt;br /&gt;&lt;br /&gt;However, even when we get this right, and we use the old APIs for older OSes and the new APIs selectively, i.e., on the OSes where they&amp;rsquo;re supported, there&amp;rsquo;s no default mechanism for demonstrating that we&amp;rsquo;re doing it right. Nothing to call out that we have these references to specific APIs that are deprecated, but only in OSes where we expect them to be usable. No handy mechanism to segregate out these uses so that they can be deprecated when we change our own internal requirements to support a newer OS. It&amp;rsquo;s all internal manual review. I suppose things move slowly in the OS world, but I&amp;rsquo;d prefer that we&amp;rsquo;d be able to qualify all of these call sites with the right metadata &amp;mdash; use this on downlevel OSes and this on modern OSes and effectively remove it when it&amp;rsquo;s no longer necessary, with some kind of &lt;em&gt;deprecated code not included&lt;/em&gt; warning to let us know, so we can remove it at our leisure.&lt;br /&gt;&lt;br /&gt;Notwithstanding these cross-OS-version issues, there&amp;rsquo;s still the issue that the &lt;code&gt;autoconf&lt;/code&gt;-centric mechanism gets stale by default. We regularly create or view new Xcode projects in newer versions of the Xcode toolsets just to see what flags get sent down to &lt;code&gt;gcc&lt;/code&gt;/&lt;code&gt;ld&lt;/code&gt; so we can emulate the new behavior in the &lt;code&gt;configure.in&lt;/code&gt; scripts. There&amp;rsquo;s a fairly rational argument to be made that we&amp;rsquo;d require less intervention if we just used Xcode projects for everything. The counter-argument is that if we did, we probably would not have to be as introspective as we are about how projects are built to get them to build, or, more importantly, to Work&amp;trade; &amp;mdash; we&amp;rsquo;d blithely build and sort out the bodies later.&lt;br /&gt;&lt;br /&gt;There&amp;rsquo;s still no real solution to having multiple &lt;code&gt;config.guess&lt;/code&gt; files for the multiple OS versions your app supports and some summarizer that converts that into static code changes for the things that are determinable (like all versions of the OS support &lt;code&gt;dlfcn.h&lt;/code&gt; functions), and into runtime code checks plus disparate behavior for things that came into existence with a particular OS version. At this point, is &lt;code&gt;autoconf&lt;/code&gt; too unwieldy to keep? Should we move to a simpler mechanism and live with the stuck-to-this-OS-ness it implies? Hard to tell. Any change will require some work. The only question is, is it more work than we would otherwise need to do over the long haul.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Actually, I don&amp;rsquo;t actually know what they were thinking; this is supposition on my part. It predates my joining the CLR team by a couple years.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;In fact, one of the reasons I got the job is that I complained to them saying that their Rotor v2 release had broken the Mac OS X build, and that I had some patches that would fix some of the damage. This put me in contact with one of cross-platform devs (from which I inherited most of the Mac responsibility ultimately) and the dev lead of the project, who was willing to give me contribute access, even though I was from another Dev organization. When they realized they needed a Mac guy, they talked to me. As it turns out, they might have benefited more from a Darwin/FreeBSD guy, since my knowledge was more old-skool Toolbox than a born-again *nix guy (since I had done *nix work in college when I wasn&amp;rsquo;t working on 68k code). At least at the time. No longer. Plus now they know more about CoreFoundation than they ever wanted to know.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;Sadly, they didn't have a commercial-quality JIT-compiler for the PowerPC, so they just recirculated the good ole FJIT. (The &amp;ldquo;F&amp;rdquo; stands for &amp;ldquo;fast&amp;rdquo;, and by &amp;ldquo;fast&amp;rdquo;, I mean JIT-compiler throughput, not JIT-compiled-code execution speed.) The results were pretty shoddy &amp;mdash; it worked but the word &amp;ldquo;performant&amp;rdquo; wouldn&amp;rsquo;t be seen in the same room as it.&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt;The build system for Windows Desktop CLR maintained the rotor project for quite some time beyond its last release, in the event it would be shipped again. However, in the spirit of &amp;ldquo;testing just enough&amp;rdquo; (i.e., testing sparse points of the matrix), we stopped building the Window rotor project some time ago, presuming we were doing better testing by having a real Mac rotor project that we had to actually ship.&lt;br /&gt;&lt;sup&gt;5&lt;/sup&gt;Don&amp;rsquo;t even get me started on that you cannot code on Mac OS X to be OS SDK-independent without Major Hackery&amp;trade;. Regular changes to function prototypes break our warnings-as-errors compilations.&lt;br /&gt;&lt;sup&gt;6&lt;/sup&gt;In the days before PowerPC was removed from our list of shipping targets, we had the capacity to build the opposite architecture on the same machine to make sure you hadn&amp;rsquo;t hosed the other side due to your changes. Well, it was all fine and good, except that it would not run at all. It did a fine job of catching compiler warnings, but at the top of the world, the endien #defines were all wonky because the values for the current build machine had bled into the target architecture. In the event that PowerPC was ever made little endien (not just little endien mode, like the G4 and earlier), perhaps this might have worked.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-1603639443240216058?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/1603639443240216058/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=1603639443240216058' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1603639443240216058'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1603639443240216058'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/08/rich-support-for-multiple-versions-of.html' title='Rich support for multiple (versions of) OSes: autoconf?'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-5651691716557009351</id><published>2009-08-04T16:21:00.000-07:00</published><updated>2009-08-04T17:47:28.726-07:00</updated><title type='text'>Failure to clean</title><content type='html'>While considering what to do for MQ&lt;sup&gt;1&lt;/sup&gt;, I ran across a presentation (&lt;a href="http://media01.smartcom.no/Microsite/start.aspx?eventid=4519"&gt;video&lt;/a&gt;) that &lt;a href="http://www.peterprovost.org/"&gt;Peter Provost&lt;/a&gt; gave for &lt;a href="http://www.ndc2009.no/en/"&gt;NDC 2009&lt;/a&gt;. He has an awesome analogy between coding and cooking at 31m into the presentation: &lt;blockquote&gt;I was very fortunate to work for a good chef, and one of the things that he taught me was to be constantly cleaning up as I was cooking&amp;hellip; [If you are forced to have the big clean up at the end,] as you&amp;rsquo;re constantly piling on the scraps of food all over the counter, and the dirty knives and plates, it totally gets in your way. At the end you stop and say, &amp;ldquo;We can&amp;rsquo;t cook any more food for an hour; we got to clean up the kitchen.&amp;rdquo;&lt;/blockquote&gt; If you can imagine that a version six product (where a product cycle is about two years long) is like a kitchen where people have been constantly working in for twelve years, and at no time has anyone actually cleaned it up all the way, and finding clean space to work in and clean tools to do the work with is getting progressively harder and harder, then you have a very good idea of what writing software&lt;sup&gt;2&lt;/sup&gt; is like.  &lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;MQ is Microsoft parlance (perhaps others too) for a &amp;ldquo;quality&amp;rdquo; milestone. Milestones is one way to divide up a large set of tasks that you want to work on during the course of a single product cycle, and the ones which add features are generally M1, M2, etc. MQ (or M0) generally starts (or is in the interstice between) product cycles, and generally focuses on infrastructure and code-quality improvements&amp;mdash;things that only have a secondary impact on whether customers will want our software, i.e., that we are efficient in making those other changes.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;Well, writing software in a non-agile or limited-agility way.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-5651691716557009351?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://media01.smartcom.no/Microsite/start.aspx?eventid=4519' title='Failure to clean'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/5651691716557009351/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=5651691716557009351' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5651691716557009351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5651691716557009351'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/08/failure-to-clean.html' title='Failure to clean'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-1351314968989485438</id><published>2009-07-21T17:18:00.000-07:00</published><updated>2009-07-21T17:54:03.030-07:00</updated><title type='text'>Entourage is taking a work break</title><content type='html'>I honestly don&amp;rsquo;t remember when I first started using &lt;a href="http://www.microsoft.com/mac/products/entourage2008/"&gt;Entourage&lt;/a&gt;. I suspect it was back before Project Athena was named Entourage, and was simply the Mac version of Outlook Express. I&amp;rsquo;d hooked up my work Exchange server account via IMAP, and later Entourage&amp;rsquo;s built-in Exchange support. Yesterday, for the first time in many moons, I can&amp;rsquo;t use Entourage to access my work e-mail.&lt;br /&gt;&lt;br /&gt;The reason: We&amp;rsquo;re moving on up. Many Microsofties&amp;rsquo; accounts are getting migrated to Exchange 2010 so we all can dogfood, dogfood, dogfood. And WebDAV in Exchange 2010 has gone the way of the dodo&lt;sup&gt;1&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;Never fear, intrepid Mac Office users: in lieu of switching to the aging, legacy, Windows-centric MAPI, the Mac Office folks are &lt;a href="http://www.microsoft.com/mac/itpros/entourage-ews.mspx"&gt;designing forward&lt;/a&gt; to the newfangled &lt;a href="http://msexchangeteam.com/archive/2009/04/21/451126.aspx"&gt;Exchange Web Services&lt;/a&gt; (EWS), the faster replacement for WebDAV. EWS works on Exchange 2007, and will have expanded capabilities in 2010.&lt;br /&gt;&lt;br /&gt;Nonetheless, we dogfooders are stuck choosing between hot dogfood-on-dogfood action (i.e., the latest builds of Entourage EWS against the pre-release Exchange 2010) or waiting until Mac Office makes their release. Since I&amp;rsquo;m no longer on the team (i.e., not building and debugging it day in and day out), and it&amp;rsquo;s both about my home and my work data, I&amp;rsquo;m inclined to sit this one out, and wait on pins and needles until they come out with the new coolness.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;A better list of changing APIs for Exchange 2010 can be found &lt;a href="http://blogs.msdn.com/exchangedev/archive/2008/05/22/exchange-developer-roadmap.aspx"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-1351314968989485438?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/1351314968989485438/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=1351314968989485438' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1351314968989485438'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1351314968989485438'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/07/entourage-is-taking-work-break.html' title='Entourage is taking a work break'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3731100194994961514</id><published>2009-07-11T16:08:00.000-07:00</published><updated>2009-07-11T16:46:41.362-07:00</updated><title type='text'>Home networking and its woes</title><content type='html'>A couple weeks ago, I updated all of the Ethernet hubs in the house to support gigabit ethernet. It&amp;rsquo;s not that I have many devices that would take advantage of this, but I suspect more and more as time goes on will. Nonetheless, this most recent upgrade still didn&amp;rsquo;t quite work out perfectly: the &lt;a href="http://www.netgear.com/Products/Switches/DesktopSwitches/GS108.aspx"&gt;Netgear ProSafe GS108&lt;/a&gt; in the office connecting to the &lt;a href="http://www.netgear.com/Products/Switches/DesktopSwitches/GS105.aspx"&gt;Netgear ProSafe GS105&lt;/a&gt; up inside the &lt;a href="http://www.leviton.com/OA_HTML/ibeCCtpSctDspRte.jsp?section=10348&amp;minisite=10027&amp;sitex=10027:22372:US"&gt;Leviton Structured Media&amp;trade; box&lt;/a&gt; won&amp;rsquo;t train to gigabit speeds, always falling back to 100 megabit. Grr. Not sure exactly how to diagnose the problem. (The same problem doesn&amp;rsquo;t occur between the 105 and an identical 108 unit in a different room.)&lt;br /&gt;&lt;br /&gt;At the same time I updated the hubs, I decided it&amp;rsquo;d be nice to actually have more than one working telephone jack available. (I mean, it&amp;rsquo;s downright tragic to have this awesome patch system in the Leviton box and yet only have one real phone line&amp;mdash;connected to the modem itself.) I could put little DSL filters in front of them, but that posed a problem for the only other (prospective) phone in the house &amp;mdash; a wall-plate-mounted kitchen phone. We didn&amp;rsquo;t have a DSL filter that would fit that and have it stay on the wall. So, I did some research and found that of course Leviton makes a &lt;a href="http://www.levitonproducts.com/catalog/model_47616-DSB.htm"&gt;DSL filter board&lt;/a&gt; (47616-DSF) to stick into the box. When I got it, I realized that I didn&amp;rsquo;t have (nor really know how to use) a punchdown tool. Fortunately, one of my friends who is a hardware geek did, and gave me the explanation on how to use it. I rewired the phone to go through the board first, but got zero love -- no signal seemed to come out of the &amp;ldquo;to modem&amp;rdquo; (or at least it never reached the modem), even though the phone lines still seemed to work correctly. Double grr. Now it&amp;rsquo;s re-patched to the original configuration, and there&amp;rsquo;s still no phone in the kitchen.&lt;br /&gt;&lt;br /&gt;After all this, we started noticing that our internet service seemed seriously degraded. We have Qwest &amp;ldquo;Platinum Package&amp;rdquo; using &lt;a href="http://www.drizzle.com"&gt;Drizzle&lt;/a&gt; as our ISP. Today, I looked at the modem&amp;rsquo;s web interface, and it said that our 7 Mbps connection was connected at 3360 Kpbs. That seemed rather unreasonable, so I did some research and found some ugliness &amp;mdash; the current description of &amp;ldquo;Platinum Package&amp;rdquo; advertises &amp;ldquo;up to 7 Mbps&amp;rdquo; (and that makes sense to some extent, seeing as though they could have the fastest modem connection ever, and the ISP may still be the slow link), but &lt;em&gt;they only guarantee at least 3 Mbps!&lt;/em&gt; I don&amp;rsquo;t remember that being part of the deal when I signed up; perhaps they changed the policy? (It&amp;rsquo;s not like they publish the historical policy changes so that you can see when the terms of the service changed out from under you.) I thought that it was possible that it was my forays into rewiring the punchdowns that caused the problem, but after connecting the modem directly into the telephone test jack where the phone comes into the house, it got even worse training. Putting it back where it was retrained it to 4400 Kbps, but then I updated the firmware on it (which required a reset and retrain), and now it&amp;rsquo;s back to 3700 Kbps. Let&amp;rsquo;s just say that our instant-watch &lt;a href="http://www.netflix.com"&gt;Netflix&lt;/a&gt; movies on the &lt;a href="http://www.microsoft.com/xbox/"&gt;Xbox 360&lt;/a&gt; went from 4 bars, sometimes dropping to 3, to starting at 2 bars and bailing out entirely within a couple minutes. Really rather frustrating. Qwest&amp;rsquo;s web page talks about a &amp;ldquo;Quantum Package&amp;rdquo; (aka Fastest) that goes &amp;ldquo;up to 12 Mbps&amp;rdquo; (with a guarantee of what?), but their availability query suggests it&amp;rsquo;s not available for my phone/address.&lt;br /&gt;&lt;br /&gt;I am tempted to jump the Qwest DSL ship (or at least them running the show &amp;mdash; using Speakeasy or something) and venture into cable-internet. I just really want to have something akin to a guaranteed 1 MB/s (8192 Kbps) down and not have it preclude the ability to connect from the Internet into a machine on the home network.&lt;br /&gt;&lt;br /&gt;With all of these sequential failures, I&amp;rsquo;m even less inclined to continue to plan an updated wireless network, complete with a guest VLAN. I had hoped that perhaps the ReadyNAS NV+ would support some RADIUS service so I could just make the denizens use 802.1x, and route guests only to the internet. Maybe someday.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3731100194994961514?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3731100194994961514/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3731100194994961514' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3731100194994961514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3731100194994961514'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/07/home-networking-and-its-woes.html' title='Home networking and its woes'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4300415817351303189</id><published>2009-07-10T10:30:00.000-07:00</published><updated>2009-07-10T10:37:37.558-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silverlight'/><category scheme='http://www.blogger.com/atom/ns#' term='CLR'/><title type='text'>Silverlight 3</title><content type='html'>Our partners over in the Silverlight Runtime (SLR, formerly Jolt) have done a bang-up job working on Silverlight 3, which is released to the public today. There are scads of &lt;a href="http://silverlight.net/GetStarted/silverlight3/default.aspx#whatsnew"&gt;new features&lt;/a&gt;. Go check it out!&lt;br /&gt;&lt;br /&gt;We did some very targeted features in the CoreCLR for Silverlight 3, but it is largely the same engine as it was before. One of the important parts for Mac users is that there are some changes to be compatible with Snow Leopard in there. (Silverlight 2&amp;rsquo;s CoreCLR mostly works, but there are some edge cases that might show up issues, depending on the Silverlight application.)&lt;br /&gt;&lt;br /&gt;Over here, we have our heads down for the most part, putting the finishing touches on the &lt;a href="http://www.microsoft.com/visualstudio/en-us/products/2010/default.mspx"&gt;Visual Studio 2010&lt;/a&gt; (aka Dev10) release. We&amp;rsquo;ve already released a &lt;a href="http://msdn.microsoft.com/en-us/subscriptions/downloads/default.aspx?pv=18:370"&gt;Beta 1&lt;/a&gt; of the new .NET Framework v4 (including our CLR bits). Finally, the desktop CLR will see some of the stuff that we&amp;rsquo;ve been showcasing in the CoreCLR! Furthermore, Visual Studio will have several improvements to support the design and debugging of Silverlight content.&lt;br /&gt;&lt;br /&gt;It&amp;rsquo;s always nice to see one&amp;rsquo;s work finally make it to the public.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4300415817351303189?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/silverlight' title='Silverlight 3'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4300415817351303189/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4300415817351303189' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4300415817351303189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4300415817351303189'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/07/silverlight-3.html' title='Silverlight 3'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-8298662189731366228</id><published>2009-07-09T20:51:00.000-07:00</published><updated>2009-07-09T21:00:48.586-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellectual property'/><title type='text'>Proof positive that the GPL kills kittens</title><content type='html'>&lt;a href="http://www.red-sweater.com/about/DanielJalkut.html"&gt;Daniel Jalkut&lt;/a&gt;, over on &lt;a href="http://www.red-sweater.com/blog/"&gt;Red Sweater Blog&lt;/a&gt;, recently had a good &lt;a href="http://www.red-sweater.com/blog/825/getting-pretty-lonely"&gt;rant&lt;/a&gt; about the &lt;a href="http://www.gnu.org/licenses/quick-guide-gplv3.html"&gt;GPL&lt;/a&gt;. Ok, maybe not proof about the kittens, but still…&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-8298662189731366228?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.red-sweater.com/blog/825/getting-pretty-lonely' title='Proof positive that the GPL kills kittens'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/8298662189731366228/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=8298662189731366228' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/8298662189731366228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/8298662189731366228'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/07/proof-positive-that-gpl-kills-kittens.html' title='Proof positive that the GPL kills kittens'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3916767259394230515</id><published>2009-05-20T13:10:00.000-07:00</published><updated>2009-07-09T11:21:33.441-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bootcamp'/><category scheme='http://www.blogger.com/atom/ns#' term='smartcard'/><category scheme='http://www.blogger.com/atom/ns#' term='TFS'/><category scheme='http://www.blogger.com/atom/ns#' term='encryption'/><title type='text'>Back in action</title><content type='html'>Just received a replacement hard drive, the &lt;a href="http://www.seagate.com/ww/v/index.jsp?locale=en-US&amp;name=st9500420as-momentus-7200.4-sata-500-gb-hd&amp;vgnextoid=70f4bfafecadd110VgnVCM100000f5ee0a0aRCRD&amp;vgnextchannel=819a2c74f15dd110VgnVCM100000f5ee0a0aRCRD&amp;reqPage=Model"&gt;500GB Seagate Momentus 7200.4&lt;/a&gt;, and after spending 40m yesterday taking out the old 320GB 5400RPM drive that would periodically stop responding, I&amp;rsquo;ve been spending time getting my MacBook Pro back into action.&lt;br /&gt;&lt;br /&gt;Transferring my Mac OS X partition with Disk Utility and my WinXP bootcamp partition with &lt;a href="http://twocanoes.com/winclone/"&gt;WinClone&lt;/a&gt; went very smoothly, and now I&amp;rsquo;m finally at the point where I'm going to put a code enlistment back on it. DevDiv for this release is using &lt;a href="http://msdn.microsoft.com/en-us/teamsystem/default.aspx"&gt;Team Foundation Server&lt;/a&gt; for our source control, and for the Mac side, we&amp;rsquo;re using the &lt;a href="http://teamprise.com/"&gt;Teamprise&lt;/a&gt; client to access the server. It&amp;rsquo;s churning along in the background considering what files it&amp;rsquo;ll need to pull down to replace my deleted enlistment.&lt;br /&gt;&lt;br /&gt;On the cool side, due to our data-at-rest policies for laptops, I&amp;rsquo;ve recreated an encrypted sparsebundle disk image for the purpose of storing my source. Historically, I would have just used the &lt;code&gt;-encryption&lt;/code&gt; flag to &lt;code&gt;hdiutil&lt;/code&gt; and relied on the security of my local machine&amp;rsquo;s keychain to keep the secret. However, since &lt;a href="http://www.gemalto.com/"&gt;Gemalto&lt;/a&gt; has released Mac OS X tokend plugins for its &lt;a href="http://www.gemalto.com/products/dotnet_card/"&gt;.NET v2+ cards&lt;/a&gt;, I can use the certificate off of my Microsoft badge as the security, now requiring thieves to either crack the stock encryption or to also steal my badge and my PIN. (Good luck with that.)&lt;br /&gt;&lt;br /&gt;Building services are going to be replacing the carpet and putting a fresh coat of paint on the walls this evening, so I&amp;rsquo;m putting all my books and peripherals into boxes. I only hope that my sync is done by the time my office is packed so I can go work in the new &lt;a href="http://seattletimes.nwsource.com/html/microsoft/2009086103_microsoftcampus20.html"&gt;commons&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3916767259394230515?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3916767259394230515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3916767259394230515' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3916767259394230515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3916767259394230515'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/05/back-in-action.html' title='Back in action'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2239003970237947858</id><published>2009-04-19T15:58:00.000-07:00</published><updated>2009-07-09T11:19:36.059-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='intellectual property'/><title type='text'>The shackles of IP taint</title><content type='html'>&lt;center&gt;or&lt;br /&gt;How it&amp;rsquo;s easier to drink the Kool-Aid&amp;trade;&lt;br /&gt;if it&amp;rsquo;s the only drink you&amp;rsquo;re allowed to have.&lt;/center&gt;&lt;br /&gt;The problem: If you, as a developer, introduce intellectual property into Microsoft&amp;rsquo;s distributable software portfolio&lt;sup&gt;1&lt;/sup&gt;, and the ownership of that intellectual property is under dispute, Microsoft may come under (additional) threat of lawsuit.&lt;br /&gt;&lt;br /&gt;The &amp;ldquo;solution&amp;rdquo;: Make the policy such that Microsoft employees have no way of copying any external IP&amp;mdash;make it against the rules to read Open Source code by default, even outside of their job.&lt;sup&gt;2&lt;/sup&gt; To a lesser extent, except for specific competitive reviews, even using alternative products (esp., if it&amp;rsquo;s a development product) is frowned upon lest you absorb possible IP in the visible framework code.&lt;br /&gt;&lt;br /&gt;The ramifications for your average Microsoft software group aren&amp;rsquo;t that problematic. They&amp;rsquo;re generally consuming the Windows OS (Microsoft), using the Visual Studio tools to build their project (Microsoft), and the majority of the analysis and testing tools are Microsoft. Furthermore, if you don&amp;rsquo;t understand an API&amp;rsquo;s MSDN documentation, you can just load the symbols and debug right into it and find out for yourself what is going on (or going wrong).&lt;br /&gt;&lt;br /&gt;But it does mean that you are limited to what the &amp;ldquo;state of the art&amp;rdquo; is to what the Microsoft-available solutions are, and furthermore to &lt;em&gt;not really know what you&amp;rsquo;re missing&lt;/em&gt;.&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;As soon as you get on the fringe, the all-Microsoft strategy starts to slip. As a MacBU developer and now as a CLR developer working at least part time on the Macintosh CoreCLR, very little is in-house. Trying to track down something in a closed-source Apple product is just as bad as Apple trying to track something down in our closed-source products, so we get a taste of what it&amp;rsquo;s like to be a third party. But even when it&amp;rsquo;s open source, we still can&amp;rsquo;t download it and look at it. Even if it would be expedient to do so to figure out what our (mis)use of it was. Even when the documentation is sketchy or ambiguous.&lt;br /&gt;&lt;br /&gt;So as it stands, we rely heavily on ADC. We can&amp;rsquo;t peer into the code, but they can and give us hints, or code samples. And obviously, they go and fix bugs we report in their software, as well as in the family of open source projects that are released with Mac OS X. Which leaves us back again working in our own sandbox.&lt;br /&gt;&lt;br /&gt;It sometimes takes years for external ideas and outstanding tools to penetrate into Microsoft, and it seems to me, almost entirely through people who are new industry or college hires, bringing in their previous backgrounds (taint notwithstanding&lt;sup&gt;4&lt;/sup&gt;) with, generally, open source community. The rest of us have to work hard (and run a rather annoying gauntlet) to keep from relaxing into navel-gazing. &lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;As opposed to in-house tools that are not distributed.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;Unless it can be demonstrated that there are sufficient business reasons to justify the expense of having the legal team review the licensing, and incur the additional risk to Microsoft.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;On the other hand, we also have the problem that there are usually many different (sometimes nigh identical) solutions to the same problem that aren&amp;rsquo;t well publicized and thus proliferate.&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt;If a new hire made significant contributions to an open source product, then they&amp;rsquo;d be barred from working on any Microsoft product that would be of similar ilk, presuming that that would be the IP they might leak from external sources into the MS codebase. Unfortunately, there&amp;rsquo;s no good mechanism to determine what the overlap is, so it&amp;rsquo;s just a matter of how much risk the dev managers and legal team think they&amp;rsquo;d incur.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2239003970237947858?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2239003970237947858/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2239003970237947858' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2239003970237947858'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2239003970237947858'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/04/shackles-of-ip-taint.html' title='The shackles of IP taint'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7125381749894283874</id><published>2009-04-07T22:48:00.000-07:00</published><updated>2009-04-08T07:05:03.083-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='cheese'/><category scheme='http://www.blogger.com/atom/ns#' term='Tiny Kitchen'/><category scheme='http://www.blogger.com/atom/ns#' term='macaroni'/><category scheme='http://www.blogger.com/atom/ns#' term='recipe'/><title type='text'>Baked Mac &amp; Cheese</title><content type='html'>I&amp;rsquo;ve never really been particularly good in the kitchen. I tend to need a recipe and to have all the ingredients, and generally to only work on one thing at a time. That and I&amp;rsquo;m never quite sure where everything is, and generally have to look in three separate places.&lt;br /&gt;&lt;br /&gt;Nonetheless, recently, I&amp;rsquo;ve been making a particular dish multiple times, and am getting better at timing things to be ready Just In Time&amp;trade;: The &lt;a href="http://www.amazon.com/1997-Cooking-Marion-Rombauer-Becker/dp/0684818701/"&gt;&lt;em&gt;Joy of Cooking&lt;/em&gt; (&amp;lsquo;97 edition)&lt;/a&gt;&amp;rsquo;s Baked Macaroni and Cheese.&lt;br /&gt;&lt;br /&gt;My friend Mason, author of the &lt;a href="http://tiny-kitchen.blogspot.com/"&gt;Tiny Kitchen&lt;/a&gt; iPhone application, swears by the &lt;em&gt;Cook&amp;rsquo;s Illustrated&lt;/em&gt; version (the older, adult version), and I will have to try it eventually. Nonetheless, his app has helped me on more than one occasion to set up a shopping list so I can remember to get everything I need for it.&lt;br /&gt;&lt;br /&gt;Towards that end, I am adding it here, in Tiny Kitchen form, sans &lt;em&gt;Joy&lt;/em&gt;&amp;rsquo;s &lt;a href="http://www.copyright.gov/fls/fl122.html"&gt;copyrighted description&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;---begin-tinykitchen---&lt;br /&gt;Title: Baked Macaroni and Cheese (Joy of Cooking)&lt;br /&gt;Time To Cook (in minutes): 45&lt;br /&gt;Tags: dinner&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;   2 cups elbow macaroni &lt;br /&gt;   3 tbsp. butter&lt;br /&gt;   2 tbsp. flour&lt;br /&gt;   2 cups milk&lt;br /&gt;0.5000 - onion (minced)&lt;br /&gt;   1 - bay leaf&lt;br /&gt;0.2500 tsp. paprika&lt;br /&gt;2.2500 cups sharp Cheddar or Colby cheese (grated)&lt;br /&gt;- - black pepper (freshly ground)&lt;br /&gt;0.5000 cups bread crumbs (fresh)&lt;br /&gt;&lt;br /&gt;----&lt;br /&gt;&lt;br /&gt;Guid: 4EC3A73B-5A81-4EA2-A600-8C20A84AC72F&lt;br /&gt;---end-tinykitchen---&lt;br /&gt;&lt;br /&gt;I&amp;rsquo;ve tended to shop at &lt;a href="http://www.traderjoes.com/index.html"&gt;Trader Joe&amp;rsquo;s&lt;/a&gt; for the ingredients, and use these specifics:&lt;ul&gt;&lt;li&gt;Like &lt;em&gt;Cook&amp;rsquo;s Illustrated&lt;/em&gt; suggests, I use a blend of mostly sharp cheddar (extra sharp Celtic or extra sharp Wisconsin, for more orange-y look), and some Monterey Jack.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I use fusilli rather than elbow macaroni.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I use (organic) whole milk.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I also buy frozen chicken breasts, and broil two to add a little tasty protein to my fat and salt.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I&amp;rsquo;ve used Tiny Kitchen&amp;rsquo;s recipe scaling feature multiple times, having prepared it in a single batch only once. More often it&amp;rsquo;s in two or three times quantities. I&amp;rsquo;ve found it difficult to figure out what the right amount of time, or really, the right creamy consistency to reach before pulling it off the stove and adding the cheese. Also, trying to add salt and pepper to taste for varying quantities seems hard to get right.&lt;br /&gt;&lt;br /&gt;I made it again this past weekend in a double batch, half for us, and half for our newly-parents-again friends S. Ben, Meghan, &amp;ldquo;little&amp;rdquo; Nathan, and now Eliza. From my own tastebuds, it was a good run.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7125381749894283874?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7125381749894283874/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7125381749894283874' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7125381749894283874'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7125381749894283874'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/04/baked-mac-cheese.html' title='Baked Mac &amp; Cheese'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2026064650660254877</id><published>2009-04-04T13:56:00.000-07:00</published><updated>2009-07-09T11:20:22.491-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bailout'/><category scheme='http://www.blogger.com/atom/ns#' term='public domain'/><category scheme='http://www.blogger.com/atom/ns#' term='patent'/><category scheme='http://www.blogger.com/atom/ns#' term='intellectual property'/><category scheme='http://www.blogger.com/atom/ns#' term='loans'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>IP for loans?</title><content type='html'>With the big three auto manufacturers repeatedly asking the government for loans to stay alive, I think now is an excellent time to use our leverage to make those loans with the condition that they sell the IP rights on selected parts of their patent portfolio into the public domain in exchange for some amount of debt forgiveness. Whereas it&amp;rsquo;s going to be impossible to clean up the patent law in any near term, it would be interesting if some of those defensive patents became available for use without licensing. I wonder how much is in there that inhibited competition?&lt;br /&gt;&lt;br /&gt;On the other hand, as an alternative to releasing them into the public domain, it might behoove American citizens to have the government retain these patent rights on our behalf. In today&amp;rsquo;s world of cross-licensing deals, and having one patent-infringement case always spawn a host of counter patent-infringment cases (in a &lt;a href="http://en.wikipedia.org/wiki/Mutual_assured_destruction"&gt;MAD&lt;/a&gt; sense), perhaps it&amp;rsquo;s better to have a defense for the public. &lt;br /&gt;&lt;br /&gt;Right now, if you, as an individual, infringe on a patent without the requisite licensing, you may get a cease-and-desist order (if they find out), and may have to pay a rather hefty fine (with &lt;a href="http://en.wikipedia.org/wiki/Treble_damages"&gt;treble damages&lt;/a&gt; if you knew you were infringing). Companies can get hosed, because if their product is based in part on the infringed patent, then, depending on the licensing that is available, it may no longer be a viable product once that happens. In the case where they&amp;rsquo;re simply copying the idea, that might be a good thing, but in the case where it was parallel discovery&lt;sup&gt;1&lt;/sup&gt;, then they&amp;rsquo;re just out of luck.&lt;br /&gt;&lt;br /&gt;If, like the companies with big patent portfolios, the government managed this portfolio on behalf of its citizens, they could do some interesting things. Try out this thought experiment based on the following licensing strategy:&lt;ul&gt;&lt;li&gt;Every citizen gets license to use anything it the government managed portfolio for non-commercial use. This equates nicely to the same effect of having the patent be in the public domain.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any commercial entity can acquire a low cost license to use the patent, &lt;a href="http://en.wikipedia.org/wiki/If_and_only_if"&gt;iff&lt;/a&gt; they agree to cross-license anything in their portfolio to the entire American public for non-commercial use as above for as long as they use the license.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Any commercial entity can retain licensing privileges for their IP, but there will be a much higher licensing cost to use a patent in the government portfolio.&lt;/li&gt;&lt;/ul&gt;Furthermore, the government can renew the patent as long as anyone else could.&lt;br /&gt;&lt;br /&gt;Using this mechanism, we improve on the benefit to the public over these patents going into the public domain by (1) giving incentive to the companies to open their portfolio to the public, and (2) providing extra government income, which could be earmarked for the maintenance of the offices managing the government portfolio, as well as the patent office itself.&lt;br /&gt;&lt;br /&gt;Personally, I think the IP system needs a fairly large overhaul to fix the issues of (1) the increasing (and varied) pace of discovery and obsolescence, (2) the volume of ideas and the general lack of cross-referencing&lt;sup&gt;2&lt;/sup&gt;. Nonetheless, in lieu of a big rewrite (which is unlikely to occur wholesale), this incremental fix might be worthwhile. And GM could start us off.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Parallel discovery is actually very likely to occur. Since there are treble damages for knowing you&amp;rsquo;re infringing, it behooves one to &lt;em&gt;not&lt;/em&gt; know. Ultimately, companies stick their head in the sand and hope not to infringe, while their legal teams, separated from the rest of R&amp;amp;D by a &lt;a href="http://en.wikipedia.org/wiki/Chinese_wall"&gt;Chinese wall&lt;/a&gt; sit ready to do patent searches if a lawsuit comes in the front door.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;I expect that the patent publications are like dry versions of the &lt;a href="http://en.wikipedia.org/wiki/Whole_Earth_Catalog"&gt;Whole Earth Catalog&lt;/a&gt; rather than a hierarchically organized, indexed, and cross-referenced document that leaves little doubt whether you&amp;rsquo;re product infringes and/or your claim is a new claim.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2026064650660254877?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2026064650660254877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2026064650660254877' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2026064650660254877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2026064650660254877'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/04/ip-for-loans.html' title='IP for loans?'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-6166058619887842388</id><published>2009-04-02T22:08:00.000-07:00</published><updated>2009-04-04T13:55:58.428-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Planet Money'/><category scheme='http://www.blogger.com/atom/ns#' term='economy'/><title type='text'>When the government speculates</title><content type='html'>I&amp;rsquo;ve been listening to the &lt;a href="http://www.npr.org/rss/podcast.php?id=510289"&gt;Planet Money Podcast&lt;/a&gt; recently, since its recent cross-over broadcast on &lt;a href="http://www.thisamericanlife.org/radio_podcast.aspx"&gt;This American Life&lt;/a&gt; (&lt;a href="http://www.thisamericanlife.org/Radio_Episode.aspx?sched=1285"&gt;375: Bad Bank&lt;/a&gt;). They&amp;rsquo;re doing a brilliant job at explaining the complicated financial strangeness that&amp;rsquo;s going on. In a recent episode, &lt;a href="http://www.npr.org/blogs/money/2009/03/hear_in_search_of_bad_guys.html"&gt;#23: In Search Of Bad Guys&lt;/a&gt;, about half-way through (14m 9s), they talk about solvency vs. liquidity. Check it out, and then come back.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WSa-jToSUFw/SdWlNw_w3hI/AAAAAAAAABw/8rgfni8jCuc/s1600-h/Valuation.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 173px;" src="http://3.bp.blogspot.com/_WSa-jToSUFw/SdWlNw_w3hI/AAAAAAAAABw/8rgfni8jCuc/s320/Valuation.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320340190717337106" /&gt;&lt;/a&gt;&lt;br /&gt;The upshot is that the mortgages the banks are holding aren&amp;rsquo;t worth the full fair value, as not everyone is going to pay them. The banks want to sell them at as little loss as possible in exchange for reducing risk. The question is, is the price at which people will buy these (the bid price), artificially reduced by the market&amp;rsquo;s general lack of available funds to invest.&lt;br /&gt;If we had prescient bean counters today, they would foretell that the &lt;em&gt;real&lt;/em&gt; value is going to fall in one of these three segments.&lt;ul&gt;&lt;li&gt;Above what the bank is willing to sell it for&amp;mdash;This is a real win for all folks involved, though least for the banks. The banks take a loss to reduce risk, but remain solvent. The investor-taxpayers make money on their investment while also staving off general economic problems caused by the closing of an insolvent bank.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Between what the bank is willing to sell the &amp;ldquo;toxic&amp;rdquo; asset and what the current market says it&amp;rsquo;s worth&amp;mdash;This is the big hedge. The idea here is that the bank has already lost money on the investment, and the taxpayers are going to eat further losses in exchange for keeping the bank solvent, as insolvency presumably would cause even bigger losses than these across the whole economy. However, it&amp;rsquo;s still not as bad as the market currently looks (which is what the banks are currently arguing&amp;mdash;whether it&amp;rsquo;s lack of liquidity or lack of good forecasting, the market is unnaturally depressed).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Below even what the current market thinks&amp;mdash;This is the true ugliness, where we, the taxpayers, are eating even more of the bank&amp;rsquo;s losses. The bank is, for all of its previous losses, getting a great deal here, basically being given taxpayer funds to pay for its bad bets. As these costs increase, it becomes harder and harder to justify keeping the bank alive vs. just letting it fail. (I suspect the FDIC costs would be pretty easy to calculate; it&amp;rsquo;d be the derivative issues in the economy that would be hard to figure.)&lt;/li&gt;&lt;/ul&gt;There is an awesome self-reinforcement built into this system. If the government produces a program to buy toxic assets and preserve the banking infrastructure, then the economy is likely to improve (or at least improve sooner) resulting in an increased likelihood that the mortgages that are so toxic will actually be paid on. Now, if only they could show how we&amp;rsquo;re going to pay all this back and how long it will take.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-6166058619887842388?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://podcastdownload.npr.org/anon.npr-podcasts/podcast/510289/102457169/npr_102457169.mp3' title='When the government speculates'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/6166058619887842388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=6166058619887842388' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6166058619887842388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6166058619887842388'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2009/04/when-government-speculates.html' title='When the government speculates'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WSa-jToSUFw/SdWlNw_w3hI/AAAAAAAAABw/8rgfni8jCuc/s72-c/Valuation.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-6350430157597382441</id><published>2008-12-02T21:10:00.000-08:00</published><updated>2008-12-03T09:28:32.295-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='iTunes'/><category scheme='http://www.blogger.com/atom/ns#' term='iPhone'/><category scheme='http://www.blogger.com/atom/ns#' term='error'/><category scheme='http://www.blogger.com/atom/ns#' term='0xE8000001'/><title type='text'>iPhone-to-iTunes Fail</title><content type='html'>The May-December relationship between my new iPhone 3G and my G4 cube has quickly and suddenly given up the ghost. Two days after getting the 2.2 software on my phone (which I would have done with my G4 cube, but its 802.1b connection was &lt;em&gt;way&lt;/em&gt; too slow to download the software, and I used my 802.1n on my MacBook Pro), my phone showed the graphic that I needed to plug it into iTunes. Le sigh. So I try to connect to the G4 (which has finally downloaded the software by now), and I get:&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_WSa-jToSUFw/STYVx36T3wI/AAAAAAAAABQ/fIO8nSuEWSQ/s1600-h/iPhoneFail.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 112px;" src="http://3.bp.blogspot.com/_WSa-jToSUFw/STYVx36T3wI/AAAAAAAAABQ/fIO8nSuEWSQ/s320/iPhoneFail.png" border="0" alt=" iTunes could not connect to the iPhone Mr. Herring&amp;rsquo; Æther Engine because an unknown error occurred (0xE8000001)." id="BLOGGER_PHOTO_ID_5275427960077410050" /&gt;&lt;/a&gt;Well, carp. I go back to my MacBook Pro and restore the phone. At this point, I suspect I should be able to hook it back up to the G4, but no. iPhoto realizes it needs to launch, but iTunes spends most of two minutes showing the beachball and finally pops up the same error. Unfortunately, my MacBook Pro, which is a working machine (many enlistments in lots of source), has a pittance of the music / podcasts / playlists / etc. compared to that of the cube. I&amp;rsquo;ve finally given up and copied my various applications over to its iTunes installation, and am about to sync using the laptop instead.&lt;br /&gt;&lt;br /&gt;Also, is it too much to ask to have the backup remember the text correction data that it's learned? I&amp;rsquo;ve taught it not to correct certain words and now it appears I get to do it again. :(&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Updated (12/3):&lt;/span&gt;&lt;br /&gt;After spending a week of trying to get this to work (rebooting the cube, rebooting the iPhone, force quitting the iTunes Helper app, etc.), and finally getting worked up enough to post about it, last night after posting, it finally worked. For some reason, connecting the phone while iTunes was up was causing the error, but connecting the phone first, and then booting iTunes got me to the &amp;ldquo;You need to put in your phone password&amp;rdquo; error, and thence to actual connection (again, having to quit iTunes and ensure the phone was connected and unlocked, and then launching iTunes again). Now, after several hours of USB v1 synching, my phone is mostly back. For some strange reason, the AppStore thinks all of the applications are out of date and is now downloading replacements, but whatever.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-6350430157597382441?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/6350430157597382441/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=6350430157597382441' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6350430157597382441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6350430157597382441'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/12/iphone-to-itunes-fail.html' title='iPhone-to-iTunes Fail'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_WSa-jToSUFw/STYVx36T3wI/AAAAAAAAABQ/fIO8nSuEWSQ/s72-c/iPhoneFail.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7890589229253850789</id><published>2008-07-07T13:20:00.000-07:00</published><updated>2008-07-07T13:34:01.055-07:00</updated><title type='text'>Redefining free</title><content type='html'>From the &lt;a href="http://www.asp.net/"&gt;ASP.net&lt;/a&gt; website, &lt;blockquote&gt;ASP.NET is a free technology that allows anyone to create a modern web site.&lt;/blockquote&gt; and from the &lt;a href="http://www.asp.net/get-started/"&gt;getting started&lt;/a&gt; page, &lt;blockquote&gt;All you need to get started with ASP.NET is the free .NET Framework and the free Visual Web Developer.&lt;/blockquote&gt; I am now wondering whether Microsoft is now issuing also free licenses to Windows, so that as a Macintosh owner, I can actually use the technology. No, not so much. Perhaps they need a superscript asterisk&lt;small&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/small&gt;.&lt;br /&gt;--&lt;br /&gt;&lt;small&gt;&lt;sup&gt;*&lt;/sup&gt;&lt;/small&gt;Requires the purchase of a qualified Microsoft Windows operating system.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7890589229253850789?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.asp.net/get-started/' title='Redefining free'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7890589229253850789/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7890589229253850789' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7890589229253850789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7890589229253850789'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/07/redefining-free.html' title='Redefining free'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-662113572762481777</id><published>2008-07-02T11:25:00.000-07:00</published><updated>2008-07-02T11:56:32.633-07:00</updated><title type='text'>Setup woes</title><content type='html'>Could someone explain to me why installers are often the least thought-through part of the application development process? And more importantly, why, especially at Microsoft, the people who write the software and thus know the limitations it has on file layout (including files comprising the application and its support libraries, but also plugins, caches, temporary user data, persistent user data, configuration files or *puke* registry keys) are usually not the people producing the software installation packages? And even when they are, they think first Test Matrix and second Customer Utility.&lt;br /&gt;&lt;br /&gt;Installation is the very first user experience (after opening the box, in the case of full package product, which rarely happens anymore with web downloads), and is a regular experience as upgrades come out, or more likely, security patches. Getting your installer right enables people to install your application where they want it to. Whether that means an alternate volume (other than the boot volume) or in a user-specific directory (in the case where they&amp;rsquo;re not an admin and don't have access to the root of the volume), or on some network share for multiple people to use, they should be able to get it there, and installer writers are notorious for arbitrarily limiting this.&lt;br /&gt;&lt;br /&gt;Furthermore, custom installer scripts do the most insane things, requiring you to quit apps that have nothing to do with the thing you're installing, or to reboot because they couldn&amp;rsquo;t figure out how to gracefully install in a way that lets running apps continue to work correctly. Gaah!&lt;br /&gt;&lt;br /&gt;I downloaded the &lt;a href="http://www.microsoft.com/mac/downloads.mspx?pid=Mactopia_RDC&amp;fid=803F9438-8DF3-490F-92C6-0E0F92787DB8#viewer"&gt;RDC&lt;/a&gt; update (well, from v2.0 Beta to v2.0 RTW) and tried to install it. It wouldn&amp;rsquo;t allow me to install to my data volume. Why? No reason that I can fathom. (It doesn't have the same installation requirements promise that Mac Office 2008 made; it's an RTW product and free&amp;ndash;they could change it to be whatever they wanted, even 10.4.10. Heck, that would even &lt;em&gt;reduce&lt;/em&gt; the all-important testing matrix.) Even if I use the same hack to fix that, the package was not marked as relocatable, so it would have installed the thing to /Volumes/OtherVolume/Applications, rather than let me nicely select where to put it (i.e., to replace the Beta version that was on the data volume and running fine from there). So, I decided to install it &amp;ldquo;normally&amp;rdquo; and just move it after the fact. While running, it asks me to quit Entourage. Why does it need to quit Entourage? There&amp;rsquo;s no shared libraries between Entourage and RDC. Ah, but it needs to install Microsoft AutoUpdate, and Entourage uses that. There are two obvious problems here: (1) There was nothing in the package that said it was installing two different items, RDC and AutoUpdate. If AutoUpdate is not in the package of RDC, then it should be its own separate line item to be installed. Even if the developers wanted to enforce an (unnecessary) dependency between RDC and AutoUpdate, having it called out would be actually useful. (2) Why does Entourage have to quit in order to update Microsoft AutoUpdate? Even presuming that there was an actual update that was occurring (which seems strange considering I just updated to Office 12.1.1, and would have expected that any updates to AutoUpdate would have been in that package as well). The best part is that your only choice when Entourage is running is to quit Entourage, because the only button available to you in the installer is &amp;ldquo;Continue&amp;rdquo;, and if you click that while Entourage is still up, it just causes the dialog to reappear. I suppose there&amp;rsquo;s always Force Quit.&lt;br /&gt;&lt;br /&gt;So, in summary, the installer fails on several fronts:&lt;ul&gt;&lt;li&gt;relocatable installation&lt;ul&gt;&lt;li&gt;different path&lt;/li&gt;&lt;li&gt;different volume (unless the volume happens to be a system volume of 10.4.9 or later&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;non-admin installation to ~/Applications&lt;/li&gt;&lt;/ul&gt; and is a little annoying about hiding multiple packages with weird installation requirements.&lt;br /&gt;&lt;br /&gt;Guess I&amp;rsquo;m back to fighting the uphill battle.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-662113572762481777?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/662113572762481777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=662113572762481777' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/662113572762481777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/662113572762481777'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/07/setup-woes.html' title='Setup woes'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3374741234019293650</id><published>2008-06-24T16:43:00.000-07:00</published><updated>2008-06-27T13:24:37.554-07:00</updated><title type='text'>Install Mac Office 2008 updates to a data volume</title><content type='html'>The Office 2008 installer package was shipped with an intentional deficiency&amp;ndash;the ability to install to other volumes than a system volume, and furthermore a system that supported the minimum OS requirements of Office 2008&amp;ndash;to work around problems with the OS installer. Those problems only existed on certain versions of Tiger and they were fixed before Office was shipped, but not until after minimum OS version support was announced.&lt;br /&gt;&lt;br /&gt;The unfortunate problem is that, even though the problem existed on a particular version of the OS, the installer logic denies you the ability to install when you&amp;rsquo;re on a version of the OS that doesn&amp;rsquo;t have the problem, which includes 10.4.11 and 10.5.&lt;i&gt;x&lt;/i&gt;. This could be handled by logic in the .dist file hiding in the updater package, but to date (including the 12.1.1 update), is not.&lt;br /&gt;&lt;br /&gt;Here are some instructions that I have successfully used&lt;sup&gt;1&lt;/sup&gt; to get Office updates to install to my data volume, which is where I moved it immediately after installing it:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;After auto-update runs the installer, OK the dialog asking if it can run a script.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Command-Click on the title bar of the installer and choose the folder containing the Installer package, usually named &amp;ldquo;Temporary Items&amp;rdquo;. This should reveal it in the Finder.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Copy the installer package to the Desktop using Option-drag. This is so we can edit the copy and have it in a known, long-term location.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Quit the Installer, since the stock package won&amp;rsquo;t install.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Right click the package on the Desktop, and choose &amp;ldquo;Show Package Contents&amp;rdquo;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Double click the Contents folder.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Open distribution.dist in your favorite text editor.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Replace the body of &lt;code&gt;volumeOs1049OrHigherTest&lt;/code&gt; with &lt;code&gt;return true;&lt;/code&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Save the file; it&amp;rsquo;s read-only by default, so you&amp;rsquo;ll have to force it.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Double click the installer package on the Desktop and install it as normal.&lt;/li&gt;&lt;/ol&gt;One might imagine that if there were a particular problem with the installer in 10.4.9, that one could rewrite the check s.t. the volume check succeeds if &lt;code&gt;(!systemIs1049() || volumeOs1049OrHigher()) &amp;&amp; volumeHasUpdatableVersion()&lt;/code&gt; and still get the limited behavior where it causes problems with the system, and the unlimited behavior where it does not.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;YMMV. Void where prohibited. These are not official Microsoft instructions; I&amp;rsquo;m acting as merely another customer of Microsoft using publicly available knowledge about .dist files.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3374741234019293650?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3374741234019293650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3374741234019293650' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3374741234019293650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3374741234019293650'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/06/install-mac-office-2008-updates-to-data.html' title='Install Mac Office 2008 updates to a data volume'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-431901967453131446</id><published>2008-06-24T07:36:00.000-07:00</published><updated>2008-06-24T16:43:31.887-07:00</updated><title type='text'>On tools and how to sell managers on tools upgrades</title><content type='html'>You would think that because Apple provides their developer tools &lt;i&gt;gratis&lt;/i&gt; that that means they&amp;rsquo;re &amp;ldquo;free.&amp;rdquo; There&amp;rsquo;s a rather marginal cost involved to actually physically making the switch in the build system for your product, larger if you aren&amp;rsquo;t using Apple&amp;rsquo;s whole toolchain&lt;sup&gt;1&lt;/sup&gt;, but in and of itself, that&amp;rsquo;s still pretty cheap.&lt;br /&gt;&lt;br /&gt;The real cost is the ineffable &amp;ldquo;baking time&amp;rdquo; cost for QA to be sufficiently happy with knowing that the toolchain change did not introduce any regressions&lt;sup&gt;2&lt;/sup&gt;. You can immediately run all of your existing unit tests and scenario tests and have a good idea of the quality of your product, true. But, all the manual tests need to be run by hand, and depending on the size of that corpus, it can take a while. Furthermore, not everything gets tested in these official tests&lt;sup&gt;3&lt;/sup&gt;, and some amount of ad hoc testing is generally desired. How much depends on the complexity of your product, the (apparent) understanding of QA of that complexity, and the general paranoia level of QA.&lt;br /&gt;&lt;br /&gt;The best time to sell managers on tools upgrades is at the beginning of a project release, though, for long-term projects, the tools may change multiple times over the course of development. In that case, strategic tools changes even after beta releases may be desirable, but you have to sell them on the strategy: what is the benefit? In some cases, the benefit is inobvious&amp;ndash;e.g., we know they improved the optimizer, but does that actually help us in our scenarios? These need private releases using the new tools just to measure performance changes before there's a benefit demonstrated. In other cases, new compiler or SDK features imply the ability to have a better feature, e.g., conditional linking of 10.5 APIs without having to clunkily redeclare them in your source that's otherwise tied to the 10.4 SDK, or for 10.5/Xcode 3.0 specifically, the ability to add DTrace custom probes. For us&lt;sup&gt;4&lt;/sup&gt;, unless we posted the bug, it&amp;rsquo;s unclear what set of bugs were addressed in a new tools release to know whether any of them would affect us, save through testing. Ultimately, management can weigh the benefit with the known/estimated costs and choose to make the jump, or wait until we start the next release.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;For example, the delta for switching between the 10.4 headers and the 10.5 headers consisted only of having to add a few explicit #includes that we had gotten away with not having because another system-level #include had done that work for us. Deltas between compiler revisions is another story, since the compiler gets monotonically more strict over time.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;Whereas it is significantly more rare that a toolchain change will introduce a regression due to a compiler/linker bug, it is much more likely that such regressions are a product of substandard design that (1) took reliances on unspecified compiler behavior or (2) was luckily not revealed by a previous compiler.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;It should be no surprise that testing matrices are far larger than we have time to test. (Think along the line about testing until the heat death of the universe.) Official testing may only sparsely fill the matrices along tuples of interesting-to-combine technologies.&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt;Whereas some of these toolchains produced by Apple are Open Source, since Microsoft is also in the business of making compilers, it behooves us not to inspect code changes made in a specific revision of the tools.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-431901967453131446?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/431901967453131446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=431901967453131446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/431901967453131446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/431901967453131446'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/06/on-tools-and-how-to-sell-managers-on.html' title='On tools and how to sell managers on tools upgrades'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-1175647569354489943</id><published>2008-06-06T22:52:00.000-07:00</published><updated>2008-06-06T23:01:12.808-07:00</updated><title type='text'>WWDC bound</title><content type='html'>Miller, Mabry and I are headed to SF tomorrow, and I&amp;rsquo;ll be staying through the week for WWDC. I suspect that there will be scads of iPhone developer wannabes&lt;sup&gt;1&lt;/sup&gt;. Me, I&amp;rsquo;ll be focusing on hardware exception handling, tools support for servicing, and Windows integration. Maybe I&amp;rsquo;ll find a few highly technical Mac/Unix heads in the Seattle area who want to come work for &lt;a href="http://www.silverlight.net"&gt;Silverlight&lt;/a&gt;, either with me in the CLR or on the WPF/E team. I really hope, though, that I&amp;rsquo;ll shake this cold before Monday.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;I&amp;rsquo;d be a iPhone dev wannabe, but the CLR team doesn&amp;rsquo;t have an ARM JIT compiler, and the .NET Compact Framework, which does, would probably be the most likely product to support a CoreCLR-like piece of software for the device.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-1175647569354489943?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/1175647569354489943/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=1175647569354489943' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1175647569354489943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/1175647569354489943'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2008/06/wwdc-bound.html' title='WWDC bound'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-5771029560036732217</id><published>2007-12-07T18:10:00.000-08:00</published><updated>2007-12-07T18:20:33.970-08:00</updated><title type='text'>Hex</title><content type='html'>Maybe I&amp;rsquo;m old-fashioned. I&amp;rsquo;m &lt;i&gt;still&lt;/i&gt; using &lt;a href="http://www.mathemaesthetics.com/"&gt;Mathem&amp;aelig;sthetics, Inc&lt;/a&gt;&amp;rsquo;s &lt;a href="http://www.mathemaesthetics.com/ResorcererIndex.html"&gt;Resorcerer 2.4.1&lt;/a&gt; to peer into random files as hex (or ASCII or Unicode). I used the heck out of it in the days of resource forks, which is clearly less important now. Nonetheless, I&amp;rsquo;ve not happened upon an outstanding OS X GUI hex editor. (Not that I&amp;rsquo;ve done &lt;i&gt;that&lt;/i&gt; much research, mind you.)&lt;br /&gt;&lt;br /&gt;Anyone have their own pet program? (Does it do regexp? Does it support binary-format scheme files that you can attempt to apply to the data?)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-5771029560036732217?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/5771029560036732217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=5771029560036732217' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5771029560036732217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/5771029560036732217'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/12/hex.html' title='Hex'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3963498901000129002</id><published>2007-11-29T01:14:00.000-08:00</published><updated>2007-11-29T01:30:50.068-08:00</updated><title type='text'>My SE/30 is alive!</title><content type='html'>Earlier this month, Miller informed me that &lt;a href="http://www.freecycle.org/group/US/Washington/Seattle"&gt;Freecycle Seattle&lt;/a&gt; members can recycle their old machines for free, and indicated that we might be better off without extra old hardware floating around. I countered with the offer that I would get rid of any hardware that wouldn&amp;rsquo;t work (or wasn&amp;rsquo;t worth repairing/saving). I had &lt;a href="http://technosloth.blogspot.com/2006/06/machine-speculation.html"&gt;mused earlier&lt;/a&gt; that it would be sad if my SE/30 didn&amp;rsquo;t work, and now doubly so. But, I got it out of its long storage spot and turned it on and got the blinking question mark diskette icon! Well, all that means is my hard drive isn&amp;rsquo;t spinning up any more. I was able to coax my System 7 era Disk Tools 3.5&amp;rdquo; diskette in (boy, the ejector sounds like it is really having a difficult time working), and got it to boot.&lt;br /&gt;&lt;br /&gt;I pointed it out to Miller, and we both agreed that it&amp;rsquo;s nice to see that some thematic elements that make a Mac a Mac are retained even to this day.&lt;br /&gt;&lt;br /&gt;So, now that I&amp;rsquo;ve wiped off the crud that had grown(?) on it while in storage, is it worth trying to find someone to fix the hard drive? Or is it just something that I should replace? Anyone have an ethernet to old skool Appletalk solution and/or is it worth it to try and hook it up to the internet again?&lt;br /&gt;&lt;br /&gt;Tomorrow, I get to see if my Duo 280 will boot in its docking station.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3963498901000129002?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3963498901000129002/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3963498901000129002' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3963498901000129002'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3963498901000129002'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/my-se30-is-alive.html' title='My SE/30 is alive!'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-6945018161376239622</id><published>2007-11-29T00:34:00.001-08:00</published><updated>2007-11-29T01:07:21.658-08:00</updated><title type='text'>Multipartition Bootcamp</title><content type='html'>I have pretty much always lived with at least two OS partitions and one data partition, because I&amp;rsquo;m always testing some kind of pre-release OS or side-by-side testing app functionality on multiple OSes. Thus I want to be able to share applications and application data between the two OSes on the data partition. The advent of &lt;a href="http://www.apple.com/bootcamp"&gt;Bootcamp&lt;/a&gt; got me to give up my standard operating procedures to test drive running Windows on my laptop. It was great! Well, as great as running Windows is. I could have stayed there, even to the point of using &lt;a href="http://www.mediafour.com/macdrive"&gt;MacDrive&lt;/a&gt; to treat my HFS+ Mac boot volume as combination boot volume and data disk between Mac and Windows... but no, I got greedy.&lt;br /&gt;&lt;br /&gt;Having looked at first &lt;a href="http://www.macgeekery.com/tips/cli/nondestructively_resizing_volumes"&gt;this post&lt;/a&gt;, and then later &lt;a href="http://www.macosxhints.com/article.php?story=20071101065229169"&gt;this hint&lt;/a&gt;, I decided to bring back multiple boot partitions. I tried using the disk utility mechanism to resize the volumes to no avail. I think it always corrupted the MBR that the bootcamp utility set up. I ended up buying &lt;a href="http://www.coriolis-systems.com/iPartition.php"&gt;iPartition&lt;/a&gt; and playing around with it a bunch, but most of my edits would cause Windows to no longer boot either. However, I did manage to come up with an order of operations that makes it work.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Boot from your Leopard disk into its copy of Disk Utility.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Format the disk as HFS+Journaled entirely&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Install Leopard.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;From Leopard, run Bootcamp.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Resize the partition that Bootcamp suggests so that the Leopard partition is the size you ultimately want it to be, and that Windows takes up the rest.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;At this point, instead of rebooting and installing Windows, I booted onto a external USB drive with iPartition installed. (You could boot onto the iPartition boot CD instead.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Using iPartition, I shrank the Windows partition to its ultimate size, and added after it two extra HFS+J partitions for my other OS partition and my data partition.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I put in the Windows Vista RTM DVD and rebooted holding down &amp;ldquo;C&amp;rdquo; to install Vista. It saw the shrunken partition, let me reformat it, and installed.&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;[These instructions are specifically for starting from scratch. If you&amp;rsquo;re trying to do this with pre-existing volumes, I suggest backing them all up to an external device using Disk Utility or better yet, &lt;a href="http://www.bombich.com/software/ccc.html"&gt;Carbon Copy Cloner&lt;/a&gt;, and &lt;a href="http://www.twocanoes.com/winclone/"&gt;WinClone&lt;/a&gt; for bootcamp partitions. You should then be able to restore after the partitions have been finally resized. You may have to still boot from a Windows disk if only to format the bootcamp partition as NTFS (and not bother installing further) before WinClone can restore your backup.]&lt;br /&gt;&lt;br /&gt;The only thing that is somewhat frustrating about this now is that, even though I can boot between Tiger, Leopard, and Vista, as far as Vista is concerned, the drive (disk0) is a MBR drive and has three main partitions, the EFI partition, the Leopard partition, and the Vista partition; the remaining space is &amp;ldquo;unused&amp;rdquo;. Disk Utility while booted into Mac OS X, on th e other hand, happily lists the other partitions. This isn&amp;rsquo;t usually annoying, but MacDrive only sees and can mount the Leopard partition. (Mediafour claims the the partition maps &amp;ldquo;are incorrect or damaged beyond MacDrive&amp;rsquo;s ability to handle.&amp;rdquo;) So if I wanted to still have an available-to-Windows data drive, I&amp;rsquo;m going to have to back up everything, and restart these instructions, only making the original Leopard partition large enough to accommodate the data partition, and move the ultimately Leopard partition to the end. &lt;b&gt;*sigh*&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;If you all have better options, please let me know. &lt;br /&gt;&lt;br /&gt;P.S., Since all this, &lt;a href="http://wiki.onmac.net/index.php/Triple_Boot_via_BootCamp"&gt;yet another post&lt;/a&gt; describes how to do this, and add linux to the mix.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-6945018161376239622?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/6945018161376239622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=6945018161376239622' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6945018161376239622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6945018161376239622'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/multipartition-bootcamp.html' title='Multipartition Bootcamp'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4207021395176322709</id><published>2007-11-28T23:59:00.000-08:00</published><updated>2007-11-29T00:24:35.795-08:00</updated><title type='text'>Cocoa-to-.NET bridge?</title><content type='html'>&lt;a href="http://davidweiss.blogspot.com"&gt;David&lt;/a&gt; also asked, &amp;ldquo;if a developer of a Cocoa application wanted to use a CoreCLR engine, but a Cocoa UI, would they just &amp;lsquo;load the CoreCLR.framework&amp;rsquo; or is there more to it than that.&amp;rdquo;&lt;br /&gt;&lt;br /&gt;There is no technical limitation of CoreCLR that would not allow calls from it into Cocoa (ObjC[++]) or vice versa, in the same way that Cocoa can call into C/C++ normally. The CoreCLR, like the desktop runtime, supports a hosting interface that allows .NET to be hosted in an application environment. Unlike the desktop runtime, CoreCLR is currently only ever hosted (e.g., in the browser control called &lt;a href="http://silverlight.net"&gt;Silverlight&lt;/a&gt;). You can ask the hosting interface to create a function delegate, which will take a managed function and turn it into a C-style function pointer, which, were you to call it, would marshal all the arguments into the managed world and run managed code. Beyond that, you could theorize creating something like the ObjC-Perl bridge, where managed objects were made visible directly to the ObjC runtime&lt;sup&gt;1&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;That said, there are a couple of things that would stymie the average developer if they wanted to do this:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;At the moment, only internal (i.e., Microsoft) clients of CoreCLR have access to the hosting interface.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;The security model of CoreCLR, at least in the Silverlight timeframe, is &lt;a href="http://blogs.msdn.com/shawnfa/archive/2007/05/09/the-silverlight-security-model.aspx"&gt;changing&lt;/a&gt; so that only Microsoft trusted libraries have access to sensitive OS operations, and normal developers&amp;rsquo; code would be sandboxed (much like it would be if it were running in Silverlight).&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I don&amp;rsquo;t have too much insight as to whether these things might change in the future. However, there are a bunch of details that would have to be resolved first, e.g., how to ensure 3&lt;small&gt;&lt;sup&gt;rd&lt;/sup&gt;&lt;/small&gt; party CoreCLR users keep their CoreCLR serviced with the appropriate security fixes. If you&amp;rsquo;re interested, let your request be known in the feedback forums up on &lt;a href="http://silverlight.net"&gt;http://silverlight.net&lt;/a&gt;.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Although, at this point, you&amp;rsquo;d end up with double garbage collection. If an ObjC object held a reference to a managed object, and then lost its last reference, then eventually the pool would get collected, which would then release the (possibly) last reference to the managed object, which would then get collected when the CLR GC occurs.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4207021395176322709?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4207021395176322709/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4207021395176322709' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4207021395176322709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4207021395176322709'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/cocoa-to-net-bridge.html' title='Cocoa-to-.NET bridge?'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7919022695713111697</id><published>2007-11-28T23:25:00.000-08:00</published><updated>2007-11-28T23:59:22.512-08:00</updated><title type='text'>Trimming .NET</title><content type='html'>As I mentioned in a previous post, Silverlight 1.1 will have the CoreCLR component in it to provide a subset of .NET support to control WPF/E (as an alternative to JavaScript, which is available in the currently released Silverlight 1.0). Since &lt;a href="http://davidweiss.blogspot.com"&gt;David&lt;/a&gt; asked &amp;ldquo;how you go about selecting which parts of .NET (which is huge) you decide to port to the CoreCLR framework you are developing,&amp;rdquo; I ended up having to do a little research.&lt;br /&gt;&lt;br /&gt;I joined the CLR team in August of &amp;rsquo;06, and the work to &amp;ldquo;trim&amp;rdquo; the desktop runtime engine and frameworks down to the for-use-in-Silverlight CoreCLR runtime engine and frameworks had already been completed. Back in June(!)&lt;sup&gt;1&lt;/sup&gt; I talked with &lt;a href="http://blogs.msdn.com/jkeljo/"&gt;Jonathan Keljo&lt;/a&gt;, who was the program manager working on this problem, about what went on during this period.&lt;br /&gt;&lt;br /&gt;Ultimately, we cribbed. Instead of trying to figure out for our (CLR) selves, we ended up looking at the pre-existing product that was already a slimmed-down version of .NET: the Compact Framework&lt;sup&gt;2&lt;/sup&gt;. We looked at their surface area and decided to see if we could match theirs. They had foregone features, and we chose similarly. One of the many ways CF manages size changes is just limiting the number of convenience functions.&lt;br /&gt;&lt;br /&gt;When we prototyped the CoreCLR surface area, we ripped out some stuff based on instinct&amp;ndash;what were the biggest (in terms of data and code size) features? We took out the top few (fusion, COM Interop, server GC, debugging support&lt;sup&gt;3&lt;/sup&gt;), and strangely enough, we were close to our size goals.&lt;br /&gt;&lt;br /&gt;On the framework side, we had inherited some subsetting already from the Rotor project. Since the platform adaptation layer (PAL) did not support all of the APIs we were calling in Win32 in the desktop version of the CLR to support some managed libraries, some of those managed layers were removed. In certain cases, we expanded upon the pre-existing PAL. The PAL had been written to be simple and very cross-platform, but knowing we wanted to support the Macintosh, we could supplement it with Macintosh-specific implementations of certain important APIs so as to not have to overly subset.&lt;br /&gt;&lt;br /&gt;It&amp;rsquo;s not the cool-use-of-advanced-software-refactoring-principles answer I might have wanted, but it&amp;rsquo;s reflective of the environment we often find ourselves in&amp;ndash;partially constrained by our desire to leverage previous work, and partially enabled by that same desire.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Yes, I know I&amp;rsquo;m behind.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;I knew this was going to be a cop-out answer, which is why I waited for so long to post. Perhaps I&amp;rsquo;ll get a chance to interview someone from CF and figure out how &lt;i&gt;they&lt;/i&gt; went about their trimming procedures.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;Debugging support isn&amp;rsquo;t so much removed from CoreCLR as split out from the main product so it can be downloaded separately as an SDK.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7919022695713111697?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7919022695713111697/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7919022695713111697' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7919022695713111697'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7919022695713111697'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/trimming-net.html' title='Trimming .NET'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7928198241105852274</id><published>2007-11-02T20:28:00.000-07:00</published><updated>2007-11-02T21:39:01.365-07:00</updated><title type='text'>Back from parental leave</title><content type='html'>I took off from September 21&lt;sup&gt;&lt;small&gt;st&lt;/small&gt;&lt;/sup&gt; on what was going to be a six-week parental leave scheduled to coincide with Miller returning to work, which in her case means teaching Arabic at the UW. Microsoft has a great benefit of one full month of leave is paid, though you can take up to three. I was planning on taking six weeks so I wouldn&amp;rsquo;t spend either a lot of vacation days or being unpaid for a while, since we still haven&amp;rsquo;t sold the condo we moved out of when we bought a home at the end of March. Miller, the trooper that she is, managed to switch to the &amp;ldquo;working mom&amp;rdquo; stage rather well. I, on the other hand, managed very few of the many pet projects I had exuberantly planned for myself while staying at home and watching Mabry. (Let&amp;rsquo;s just say I was frequently interrupted.) In any case, the whole child care thing got settled, and I&amp;rsquo;ve been kicked back to work two weeks early.&lt;br /&gt;&lt;br /&gt;After getting back to work, I made it a point to get out from under the heap of mail I&amp;rsquo;d accumulated over the course of several years before starting any new projects. Some 8,000 semi-read Inbox e-mails later, I now only have a 400 message &amp;ldquo;reviewed&amp;rdquo; folder, which will probably have to have another categorizing pass made on them&lt;sup&gt;1&lt;/sup&gt;. In some cases, it was a matter of realizing I was no longer (if in fact I ever was) in a position to affect some issues, and even though they may have been personally irritating, that I had to pick my battles. I still think I&amp;rsquo;m still going to have to figure out a better way to track conversations to ensure that things get handled correctly.&lt;br /&gt;&lt;br /&gt;Among the pending things to do is to respond to some &lt;a href="https://www.blogger.com/comment.g?blogID=15431842&amp;postID=3733084974731358269"&gt;questions&lt;/a&gt; posed by &lt;a href="http://davidweiss.blogspot.com/"&gt;David Weiss&lt;/a&gt;, and so I think I will do that now and have one less thing on my list&amp;hellip;&lt;br /&gt;&lt;br /&gt;P.S., Mabry has just turned three months and has been vocalizing at me as I&amp;rsquo;ve been writing this. Maybe &lt;em&gt;now&lt;/em&gt; might be just after I play with her a bit. &amp;#9786;&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;During this purge, I think I stumbled on to some what must be n&lt;sup&gt;&lt;small&gt;2&lt;/small&gt;&lt;/sup&gt; or longer algorithms in Entourage, as deleting large swaths of mail when visible in the UI would sometimes take &lt;em&gt;ages&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7928198241105852274?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7928198241105852274/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7928198241105852274' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7928198241105852274'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7928198241105852274'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/back-from-parental-leave.html' title='Back from parental leave'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3347860690754269957</id><published>2007-11-02T17:01:00.000-07:00</published><updated>2007-11-04T11:28:21.915-08:00</updated><title type='text'>My wife’s next OS won’t be Mac OS X…</title><content type='html'>&amp;hellip; and I cannot help but think I am partially to blame, because this is no fault of Apple&amp;rsquo;s, but rather due to deficiencies of Mac Word.&lt;br /&gt;&lt;br /&gt;Here I am, a guy who hasn&amp;rsquo;t been without a personal Mac since &amp;lsquo;90 (and had regular access to them as early as &amp;lsquo;87), a proponent of Mac software at Microsoft since joining in &amp;lsquo;95, and through my own development efforts, making the Microsoft Office experience better on the Mac, and my wife is choosing Windows because of limitations of our Mac software&lt;sup&gt;1&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;Admittedly, Miller&amp;rsquo;s particular requirement is one that is not shared by a large percentage of the users or potential users of Mac Office&lt;sup&gt;2&lt;/sup&gt;&amp;ndash;she needs to collaborate with her students, fellow TAs, and professors on electronic documents written in Arabic. This is by no means a new requirement for her. She began her Arabic study four years back as a requirement for her masters degree in &lt;a href="http://jsis.washington.edu/religion/"&gt;Comparative Religion&lt;/a&gt;, and decided to parlay her studies into a doctoral program in Arabic Studies.&lt;br /&gt;&lt;br /&gt;The problem? Most all work is done in Microsoft Word documents, and Microsoft Word for the Macintosh does not support any right-to-left languages (aka, &amp;ldquo;bi-di&amp;rdquo;). If she works in Mac Word in Arabic, she gets completely disconnected characters&lt;sup&gt;3&lt;/sup&gt;. She has unseated me many, many times at my Windows box in our office so that she can use Windows Word and actually get work done.&lt;br /&gt;&lt;br /&gt;Having worked in the MacBU as a fellow developer, I had a great &amp;ldquo;in&amp;rdquo; to try and get this addressed. Unfortunately, every time I would bring it up, we&amp;rsquo;d do the back-of-the-envelope calculation of development cost&lt;sup&gt;4&lt;/sup&gt; versus the number of users who would use it (upgrade incentive for current users, and new users buying in due the feature). The internal statistics for Mac adoption in Arabic-using (and, to a lesser extent, Hebrew-using) nations did not make for a pretty picture for the &amp;ldquo;leverage&amp;rdquo; this feature would provide&amp;ndash;our development dollars would probably be better spent on other features that had a impact * user-base value.&lt;br /&gt;&lt;br /&gt;Of course, I&amp;rsquo;ve made alternate suggestions based on the software she does have on her Mac. In 10.4, at least, Pages had issues loading/working on Word documents with Arabic. (I know not whether creating documents from scratch work better; I suspect so, since even SimpleText, er, TextEdit does a fair job, AFAICT.)&lt;br /&gt;&lt;br /&gt;The next question is, of course, why use Word documents then if another doc format has better Mac OS X (and theoretically cross-platform) support for Arabic? Answer: Other document types don&amp;rsquo;t don&amp;rsquo;t have ubiquitous, well-known editors. In Miller&amp;rsquo;s specific case, all U.W. students have access to Word for both platforms, and the labs have more than enough Windows boxes. Most Arabic students/professors don&amp;rsquo;t have this problem because they don&amp;rsquo;t use Macs. (Nor is this really an incentive to do so.) They do not have any reason to switch document formats for the (apparently-)minority class of Mac users.&lt;br /&gt;&lt;br /&gt;I suppose, though, the issue isn&amp;rsquo;t completely closed. It&amp;rsquo;s possible someone will comment that we need to try some specific software to solve the problem. OTOH, it still may be that Miller may end up with a Macintosh computer for her next machine, but if so, it&amp;rsquo;ll probably be BootCamped to some form of Windows.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Updated:&lt;/b&gt; I wanted to show some examples, but not knowing Arabic, I needed some assistance. So, the Arabic word romanized as &amp;ldquo;mumkin&amp;rdquo; (meaning &amp;ldquo;possible&amp;rdquo;), looks like &lt;a href="http://bp1.blogger.com/_WSa-jToSUFw/Ry4cc73yCYI/AAAAAAAAAAs/Bo9A5QTlYcM/s1600-h/TextEditArabic.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp1.blogger.com/_WSa-jToSUFw/Ry4cc73yCYI/AAAAAAAAAAs/Bo9A5QTlYcM/s320/TextEditArabic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5129068309055146370" /&gt;&lt;/a&gt; in TextEdit, but like &lt;a href="http://bp2.blogger.com/_WSa-jToSUFw/Ry4cdL3yCZI/AAAAAAAAAA0/XyOPtkuGvH4/s1600-h/WordArabic.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_WSa-jToSUFw/Ry4cdL3yCZI/AAAAAAAAAA0/XyOPtkuGvH4/s320/WordArabic.jpg" border="0" alt=""id="BLOGGER_PHOTO_ID_5129068313350113682" /&gt;&lt;/a&gt; in Word. Thanks to Miller for helping me out with these.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Arguing protectionism here would be a little silly. Windows Word gets a fair amount of this functionality from Windows, so if Microsoft Office was a 3&lt;sup&gt;&lt;small&gt;rd&lt;/small&gt;&lt;/sup&gt; party, the Word team would have been in a similar pickle on Mac OS X, at least until relatively recently.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;And if you have hard data otherwise, please, please, please let me know so I can convince the Powers-That-Be that there&amp;rsquo;s a business case to addressing the problem.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt;Arabic writing is like cursive in that characters look different if they begin a word, are in the middle of a word, or are at the end of the word. However, unlike cursive, they are &lt;em&gt;seriously&lt;/em&gt; different, and the word becomes very hard to recognize, not to mention the layout problems that are caused (because they no longer are the same width).&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt;The cost has changed significantly over the course of years. Seven years ago, our best bet would have been to port the entire Windows support for ligatures (which Windows Word uses without having to implement itself), and bi-di support from Word. That would have been quite expensive. Nowadays, despite not being able to just replace the Word layout engine with ATSUI (so that we could continue to guarantee identical layout across versions/OSes), we could theoretically offload some of the work to ATSUI and then ask it what work it did and translate that into our own layout world. This is obviously less expensive, but still involved and prone to being a bug farm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3347860690754269957?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3347860690754269957/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3347860690754269957' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3347860690754269957'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3347860690754269957'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/11/my-wife-next-os-won-be-mac-os-x.html' title='My wife&amp;rsquo;s next OS won&amp;rsquo;t be Mac OS X&amp;hellip;'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp1.blogger.com/_WSa-jToSUFw/Ry4cc73yCYI/AAAAAAAAAAs/Bo9A5QTlYcM/s72-c/TextEditArabic.jpg' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2970966858259336548</id><published>2007-07-30T05:29:00.000-07:00</published><updated>2007-07-30T17:07:01.853-07:00</updated><title type='text'>Little Mabry</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://bp3.blogger.com/_WSa-jToSUFw/Rq3anXZbKXI/AAAAAAAAAAc/dueym_beohs/s1600-h/942475750_2552fe3e3a.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp3.blogger.com/_WSa-jToSUFw/Rq3anXZbKXI/AAAAAAAAAAc/dueym_beohs/s320/942475750_2552fe3e3a.jpg" border="0" alt="Mabry Parker Herring at about 18 hours old"id="BLOGGER_PHOTO_ID_5092967123456305522" /&gt;&lt;/a&gt;&lt;br /&gt;Miller and I (officially) became parents over the weekend. Mabry Parker Herring was born Saturday (7/28) at 6:28pm PDT. She was 6 lbs., 10 oz., and 20&amp;rdquo; long. She and her mother are both sleeping while I&amp;rsquo;m taking night duty, and stealing a little computer time. There&amp;rsquo;s a &lt;a href="http://www.flickr.com/photos/15661888@N00/sets/72157601089335169/"&gt;photoset&lt;/a&gt; up on &lt;a href="http://www.flickr.com"&gt;Flickr&lt;/a&gt;.&lt;br /&gt;&lt;small&gt;Photo provided by &lt;a href="http://www.flickr.com/photos/robgmsft/"&gt;Rob&lt;/a&gt;&lt;/small&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2970966858259336548?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2970966858259336548/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2970966858259336548' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2970966858259336548'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2970966858259336548'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/07/little-mabry.html' title='Little Mabry'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp3.blogger.com/_WSa-jToSUFw/Rq3anXZbKXI/AAAAAAAAAAc/dueym_beohs/s72-c/942475750_2552fe3e3a.jpg' height='72' width='72'/><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4658431494320381754</id><published>2007-07-07T14:27:00.000-07:00</published><updated>2007-07-07T15:08:54.936-07:00</updated><title type='text'>Iced americano and a little brie</title><content type='html'>I&amp;rsquo;m (mostly) taking a day off from tech today. It&amp;rsquo;s another fabulous summer day in Seattle. Started the morning off with baked eggs from the &lt;a href="http://www.hispotcafe.com/"&gt;Hi Spot&lt;/a&gt;, found my way onto a &lt;a href="http://transit.metrokc.gov/tops/bus/schedules/s002_0_.html"&gt;number 2&lt;/a&gt; to downtown, wandered through the &lt;a href="http://www.seattle.gov/parks/parkspaces/FreewayPark.htm"&gt;Freeway Park&lt;/a&gt; for I think the very first time(!) to the &lt;a href="http://www.wsctc.com/"&gt;Convention Center&lt;/a&gt;, to &lt;a href="http://www.stamp-coin.com/"&gt;The Stamp and Coin Shop&lt;/a&gt;, where I finally purchased a &lt;a href="http://www.lighthouse.us/epages/lighthouse_us.storefront/4690078f00f6f49a271bc0a801620681/Product/View/G000031"&gt;coin album&lt;/a&gt; to finally get my coins out of the shoeboxes and converted chocolate boxes and into something nice.&lt;br /&gt;&lt;br /&gt;Another number 2, and I&amp;rsquo;m back at home, and somewhere I get the desire to go jogging. (Where did THAT come from?) Made it all of five blocks before switching back to walking and headed home. While our housemates were hosting their birthing class reunion, I finally got the &lt;a href="http://brookstone.com/store/product.asp?product_code=376186"&gt;hammock&lt;/a&gt; my parents had given me many years ago for my birthday (when I lived in a condo with nowhere to put it) installed in our back yard. On my way back in, I pilfered a little brie from the remnants of the reunion treats, and now I&amp;rsquo;m off to take Michael&amp;rsquo;s &lt;a href="http://www.encycleopedia.com/index.cfm?pid=23&amp;edID=8"&gt;folding bike&lt;/a&gt;, which Miller borrowed on my behalf, to &lt;a href="http://www.2020cycle.com/"&gt;2020 Cycle&lt;/a&gt; to get patched, and I&amp;rsquo;m thinking a little iced americano from &lt;a href="http://seattle.wifimug.org/?Kateys"&gt;Katy&amp;rsquo;s&lt;/a&gt; will go well with the remaining taste of brie. Mmm&amp;hellip; good day so far.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4658431494320381754?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4658431494320381754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4658431494320381754' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4658431494320381754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4658431494320381754'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/07/iced-americano-and-little-brie.html' title='Iced americano and a little brie'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-309067279444787906</id><published>2007-07-02T13:44:00.000-07:00</published><updated>2007-07-02T14:44:58.604-07:00</updated><title type='text'>MacBook Pro HD upgrade</title><content type='html'>I&amp;rsquo;d been running into problems recently, having my builds run me entirely out of existing hard drive space on my 160GB hard drive, so I broke down and ordered a &lt;a href="http://www.mcetech.com/msperformance/"&gt;250GB drive from MCETech&lt;/a&gt;. This is maybe the fourth time I&amp;rsquo;ve done the whole move-the-internal-drive-to-an-external-enclosure-and-transfer-partitions process, so one might think I&amp;rsquo;d have it down by now. Alas, not quite.&lt;br /&gt;&lt;br /&gt;First, an annoying detail I hadn&amp;rsquo;t noticed about the drive enclosure&amp;ndash;it requires &lt;em&gt;two&lt;/em&gt; USB connections: one for power, and one for data (and probably more power). This makes it a little more unwieldy, and furthermore, since I often use a USB-based laptop mouse, problematic. However, I generally live without external storage, so I&amp;rsquo;m not too put off.&lt;br /&gt;&lt;br /&gt;The actual hardware transferring process was actually pretty much a breeze. I&amp;rsquo;d dug into my TiBook before, but the MBP is new, and so it was nifty to get in and see how it was put together. I have to say that the side, back and sunken bottom screws seem to be a much better system for maintaining a secure case. Kudos to those Apple hardware guys. My only two problems here were that I didn&amp;rsquo;t know exactly how much force it would take to detach the case top from the clips (and was probably overly gentle and thus not getting anywhere for several minutes), and that I was missing one of the rubber grommets that hold the hard drive in place. (In the latter case, it is entirely possible that it jumped ship as I removed the old drive from the case, but a search of my workspace did not reveal it.)&lt;br /&gt;&lt;br /&gt;The rest of the process has been a bit of a drag though. The first concern was converting from a BootCamp-enabled setup (a BootCamp-created partition and then everything else on one HFS+ partition) over to a different layout more inline with my historical preferences: at least two HFS+ boot partitions (&amp;gt;= 20GB) to host the current released OS X and one for a pre-release OS X, one large data partition to host data. I ended up taking that template and adding a small case-sensitive partition for some testing purposes, and room enough to maintain the previous BootCamp-created partition. After some small amount of figuring, I tell Disk Utility to do its magic, and I&amp;rsquo;m ready to start transferring.&lt;br /&gt;&lt;br /&gt;Even though I only had the one big HFS+ partition for Mac OS X things, I had still maintained some segregation left over from the TiBook days. So I moved everything in my &amp;ldquo;Stuff&amp;rdquo; directory and my source enlistments to the new data drive. This ended up dying in the middle because, despite the fact that Microsoft Entourage was shut down, reminders were still turned on, which meant that the background Database Daemon kept a lock on my identity&amp;rsquo;s database. Not quite thinking correctly, I re-dragged the Microsoft User Data folder over to the new partition. See, it had succeeded moving some items, but not all items, and as such, I blew away other parts of my identity, including my rules&lt;sup&gt;1&lt;/sup&gt;. I had been moving rather than copying, because I would need to trim down the original drive because it wouldn&amp;rsquo;t fit on a 25GB partition. Drat. Well, the rest copied successfully, and then I was able to Carbon Copy Clone the original OS disk over to the new, smaller partition. This too was problematic, in comparision to older times&amp;ndash;having the two boot partitions means that you can boot off of one to transfer the other, but I ended up having to use target disk mode and my mostly-unused G5 in my office to accomplish the same thing. Once there, I made happy symlinks in my home directory to the Documents, Movies, Pictures (etc.) folders on the data partition, and the Mac-side was good to go.&lt;br /&gt;&lt;br /&gt;This is where I started running afoul of missing support for moving BootCamp partitions around. Disk Utility wouldn&amp;rsquo;t touch the thing&lt;sup&gt;2&lt;/sup&gt;. I downloaded &lt;a href="http://www.twocanoes.com/winclone"&gt;WinClone&lt;/a&gt;, but ran into &lt;a href="http://www.twocanoes.com/forums/viewtopic.php?t=460"&gt;this problem&lt;/a&gt;. At this point, I gave up on Windows for the moment, knowing I could always pull it off the external drive later.&lt;br /&gt;&lt;br /&gt;Now it was onto installing Leopard in the space lovingly devoted to it. I rebooted into the installer DVD and it complained it couldn&amp;rsquo;t install on a drive formatted in this fashion. &amp;ldquo;Argh!&amp;rdquo; A quick inspection in Disk Utility showed that it was, in fact, partitioned using Apple Partion Table rather than GUID Partition Table. Then, of course, I slapped my head, since I remember having noticed that when I looked at the completely clean new drive, but apparently when I repartitioned it, I neglected to switch which partition scheme I used.&lt;br /&gt;&lt;br /&gt;After much grumbling, I used Disk Utility to image the two data-containing partitions back onto the external drive, re-repartitioned using the right partition scheme this time, and spent quality time trying to get the images back onto the drives. In the case of the OS partition, for some reason, both Carbon Copy Cloner and Disk Utility balked many times in a row at the restore, and the first restore that took had for some reason decided to ignore the permissions on the disk image, resulting in a non-functional OS. (It would drop into some boot-time Unix console, try several times to load some services, and ultimately fail.) This morning, I am finally back to the point where I can install Leopard.&lt;br /&gt;&lt;br /&gt;I know that this is not a typical procedure for non-technical people, but I really do wish there were an tool, possibly part of the Migration tool, or maybe the Disk Utility (or, obviously, a third-party solution), that let you batch move/resize partitions so that I could do this in one stop. It would be especially cool if it allowed me to split an existing disk into two separate disks by which sets of the file system I wanted transferred to which sides.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;I think the rules regeneration count is now up to eight. At least this time, it was my fault, and not some obscure un-diagnosable rules corruption.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;On the other hand, the Startup Disk would still recognize the drive as a bootable Windows partition, though if you selected it and tried to boot it now that it was a USB-based drive, it would bring up the flashing I&amp;rsquo;m-missing-a-system icon at boot.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-309067279444787906?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/309067279444787906/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=309067279444787906' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/309067279444787906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/309067279444787906'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/07/macbook-pro-hd-upgrade.html' title='MacBook Pro HD upgrade'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4993736250826179410</id><published>2007-06-28T09:10:00.000-07:00</published><updated>2007-06-28T09:26:37.154-07:00</updated><title type='text'>How well does your voting system work?</title><content type='html'>&lt;a href="http://bp2.blogger.com/_WSa-jToSUFw/RoPg7UcU6TI/AAAAAAAAAAU/-b5EbML0MpY/s1600-h/PlurClon6.bmp"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp2.blogger.com/_WSa-jToSUFw/RoPg7UcU6TI/AAAAAAAAAAU/-b5EbML0MpY/s400/PlurClon6.bmp" border="0" alt=""id="BLOGGER_PHOTO_ID_5081152114308475186" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href="http://rangevoting.org/IEVS/Pictures.html"&gt;Yee pictures&lt;/a&gt; show off graphically how various &lt;a href="http://en.wikipedia.org/wiki/Voting_system"&gt;election mechanisms&lt;/a&gt;&amp;ndash;e.g., &lt;a href="http://en.wikipedia.org/wiki/Plurality"&gt;plurality&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Instant-runoff_voting"&gt;instant runoff voting&lt;/a&gt;, as well as a collection of other esoteric methods&amp;ndash;actually respond to the will of the populace. It&amp;rsquo;s interesting to see what happens in the case of ties and when the vote is split for several mechanisms (see the result for plurality above). It&amp;rsquo;s a good reminder about how problematic plurality is, but it&amp;rsquo;s also a good wake-up call for IRV supporters who think that ties won&amp;rsquo;t be a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4993736250826179410?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://rangevoting.org/IEVS/Pictures.html' title='How well does your voting system work?'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4993736250826179410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4993736250826179410' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4993736250826179410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4993736250826179410'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/06/how-well-does-your-voting-system-work.html' title='How well does your voting system work?'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp2.blogger.com/_WSa-jToSUFw/RoPg7UcU6TI/AAAAAAAAAAU/-b5EbML0MpY/s72-c/PlurClon6.bmp' height='72' width='72'/><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-3733084974731358269</id><published>2007-06-12T18:24:00.000-07:00</published><updated>2007-06-12T18:32:14.503-07:00</updated><title type='text'>By the gleam of yonder moon</title><content type='html'>&lt;a href="http://bp0.blogger.com/_WSa-jToSUFw/Rlb1ZMgcSnI/AAAAAAAAAAM/_6XzELSAwPg/s1600-h/logo.jpg"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;" src="http://bp0.blogger.com/_WSa-jToSUFw/Rlb1ZMgcSnI/AAAAAAAAAAM/_6XzELSAwPg/s320/logo.jpg" border="0" alt="Microsoft&amp;reg; Silverlight&amp;trade;"id="BLOGGER_PHOTO_ID_5068508243854903922" /&gt;&lt;/a&gt;&lt;br /&gt;Welcome to a new age of .NET. With the Customer Technology Preview (CTP) of Silverlight&amp;trade; 1.1, the first commercial cross-platform Microsoft&amp;reg; .NET&amp;trade; components became available. Furthermore, my tongue is no longer officially tied. The cat is out of the bag, and thus I can now clue you all in on what I&amp;rsquo;ve been doing in the last year.&lt;br /&gt;&lt;br /&gt;Since there&amp;rsquo;s already been quite a bit of posting on the subject of Silverlight, I figured I&amp;rsquo;d fill in some of the details about its composition and some of the nomenclature, since, even within Microsoft, it&amp;rsquo;s not completely obvious what&amp;rsquo;s in the package at first glance.&lt;br /&gt;&lt;br /&gt;&lt;table border="1"&gt;&lt;tr&gt;&lt;th colspan="5"&gt;&lt;center&gt;Silverlight&lt;/center&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th rowspan="2"&gt;&lt;center&gt;Intro-&lt;br /&gt;duced Version&lt;/center&gt;&lt;/th&gt;&lt;th rowspan="2"&gt;&lt;center&gt;Level&lt;/center&gt;&lt;/th&gt;&lt;th colspan="3"&gt;&lt;center&gt;Technology&lt;/center&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;&lt;center&gt;Name&lt;/center&gt;&lt;/th&gt;&lt;th&gt;&lt;center&gt;Codename&lt;/center&gt;&lt;/th&gt;&lt;th&gt;&lt;center&gt;Description&lt;/center&gt;&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="2"&gt;1.0&lt;/td&gt;&lt;td rowspan="2"&gt;0&lt;br /&gt;(Native)&lt;/td&gt;&lt;td&gt;WPF/E&lt;/td&gt;&lt;td&gt;Jolt&lt;sup&gt;1&lt;/sup&gt;&lt;/td&gt;&lt;td align="left"&gt;Windows Presentation Foundation / Everywhere is the browser plug-in variant of its &lt;a href="http://msdn2.microsoft.com/en-us/library/ms754130.aspx"&gt;bigger brother&lt;/a&gt; in Windows. It is &lt;a href="http://msdn2.microsoft.com/en-us/library/ms747122.aspx"&gt;XAML&lt;/a&gt;-based presentation engine.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Windows Media codecs&lt;/td&gt;&lt;td align="left"&gt;These allow for high speed video streaming inside a Silverlight solution.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td rowspan="4"&gt;1.1&lt;/td&gt;&lt;td rowspan="4"&gt;1&lt;br /&gt;(Managed support)&lt;/td&gt;&lt;td&gt;CoreCLR&lt;/td&gt;&lt;td&gt;&lt;a href="http://en.wikipedia.org/wiki/Telesto_%28moon%29"&gt;Telesto&lt;/a&gt;&lt;sup&gt;2&lt;/sup&gt;&lt;/td&gt;&lt;td align="left"&gt;The core execution engine and platform adaptation components of .NET. These are the only parts of the managed support that are native; the rest are all managed libraries. Officially, the CoreCLR project is also responsible for the Base Class Libraries (BCL), which has been reduced for both size and portability reasons.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;UIFX&lt;/td&gt;&lt;td align="left"&gt;The standard framework libraries, similarly reduced from the Desktop for both size and portability reasons.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;.NET Language Runtimes&lt;/td&gt;&lt;td align="left"&gt;Managed libraries to support C# and VB.NET&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;DLR&lt;/td&gt;&lt;td align="left"&gt;Dynamic Language Runtime support libraries&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;The &amp;ldquo;level-1&amp;rdquo; components of Silverlight are entirely to provide a managed programming model for WPF/E, as an alternative to its built-in JScript model. The part of Silverlight I&amp;rsquo;ve been working on is the CoreCLR component, focusing on Mac OS X integration, but have been banding together with my Mac counterparts on the other related teams (mostly WPF/E, with a little bit of UIFX) to make sure the collective Silverlight story on the Mac is a good one. If you have feedback for us, head on over to the &lt;a href="http://silverlight.net/forums/"&gt;Silverlight.net forums&lt;/a&gt;, specifically the &lt;a href="http://silverlight.net/forums/17.aspx"&gt;Programming with .NET forum&lt;/a&gt;, and let us know. It may take more than one of us to give a full answer (for example, I know much more about how we handle native exceptions on the Mac than about what XAML you&amp;rsquo;d need to use for a particular operation), but we&amp;rsquo;ll help if we can.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;In the era before marketing took over code-name generation, we could have tributes to &lt;a href="http://www.joltenergy.com"&gt;fine beverage products&lt;/a&gt;. However, since code names regularly leak out of Microsoft, and out of worry that we will get stuck with a trademark lawsuit for something that isn&amp;rsquo;t the name we&amp;rsquo;re ultimately going to use, marketing now comes up with names, presumably with some kind of trademark search ahead of time to verify that we&amp;rsquo;re not going to run afoul of someone else&amp;rsquo;s.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;No, &amp;ldquo;Silverlight&amp;rdquo; isn&amp;rsquo;t the &amp;ldquo;the gleam of yonder (Telesto) moon,&amp;rdquo; but I figured it sounded good.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-3733084974731358269?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://silverlight.net' title='By the gleam of yonder moon'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/3733084974731358269/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=3733084974731358269' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3733084974731358269'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/3733084974731358269'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/05/by-gleam-of-yonder-moon.html' title='By the gleam of yonder moon'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://bp0.blogger.com/_WSa-jToSUFw/Rlb1ZMgcSnI/AAAAAAAAAAM/_6XzELSAwPg/s72-c/logo.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-831461161280197940</id><published>2007-06-11T14:14:00.000-07:00</published><updated>2007-06-11T14:37:45.611-07:00</updated><title type='text'>LOLCode.NET</title><content type='html'>Courtesy of my coworker, Andrew, who wrote the following on my whiteboard:&lt;blockquote&gt;Plz Use namespace System&lt;br /&gt;Awsum! KThxBye!&lt;/blockquote&gt;I don&amp;rsquo;t know if I have the heart to tell him that his syntax doesn&amp;rsquo;t appear to match the only known &lt;a href="http://www.lolcode.com/implementations/lolcode.net"&gt;LOLCode.net&lt;/a&gt; implementation. Further alas that it&amp;rsquo;s GPL&amp;rsquo;d, which means that per Microsoft&amp;rsquo;s &lt;a href="http://en.wikipedia.org/wiki/Chinese_wall#Computer_science"&gt;Chinese-wall&lt;/a&gt;-like policy, if I desire to keep my job, I can&amp;rsquo;t even look at the implementation. Ah, well. I guess, IM NOT IN YR CODZ.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-831461161280197940?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://icanhascheezburger.com/2007/06/01/lolcode/' title='LOLCode.NET'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/831461161280197940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=831461161280197940' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/831461161280197940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/831461161280197940'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/06/lolcodenet.html' title='LOLCode.NET'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-6667282604083380169</id><published>2007-05-24T20:27:00.000-07:00</published><updated>2007-05-24T21:04:13.566-07:00</updated><title type='text'>reCAPTCHA</title><content type='html'>&lt;p&gt;After code reviewing some large number of files, I took a slight detour over to &lt;a href="http://boingboing.net"&gt;BoingBoing&lt;/a&gt; to an article on &lt;a href="http://www.networkworld.com/community/?q=node/15522"&gt;an alternative CAPTCHA mechanism&lt;/a&gt;. Instead of using a normal &lt;a href="http://en.wikipedia.org/wiki/CAPTCHA"&gt;CAPTCHA&lt;/a&gt; system, typing in known words that have been graphically altered so that a computer couldn&amp;rsquo;t interpret it, you type in unknown words gathered via &lt;a href="http://en.wikipedia.org/wiki/Optical_character_recognition"&gt;OCR&lt;/a&gt; that no computer has interpreted, but that the reCAPTCHA system has a pretty high liklihood index on knowing what at least one of them is. You type in two words. You get the &amp;ldquo;known&amp;rdquo; one right, and you get in, and your submission for the other word is kept to help determine what the other word is. It&amp;rsquo;s a pretty interesting idea. Plus, they&amp;rsquo;re using it to help digitize documents in the public domain that have been scanned, but that OCR has been hard pressed to convert them&amp;ndash;a good cause.&lt;p&gt;&lt;p&gt;In my playing around with the example on the site, I noticed some oddities:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;You can fudge at least one of the words. There was an instance of &amp;ldquo;1980&amp;rdquo; and another word. I guessed that the other word was the &amp;ldquo;known&amp;rdquo; word, typed that in verbatim, and passed in &amp;ldquo;1988&amp;rdquo; instead. The reCAPTCHA system said I was in like Flynn.&lt;/li&gt;&lt;li&gt;You are likely to get partial or multiple words instead. Since it&amp;rsquo;s OCR that&amp;rsquo;s already known to not interpret it correctly, it may not even get the correct word break and when you are instructed to enter &amp;ldquo;two words,&amp;rdquo; you may have to enter in three or four words, or partial words.&lt;/li&gt;&lt;li&gt;Sometimes there are odd symbols in the older texts. There was a word that had an &amp;lsquo;&amp;aelig;&amp;rsquo; in it. I dutifully asked the International menu to show me my Keyboard Viewer (since I &lt;em&gt;never&lt;/em&gt; remember the Option-key combination for those diareses), found the character, and submitted the word exactly as written. It called me correct, but I wager that normal people won&amp;rsquo;t bother to use those high-falutin&amp;rsquo;, old-fangled characters, and just type &amp;ldquo;ae&amp;rdquo;. It might be close enough, but is it right?&lt;/li&gt;&lt;li&gt;Use of alternative symbols might get you an error. There was a word that clearly had a right-side closing single quote character used as a possesive or a contraction. However, I dutifully entered in the curley-quote version and was rebuffed! I guess the straight quotes is what they wanted.&lt;/li&gt;&lt;li&gt;Older texts have spelling mistakes or perhaps older or alternative spellings. I wonder how many people are going to bother making sure they type that extra &amp;lsquo;t&amp;rsquo; that doesn&amp;rsquo;t belong; will it be enough for the verification code to preserve the original text&amp;rsquo;s spelling?&lt;/li&gt;&lt;li&gt;Some of those OCR documents are hard to read as it is, and blurring it makes it harder. There were several times where I had to refresh the reCAPTCHA many times in a row because it was just impossible to read. I wonder what their mechanism is when many, many people have avoided making a claim, or made irreconcilable claims as to what that word is. Does some poor shmuck have to go back and look at it manually? Or do they start limiting the blurring? Hmm&amp;hellip;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;All in all, though, it still seemed like it provided a very reasonable security while providing a nifty public service.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-6667282604083380169?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://recaptcha.net' title='reCAPTCHA'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/6667282604083380169/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=6667282604083380169' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6667282604083380169'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/6667282604083380169'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/05/recaptcha.html' title='reCAPTCHA'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-7850356836655221033</id><published>2007-02-06T15:38:00.000-08:00</published><updated>2007-02-06T15:41:25.959-08:00</updated><title type='text'>Standard User (UAC) + Network Home Folder = #)$(*@%</title><content type='html'>I am in month seven of using Vista, having installed Beta 1 on my sole Windows development box as a part of being a Good Dogfooder&amp;trade;.&lt;sup&gt;1&lt;/sup&gt; As a self-styled security afficionado, I elected to have my regular domain account be a &lt;a href="http://technet.microsoft.com/en-us/windowsvista/aa906021.aspx#EIC"&gt;Standard User account&lt;/a&gt;, using a local machine account as the administrator account. Now, when I want to do anything that requires administrator access, I&amp;rsquo;m prompted with a request for credentials.&lt;br /&gt;&lt;br /&gt;When I first saw these, I felt comforted. I was used to seeing the same on my Mac OS X boxes when an application was requesting admin or root privileges. However, the sheer number of times that I needed to actually acquire administrative access to my machine surprised me. I would often think, &amp;ldquo;Does this thing really need administrative privileges to work?&amp;rdquo; In a lot of cases, the answer was, &amp;ldquo;Yes,&amp;rdquo; but in some, it seems that some more work could be done to either allow an application to install/run with user privileges (e.g., browser plugins) or to isolate preference options according to whether they need the dreaded &amp;ldquo;elevation&amp;rdquo;&lt;sup&gt;2&lt;/sup&gt;. Ultimately, though, that work can be done, and application developers and IT folks have some Microsoft-provided tools that can help them make their applications/plugins/whatever behave well in this environment.&lt;br /&gt;&lt;br /&gt;Later, I would increase my Good Dogfooder&amp;trade; karma (or reduce it, depending on whether you subscribe to the only-negative-karma idea) by enrolling in a pilot program to try out redirecting user folders to a network share. It pretty much works as advertised. Everything that would be in &lt;code&gt;C:\Users\nathanh.000&lt;/code&gt; gets redirected to a network volume that my domain account has read/write access to. It takes a bit of time to log in, but no matter where I log in, I have the same information. Similarly, there a few applications and products that don&amp;rsquo;t handle this gracefully... applications that like to install shortcuts on the Desktop, for instance, are annoying unless they&amp;rsquo;re installed somewhere on my user directory (which is rarely, if ever) or installed in the &lt;em&gt;same location&lt;/em&gt; on &lt;em&gt;every machine&lt;/em&gt; I log in to. Again, I can report back my woes and, at least with Microsoft-written applications, have a shot at having them work better in that environment.&lt;br /&gt;&lt;br /&gt;Alas, as is usually the case with living on the bleeding edge, there&amp;rsquo;s the blood. Dogfooding at Microsoft is &lt;em&gt;de rigeur&lt;/em&gt;, and there will always be some annoyances, though the product teams do a lot to keep them to a minimum. My problem is the confluence of elevation in the presence of the network home folder.&lt;br /&gt;&lt;br /&gt;Let&amp;rsquo;s review: My domain account is my main account, and is a standard user, not an administrator. My administrative account is a local machine account, and has no domain privileges at all. My home directory is a mounted network drive where my domain account has privileges, but &lt;em&gt;not&lt;/em&gt; my local machine administrative account. Do you see what&amp;rsquo;s coming?&lt;br /&gt;&lt;br /&gt;Situation #1: Installing from a network share.&lt;br /&gt;&lt;br /&gt;I can browse to some UNC path from my domain account, and click on an installer. The installer, UAC-aware as it is, puts up the elevation dialog, since it has to install into some machine-wide areas. I enter in my local administrator account and password. Voil&amp;agrave;, the installer now runs as if it is the local administrator account, and instantly no longer has access to the network share, since my local administrator account doesn&amp;rsquo;t have privileges. Fortunately, this is usually only an annoyance, as most of the time, I am presented with a dialog complaining that the installer doesn&amp;rsquo;t have access to the share, and could I please enter in credentials of someone who does. I find it odd that I have to enter in my own credentials when I&amp;rsquo;m already logged in as myself.&lt;br /&gt;&lt;br /&gt;Situation #2: Installing into the home directory&lt;br /&gt;&lt;br /&gt;In the case where an installer needs to install into some machine-wide area as well as the home directory, I&amp;rsquo;m more stuck. I have to elevate to run the installer, but as soon as I do that, the installer loses access to the home directory. For some reason, in that case, it doesn&amp;rsquo;t present the network-access dialog, and things just fail to work.&lt;br /&gt;&lt;br /&gt;In one such case, a program installed most of its items, but then failed to create a startup shortcut for me. &amp;ldquo;No matter,&amp;rdquo; I thought, &amp;ldquo;I&amp;rsquo;ll just copy it over myself.&amp;rdquo; I noticed that the shortcut I needed was already in my Start menu, so I browsed to it and copied it. I then browsed to the All Users startup items folder and tried to paste it as a shortcut. I then get the following dialog:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Windows cannot create a shortcut here. Do you want a shortcut to be placed on the Desktop instead? [Yes] [No]&lt;/blockquote&gt;&lt;br /&gt;&amp;ldquo;Hunh,&amp;rdquo; I think, and choose, &amp;ldquo;Yes.&amp;rdquo; Personally, I thought it should have just brought up an elevation dialog and let me paste the shortcut, but no matter. There is more than one way to do it. So, I then try to drag the shortcut nicely pasted onto the Desktop to the All Users Startup Items folder. Happily, I get the elevation notice. I think, &amp;ldquo;Great! Now I&amp;rsquo;ll have access to put this item here.&amp;rdquo; But I had not thought it through, for while I gained access to put the shortcut there, I simultaneously lost access to its source. Thus, after another elevation dialog (I don&amp;rsquo;t think that one should be necessary), I get the following dialog:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You don't have permission to copy files to this location over the network. You can copy files to the Documents folder and then move them to this location.&lt;/blockquote&gt;&lt;br /&gt;I take issue with this dialog on two accounts. (1) I have permission to copy files to this location; I just got it. I just lost permission to copy files &lt;em&gt;from&lt;/em&gt; the source location. &amp;ldquo;to&amp;rdquo; is a little unclear. (2) Copying files to the Documents folder is &lt;em&gt;not going to help me&lt;/em&gt;, since my Documents folder is &lt;em&gt;also&lt;/em&gt; on the network share location that my Desktop is.&lt;br /&gt;&lt;br /&gt;The sad part is I could have elevated, and copied the shortcut directly, without ever having to place a copy on my network home directory. But I wasn&amp;rsquo;t thinking through the ramifications.&lt;br /&gt;&lt;br /&gt;Unfortunately, neither will our users. Furthermore, they&amp;rsquo;re not going to understand why these things don&amp;rsquo;t work &amp;ldquo;right&amp;rdquo; or &amp;ldquo;just work.&amp;rdquo;&lt;br /&gt;&lt;br /&gt;I am not part of the UAC team and have definitely not considered all the ramifications of the implementation of extreme credential isolation, but I am certainly enjoying the authorization mechanism on Mac OS X which allows me as my current user (with all the access that implies) to do specific other tasks requiring a higher authorization level by supplying administrative credentials, and still have access to the secured resources my user should have access to.&lt;br /&gt;&lt;br /&gt;I expect the UAC edges will get smoothed out, as will network home folder redirection... I mean, hey, why else do we do this dogfooding anyway?&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt;Actually, it was at that point that all Microsoft employees were exhorted to all use Vista as our desktops&amp;ndash;even though no official effort had been made to ensure that our group&amp;rsquo;s build environment and tools would still work&amp;ndash;so that we would make sure the experience would be good for our customers. Our woes were noted, and some were addressed in time for Vista and associated tools to be released to manufacturing, so our pain was not in vain.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt;Originally, I thought &amp;ldquo;elevation&amp;rdquo; was just a synonym for &lt;a href="http://en.wikipedia.org/wiki/Authorization"&gt;authorization&lt;/a&gt;. Alas, it is not. When you &amp;ldquo;elevate,&amp;rdquo; you (or rather your process) &lt;em&gt;becomes&lt;/em&gt; owned by another user with more privileges than you. That user may also have fewer privileges than you in other realms. This can be a problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-7850356836655221033?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/7850356836655221033/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=7850356836655221033' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7850356836655221033'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/7850356836655221033'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/02/standard-user-uac-network-home-folder.html' title='Standard User (UAC) + Network Home Folder = #)$(*@%'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-2200459307278436657</id><published>2007-01-10T02:31:00.000-08:00</published><updated>2007-01-10T04:23:25.816-08:00</updated><title type='text'>Collections</title><content type='html'>Take thrice the daily intake of caffeine, a frustrating problem at work that needs some back-burner cogitation, and a recent revisiting of eBay, and that&amp;rsquo;s all that&amp;rsquo;s needed for a seriously long stint of late night web browsing for the purposes of collecting.&lt;br /&gt;&lt;br /&gt;I would expect there&amp;rsquo;s a coincidence of collectors among people who write code, largely because I believe that both are ventures that jibe well with people who are &amp;ldquo;detail-oriented,&amp;rdquo; which is my polite way of saying obsessive-compulsive. In my case, I&amp;rsquo;ve gone through several iterations of collecting, starting with an aborted attempt at stamp collecting back when I was maybe 10. To some extent, it seemed to me that collecting was just a specific form of being a careful pack rat&amp;#150;you take care of your belongings to help them to last, even if you don&amp;rsquo;t need them at the moment, just because someday you might&amp;#150;a last vestige of handed-down Depression-Era values.&lt;br /&gt;&lt;br /&gt;I switched over to collecting coins, but not expensive ones&amp;#133; just some interesting U.S. coins I had come across. One of my favorite finds was a glass jar of pennies that my father had saved when he was a kid. I was so excited to find some &amp;ldquo;seriously&amp;rdquo; older coins (e.g., from the &amp;lsquo;50s rather than the &amp;lsquo;70s or &amp;lsquo;80s).&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;small&gt;I have since taken to dumping my pocket change into jars: one empty Glenfiddich metal canister for the quarters, aka laundry money, and one empty plastic jug that formerly contained olive oil for all the rest. Maybe someday my kids might find it as exciting, if these containers survive that long. The first attempt at this involved storage in an empty poster tube, and during the &lt;a href="http://www.pnsn.org/SEIS/EQ_Special/WEBDIR_01022818543p/welcome.html"&gt;Nisqually quake&lt;/a&gt;, the tube herniated and broke; my wife (then girlfriend) decided to &amp;ldquo;clean up the mess&amp;rdquo; by taking all the coins to &lt;a href="http://www.coinstar.com"&gt;Coinstar&lt;/a&gt;! Coinstar of all things! Not only did I not even get to see six years worth of savings churn through the machine, but I get to pay 8.9% for the privilege! AIEE!&lt;/small&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Ultimately, I didn&amp;rsquo;t do much in the way of collecting coins as a kid. I just kept a few dollar coins and some examples from various years. Another short-lived collection was that of Star Wars trading cards (even as a kid I eschewed sports-related things); I don&amp;rsquo;t even think that lasted through a full summer before I traded them away for something else.&lt;br /&gt;&lt;br /&gt;In college, though, I started collecting for real. I fell victim to this newfangled idea&amp;#150;a card game where you collect the cards. This was, of course, &lt;a href="http://www.wizards.com/magic/"&gt;Magic, the Gathering&amp;trade;&lt;/a&gt;, around the Alpha/Beta transition, and before I had even heard of the CCG acronym. My college roommate, Naval, would purchase boxes of card, sell the packs, and then trade with the people as they opened their packs. Well before &lt;a href="http://oneredpaperclip.blogspot.com/"&gt;Kyle MacDonald&lt;/a&gt; hit the trading scene, Naval turned one island into a &lt;a href="http://www.wizards.com/magic/autocard.asp?name=Shivan%20Dragon"&gt;Shivan Dragon&lt;/a&gt;. I did my own purchasing and trading. Even now, I have a Fleer binder of nifty cards and a white box of extra cards in my office, for lack of a better place for them. My friend Brian, who has alternative names for most everything, refers to Magic as cardboard crack. I&amp;rsquo;m pretty sure I was addicted or close to it while in college; any extra money I had from my computing jobs on campus would go into it. Later, I&amp;rsquo;d try out &lt;a href="http://en.wikipedia.org/wiki/Vampire:_The_Eternal_Struggle"&gt;Jyhad&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Middle-earth_Collectible_Card_Game"&gt;Middle-earth&lt;/a&gt;, and to a lesser extent Dr. Who, Star Wars, Star Trek, and BloodWars, before I ultimately swore off investing in any new CCG.&lt;br /&gt;&lt;br /&gt;After college and after collectible card games, I got found myself back into coins by what I would have considered to be an unlikely source for me buying anything, &lt;a href="http://www.shopathometv.com"&gt;Shop At Home TV&lt;/a&gt;. I usually just tell my TV to omit those shopping channels when setting it up for the first time, so I&amp;rsquo;m not sure exactly how it was that I came to be staying up, late at night, watching the Coin Vault. Somehow I got drawn to buying a whole slew of silver coins (mostly brilliant uncirculated), and only later discovered that there was a hefty markup. Nonetheless, it piqued my interest again, if only mildly, for numismatics. I certainly enjoy getting each year&amp;rsquo;s silver eagles for depositing into my Dansco album.&lt;br /&gt;&lt;br /&gt;In addition, my prediliction for Zeppelin&lt;sup&gt;1&lt;/sup&gt; paraphenalia, which is a collection&lt;sup&gt;2&lt;/sup&gt; in its own right, bled into coins with regard to the 1930 three- and five-reichsmark coins, which feature the dirigible and laud its 21-day circumnavigation of the world in 1929. I have to say, it&amp;rsquo;s pretty difficult to find those coins on this side of the water. With some rusty college German, I can partially navigate some internet sites and eBay sales. Ron, of &lt;a href="http://germancoins.com"&gt;germancoins.com&lt;/a&gt;, has been a good resource, both in terms of coins and how to bridge the gap between US gradings and German gradings. One of my early morning tasks today is to perform my first international wire transfer, to pay for a recent winning auction bid for such a coin.&lt;br /&gt;&lt;br /&gt;It still seems a little crazy to be trying to guess whether or not an online vendor is trying to gouge you (and by how much) without a price reference guide, or even without necessarily many vendors selling the same items. It makes for some hefty search sessions (and my browser tabs increase to the point where you can only see the first three letters of the title of the page), and even then, it still sort of feels like jumping off the deep end, especially in the realm of coins, where you&amp;rsquo;re trying to double-check the quality grading by inspecting a grainy submitted picture, that isn&amp;rsquo;t particularly zoomed in. Nonetheless, I&amp;rsquo;m trying it out, and we&amp;rsquo;ll see how well it all turns out.&lt;br /&gt;&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; The airships, not the band.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; I had always been a fan of airships, as long as I can remember. But it was only during the collecting of some material for a game of &lt;a href="http://www.guardiansorder.com/games/nobilis/"&gt;Nobilis&lt;/a&gt;&amp;#150;entitled &lt;a href="http://gaming.pile.org/means/wiki/Home"&gt;Means and Ends&lt;/a&gt;, it had a chancel which was a modified version of Seattle Center circa 1962 during the World&amp;rsquo;s Fair&amp;#150;that I branched out from Life magazine copies and into Zeppelin books. Of course, the geekery doesn&amp;rsquo;t stop there; I&amp;rsquo;m also a member of the &lt;a href="http://www.blimpinfo.com/"&gt;Lighter-than-air society&lt;/a&gt;, and I regularly wear a &lt;a href="http://www.cafepress.com/savehangarone"&gt;Save Hangar One&lt;/a&gt; t-shirt in the hopes they don&amp;rsquo;t dismantle Moffett Field&amp;rsquo;s historic hangar.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-2200459307278436657?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/2200459307278436657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=2200459307278436657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2200459307278436657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/2200459307278436657'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/01/collections.html' title='Collections'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-9169256593000758129</id><published>2007-01-09T16:12:00.000-08:00</published><updated>2007-01-09T17:52:26.707-08:00</updated><title type='text'>iPhone envy</title><content type='html'>Well, I was wrong. My friend Jon asked me what was going to be offered up this morning, and I said, &amp;ldquo;Whatever it is, it isn&amp;rsquo;t going to be an &lt;a href="http://www.apple.com/iphone/"&gt;iPhone&lt;/a&gt;.&amp;rdquo; This because Cisco owns the trademark to it&amp;#133; In the back of my head, I was really hoping for a phone/iPod combo, not just because it would be cool, but because my &lt;a href="http://www.clubimate.com/t-DETAILS_SP3I.aspx"&gt;i-Mate SP3i&lt;/a&gt; Smartphone is starting to drive me crazy, and I am looking for a replacment.&lt;br /&gt;&lt;br /&gt;This isn&amp;rsquo;t to say that the SP3i wasn&amp;rsquo;t nifty at one time. When I was willing to spring for the $20 extra a month it cost for insanely slow wireless internet service, it synchronized nicely with my Exchange account at work, which was pretty much the only way I ever used its connection. Trying to do anything other than load an extremely simple page (usually one written to be displayed on a Palm) (1) took forever and (2) required scrolling all over tarnation with the dinky joystick of intermittent operation. Said joystick came out of the phone multiple times, and could never quite be put back in correctly, and right now I&amp;rsquo;m operating with the plastic stub instead. Still, the difference between me knowing I had a meeting to get to and/or to look up where it was or what someone&amp;rsquo;s number is in my 400+ contact address book was &lt;em&gt;huge&lt;/em&gt;.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;small&gt;On a parallel note, the implementation of as-needed-synchronization in Windows Mobile&amp;trade; 2003 Second Edition&amp;rsquo;s Pocket Outlook depends not on the ultra-slow network that I paid $20 a month for at all. Instead, the Exchange server sends invisible SMS messages (ones that don&amp;rsquo;t show up in your text message section) that get interpreted by Pocket Outlook to let it know there&amp;rsquo;s something new to synchronize. I didn&amp;rsquo;t have a text plan when I first got my smartphone, and after two months of $150 charges in text messages that I had no idea where they were coming from, I finally switched to mode of synching to just every 30 minutes. My comrades in Windows Mobile ultimately changed the behavior of this in a later edition of Windows Mobile&amp;trade;, which is great, but unfortunately, they weren&amp;rsquo;t willing to upgrade my phone (they were OK upgrading the SP3, but the SP3i was just too&amp;#133; something&amp;#133; (new? freaky?) And as far as I can tell, the manufacturer won&amp;rsquo;t upgrade it, presumably because it was already an older model.&lt;/small&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;As time went by, I gave up on the Internet connection, trying to settle on desktop-synchronization. Unfortunately, it was about this time that I played Good Microsoft Employee&amp;trade;, and dogfooded beta candidates of &lt;a href="http://www.microsoft.com/windowsvista/"&gt;Vista&lt;/a&gt;, for which there was no ActiveSync. Now that Vista has released to manufacturing, there&amp;rsquo;s now an ActiveSync, but it doesn&amp;rsquo;t sync contacts or events anymore. &amp;ldquo;The synch status is on the device.&amp;rdquo;, only it&amp;rsquo;s not. Add all of this to the device no longer responding to right button clicks, and taking on the order of 5 to 20 seconds to respond to left button clicks when it hasn&amp;rsquo;t been used in a while (is it paging things in?), I&amp;rsquo;m starting to take a hard look at new cell phones.&lt;br /&gt;&lt;br /&gt;One of the most annoying things about bar phones, IMNSHO, is the requirement of locking them. Yes, I know it&amp;rsquo;s not a strict requirement, but I put the things in my pocket and then they auto-dial someone in my contact list. I&amp;rsquo;m still waiting for an accidental call to 911 to happen. Strange things happen when it is locked though. If I get a reminder, sometimes I cannot dismiss it because it wants you to unlock it first, but the reminder is on top, so you don&amp;rsquo;t get the unlock UI. There might be some kind of lock timer I could use, but that doesn&amp;rsquo;t preclude me pocket dialing people, and I don&amp;rsquo;t always remember to lock it. I was thinking I would have to go to some kind of flip or clamshell phone to avoid that nuisance. I spent some time over the holidays looking for a relatively cheap phone (since I&amp;rsquo;d have to buy it as an &amp;ldquo;upgrade&amp;rdquo; through &lt;a href="http://www.t-mobile.com/"&gt;T-Mobile&lt;/a&gt; or get a compatible unlocked phone, as I already have a contract), but hadn&amp;rsquo;t come up with anything.&lt;br /&gt;&lt;br /&gt;And then Steve Jobs shows off the new iPhone.&lt;br /&gt;&lt;br /&gt;Something tells me the Exchange support might not be all that great. As it stands, Mail.app has never once been able to synch with the Microsoft Corporate Exchange servers. (In the past, that&amp;rsquo;s meant that I&amp;rsquo;ve been even more tied to Entourage and/or Outlook, and had a vested interest in fixing/reporting bugs in those products.) I somehow doubt that the iPhone is going to do better than Mail.app. But still the idea is alluring. The iPod I got as a ship gift for shipping Microsoft Office 2004 ended up going to my wife who lives for her podcasts, and her old iPod had ended up with battery issues. (NB: She recently got it re-batteried and now I have an ancient iPod that I really should load up with some tunes.) Having a newer model iPod that can show video and call folks and can fit in my pocket sounds great. And maybe I can even leverage Entourage&amp;rsquo;s Sync Services integration to get my info onto the phone&amp;#133;&lt;br /&gt;&lt;br /&gt;I guess I&amp;rsquo;ll keep an eye on it, and if/when it comes out, figure out whether it&amp;rsquo;ll be worth switching to Cingular or whether it could be purchased unlocked for use with T-Mobile. Until then, I&amp;rsquo;ll live with my ailing smartphone.&lt;br /&gt;&lt;br /&gt;P.S., What would be &lt;em&gt;really&lt;/em&gt; cool, would be if it had a slot for not just a SIM card to enable the device, but extra SIM cards to serve as generic smart cards. Then you could use it as your physical token for authentication on machines. Can you imagine walking up to your machine and have it auto-negotiate credential sharing, and have a keychain show up on your box?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-9169256593000758129?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/9169256593000758129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=9169256593000758129' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/9169256593000758129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/9169256593000758129'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/01/iphone-envy.html' title='iPhone envy'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-4666283421374678374</id><published>2007-01-04T21:20:00.000-08:00</published><updated>2007-01-04T22:00:52.502-08:00</updated><title type='text'>Intel inside / Herring v2</title><content type='html'>Time seems to get away from me when diving into new work. It&amp;rsquo;s been a few months since my &lt;a href="/2006/09/machine-speculation-redux.html"&gt;last speculative post&lt;/a&gt;, and since then, as I&amp;rsquo;m sure you&amp;rsquo;ve noticed, the Core 2 Duos are now in the MacBook Pros. I bought mine the day it came out. But like the rest of my old machines, it wasn&amp;rsquo;t so easy to part with my old Titanium. First, it was a matter of not having brought everything over (like some applications who keep data in strange places and as such didn&amp;rsquo;t get copied over when I copied my home directory and data drive), and secondly, for the first time in a long time, I had some PowerPC-only work on my plate!&lt;br /&gt;&lt;br /&gt;Digging out the old 601 manual and peering through its pages, I realized that I missed dabbling in assembly. I say dabbling because I know just enough to be dangerous, and not enough to wring the performance you&amp;rsquo;d want from, say, an optimizing compiler. Fortunately, all I had to do was play with stack frames and arguments placement. Mmm&amp;#133; Nothing like screwing that up and getting a completely broken stack trace at the point of a problem. Well, anyhow, as it turns out, whereas it&amp;rsquo;s possible to use my new shiny MacBook Pro to do this work, it&amp;rsquo;s quite difficult to debug in Rosetta, and Rosetta seems to not be too happy about programs generating their own code (it quickly runs out of memory&amp;mdash;perhaps it doesn&amp;rsquo;t know where the data ends and the generated code begins?). Thus, my old PowerBook was going to have its one last hurrah over Christmas, so I could work during downtime while visiting family.&lt;br /&gt;&lt;br /&gt;I greatly overrated the downtime, which ultimately didn&amp;rsquo;t matter, as for some reason gdb on my PowerBook wouldn&amp;rsquo;t load the symbols of the code I was debugging, so it was even more difficult than it was going to be back at work. I gave up on working over Christmas and focussed it on my and Miller&amp;rsquo;s family.&lt;br /&gt;&lt;br /&gt;As an aside, it seems that around my birthday, Miller and I &amp;ldquo;spawned a new process&amp;rdquo;. I don&amp;rsquo;t think it&amp;rsquo;s Intel inside there, but according to the doctor, it&amp;rsquo;s set to release in late July &amp;lsquo;07. Both of our families are quite pleased.&lt;br /&gt;&lt;br /&gt;Now that the last vestiges of a reason to keep the old workhorse is gone, I finally used the photos I snapped of it several weeks ago, and put it up on &lt;a href="http://www.ebay.com"&gt;eBay&lt;/a&gt;. &lt;code&gt;&amp;lt;shameless_plug&amp;gt;&lt;/code&gt;If you&amp;rsquo;re looking for an old MacBU warhorse, replete with a Moby sticker, &lt;a href="http://cgi.ebay.com/ws/eBayISAPI.dll?ViewItem&amp;item=300066954185"&gt;bid away.&lt;/a&gt;&lt;code&gt;&amp;lt;/shameless_plug&amp;gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-4666283421374678374?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/4666283421374678374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=4666283421374678374' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4666283421374678374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/4666283421374678374'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2007/01/intel-inside-herring-v2.html' title='Intel inside / Herring v2'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115941108781823829</id><published>2006-09-27T18:17:00.000-07:00</published><updated>2006-09-27T19:40:09.283-07:00</updated><title type='text'>Machine speculation, redux</title><content type='html'>A couple of recent articles about Intel's new quad-core Core 2 offering coming early (in late 2006 rather than early 2007) from &lt;a href="http://www.sfgate.com/cgi-bin/article.cgi?f=/c/a/2006/09/27/BUGGLLDA6J1.DTL"&gt;SFGate&lt;/a&gt; and the &lt;a href="http://www.washingtonpost.com/wp-dyn/content/article/2006/09/26/AR2006092601034.html"&gt;Washington Post&lt;/a&gt; reminded me that I didn't really act upon my previous &lt;a href="http://technosloth.blogspot.com/2006/06/machine-speculation.html"&gt;machine speculation&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had posited there was an outside chance that they'd update the laptop line for WWDC '06. It was much more likely that they'd release an Intel desktop, and they did. (I had given it a release date of December +/- 6 months, so it definitely came in on the early side.) Nonetheless, I was (and am) holding out for the low energy versions to get put into the machines for better battery life (and less cooking of the lap), and hoping that they'd be able to cram in a second two-core processor in. Well, with the announcement that availability of quad-core chips this year, with low energy versions "early next year", I might get (effectively) both. Unfortunately, since there's usually some lag time between chip availability and adoption, I may end up waiting another nine months until they could get put in the MacBook line. Ultimately, this comes down to when Apple updates the line and what they're going to do with it. I've got my fingers crossed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115941108781823829?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115941108781823829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115941108781823829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115941108781823829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115941108781823829'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/09/machine-speculation-redux.html' title='Machine speculation, redux'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115868496341907515</id><published>2006-09-19T09:05:00.000-07:00</published><updated>2006-09-20T16:22:10.676-07:00</updated><title type='text'>Not just licking my wounds</title><content type='html'>I should have known better. I'm not particularly thin-skinned, but every time I end up going to an Apple conference, instead of being able to purely enjoy the new technology (and at &lt;a href="http://developer.apple.com/wwdc/"&gt;WWDC&lt;/a&gt;, the camaraderie of other Mac developers), I find myself plucking daggers out of my (well, Microsoft's) back.&lt;br /&gt;&lt;br /&gt;Yes, I know that the Reality Distortion Field is going to promise great things on the platform. But, having never been to a &lt;a href="http://msdn.microsoft.com/events/pdc/"&gt;PDC&lt;/a&gt; or &lt;a href="http://www.microsoft.com/events/teched2006/"&gt;TechEd&lt;/a&gt;, do the Windows conferences heap the same load of scorn on alternative OSes (and by inference, developers on and for that OS)? I'm sure there are cross-platform developers who are just itching for the new technology who think, "Yeah, yeah, now tell us what's cool about your stuff!" There are probably such Mac stalwarts that don't care a whit about what Microsoft is doing or would rather not hear the name mentioned in their presence, and referring to "Redmond"&lt;sup&gt;1&lt;/sup&gt; repeatedly is just as bad.&lt;sup&gt;2&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;In any case, having been to WWDC 2003, and having had access to other MacBU folks' DVDs for '04 and live streaming for '05, I didn't get as much out of it as one of my new coworkers, who was roughly introduced to the society surrounding the technology. Instead, I enjoyed talking to several Apple developers working on the technology areas of my interest (mostly security-related), and &lt;a href="http://www.phrases.org.uk/bulletin_board/23/messages/706.html"&gt;put bugs in their ear&lt;/a&gt; about future directions. Secondly, I did not just throw away all those Microsoft daggers&amp;ndash;omitting the ones that were purely spiteful, there were still several that complained of real problems in MacBU products that I was able to give feedback to the team about, not all of which were known issues.&lt;br /&gt;&lt;br /&gt;The reason I've been quiet recently is not that I'm licking my wounds from WWDC, but that I'm diving headfirst into a bunch of new-to-me technology. Although my coworkers have some good insight about what sections of the technology have analogs to what I had been doing previously, it is still a little like drinking from a firehose. I hope to spend the next few months coming up to speed, and then when the product specs settle down and we can go public about it all, have some more technical blog entries about what I'm actually doing here in CoreCLR.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; A quick search of software companies in Redmond, Washington turns up quite a number of results. Perhaps they're repeatedly referring to &lt;a href="http://www.wildtangent.com"&gt;WildTangent&lt;/a&gt;? No? Maybe &lt;a href="http://www.hipsoft.com"&gt;Hipsoft&lt;/a&gt;? &lt;a href="http://www.cricksoft.com/us/"&gt;Crick Software&lt;/a&gt;? Something tells me they're just afraid of mentioning Microsoft, in case it increases Microsoft brand recognition to their own detriment.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; I've often wondered what purpose it serves to mock Windows at these conferences. I don't think it's going to dissuade Windows developers from developing for Windows OSes. Is it dissuading current Mac developers from leaving the platform? Or is it just patting them on the back for having made "the right choice" of OSes? Hmm.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115868496341907515?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115868496341907515/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115868496341907515' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115868496341907515'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115868496341907515'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/09/not-just-licking-my-wounds.html' title='Not just licking my wounds'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115388873024188887</id><published>2006-07-25T21:01:00.000-07:00</published><updated>2006-09-20T16:23:59.860-07:00</updated><title type='text'>CoreCLR at WWDC</title><content type='html'>Well, it's a bit of a strange time for me. I've accepted a position on the CoreCLR&lt;sup&gt;1&lt;/sup&gt; team working on the Macintosh version of the MiniCLR that's going into &lt;a href="http://channel9.msdn.com/showpost.aspx?postid=193367"&gt;WPF/E&lt;/a&gt;&lt;sup&gt;2&lt;/sup&gt; and perhaps later other places. It's a little odd to be considering leaving a position I've ostensibly had since I got here (with only one major reorg), but fortunately(?) I have so much to do to wrap up what I was working on for MacBU that I haven't had time to ruminate overmuch. On the other hand, it's hard not to get excited about working on cool developer technologies.&lt;br /&gt;&lt;br /&gt;After some amount of worry when it seemed the handoff between the two groups (which is scheduled to happen over this weekend) was going to jeopardize my going to &lt;a href="http://developer.apple.com/wwdc/"&gt;WWDC&lt;/a&gt;, all is resolved, and I'm once again set to go down to San Francisco the end of next week. I'll just be wearing a slightly different hat is all.&lt;br /&gt;&lt;br /&gt;I hope that within my first week at the new job I'll know enough about what we can tell other folks that I might have something to show at WWDC. Or at least blog about it some.&lt;br /&gt;&lt;br /&gt;Many thanks to my colleagues at MacBU for making my stay fun. Who knows… maybe I'll come back sometime later with some newfangled scripting technology to use with Office. If only I could think of one…&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; The CLR in CoreCLR stands for &lt;a href="http://msdn.microsoft.com/netframework/programming/clr/"&gt;Common Language Runtime&lt;/a&gt;, a fundamental piece of .NET technologies.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; WPF/E is Windows Presentation Foundation/Everywhere, a subset of WPF designed to work outside of Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115388873024188887?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115388873024188887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115388873024188887' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115388873024188887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115388873024188887'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/07/coreclr-at-wwdc.html' title='CoreCLR at WWDC'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115264575453749914</id><published>2006-07-11T12:51:00.000-07:00</published><updated>2007-01-05T07:07:28.717-08:00</updated><title type='text'>Yet another framework</title><content type='html'>When I was younger, my dad showed off his Texas Instruments TI98+ scientific calculator, which for him was a godsend; he was doing medical research at the time, and being able to program up to fifty operations on a piece of data at a time made filling out his tables significantly easier. I was too young to really do much with it (or more to the point, have too much that I needed to do that could use it), but I "helped" (in that way that a child can "help" and have it take longer than it would've otherwise).&lt;br /&gt;&lt;br /&gt;Fast forward a couple years, and our family acquired an &lt;a href="http://en.wikipedia.org/wiki/Apple_II#Apple_II_Plus"&gt;Apple ][+&lt;/a&gt;. This wasn't our first computer&lt;sup&gt;1&lt;/sup&gt;, but it was the first one he did any significant computing on. I used to watch him enter in page after page of AppleSauce Basic to take in data sets, perform calculations, and spit out the results. We used the heck out of this machine. Admittedly, as kids, we preferred to play &lt;a href="http://en.wikipedia.org/wiki/Karateka_%28computer_game%29"&gt;Karateka&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Moon_Patrol"&gt;Moon Patrol&lt;/a&gt;, or earlier Aztek and Elevator Action&lt;sup&gt;2&lt;/sup&gt;, we also had AppleWrite and I wrote my homework using that for &lt;em&gt;years&lt;/em&gt;.&lt;sup&gt;3&lt;/sup&gt;&lt;br /&gt;&lt;br /&gt;Still later, I came back from college to find that my dad had purchased an IBM PC clone and had ceased doing any programming, but just used some already-created applications which did most of what he wanted. I ended up sneeking on and writing a simple BASIC program that would play &lt;em&gt;Happy Birthday&lt;/em&gt; to him if he started his computer on his birthday. Apparently, he didn't do that for two years and was mightily surprised when it started making noises at him. In any case, one of the times I was working on programming and he was around, I asked him why he didn't just pick up this new BASIC and continue his work. His response was that he had already learned enough languages, and that picking up another was just not worth the time. I repsonded that it was not that different, that it was easy. He agreed that it was likely to be as easy as I said, but still not worth changing for, given the viability of the solution he already had.&lt;br /&gt;&lt;br /&gt;At the time, I thought that I would &lt;em&gt;never&lt;/em&gt; feel that way.&lt;br /&gt;&lt;br /&gt;When I was maintaining the MacBU build system, it was written in Perl. I hadn't known Perl beforehand, and because I thought the system needed some tweaks, I learned just enough to make the tweaks I wanted. Then, of course, being the only person who was actually doing any work on it, they made me the official person to work on it. I ended up getting a pretty in-depth education in Perl as a result, from having to deal with the Perl plug-in to CodeWarrior (PerlIO anyone?) to writing tied filehandles to capture output into an XML time-stamped log. All this without the benefit of something like &lt;a href="http://www.latenightsw.com/affrus/"&gt;Affrus&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Eventually, I gave up working on the build system, and subsequent to that, it was decided that Python shall be the Way of the Future&amp;trade;, and the system that we're working on to support Xcode was to be adapted into Python from the old Perl-based CodeWarrior-driving system. Of course, now I'm back to where I was before &amp;#150; wanting to make tweaks to the system to make it work better for me. And learning Python isn't so terribly hard, since it's very similar to Perl. But it just seems sad to have to figure out a bunch of ever-so-slightly-different ways of doing the exact same thing.&lt;br /&gt;&lt;br /&gt;I probably will finally put Python under my belt one of these days, but it's just not as compelling as it would have been to my child-self.&lt;br /&gt;&lt;br /&gt;Not all new systems fall in this baliwick however. I'm currently working on some simple Cocoa stuff. Cocoa, too, has been long ignored by me, largely because very little of the MacBU-based code uses it. It is a whole new way of doing business, and its model is sufficiently different that it's taking a little "settle-in" time to grok it. It will be yet another framework to learn and to have to integrate into my other programming paradigms. However, it makes some things sufficiently simple, that it &lt;em&gt;is&lt;/em&gt; compelling to learn. I just sometimes wish I were learning it faster.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; Earlier, my dad had purchased a &lt;a href="http://en.wikipedia.org/wiki/ZX81"&gt;Sinclair ZX81&lt;/a&gt; with the 16k memory pack. The Basic programming was rather simple and fragile &amp;#150; on one hand, the 16K memory pack's connection wasn't too good, and if you giggled the keyboard, you were likely to lose everything, and on the other hand, it took several tries of playing the tape before the computer would finally "take" the program. As it was, I think he chalked it up to a learning experience and didn't do any scientific work on it. My brothers and I played some super-lo-fi 2D space scroller (like Zaxxon, only not orthogonal).&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Unfortunately, we didn't really have access to the good games, since it was a "Work" machine. I remember spending quality time at a friends house playing &lt;a href="http://en.wikipedia.org/wiki/Proving_Grounds_of_the_Mad_Overlord"&gt;Wizardry&lt;/a&gt;. To this day, I still attribute my navigation skills to wandering that maze sans MILWA.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt; The Apple ][+ was also the computer I performed significant programming tasks on. I used AppleSoft BASIC to do some boring things (like modify other BASIC text-driven games, like Oregon Trail). I took a stab at basic graphics programming to show long addition. I tried several times (mostly failed attempts) to learn 6502 assembly, and really only ever emitted a few assembly things in BASIC code. My brothers mostly remember me trying to harangue them into helping me transcribe hex dumps of computer programs published in computer periodicals &amp;#150; they hated that, though less so when checksums were finally introduced.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115264575453749914?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115264575453749914/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115264575453749914' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115264575453749914'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115264575453749914'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/07/yet-another-framework.html' title='Yet another framework'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115198562488784368</id><published>2006-07-03T20:48:00.000-07:00</published><updated>2006-07-04T15:24:44.813-07:00</updated><title type='text'>Choice: productive(?) but unhappy</title><content type='html'>Doing my standard breadth-first-search of people's blogs (omitting links of little interest), I ran across the &lt;a href="http://simplessity.com"&gt;Simplessity blog&lt;/a&gt; (via Nadyne via Brian Johnson). The particular article linked from the title is about a presentation by Barry Schwartz about how as the number of choices goes to infinity, the productivity (of maximizers at least) goes up, but happiness (in general) goes down. Facinating. This probably explains why people end up being paralysed when faced with the number of options our products support (assuming they actually are aware of them). ("How best to format this document? Oh, crap, that was the wrong way." Even if it &lt;em&gt;was&lt;/em&gt; the right way.)&lt;br /&gt;&lt;br /&gt;I &lt;em&gt;really&lt;/em&gt; like the idea of &lt;a href="http://papers.ssrn.com/sol3/papers.cfm?abstract_id=405940"&gt;Libertarian Paternalism&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115198562488784368?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://simplessity.com/entry/43/paradox-of-choice-why-more-less' title='Choice: productive(?) but unhappy'/><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115198562488784368/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115198562488784368' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115198562488784368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115198562488784368'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/07/choice-productive-but-unhappy.html' title='Choice: productive(?) but unhappy'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115156772366589967</id><published>2006-06-29T00:35:00.000-07:00</published><updated>2006-09-20T16:41:26.446-07:00</updated><title type='text'>How user discontent translates into profit motive</title><content type='html'>My (employer-inherited) goal is to sell boxes. Microsoft software product boxes, specifically. Fortunately for me and my CS degree, my particular function in the achievement in this goal has nothing to do with the boxes themselves or the manufacture of the discs, but really only with the software that goes in the box.&lt;br /&gt;&lt;br /&gt;Consumers, purchasers of boxes, both like and dislike aspects of the box and its contents. The question that this post is trying to address is how (or whether) whatever dissatisfaction a consumer might have translates into profit motive to fix the problem.&lt;br /&gt;&lt;br /&gt;Well, first, there's the recognition of the problem that has to happen. Many problems go unfixed for lack of recognition. In some cases, that can be despite outspoken users on the newsgroups. It can be because we recognized part of the problem but not the larger problem (or the still yet larger problem, etc.). In some cases, people don't even know there is a problem until a user experience person watches them try to use the software and choose a highly inefficient way (relative to some other way the software provides) of solving a task. Some amount of market research is created to see if we could establish what problems are key to get people to upgrade or buy new.&lt;br /&gt;&lt;br /&gt;But even once a problem is identified, there's still some measurement as to its importance. The market research may also have details as to how big a populace has a particular problem. Even when there is no market research around a particular issue, our Program Managers, Developers and Testers have to take a stab at how likely it would be for someone to encounter certain problems and if that results in a subset of users, again, how large that subset would be (and how annoyed they're going to be when they see the problem). The size of the affected population multiplied by some factor related to how severe the issue is / how critical that functionality is to the work they do, determines the initial relative priority of working on one problem vs. another. When development and test come in with time estimates for how long it will take to fix and test problems, then there's a more fungible, but more final relative priority of working on problems.&lt;br /&gt;&lt;br /&gt;This still doesn't really account for the nebulous issue of, when is a piece of software buggy enough that you give up and won't upgrade. I'm sure there's also research around that, but for us it seems that the quality bar that gets set is largely a touchy-feely setting, that gets set based on experience and consensus between the departments. We hope that that quality bar is sufficiently high to make sufficiently many people sufficiently happy with the product as to keep buying upgrades. Unfortunately, that bar setting is set by different people on a per-application basis, so there may not be uniformity there.&lt;br /&gt;&lt;br /&gt;How can you affect that equation so that your bug gets fixed?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Send cogent, succinct, and detailed bug reports &amp;#150; generally, this means to the newsgroups. This improves the likelihood of problem recognition, and reduces the fix time for development, especially if they don't have to track down a reliable reproduction case. Remember, what you think is a bug Microsoft has been ignoring might be a bug that they've fixed several versions of and think might be gone for good (and haven't seen your case yet).&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Call PSS &amp;#150; As I said &lt;a href="http://technosloth.blogspot.com/2006/06/piercing-veil.html"&gt;before&lt;/a&gt;, this costs us (and you) money, and we generally track what problems are coming in. The higher the number of calls, the more likely PSS will ask us to fix it on their behalf. (How important this is is not clear.)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Make sure other people affected by this issue do the same &amp;#150; again, it's a numbers game, to some extent.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;If it's something that's truly blocking your organization from upgrading, have your license purchaser let their TAM know &amp;#150; The more seats that are affected, the more important it is. In fact, MacBU has had a lot of pressure from Windows Office and Exchange to solve some problems because not having a sufficient Mac solution was hurting Enterprise sales in heterogenous OS environments.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;strike&gt;Bribe your developer contact.&lt;/strike&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;What doesn't affect the equation that you think might:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Saying how important this bug is &amp;#150; We take these statements with a grain of salt. It might be really important to you and yours, but how representative are you? If the affected users are 0.03%, and experiencing it isn't likely to keep them from buying the product, then it's less compelling than if 10% of the users are seeing it. Similarly, saying you're not going to buy the product anymore, is only so useful if we actually believe you and believe there are a lot of people like you. Bluffing or exaggerating may get results, but more likely, it may get you ignored as a noise generator. Now, if you can point to sharable market research that supports your claims, then, you should be talking to our product planners.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Saying how long the bug has been around &amp;#150; Sadly, this is nearly inversely proportional to how likely it is to get fixed. If we could afford to ship it once and suffered insufficient adverse effects, then we're more willing to ship it again. That said, there's always some legacy bugs that are just taking their time to percolate to the top of the priority queue.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Saying how much money Microsoft has to throw at the problem &amp;#150; That Microsoft has coffers is one thing, but we are law-bound to try and make the most money for our shareholders. That means at the business level, we have to justify spending money to make money. Fortunately, that doesn't go all the way down to the individual bug fix level exactly, though it is somewhat mirrored in our priority/severity accounting and triage processes.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Being polite &amp;#150; Whereas we would sincerely appreciate your politeness and avoiding mockery of us and our products in public forums, if you are actually making a cogent, succinct argument in favor of fixing an issue (that we can tell), then we'll use it despite whatever extra vitriol was included. Hey, we all get frustrated sometimes. On the other hand, no amount of politeness is going to make a super-expensive feature less expensive and thus more palatable.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Unfortunately, none of this is a guarantee, and unless you're a Premier Support customer wanting a QFE, it's entirely possible that nothing (visible) may come of your efforts, or at least that the fix comes a long time off (one or more product cycles). Maybe someday our process will be sufficiently transparent as to show our assigned profit expectations to fixing various problems, and allow people to post bug bounties to push the chances of their particular pet-peeve bug high enough to meet the cutoff bar for a release. But sadly, I don't believe this will ever come about. On one hand, market research is apparently incredibly difficult to publish publically, and without that information, a lot of our profit expectation assignments would just appear arbitrary and cause more consternation that it would create benefit. On the other hand, our expectations of profit making might be considered to be trade secrets, and thus to be hidden.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115156772366589967?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115156772366589967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115156772366589967' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115156772366589967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115156772366589967'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/how-user-discontent-translates-into.html' title='How user discontent translates into profit motive'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115147483771853863</id><published>2006-06-27T23:10:00.000-07:00</published><updated>2006-07-26T13:46:55.940-07:00</updated><title type='text'>Miller returns; her iBook, wiped</title><content type='html'>Miller got back today from the last of her solo escapades for a while (at least until Burning Man). She had just finished spending a week with her family back home, and the week before that had been grading Spanish AP exams down in San Antonio. Right before she had left, she had just gotten her iBook back from the Apple store geniuses for more out-of-warranty-yet-free repairs to the hinge. Unfortunately, once at home, her iBook shut down and then subsequently would not boot. She called me at work and asked me to take care of it while she was gone, and then made her way to the airport.&lt;br /&gt;&lt;br /&gt;A week ago, I decided to take a peek. The iBook would boot for a ways and then blink the "I can't find a blessed drive" icon. I pulled out the trusty Tiger disc and tried to boot from that, and it gave me an icon I had never seen before: a circle with a slash through it. After some Googling, it seemed that somehow the boot sector of the DVD couldn't be found, which seemed unlikely. I booted it up in target disk mode and connected it to my TiBook and there was no hard drive even listed. It did, however, show the Tiger DVD. I hadn't seen that before &amp;#151; previous versions of this error were easily rectified by selecting the drive in Disk Utility and selecting Repair, but with no disk listed...&lt;br /&gt;&lt;br /&gt;I let Miller know I was going to have to take it in again. The geniuses tried the same stuff I did, and then said that it would need to go through a Repeat Repair. I was happy to find that it, too, would cost nothing. (It's nice that these repairs are free, but we've had to repair this iBook four separate times, and my TiBook has never needed anything!) They gave the perfunctory "make sure your data is backed up" speech, and asked whether I wanted to get in-house backup for something over $100. Here was my logic: If Miller had already taken this in before, and she got the same speech, and thus she's done everything she wanted with regards to data backup. I actually made the further assumption that she had, finally, taken my advice that she should back up the stuff she could not afford to lose. As it turns out, I was batting zero for two, but the final one was the kicker: My last assumption was, even if the hard drive was the culprit (rather than a controller or loose wiring or etc.), then they'd ship the damaged hard drive back with the machine so that I'd have a shot at recovery on the off chance that she hadn't backed up everything she wanted.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;You don't get any broken parts back from Apple when they're replaced during a repair.&lt;/strong&gt; I guess this makes sense, I just hadn't thought it through.&lt;br /&gt;&lt;br /&gt;Fast forward to today, and I pick up her machine from the Genius bar, after having received the call that it had been received. They politely tell me what they did to it, and mention that they replaced the hard drive, as it had failed. I ask where the old hard drive is, and they respond, "Defective hard drives get scrapped or sent back to the manufacturer for warranty replacement, depending on the drive. It used to be policy that they'd retain them for seven days before doing so, in case someone wanted the drive, but that's no longer the case." Erp. I asked whether it was possible to retrieve it and their response was, "Probably not, since they would have already scrapped it or shipped it about the same time the iBook was shipped back here, but I can call AppleCare and check with the service manager to see what the deal is." I called Miller's parents' house and left a voice message about her machine having a brand, spanking new OS on it and that her hard drive was somewhere AWOL.&lt;br /&gt;&lt;br /&gt;Miller called later, frantic, and said that this was a tragedy, and that yes, if I could try to get the drive back, that would be great. Apparently she had not backed up her drive... anywhere. No CD-R, not on her UW account, not in Yahoo, nowhere. I went through the AppleCare menu system with the feeling that I was asking the governor for a stay of execution. The tech investigated the case for me, said that the drive had already been scrapped and that they wouldn't really know how to look for it to get it back. But, he also said, that the reason it had been scrapped was that there wasn't anything they could do to revive the drive, so there wouldn't have been anything I could have done had I the drive. (Well, nothing shy of pulling out the plates and putting it another mechanism, which is admittedly, beyond my ken.)&lt;br /&gt;&lt;br /&gt;We're still not quite sure of the information-lossage. Most of the, ahem, legitimate music can just be re-ripped. However, several years worth of academic papers, some amount of academic research, archives of e-mail correspondence, and most of her photo collection from Egypt are all resigned to the big bit bucket in the sky.&lt;br /&gt;&lt;br /&gt;If there's anything to take away from this cautionary tale, it's &lt;em&gt;back up your *#%^@ data&lt;/em&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115147483771853863?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115147483771853863/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115147483771853863' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115147483771853863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115147483771853863'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/miller-returns-her-ibook-wiped.html' title='Miller returns; her iBook, wiped'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115138416773381532</id><published>2006-06-26T22:23:00.000-07:00</published><updated>2006-07-26T16:39:37.650-07:00</updated><title type='text'>My love affair with Type Libraries</title><content type='html'>It's just the registration that's annoying.&lt;br /&gt;&lt;br /&gt;OLE Automation is one of those pieces of Mac Office which probably isn't understood by most people, even people here in the company. Strictly speaking, it's not really part of Office per se &amp;#151; the Windows version of Office doesn't include it, as it is a part of the OS&lt;sup&gt;1&lt;/sup&gt;. But what the heck does it do?&lt;br /&gt;&lt;br /&gt;Mainly, it allows a programmer to do is to define an application's object model and make that model available to be coded against or scripted. The central mechanism for this is what is called the Type Library. A type library contains a list of classes and their properties and methods, along with some annotations&lt;sup&gt;2&lt;/sup&gt;. It is roughly analogous to an AppleScript dictionary, though there are some marked differences&lt;sup&gt;3&lt;/sup&gt;. Most often, a type library is stored in a file, but it can be implemented in code as well, which allows for some extra dynamism&lt;sup&gt;4&lt;/sup&gt;. A scripting client of OLE Automation can use it to read type information out of the type library to determine what can be called. If you go into Visual Basic for Applications, and choose View/Object Browser, the contents of that browser are just a visual representation of the type library (excluding items that are marked as hidden or restricted). Then VBA knows that if you're working with an object that is the Excel Application object, that only so many properties or methods are allowed, and it can autocomplete your code as you're typing. When you run your code, VBA will call into OLE Automation, and OLE Automation will point it at the code in Excel that needs to run.&lt;br /&gt;&lt;br /&gt;The type library provides several ways to be a client of the code which the type library describes. At the base level, you can either call into a method directly through an interface pointer's vtable, or you can call into a method by referring to it by name. This latter functionality is defined by the &lt;code&gt;IDispatch&lt;/code&gt; interface, specifically the &lt;code&gt;Invoke&lt;/code&gt; method. A class can be set up to allow one or the other or both, and in the last case, it's called a dual interface. If you want to use an interface from C/C++ and it supports vtable-calling, then the &lt;code&gt;mktyplib&lt;/code&gt; utility, which generates the type libraries, can also emit .h files for including into client projects. Otherwise, you can call &lt;code&gt;IDispatch::Invoke&lt;/code&gt; and have it figure out how to call that function. If you don't know what methods you will need when you're compiling your code or script, it's still possible to perform late-time binding, and ask the type library what's available at runtime. This is what VBA does, and why it can handle scripting arbitrary OLE Automation objects, so long as they can be acquired from one of the Office applications' object models, or the object model of VBA itself.&lt;br /&gt;&lt;br /&gt;For years, the eldest Office applications, Word, Excel, and PowerPoint, all had two different object models. One was the OLE Automation / VBA model, which was shared with our Windows counterparts. One was the AppleScript model. They may have had overlap, but they were created largely in parallel, and they did not have any kind of feature parity. As a result, whereas sometimes the OLE Automation model would get new methods, the AppleScript model might not get the same methods, and the disparity would increase. Eventually, we had the idea that we could try and unify these things.&lt;br /&gt;&lt;br /&gt;I made our first attempt at it, and it didn't succeed. The OLE Automation to AppleScript mapping proved to be sufficiently inadequate for a simple translation layer. There were enough oddities in the way the applications' type libraries were created (and subsequently had scripts writing assuming those oddities would remain), that the AppleScript experience would have been awful.&lt;br /&gt;&lt;br /&gt;For Office 2004, Jim Murphy took a slightly different approach; start with the mapping, and then write some custom code to handle the rough edges. As of this writing, there are still some rough edges left, but ultimately, both VisualBasic and AppleScript now code to a (largely) unified object model, and more importantly to a (largely) unified implementation. Less code &lt;em&gt;and&lt;/em&gt; more functionality. What could be better?&lt;br /&gt;&lt;br /&gt;Under the covers, OLE Automation looks at the type library and performs calculations to figure out how to form a call to the actual function. Implementing &lt;code&gt;IDispatch::Invoke&lt;/code&gt; involves knowing how, for this architecture, ABI, and calling convention, to put arguments on the stack or in registers, call the method, and then retrieve the results of the operation. It's one of the few places in the Office products where hand-written assembly is actually necessary&lt;sup&gt;5&lt;/sup&gt;.&lt;br /&gt;&lt;br /&gt;But back to my initial caveat. While type libraries allow you to advertise arbitrary object models, one of the main issues has always been, "How do you create an instance of one of these objects?" On both Mac and Windows, the answer has always lived in the registry. When you register a type library, you place registry entries that list what version the type library is, where to find it on disk, and where to find the application or framework (er, DLL) code that implements the objects and methods. Then later, when asked to create a new object of a particular kind (e.g., when you Insert/Object "Microsoft Excel Worksheet" from within Microsoft Word), OLE can look it up in the registry and launch it (if it's an app) or load the shared library, and call the appropriate object creation code.&lt;br /&gt;&lt;br /&gt;Now you get into two sets of annoying problems. (1) The files move. On Windows, if you move files from where they were installed, you'd better make sure to re-register the type libraries, or things will (possibly transparently) break. On the Mac, it's a little more resilient (we have aliases after all), but you can still make it break. (2) You have more than one version or more than one copy of the same version. If you register a type library, you're registering just it and just the application or shared library you pick. There can be only one. If you have two or more, you'll get rerouted to the one that was registered last. This is another form of DLL-hell, and whereas DLLs can be distributed with their applications (removing the sharing aspect of shared libraries) to avoid DLL-hell, type libraries can't be fixed the same way.&lt;br /&gt;&lt;br /&gt;Ultimately, the problem is no different than the one that LaunchServices (or previously, the Desktop DB) solves. It keeps tracks of applications it's seen, and when asked for "com.microsoft.excel", it can launch it, and it has disambiguating rules it uses to pick the most appropriate "com.microsoft.excel" if there's more than one. As an aside, there's currently no way to leverage LaunchServices by having it cache additional data about files, so it could also track what info is currently in the registry.&lt;br /&gt;&lt;br /&gt;My acquaintance with OLE Automation began when MacBU acquired the privilege of maintaining the Mac version of the OLE code base. I've seen its transition to CodeWarrior, through Carbonization, and now we're working on Xcode/Universalization. My best, and frankly irreplaceable, reference for all of this, beyond having access to the code itself, has been &lt;em&gt;Inside OLE, Second Edition&lt;/em&gt;, by Kraig Brockschmidt, ISBN 1-55615-843-2, sadly out of print. It goes into much, much more technical detail about all of this and the rest of OLE, and explains it all very clearly.&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; Windows users will know it by a different name, &lt;code&gt;oleaut32.dll&lt;/code&gt;. &lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; These annotations include such things as alignment and indications of where to find help on this type or method. There's also a mechanism to add custom annotations.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt; Most OLE Automation types have analogues in the AppleScript world, but one of the hard ones is how to deal with methods that return an interface. There's no idea of returning a pointer in the AppleScript world &amp;#151; you have to return an object reference instead. Unfortunately, in some cases, a given interface won't necessarily have a way to turn itself into an object reference. If you arbitrarily created a "temporary" object store just so an object reference would get returned, the script writer would have to clean up after themselves, making sure to delete that object reference when done. While this is certainly possible, it's goes against the general AppleScript paradigm.&lt;br /&gt;&lt;sup&gt;4&lt;/sup&gt; A type library could be generated on-the-fly at runtime. Usually, this wouldn't be necessary. But it would allow the type library system to be used to interact with a completely different scripting system whose contents wouldn't be known until runtime (or at least might change between the compile time and runtime). For example, it would be theoretically possible to write code that returned an &lt;code&gt;ITypeLibrary&lt;/code&gt; interface which represented the contents of an AppleScript dictionary, and have that code be able to translate between OLE Automation types and AppleScript types so that you could use VBA to script a "normal" Macintosh scriptable application.&lt;br /&gt;&lt;sup&gt;5&lt;/sup&gt; Another such arcane place involves the code that allows an interface to be hosted in a process other than where the implementation code exists. In these cases, we have to intercept the calls, send them via interprocess communication to OLE Automation running in the other process, and it will perform the call on our behalf. (The reverse process occurs when the result is returned.)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115138416773381532?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115138416773381532/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115138416773381532' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115138416773381532'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115138416773381532'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/my-love-affair-with-type-libraries.html' title='My love affair with Type Libraries'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115135873676011335</id><published>2006-06-26T14:24:00.000-07:00</published><updated>2006-08-10T22:33:27.166-07:00</updated><title type='text'>Machine speculation</title><content type='html'>It was the beginning of this year when the new Intel MacBook Pro made it into the Apple Store for pre-ordering that the Pavlovian drooling commenced. My wife, Miller, in her prudent fashion, suggested I wait six months before upgrading my 500 MHz TiBook. Partially, it's because she wants to make sure I'm not just infatuated with the new technogadget-of-the-month. I, on the other hand, was sufficiently sure that I've already purchased &lt;a href="http://www.parallels.com/en/products/desktop/"&gt;Parallels&lt;/a&gt;, but her logic also made sense otherwise. Whereas a new product line may have certain problems endemic to it, six months is probably a good length of time to see if they crop up. Also, I am wondering whether WWDC '06 will hold some more product releases in store. If they announce better MacBooks, it will have been worth the wait. If they announce other hardware, like a more standard desktop, it won't be that great for me personally, though I suppose it might be possible that it would drive the prices down on the MacBooks. Unlikely, but possible.&lt;br /&gt;&lt;br /&gt;In any case, I'm still crankin' away on my TiBook. I miss the (relative) speediness of the CodeWarrior builds, where even on this old boy I could crank out a set of Mac Office builds overnight. Now it takes longer than that to crank out one flavor of one architecture. I no longer really use it for mainline development work for that reason. All that said, and though I'll be happy to finally purchase an Intel-based Mac and see some dramatic speed improvements, I'll be sort of sad to put this old workhorse to rest. The keyboard keys have all gotten shiny with extended use. The Moby sticker to the left of my touch pad has long outlived its earlier counterpart on my old Duo 280, and I'll have to seek out an appropriate replacement.&lt;br /&gt;&lt;br /&gt;Speaking of my Duo 280, is there anything I could do to replace a cracked screen at this point, or should I relegate it to the junk heap? I've still got an old Duo Dock in my office, though at this point, all it's doing is supporting my Intel iMac so the screen height is more ergonomically correct. One of my non-tech-geek friends made the point over the weekend that all these old machines are just adding to the already considerable clutter in our house. We got into a spirited debate over whether to keep random extra, usually defunct or obsolete, tech gear around. At some point I used the word "shrine" and the discussion fizzled. Anyhow, I think having a working Duo 280 is worth keeping, but probably not a irreparable one. I'm afraid to pull my SE/30 out of the closet and see whether it'll still go. I don't want to have to turn it into a fish tank just to have a reason to save it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115135873676011335?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115135873676011335/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115135873676011335' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115135873676011335'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115135873676011335'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/machine-speculation.html' title='Machine speculation'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115061410343063877</id><published>2006-06-17T23:57:00.000-07:00</published><updated>2006-06-23T04:59:40.403-07:00</updated><title type='text'>Long overdue photo</title><content type='html'>&lt;a href="http://photos1.blogger.com/blogger/6818/1428/1600/AlittlebitoftheUV.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg" border="0" alt="Nathan's head shot" /&gt;&lt;/a&gt;&lt;br /&gt;I think I might burn out my blogging muscles for another nine months if I type up another long post, so I'll settle for putting up a photo that will go into my profile.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115061410343063877?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115061410343063877/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115061410343063877' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115061410343063877'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115061410343063877'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/long-overdue-photo.html' title='Long overdue photo'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115057539206811099</id><published>2006-06-17T16:38:00.000-07:00</published><updated>2006-06-17T16:46:32.946-07:00</updated><title type='text'>Piercing the veil</title><content type='html'>Corporations are rarely transparent in their operations, and Microsoft is no exception. It has historically difficult to understand exactly Microsoft was doing to address specific customer desires or complaints. Previously, the ways you might have been able to talk to Microsoft were:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Writing to MSWish - despite being monitored, user rarely got any feedback as to whether their bug was to be fixed or their feature suggestion taken into account other than the boilerplate text. [NOTE: MSWish is no longer operational at this time.]&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Talking to &lt;a href="http://support.microsoft.com/gp/assistsupport"&gt;PSS&lt;/a&gt; - complaints or feature requests get filtered through this organization, and instead of producing qualitative suggestions to the teams, more often they'd be quantitative suggestions (e.g., this feature area got a lot of calls). Talking to PSS costs both the user and Microsoft money. Users are disinclined to call unless they can't solve their problem in some other way, so we miss feedback. Microsoft is financially incented to reduce PSS calls; better products is just one possible side-effect.&lt;sup&gt;1&lt;/sup&gt; All told, a user won't know that their commentary is going to get used or not.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Talking to &lt;a href="http://www.microsoft.com/services/microsoftservices/srv_prem.mspx"&gt;TAMs&lt;/a&gt; - Technical Account Managers handle the big accounts at Microsoft, and as such you're already a special class of user. You have more pull, but you're paying for the privilege, and the prospect of future purchases keeps our attention.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Writing to &lt;a href="http://groups.google.com/groups/dir?sel=33606727"&gt;Newsgroups&lt;/a&gt;/Forums - There's a fair amount of people willing to aid those who use our products who write to newsgroups, but quite a few of them are not Microsoft employees. Some of them are &lt;a href="http://mvp.support.microsoft.com/"&gt;MVPs&lt;/a&gt;, who are well informed and intelligently summarize major problems back to the product teams. Some Microsoftees monitor the lists, either as part of community outreach, or ad hoc, but engage individual users rarely.&lt;/li&gt;&lt;/ul&gt;With the exception of the TAMs, the general problem with all of these methods is that as a user, you'd not know whether it was worth your time to report the problem. Even if the problem was heard and understood, who knows what internal priority it would be given... would it fall of the list of things to do for this next patch release (or worse, fall off the list of things to do for a major release)? You won't know until you by product v. &lt;em&gt;n&lt;/em&gt;+1, and try it out for yourself.&lt;br /&gt;&lt;br /&gt;Part of the problem was that the Microsoft culture was one of employees being publicly silent. If you're an employee, and you post on a public forum, and you screw up (anything from revealing confidential information or trade secrets, to implying there might be a next release of something not officially announced (much less whether a particular issue would get addressed in that release), to negatively representing Microsoft), you may find yourself without a job the next day. There was little incentive to talk to the public, and when talking to the public anyway (say you get cornered on an airplane and reveal you work for Microsoft), you'd have to play defense lawyer, and say, "I can't comment on that."&lt;br /&gt;&lt;br /&gt;My personal opinion is that this lack of transparency and interaction has hurt Microsoft's public image.&lt;br /&gt;&lt;br /&gt;The advent of public bug reporting mechanism such as &lt;a href="http://developer.apple.com/bugreporter/"&gt;Apple's BugReporter&lt;/a&gt; or SourceForge's bug tracker didn't seem to perturb the way Microsoft did business; semi-standard industry practices aren't necessarily readily picked up. Instead, the advent of blogging has started to crack the official barrier between customer and employee, circumvent the aforementioned "official" routes. All of sudden, you could read a blog and get instant insight to what a product team was doing, even what technical hurdles were having to be addressed. Futhermore, with comments, you could give direct feedback to that blogger.&lt;br /&gt;&lt;br /&gt;Consequently, employee bloggers are interacting with the rest of the world in a much more public fashion. Non-public-relations people are regularly writing commuiqu&amp;eacute;s, and the PR and legal departments are nervously fidgiting, waiting for a major gaffe. On the whole, it seems promising; technology evangelists are getting people excited about products, and there's a new transparency into some of the workings at Microsoft. It's unclear how many neophyte bloggers have had to "seek employment outside of Microsoft", but my impression is that it is negligible.&lt;br /&gt;&lt;br /&gt;The developer devision seems to be leading this new wave. The &lt;a href="http://blogs.msdn.com/ianhu/archive/2005/08/08/449023.aspx"&gt;MSDN blogs&lt;/a&gt; were among the first I had heard of at the company. Furthermore, they're the first group trying to "close the loop" with services like &lt;a href="http://blogs.msdn.com/ianhu/archive/2005/08/08/449023.aspx"&gt;LadyBug&lt;/a&gt;. I'm not sure if "close the loop" is some official customer-representative jargon, but I'm using it to mean to be able to receive customer comments, report back what, if anything, we're doing with them and why, and then, once action has been taken, to follow up with the customer to make sure that the action satisfies their desires.&lt;br /&gt;&lt;br /&gt;Again, historically, we were far from being able to close the loop. If a user complained about an problem, even if we knew it was an "official problem", i.e., there was a bug report and it was deemed a valid problem, we weren't allowed tell the user that.&lt;sup&gt;2&lt;/sup&gt; Even if we could have told them it was a valid problem, we couldn't tell them much about when we would address it (assuming we knew) except under very limited circumstances.&lt;sup&gt;3&lt;/sup&gt; At best, we could have kept their contact information around and at the point where we finally addressed their problem and the software that did so was on the shelves, to report back to them. (I think, that happened in &lt;em&gt;very&lt;/em&gt; isolated cases.) That still didn't really address the customers whose problems we elected not to solve.&lt;br /&gt;&lt;br /&gt;While the new blogger-era rules of interaction are not fully written, it still seems like the new feedback tools and (the promise of) looser restrictions on customer communication will make it easier for customers to tell us what we need to know to do our jobs better and for us to let customers know that we "get it". (Or at least how much we've "gotten it", so they can take appropriate action.)&lt;br /&gt;--&lt;br /&gt;&lt;sup&gt;1&lt;/sup&gt; For example, we might add new wizards to aid people who don't know how to use a feature; this reduces support calls, but doesn't make the product better for those who already knew how to use those features. It may not even mean that the product is better when you account for all users of the product. If only 10% of customers are calling about a feature and the rest understand it, the only portion that's costing us money that we can measure are the 10%.&lt;br /&gt;&lt;sup&gt;2&lt;/sup&gt; Notwithstanding our various Licensing Terms, previously known as EULAs, which warrant nothing about the software, the implication that there was a "bug" in the program could be (and in some cases, rightly so) construed as a "flaw" rather than "design limitation". Nobody wants to be sued, and software companies with deep pockets live in some non-zero fear of being the target of a landmark class-action consumer rights lawsuit akin to those in the automobile industry that might require fixing, recalling, and/or punitive damages.&lt;br /&gt;&lt;sup&gt;3&lt;/sup&gt; If it was going to get fixed in a release not yet announced, that was a no-go. If it was going to get fixed in a release announced, but not on the verge of being shipped, there was a risk that the fix might get accidentally undone by some other work during the course of the project, and saying that it was going to be fixed meant having to make extra double sure that none of them were broken (not so hard), but also fix them if they were (which can be quite expensive if it's at the very end and we're trying to get the product out the door).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115057539206811099?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115057539206811099/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115057539206811099' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115057539206811099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115057539206811099'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/piercing-veil.html' title='Piercing the veil'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-115056432284204299</id><published>2006-06-17T09:59:00.000-07:00</published><updated>2006-06-17T11:47:36.936-07:00</updated><title type='text'>Eleven years</title><content type='html'>This coming Monday, I will have been working for &lt;a href="http://www.microsoft.com"&gt;Microsoft&lt;/a&gt; for eleven years, migrating from my initial position in Excel development into the newly-formed &lt;a href="http://www.mactopia.com"&gt;MacBU&lt;/a&gt; (or Macintosh Product Unit, as it was called in those days). I took some time this past week to look through what all I had really managed to accomplish over that time frame, partially wondering whether I was living up to my (self-gauged) potential. It's hard to recall all the little things I did for the various projects; the ship list seems to be the remaining milestones. Fortunately for my memory, those are permanently affixed to the Ship-It awards (I ran out of space on my first one), and I have the Shelf-of-Ship, a display of promotional boxes from the various products shipped (including the somewhat-hard-to-come-by Office 98J CD).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.mactopia.com"&gt;MacBU&lt;/a&gt; seems to have progressed a bunch over the years too. I missed the 68k to PPC transition that had happened with Office 4.2, but between picking up Windows components that Windows Office doesn't have to maintain for themselves (OLE, OLE Automation, Visual Basic for Applications), having to switch from our no-longer-supported Macintosh cross-compiler in MSDev to Metrowerks CodeWarrior, and undergoing a major OS revision (OS 9 to OS 10), we've come a long way. Now we get to look at CFM vs. Mach-O, moving to Xcode/gcc and adding Intel to the platforms (and largely the former two because of the latter). Roz has made a &lt;a href="http://www.microsoft.com/presspass/press/2006/jan06/01-10Macworld2006PR.mspx"&gt;public commitment&lt;/a&gt; to work on it, and &lt;a href="http://www.schwieb.com/blog/"&gt;Erik Schweibert&lt;/a&gt;, my current lead, has already posted on some of those &lt;a href="http://www.schwieb.com/blog/2006/06/01/whither-xcode/"&gt;trials&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;At the same time, whereas we don't have to play porting games with Windows Office, as their source diverges from ours, and as we need to maintain file format compatibility (to at least roundtrip the things our code doesn't support), we have a delicate balance to maintain in terms of what needs to get brought over from Windows Office and &lt;em&gt;how&lt;/em&gt; it gets brought over: Do we port it and try and keep our code in sync with theirs? Do we clean it up as a v. &lt;em&gt;n&lt;/em&gt;+1 version of the same feature? Do we rewrite it in a MacOffice paradigm? Do we do nothing and suffer the consequences? Each of these options has its negatives: Porting/synching code has the problem of many more developers working for Windows Office producing much more code than we have time to carefully review and integrate, and even if we do so, we have to live with the drawbacks of their particular implementation; on the good side, it means that if we have to do more porting of code added in a different release, it'll be easier to do since there will be fewer differences between our code and theirs. Cleaning it up suffers from the same problem of quantity, and whereas the finished product might be better and/or more elegant from a pure code-maintenance perspective, we complicate the future porting strategy &amp;#151; will we still be able to add the new feature they added to our "cleaner" version of the code, or will we have to throw out what we did and go back to straight porting later. (To be fair, it's not strictly a one-way operation; sometimes Windows Office ports code from us, and they face most of the same issues, if not the quantity issue. However, I doubt most of the pure code-cleaning gets back-ported unless it adds significant features; from most people's perspective, all it does is add risk to shipping on time.) Writing a MacOffice-version of the same feature has similar consequences, and when file format is involved, not supporting it is just not an option. &lt;a href="http://blogs.msdn.com/rick_schaut/"&gt;Rick Schaut&lt;/a&gt; has been posting on the most current incarnation of file format compatibility since &lt;a href="http://blogs.msdn.com/rick_schaut/archive/2005/06/01/424086.aspx"&gt;mid-2005&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;For better or worse, MacBU hasn't been the only Macintosh software developer at Microsoft over these years. During its inception, a bunch of teams offloaded the Mac versions of their code, some with a big sigh of not-having-to-maintain/support-Mac relief. There were (and are) still exceptions... The Outlook team continued to produce a Macintosh Outlook client up to the 2001 edition. Encarta still produced their Mac applications (even though they usually had two developers all told for both platforms). The Windows Media Player team produced their, ahem, client for the Macintosh, though that has been recently supplanted with the &lt;a href="http://www.microsoft.com/windows/windowsmedia/player/wmcomponents.mspx"&gt;Flip4Mac&lt;/a&gt; version. (This, by the way, caused a minor debacle, since their PR dept released the information on the same day Roz made the five year commitment.) The hardware group still produced their own Macintosh drivers, and the Services for Macintosh team on Windows Server worked on the Microsoft UAM, which, by the way, seems to have been replaced by an Apple-provided version of the same thing by 10.4.6 that even works on Intel. Included among the new exceptions are the &lt;a href="http://blogs.msdn.com/mharsh/archive/2006/03/23/559106.aspx"&gt;WPF/E project&lt;/a&gt;, as well as the cross-platform shared source initiatives. In all of this, these groups are acting as peers, without a specific Macintosh oversight group. The tradeoff is that there's freedom for these teams to do what they need to do for their product, at the cost of a lack of Mac-product uniformity in quality, best practices, access to Apple information (MacBU has the closest link to Apple), and so forth.&lt;br /&gt;&lt;br /&gt;As much as the new Intel boxes are creating new work for and my team, they still give me the excitement that something new is always happening in the Macintosh world. I look forward to writing more &lt;a href="http://www.microsoft.com/mscorp/execmail/2005/02-03interoperability.asp"&gt;"interoperable"&lt;/a&gt; software, and hope to see another decade of closer Apple/Microsoft integration and partnership.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-115056432284204299?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/115056432284204299/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=115056432284204299' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115056432284204299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/115056432284204299'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2006/06/eleven-years.html' title='Eleven years'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-112823348070075585</id><published>2005-10-01T19:28:00.000-07:00</published><updated>2006-06-20T13:07:51.530-07:00</updated><title type='text'>A public face</title><content type='html'>This past week brought quite a few &lt;a href="http://mvp.support.microsoft.com/"&gt;MVPs&lt;/a&gt; by our offices. Per usual, it was nice to be able to show a very little of what we're doing. On the other hand, it introduces another level of information dispersal and access protection to think about. On the one hand, acknowledging a problem with the software or talking about a planned feature could be considered to be an implicit promise to fix or implement something. On the other hand, not talking about what we're doing means that we miss out on valuable feedback.&lt;br /&gt;&lt;br /&gt;So what would have been future design feedback is now feedback on existing design, which is, well, not always pleasant. It is sometimes difficult to participate on public newsgroups or mailing lists. One doesn't read much positive feedback (but then again would you really join a newsgroup to laud the developers who wrote the feature that made your day?), and there's as much negative feedback as one might want. Some of it is completely appropriate, and takes you back several months to the point where there was an agonizing choice... either the PMs at an adds/cuts meeting, or at some late point when a problem was finally realized where all the principals weigh the cost of addressing it and making sure that it was really fixed without other repercussions. I wince once when a hard decision happens, and then again when that first person says, "What &lt;em&gt;were&lt;/em&gt; you thinking when you wrote that?" or "Don't you do &lt;em&gt;any&lt;/em&gt; testing?"&lt;br /&gt;&lt;br /&gt;It's just not useful, for me at least, to try and address all the posts. Some are unrelated to the software at all, and have to get redirected to a more appropriate area. Others are FAQs, asked on the order of three to four times a week, and points to people's lack of willingness to search the archives. Some, though, are the good problems: the ones we don't see in-house, the environments we don't have in a test lab or on a dogfooder's or beta tester's computer. These are the ones where one tenacious and helpful user makes it so we can fix the problem for untold others who won't report the issue. The other good ones are when there is an obscure error message that doesn't have an obvious solution but that we can help diagnose what's going on and solve some settings issue or help out with some workaround. Being able to respond to those makes me feel good about my work.&lt;br /&gt;&lt;br /&gt;Then there are the total flame bombs that get dropped by irate customers, or better yet, irate non-customers. I personally do not know how to respond in a positive fashion to these, especially the ones that have horribly flawed or missing logic. I really don't understand the sense of entitlement evidenced by some posts. That a piece of software might not do everything you want should be par for the course, but does it mean that you're somehow entitled to have it "fixed" to do what you want it to do? Is it merely a problem of that the public listing of features not being specific enough to let you know what will and will not work? Comparing one piece of software to another might be useful to pick which piece of software is appropriate to use, but if it compares unfavorably, does it really mean that you're due some kind of  replacement version that addresses those problems?&lt;br /&gt;&lt;br /&gt;Ultimately, I will go into work and write the best software I can.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-112823348070075585?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/112823348070075585/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=112823348070075585' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112823348070075585'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112823348070075585'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2005/10/public-face.html' title='A public face'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-112676647245769068</id><published>2005-09-14T23:40:00.000-07:00</published><updated>2005-09-15T06:04:22.913-07:00</updated><title type='text'>A hole to crawl into</title><content type='html'>Somewhere between a recent series of emotionally charged misunderstandings with a friend of mine and the Seattle weather and who knows what else, I've regressed to not wanting to leave the house. Yesterday, I felt competent enough to stare at e-mail, usenet, and blog postings, but felt entirely lethargic and slept through most of the day, never making it in to work. Today, I spent a short day at work, and then worked at negotiating a truce between two owners in our building with adjacent units with regard to sound issues. Blech.&lt;br /&gt;&lt;br /&gt;Both yesterday and today, there were social events that were interesting that I could have attended. I'm just not sure what made them unworthy or home so inviting. It certainly wasn't the lure of &lt;a href="http://www.scifi.com/onair/scifipictures/"&gt;SciFi Original Pictures&lt;/a&gt; or one of the &lt;a href="http://www.usanetwork.com/series/svu2/"&gt;Law and Order&lt;/a&gt; variants. Nonetheless, it's somehow easy to stay up until 5am alternating between channels and web browsing.&lt;br /&gt;&lt;br /&gt;Makes me wish I were back on the playa, where the nights were colorful, the stars inviting, and it was a joy to walk everywhere with my friends and my sweetie.&lt;br /&gt;&lt;br /&gt;Guess I have some more decompression to do.&lt;br /&gt;&lt;br /&gt;UPDATE: In terms of actually interesting late night television, I stumbled on &lt;a href="http://www.ucbtheatre.com/features/bravo.php"&gt;ASSSSSCAT: Improv&lt;/a&gt; on Bravo, and laughed my fool head off.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-112676647245769068?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/112676647245769068/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=112676647245769068' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112676647245769068'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112676647245769068'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2005/09/hole-to-crawl-into.html' title='A hole to crawl into'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-112663944500941559</id><published>2005-09-13T11:50:00.000-07:00</published><updated>2005-09-13T20:37:44.696-07:00</updated><title type='text'>The nth social networking software</title><content type='html'>As much as I enjoyed &lt;a href="http://www.friendster.com/"&gt;Friendster&lt;/a&gt; when it came out, it took quite some time to set up the various pictures and profile information, and then to go through to find whether my friends had previously joined, and if so add them or if not invite them, and then perform periodic maintenance as other friends joined but didn't know I was there to add me (or, to the more paranoiac part of me, &lt;em&gt;did&lt;/em&gt; know and chose not to add me anyway). Much like having a blog makes me feel, it is nice to have a little web corner-of-the-world, where if people want, they can stop in and say a virtual, "Hi!"&lt;br /&gt;&lt;br /&gt;But then, &lt;a href="http://www.orkut.com/"&gt;Orkut&lt;/a&gt; came out, and of course, some people liked that one better. Friends gradations is pretty cool; I always had the 7&lt;small&gt;&lt;sup&gt;th&lt;/sup&gt;&lt;/small&gt; grade question of "Are they &lt;em&gt;really&lt;/em&gt; my friend? Or just my acquaintance? Or what?", and that solved it, while at the same time re-inforcing the 7&lt;small&gt;&lt;sup&gt;th&lt;/sup&gt;&lt;/small&gt; grade popularity contest in my head. (This friend is a better friend than this other friend, etc.) Orkut has its own profile system, which also serves to link people with similar social interests, regional interests, etc. It also takes a fair amount of time to fill out.&lt;br /&gt;&lt;br /&gt;Now that I have the blogging bug, I'm discovering that the various journaling resources on the web are just another form of the social network software, though the focus tends to be on personal publishing. Sure, I can just publish my blog and never look any further, but Blogger also has a profile mechanism. Furthermore, my wife and several friends post on &lt;a href="http://www.livejournal.com/"&gt;LiveJournal&lt;/a&gt;, and in order to see the more private posts, you have to be part of their friends. And there again, you have another social networking issue — where are your friends posting? do you have an account on their blogging system? do you have your profiile on that blogging system or can you point to some more generic profile?&lt;br /&gt;&lt;br /&gt;The whole profile thing predates all of these services though. Even basic sales websites want to know your address and credit card information, but then go further to establish buying patterns and areas of interest to give you targetted advertising. Microsoft's &lt;a href="http://www.passport.net/"&gt;Passport&lt;/a&gt; was a simple attempt to have a single roaming profile that other websites could use, so you wouldn't have to enter in all your information over and over.&lt;br /&gt;&lt;br /&gt;It would seem to me that, with the proliferation of social networking products, that someone would undertake to create a system where people could publish their own profiles (with private information hidden) and that any number of web sites could extract the information they want. That furthermore, it would be extensible, such that if there's some new bit of trivia that a particular service to which you subscribe desires to know about you, you could extend your own profile with that information. There would have to be some kind of standardization, lest they ask you to produce the data in three different ways based on three different modes of consumption, but that seems like it would be relatively straightforward. In today's world of XML and XSLT transforms, you might even just be able to have the data once and just mirror it into other formats. Friends/Acquaintances would be referred to by the locations of their published profiles, etc.&lt;br /&gt;&lt;br /&gt;In the interim, though, it seems an interesting exercise to see if I come up with the same Favorite Movies in the same order on the various web sites I have to fill in that information. Right now, you can clearly see that I'm of many minds about things (or at least am absent-minded sometimes).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-112663944500941559?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/112663944500941559/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=112663944500941559' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112663944500941559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112663944500941559'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2005/09/nth-social-networking-software.html' title='The &lt;em&gt;n&lt;/em&gt;&lt;small&gt;&lt;sup&gt;th&lt;/sup&gt;&lt;/small&gt; social networking software'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-112650526936962426</id><published>2005-09-11T22:22:00.000-07:00</published><updated>2005-09-13T12:25:17.320-07:00</updated><title type='text'>Too much|little to post</title><content type='html'>I don't know that I've come up with good decision criteria as to what should go into a blog. The obsessive-compulsive part of me thinks that a crafted, well-honed, fine piece of editorialship is required. The rest of me balks at both the effort that would be required and the necessary reduction of the thoughts that that kind of piece would require. Ah, well, I suppose, after some consideration, that I'd prefer to show my foibles.&lt;br /&gt;&lt;br /&gt;But first, I can show you the foibles, er, postings of my wife in her &lt;a href="http://www.livejournal.com/users/millertxu/"&gt;journal&lt;/a&gt;. She's abroad for an educational stint at the &lt;a href="http://www.aucegypt.edu/"&gt;American University in Cairo&lt;/a&gt;. She's away for a while, which can be kind of hard, but between &lt;a href="http://www.skype.com/"&gt;Skype&lt;/a&gt; and &lt;a href="http://www.apple.com/macosx/features/ichat/"&gt;iChat A&lt;/a&gt; (we don't use the "V" yet, since her connection doesn't have enough throughput), we get to talk to each other pretty regularly.&lt;br /&gt;&lt;br /&gt;Now back to the nitty gritty. This week, I ran into yet another "can't install/use except as admin" program. These irk the crap out of me, largely because I want to be able to make it so that guests of my house can't (accidentally) destroy my stuff on my computer, but that they should be able to install things when I'm not home. I have heard arguments that IT departments want to be able to restrict people from installing anything, but that seems like an orthogonal problem. It is just a bug (sorry, I meant &lt;i&gt;design flaw&lt;/i&gt;) that a regular application cannot be installed merely because the setup program seems to believe it needs administrative credentials. Many things should Just Work™ in a non-admin setting. Apparently, it's problematic enough that (1) developers cannot program correctly for non-admin users and (2) users who should not be admin users are, and invite attack upon themselves, that there are whole other &lt;a href="http://blogs.msdn.com/aaron_margosis/"&gt;blogs&lt;/a&gt; on it.&lt;br /&gt;&lt;br /&gt;On the personal side, I ended up hanging out with quite a few friends this weekend that I have not hung out with regularly in quite some time. I spent some amount of time continuing my recovery period from &lt;a href="http://www.burningman.com/"&gt;Burning Man&lt;/a&gt;, mostly in the form of laundry (of which some is now been pink-ified!), though partially putting various things back into their storage, where they will not be touched for another 51 weeks. I did get a chance to meet some new folks, friends of friends, and head out for a sailing day trip on Puget Sound with them. It reminded me of my two previous longer-term experiences with sailing, and how I certainly enjoyed all the ropework involved. The capstone of the weekend, blog not included, was a fierce gumbo made by my next door neighbor who invited me to dine this evening; by the way, he makes a mean Sazerac-oidal concoction that won even my licorice-hating self over. All in all, a good weekend.&lt;br /&gt;&lt;br /&gt;In the vein of the useless: Currently listening to "myself typing this blog entry".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-112650526936962426?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/112650526936962426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=112650526936962426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112650526936962426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112650526936962426'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2005/09/too-muchlittle-to-post.html' title='Too much|little to post'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-15431842.post-112409417848649704</id><published>2005-08-15T01:13:00.000-07:00</published><updated>2005-09-13T12:25:50.013-07:00</updated><title type='text'>Once more into the breech</title><content type='html'>After thinking about blogging for several months, today I finally broke down and did it. I ended up trying to think of something sufficiently witty to name it, when my wife reminded me of Technosloth, my registered (and largly unused) domain, and voilà. After battling with &lt;a href="http://www.caminobrowser.org/"&gt;Camino&lt;/a&gt; (which would not let me edit my posts) and then &lt;a href="http://www.apple.com/safari"&gt;Safari&lt;/a&gt; (which would only let me spell-check and add images), and finally having to resort to &lt;a href="http://www.mozilla.org/products/firefox/"&gt;Firefox&lt;/a&gt;, I could prepare my initial post. Whoop-de-doo!&lt;br /&gt;&lt;br /&gt;This weblog will probably end up being (using intent as a directive) a log about personal pet peeves with coding practices, Real Life™ problems of a developer, and other miscellany of my life.&lt;br /&gt;&lt;br /&gt;May you have more patience with me, than I with the world.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/15431842-112409417848649704?l=technosloth.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://technosloth.blogspot.com/feeds/112409417848649704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=15431842&amp;postID=112409417848649704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112409417848649704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/15431842/posts/default/112409417848649704'/><link rel='alternate' type='text/html' href='http://technosloth.blogspot.com/2005/08/once-more-into-breech_15.html' title='Once more into the breech'/><author><name>Nathan Herring</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='22' height='32' src='http://photos1.blogger.com/blogger/6818/1428/320/AlittlebitoftheUV.jpg'/></author><thr:total>0</thr:total></entry></feed>
