Congratulations!

[Valid Atom 1.0] This is a valid Atom 1.0 feed.

Recommendations

This feed is valid, but interoperability with the widest range of feed readers could be improved by implementing the following recommendations.

Source: http://gdamore.blogspot.com/atom.xml

  1. <?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:blogger='http://schemas.google.com/blogger/2008' 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-7528831701633643336</id><updated>2015-05-02T20:58:12.250-07:00</updated><category term="-"/><category term="--"/><category term="afe GLDv3"/><category term="atom"/><category term="blogger"/><category term="feedburner"/><category term="illumos arcmsr"/><category term="illumos gsoc"/><category term="joyent illumos zfs"/><category term="mxfe GLDv3"/><category term="oracle opensolaris"/><category term="rss"/><category term="sdcard"/><category term="zfs nexenta fma"/><title type='text'>/dev/dump</title><subtitle type='html'>illumos and storage.  Rockets and whitewater.  Go figure.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://garrett.damore.org/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default?alt=atom'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default?alt=atom&amp;start-index=26&amp;max-results=25'/><author><name>Garrett D&#39;Amore</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>327</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-5822226322037061865</id><published>2015-05-02T17:35:00.001-07:00</published><updated>2015-05-02T17:35:09.966-07:00</updated><title type='text'>MacOS X 10.10.3 Update is *TOXIC*</title><content type='html'>As a PSA (public service announcement), I&#39;m reporting here that updating your Yosemite system to 10.10.3 is incredibly toxic if you use WiFi.&lt;br /&gt;&lt;br /&gt;I&#39;ve seen other reports of this, and I&#39;ve experienced it myself. &amp;nbsp;What happened is that the update for 10.10.3 seems to have done something tragically bad to the WiFi drivers, such that it completely hammers the network to the point of making it unusable for everyone else on the network.&lt;br /&gt;&lt;br /&gt;I have late 2013 iMac 27&quot;, and after I updated, I found that other systems started badly badly misbehaving. &amp;nbsp;I blamed my ISP, and the router, because I was seeing ping times of tens of &lt;i&gt;seconds&lt;/i&gt;!&lt;br /&gt;(No, not milliseconds, &lt;i&gt;seconds!!!&lt;/i&gt;&amp;nbsp; In one case I saw responses over 64 seconds.) &amp;nbsp;This was on other systems that were not upgraded. &amp;nbsp;Needless to say, that basically left the network unusable.&lt;br /&gt;&lt;br /&gt;(The behavior was cyclical -- I&#39;d get a few tens of seconds where pings to 8.8.8.8 would be in the 20 msec range, and then it would start to jump up very quickly until maxing up around a minute or so. &amp;nbsp;It would stay there for a minute or two, then rest or drop back to sane times. &amp;nbsp; But only very briefly.)&lt;br /&gt;&lt;br /&gt;This was most severe when using a 5GHz network. &amp;nbsp;Switching down to 2.4GHz reduced some of the symptoms -- although still over 10 seconds to get traffic through and thoroughly unusable for a wide variety of applications.&lt;br /&gt;&lt;br /&gt;There are reports that disabling Bluetooth may alleviate this, and also some people reported some success with clearing certain settings files. &amp;nbsp;I&#39;ve not tried either of these yet. &amp;nbsp;Google around for the answer if you want to. &amp;nbsp;For now, my iMac 27&quot; is powered off, until I can take the chance to disrupt the network again to try these &quot;fixes&quot;.&lt;br /&gt;&lt;br /&gt;Apple, I&#39;m seriously seriously disappointed here. &amp;nbsp;I&#39;m not sure at all how this testing got past you, but you need to fix this. &amp;nbsp;Its absolutely criminal that applying a recommended update with security critical fixes in it should turn my computer into a DoS device for my local network. &amp;nbsp;I&#39;m shocked that several days later I&#39;ve not seen a release update from Apple to fix this critical problem.&lt;br /&gt;&lt;br /&gt;Anyway, my advice is, if possible, hold off for the update to 10.10.3. &amp;nbsp;Its tragically, horribly toxic not just to the upgraded device, but probably to the entire network it sits on. &amp;nbsp;I&#39;m a little astounded that a bug in the code could hose an entire WiFi network as badly as this does -- I would have previously thought this impossible (and this was part of the reason why it took a while to diagnose this down to the computer -- I thought the ridiculous ping responses had to be a problem with my upstream provider!)&lt;br /&gt;&lt;br /&gt;I&#39;ll post an update here if one becomes available.</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/5822226322037061865/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=5822226322037061865' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5822226322037061865'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5822226322037061865'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2015/05/macos-x-10103-update-is-toxic.html' title='MacOS X 10.10.3 Update is *TOXIC*'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-8778211508689408995</id><published>2015-04-14T11:13:00.002-07:00</published><updated>2015-04-14T11:13:18.947-07:00</updated><title type='text'>vtprint - blast from the past</title><content type='html'>I recently decided to have a look back at some &lt;i&gt;old&lt;/i&gt;&amp;nbsp;stuff I wrote. &amp;nbsp;Blast from the past stuff. &amp;nbsp;One of the things I decided to look at was the very first open source program I wrote -- something called &lt;b&gt;&lt;i&gt;&lt;a href=&quot;https://github.com/gdamore/vtprint&quot;&gt;vtprint&lt;/a&gt;&lt;/i&gt;&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;b&gt;vtprint&lt;/b&gt;&lt;/i&gt; is a tool that borrowed ideas stolen from the pine mail program. &amp;nbsp;This comes from the days of serial dialups, and legacy (&lt;a href=&quot;http://www.columbia.edu/kermit/mskermit.html&quot;&gt;Kermit&lt;/a&gt;&amp;nbsp;or &lt;a href=&quot;http://www.procomm-guide.com/&quot;&gt;ProComm&lt;/a&gt; for those who remember such things) serial connectivity over 14.4K modems. &amp;nbsp;Printing a file on a remote server was hard back then; you could transfer the file using &lt;a href=&quot;http://en.wikipedia.org/wiki/XMODEM&quot;&gt;xmodem&lt;/a&gt; using rx(1), or its &quot;newer&quot; variants, rb(1) or rz(1), but this was awkward. &amp;nbsp;It turns out that most physical terminals had support for an escape sequence that would start hardcopy to a locally attached printer, and another that would stop it. &amp;nbsp;And indeed, many terminal emulators have the same support. &amp;nbsp;(I added support for this myself to the &lt;a href=&quot;http://rxvt.sourceforge.net/&quot;&gt;rxvt&lt;/a&gt;(1) terminal emulator back in the mid 90&#39;s, so any emulators derived from rxvt inherit this support as well.)&lt;br /&gt;&lt;br /&gt;So vtprint, which in retrospect could have been written in a few lines of shell code, is a C program. &amp;nbsp;It supports configuration via a custom file called &quot;vtprintcap&quot;, that can provide information about different $TERM values and the escape sequences they use. &amp;nbsp;So for example, TVI925 terminals use a different escape sequence than VT100 or VT220 terminals.&lt;br /&gt;&lt;br /&gt;The first version of it, 1.0, is lost in time, and was written back in 1991 or 1992 while I was working as a &quot;Computer Consultant&quot; (fancy name for &lt;a href=&quot;http://bofh.ntk.net/BOFH/&quot;&gt;BOFH&lt;/a&gt;, though I also did a lot of programming for the school&#39;s Windows 3.1 network and Novell NetWare 3.12 server) at the &lt;a href=&quot;http://www.haas.berkeley.edu/&quot;&gt;Haas School of Business at UC Berkeley&lt;/a&gt;. &amp;nbsp;(I was a Chemical Engineering student there, and I flunked out in thermodynamics -- I still blame &lt;a href=&quot;http://en.wikipedia.org/wiki/Gibbs_free_energy&quot;&gt;Gibbs Free Energy&lt;/a&gt;&amp;nbsp;ΔG as a concept I never truly could get my mind around. &amp;nbsp;It took a couple of years before I finally gave up fighting &quot;hard engineering&quot; and accepted my true calling as a software engineer.)&lt;br /&gt;&lt;br /&gt;Anyway, I transferred to &lt;a href=&quot;http://www.sdsu.edu/&quot;&gt;SDSU&lt;/a&gt; into the Computer Science department. &amp;nbsp;While there, back in 1993, I updated vtprint significantly, and that is the release that lives on at SourceForge.&lt;br /&gt;&lt;br /&gt;Today I imported that project to &lt;a href=&quot;https://github.com/gdamore/vtprint&quot;&gt;github&lt;/a&gt;. &amp;nbsp;(And let me tell you, it took some hoops to do this. &amp;nbsp;Apparently all the old CVS projects that were going to have converted to CVS are supposed to already have done so, because at this point even the conversion tools are mostly crufty and broken. &amp;nbsp;Maybe I&#39;ll post what I did there.) &amp;nbsp;Most of the files indicate an age of 11 years ago. &amp;nbsp;That&#39;s because 11 years ago I imported the source into CVS for the benefit of &lt;a href=&quot;http://vtprint.sourceforge.net/&quot;&gt;SourceForge&lt;/a&gt;. &amp;nbsp;The actual files date back to 1994, and you can even see my old email address -- which hasn&#39;t worked for a couple of decades, in the files.&lt;br /&gt;&lt;br /&gt;So, I gave vtprint a whirl today for the first time in years:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;garrett@hipster{4}&amp;gt; ./vtprint README&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;*** vtprint (v2.0.2) ***&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Copyright 1993-1994, Garrett D&#39;Amore&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Last revised October 25, 1994.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;NO WARRANTY! &amp;nbsp;Use &quot;vtprint -w&quot; for info.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;Freely redistributable. &amp;nbsp;Use &quot;vtprint -l&quot; for info.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;vtprint: Can&#39;t open /usr/local/lib/vtprint/vtprintcap, using builtin codes.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;vtprint: Using &amp;lt;stdout&amp;gt; for output.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;vtprint: Output flags: formfeed&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;vtprint: Printed README.&lt;/span&gt;&lt;span style=&quot;font-family: Verdana, sans-serif; font-size: x-small;&quot;&gt;vtprint: Successfully printed 1 file (1 specified).&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;Sadly, MacOS X Terminal.app does not appear to emulate the escape sequences properly. &amp;nbsp;But &lt;a href=&quot;http://iterm2.com/&quot;&gt;iTerm2&lt;/a&gt; does so very nicely. &amp;nbsp;It even generates a nice print preview using the standard MacOS X print dialog. &amp;nbsp;Sadly, it does not pass through PostScript unmolested, but for printing ASCII files it works beautifully. &lt;br /&gt;&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;&lt;a href=&quot;http://3.bp.blogspot.com/-8mJXpUuLDrI/VS1Wn3zM1lI/AAAAAAAAAPk/yxUILtO8-rs/s1600/Screen%2BShot%2B2015-04-14%2Bat%2B10.59.52%2BAM.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-8mJXpUuLDrI/VS1Wn3zM1lI/AAAAAAAAAPk/yxUILtO8-rs/s1600/Screen%2BShot%2B2015-04-14%2Bat%2B10.59.52%2BAM.png&quot; height=&quot;320&quot; width=&quot;278&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;I think that I&#39;m going to start using vtprint again, when I need to print a file located on a virtual machine, or over a connection that only offers SSH (such as a secured access machine). &amp;nbsp;With firewalled networks, I suspect that this program has new usefulness. &amp;nbsp;I&#39;m also switching from Terminal.app (as many people have suggested) to iTerm2.&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/8778211508689408995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=8778211508689408995' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8778211508689408995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8778211508689408995'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2015/04/vtprint-blast-from-past.html' title='vtprint - blast from the past'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-8mJXpUuLDrI/VS1Wn3zM1lI/AAAAAAAAAPk/yxUILtO8-rs/s72-c/Screen%2BShot%2B2015-04-14%2Bat%2B10.59.52%2BAM.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-3253875900774655656</id><published>2015-02-22T11:48:00.000-08:00</published><updated>2015-02-22T13:07:37.116-08:00</updated><title type='text'>IPv6 and IPv4 name resolution with Go</title><content type='html'>As part of a work-related project, I&#39;m writing code that needs to resolve DNS names using &lt;a href=&quot;http://golang.org/&quot;&gt;Go&lt;/a&gt;, on &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;While doing this work, I noticed a very surprising thing. &amp;nbsp;When a host has both IPv6 and IPv4 addresses associated with a name (such as &lt;i&gt;localhost&lt;/i&gt;), Go prefers to resolve to the IPv4 version of the name, unless one has asked specifically for v6 names.&lt;br /&gt;&lt;br /&gt;This flies in the fact of existing practice on illumos &amp;amp; Solaris systems, where resolving a name tends to give an IPv6 result, assuming that any IPv6 address is plumbed on the system. &amp;nbsp;(And on modern installations, that is the default -- at least the loopback interface of ::1 is always plumbed by default. &amp;nbsp;And not only that, but services listening on that address will automatically serve up both v6 and v4 clients that connect on either ::1 or 127.0.0.1.)&lt;br /&gt;&lt;br /&gt;The rationale for this logic is buried in the Go &lt;a href=&quot;https://golang.org/src/net/ipsock.go&quot;&gt;&lt;span style=&quot;font-family: inherit;&quot;&gt;net/ipsock.go&lt;/span&gt;&lt;/a&gt; file, in comments for the function &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;a href=&quot;https://golang.org/src/net/ipsock.go#L67&quot;&gt;firstFavoriteAddr&lt;/a&gt;&amp;nbsp;()&lt;/span&gt;:&lt;br /&gt;&lt;pre style=&quot;background-color: #e9e9e9; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; color: #222222; line-height: 18px; margin: 20px; padding: 10px;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span class=&quot;ln&quot; id=&quot;L76&quot; style=&quot;color: #999999;&quot;&gt;&lt;span style=&quot;font-size: 14px;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;   76&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// We&#39;ll take any IP address, but since the dialing&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ln&quot; id=&quot;L77&quot; style=&quot;color: #999999;&quot;&gt;    77&lt;/span&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// code does not yet try multiple addresses&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ln&quot; id=&quot;L78&quot; style=&quot;color: #999999;&quot;&gt;    78&lt;/span&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// effectively, prefer to use an IPv4 address if&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ln&quot; id=&quot;L79&quot; style=&quot;color: #999999;&quot;&gt;    79&lt;/span&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// possible. This is especially relevant if localhost&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ln&quot; id=&quot;L80&quot; style=&quot;color: #999999;&quot;&gt;    80&lt;/span&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// resolves to [ipv6-localhost, ipv4-localhost]. Too&lt;/span&gt;&lt;br /&gt;&lt;span class=&quot;ln&quot; id=&quot;L81&quot; style=&quot;color: #999999;&quot;&gt;    81&lt;/span&gt; &lt;span class=&quot;comment&quot; style=&quot;color: #006600;&quot;&gt;// much code assumes localhost == ipv4-localhost.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;This is a really surprising result. &amp;nbsp;If you want to get IPv6 names by default, with Go, you could use the &lt;span style=&quot;font-family: inherit;&quot;&gt;&lt;a href=&quot;http://golang.org/pkg/net/#ResolveIPAddr&quot;&gt;net.ResolveIPAddr&lt;/a&gt;() (or &lt;a href=&quot;http://golang.org/pkg/net/#ResolveTCPAddr&quot;&gt;ResolveTCPAddr&lt;/a&gt;() or &lt;a href=&quot;http://golang.org/pkg/net/#ResolveUDPAddr&quot;&gt;ResolveUDPAddr&lt;/a&gt;())&lt;/span&gt; functions with the network type of &quot;ip6&quot;, &quot;tcp6&quot;, or &quot;udp6&quot; first. &amp;nbsp;Then if that resolution fails, you can try the standard versions, or the v4 specific versions (doing the latter is probably slightly more efficient.) &amp;nbsp;Here&#39;s what that code looks like:&lt;br /&gt;&lt;pre style=&quot;background-color: #e9e9e9; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; border-top-left-radius: 5px; border-top-right-radius: 5px; line-height: 18px; margin: 20px; padding: 10px;&quot;&gt;&lt;span style=&quot;font-family: Verdana, sans-serif;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&lt;span style=&quot;color: #222222;&quot;&gt;        name := &quot;&lt;/span&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;localhost&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&quot;&lt;br /&gt;&lt;br /&gt;        &lt;/span&gt;&lt;span style=&quot;color: #38761d;&quot;&gt;&lt;span class=&quot;comment&quot;&gt;// First we try IPv6. &amp;nbsp;Note that we *hope* this fails if the host&lt;/span&gt;&lt;br /&gt;        &lt;span class=&quot;comment&quot;&gt;// stack does not actually support IPv6.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;        err, ip := net.ResolveIP(&quot;&lt;/span&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;ip6&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&quot;, name)&lt;br /&gt;        if err != nil {&lt;br /&gt;                &lt;/span&gt;&lt;span class=&quot;comment&quot; style=&quot;color: #38761d;&quot;&gt;// IPv6 not found, maybe IPv4?&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;br /&gt;                err, ip = net.ResolveIP(&quot;&lt;/span&gt;&lt;span style=&quot;color: #6fa8dc;&quot;&gt;ip4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #222222;&quot;&gt;&lt;span style=&quot;font-size: x-small;&quot;&gt;&quot;, name)&lt;br /&gt;        }&lt;/span&gt;&lt;span style=&quot;font-size: xx-small;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;However, this choice turns out to also be &lt;i&gt;evil&lt;/i&gt;, because while ::1 often works locally as an IPv6 address and is functional, other addresses, for example www.google.com, will resolve to IPv6 addresses which will &lt;i&gt;not&lt;/i&gt;&amp;nbsp;work unless you have a clean IPv6 path all the way through. &amp;nbsp;For example, the above gives me this for www.google.com:&amp;nbsp;2607:f8b0:4007:804::1010, but if I try to telnet to it, it won&#39;t work -- no route to host (of course, because I don&#39;t have an IPv6 path to the Internet, both my home gateway and my ISP are IPv4 only.)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Its kind of a sad that the Go people felt that they had to make this choice -- at some level it robs the choice from the administrator, and encourages the existing broken code to remain so. &amp;nbsp;I&#39;m not sure what the other systems use, but at least on illumos, we have a stack that understands the situation, and resolves &lt;i&gt;optimally&lt;/i&gt;&amp;nbsp;for the given the situation of the user. &amp;nbsp;Sadly, Go shoves that intelligence aside, and uses its own overrides.&lt;br /&gt;&lt;br /&gt;One moral of the story here is -- always use either explicit v4 or v6 addresses if you care, or ensure that your names resolve properly.</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/3253875900774655656/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=3253875900774655656' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3253875900774655656'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3253875900774655656'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2015/02/ipv6-and-ipv4-name-resolution-with-go.html' title='IPv6 and IPv4 name resolution with Go'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-1317329752004791569</id><published>2015-02-11T21:35:00.001-08:00</published><updated>2015-02-11T21:35:58.661-08:00</updated><title type='text'>Rise of mangos</title><content type='html'>&lt;h2&gt;&lt;i&gt;What is mangos?&lt;/i&gt;&lt;/h2&gt;&lt;br /&gt;Those of you who follow me may have heard about this project I&#39;ve created called &lt;a href=&quot;http://github.com/gdamore/mangos&quot;&gt;mangos&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Mangos is a lightweight messaging system designed to be wire compatible with &lt;a href=&quot;http://www.nanomsg.org/&quot;&gt;nanomsg&lt;/a&gt;, but is implemented entirely in &lt;a href=&quot;http://www.golang.org/&quot;&gt;Go&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;There is a very nice &lt;a href=&quot;http://www.bravenewgeek.com/fast-scalable-networking-in-go-with-mangos/&quot;&gt;write up&lt;/a&gt; of mangos by Tyler Treat, which might help explain some things.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;i&gt;Recent Activity&lt;/i&gt;&lt;/h3&gt;&lt;div&gt;&lt;i&gt;&lt;br /&gt;&lt;/i&gt;&lt;/div&gt;As a consequence of a few things, the last two weeks has seen a substantial rise of use of mangos. &lt;br /&gt;&lt;br /&gt;First off, there was Tyler&#39;s excellent article. &amp;nbsp;(By the way, he&#39;s done a series comparing and contrasting other messaging systems -- highly recommended reading.)&lt;br /&gt;&lt;br /&gt;Second, mangos got mentioned on &lt;a href=&quot;https://news.ycombinator.com/&quot;&gt;Hacker News&lt;/a&gt;. &amp;nbsp;That drew a large number visitors to my github repo.&lt;br /&gt;&lt;br /&gt;Then another open source project, &lt;a href=&quot;https://github.com/glycerine/goq&quot;&gt;Goq&lt;/a&gt;, switched from using libnanomsg to mangos, using the compatibility shim I provided for such use. &amp;nbsp;As a consequence of that work, several bugs were identified, and subsequently squashed.&lt;br /&gt;&lt;br /&gt;The upshot of all that is that I saw the number unique visitors sky rocket. &amp;nbsp;On Saturday Feb 7, there were over &lt;a href=&quot;https://github.com/gdamore/mangos/graphs/traffic&quot;&gt;2500 unique visitors&lt;/a&gt; to the github page, and 29 unique people took clones. &amp;nbsp;Sunday it tapered sharply to just over 1k visitors, and today there were only 7. &amp;nbsp;Peaks rarely get sharper than that.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;i&gt;Improvements&lt;/i&gt;&lt;/h3&gt;&lt;br /&gt;Over the past week or so I&#39;ve made a large number of changes and improvements. &amp;nbsp;Recently, mangos has grown support for &lt;a href=&quot;https://tools.ietf.org/html/rfc6455&quot;&gt;RFC 6455&lt;/a&gt; (websocket), including websocket over &lt;a href=&quot;http://www.ietf.org/rfc/rfc5246.txt&quot;&gt;TLS&lt;/a&gt;, and has had numerous internal improvements.&lt;br /&gt;&lt;br /&gt;Some of these changes have broken API. &amp;nbsp;If you use mangos, I&#39;m sorry about the breakage -- please let me know if you&#39;re hurt by this. &amp;nbsp;(I have created tagged releases for v1.0.0 and v1.1.0 in an attempt to mitigate the risk, but tip still has some interesting changes in it.)&lt;br /&gt;&lt;br /&gt;Unlike libnanomsg, mangos (tip only) can notify you when a connection is added or removed, and you can access interesting information about the connection. &amp;nbsp;This is in the &lt;a href=&quot;http://godoc.org/github.com/gdamore/mangos#Port&quot;&gt;Port API&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;&lt;i&gt;Futures&lt;/i&gt;&lt;/h3&gt;&lt;br /&gt;We are using mangos internally at Lucera, and I know now of several cases of production use. &amp;nbsp;This is kind of scary at one level, since I wrote this originally as a hobby project about a year ago (to learn Go.) &amp;nbsp;But it has become useful -- frankly extending mangos is far far more pleasurable than working in the C libnanomsg implementation -- a lot of this is thanks to Go which is utterly pleasurable to work in (no matter how bad the guts may be reputed to be). &amp;nbsp;Being able to write a new TLS transport, or even websocket, in the course of an afternoon or two (actually for TLS it was more like an hour), is really nice.&lt;br /&gt;&lt;br /&gt;I&#39;m hoping that more people will find it useful, and that folks who want to experiment with the underlying messaging patterns may find it easier to work with than the C code. &amp;nbsp;Ideally, there will be more collaborators here, as we start exploring new directions for this stuff.&lt;br /&gt;&lt;br /&gt;In the meantime, I&#39;m going to continue to work to improve and extend mangos, because its become one of the tools at my day job. &amp;nbsp;Its nice when work and pleasure come together!</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/1317329752004791569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=1317329752004791569' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/1317329752004791569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/1317329752004791569'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2015/02/rise-of-mangos.html' title='Rise of mangos'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-845552299681278252</id><published>2014-11-13T09:33:00.000-08:00</published><updated>2014-11-13T09:33:21.082-08:00</updated><title type='text'>A better illumos...</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;If you follow &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt; very closely, you may already know some of this.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;A New Fork&lt;/h3&gt;&lt;br /&gt;Several months ago, I forked &lt;a href=&quot;https://github.com/illumos/illumos-gate&quot;&gt;illumos-gate&lt;/a&gt; (the primary source code repository for the kernel and system components of illumos) into &lt;a href=&quot;https://github.com/gdamore/illumos-core&quot;&gt;illumos-core&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;I had started upstreaming my work from illumos-core into illumos-gate. &amp;nbsp;I&#39;ve since ceased that effort, largely because I simply have no time for the various arguments that my work often generates. &amp;nbsp;I think this is largely because my &lt;a href=&quot;https://github.com/gdamore/illumos-core/wiki/illumos-core-vision&quot;&gt;vision&lt;/a&gt; for illumos is somewhat different from that of other folks, and sadly illumos proper lacks anything resembling a guiding vision now, which means that only entirely non-contentious changes can get integrated into illumos. &lt;br /&gt;&lt;br /&gt;However, I still want to proceed apace with illumos-core, because I believe that work has real value, and I firmly believe that my vision for illumos is the one that will lead to greater adoption by users, and by distributors as well, since much of what I&#39;m trying to achieve in illumos-gate is aimed at reducing barriers to adoption and to developers both of illumos itself and of systems that want to build on top of or integrate illumos. &amp;nbsp;(An example of reducing barriers to adoption -- I recently &lt;a href=&quot;https://github.com/gdamore/illumos-core/commit/c79874d0f161eb999ce69cc8921a0b9a4294a710&quot;&gt;implemented a BSD compatible flock() within libc&lt;/a&gt;, which is sometimes used by applications developed for BSD or Linux.)&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Relationship to Upstream&lt;/h3&gt;&lt;br /&gt;I do also invite other parties to cherry-pick from illumos-core into illumos-gate. &amp;nbsp;I suspect that a large number of the enhancements I&#39;ve made, such as the support for the &lt;a href=&quot;https://github.com/gdamore/illumos-core/issues/88&quot;&gt;fexecve&lt;/a&gt;() function &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/9699919799/functions/exec.html&quot;&gt;specified&lt;/a&gt; by POSIX 2008, are likely to be more widely useful. &amp;nbsp;Within illumos-core, I want to retain a high standard of quality, and facilitate the effort of upstreaming for those who want to make the effort to do so.&lt;br /&gt;&lt;br /&gt;I do want to reiterate that unlike other projects that have forked from illumos, it is not my intent to divorce myself from the community -- rather I see this illumos-core as an experimental branch aimed at exploring new directions that I ultimately hope will be embraced by the wider illumos community some day; by doing this in a separate repository/branch/fork, illumos-core can drive towards these goals without getting mired in questions that would prevent progress on these goals within illumos-gate proper.&lt;br /&gt;&lt;br /&gt;The focus here is on delivery, rather than on discussion. &amp;nbsp;(In fact, one of my taglines on social media has for many years been &quot;&lt;a href=&quot;https://www.openhub.net/accounts/gdamore&quot;&gt;Code first, questions later&lt;/a&gt;.&quot; &amp;nbsp;The illumos-core effort represents a return to that core value.)&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Call for Participation&lt;/h3&gt;&lt;br /&gt;I&#39;m also interested in having co-collaborators on this project. &amp;nbsp;The goals are large, and while I hope to achieve them someday even if I have to do it all myself, I&#39;m certain that the project will move quite a lot faster with help. &amp;nbsp;Also, because of our lack of bureaucracy, I hope that illumos-core can be an easier path to integration than illumos-gate. &amp;nbsp;I just use a simple &lt;a href=&quot;http://www.github.com/&quot;&gt;github&lt;/a&gt; pull-request for integration at present.&lt;br /&gt;&lt;br /&gt;There is an opportunity for folks at all different technical levels to participate. &amp;nbsp;We need work that involves systems programming, but also there is work around documentation, research, shell scripting, test development and release engineering to be performed. &amp;nbsp;I&#39;m happy to mentor folks who want to help out, based on their skill level.&lt;br /&gt;&lt;br /&gt;And, of course, for folks who want to focus primarily on improving illumos-gate upstream, there is effort that could be spent to figure out what to cherry-pick and to do the various illumos-gate process wrangling steps to get those bits integrated.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/845552299681278252/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=845552299681278252' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/845552299681278252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/845552299681278252'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/11/a-better-illumos.html' title='A better illumos...'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-8778482429302443995</id><published>2014-10-17T23:20:00.002-07:00</published><updated>2014-10-17T23:20:57.527-07:00</updated><title type='text'>Your language sucks...</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;As a result of work I&#39;ve been doing for &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt;, I&#39;ve recently gotten re-engaged with internationalization, and the support for this in libc and localedef (I am the original author for our localedef.)&lt;br /&gt;&lt;br /&gt;I&#39;ve decided that human languages suck. &amp;nbsp;Some suck worse than others though, so I thought I&#39;d write up a guide. &amp;nbsp;You can take this as &quot;your language sucks if...&quot;, or perhaps a better view might be &quot;your program sucks if you make assumptions this breaks...&quot;&lt;br /&gt;&lt;br /&gt;(Full disclosure, I&#39;m spoiled. &amp;nbsp;I am a native speaker of English. &amp;nbsp;English is pretty awesome for data-processing, at least at the written level. &amp;nbsp;I&#39;m not going to concern myself with questions about deeper issues like grammar, natural language recognition, speech synthesis, or recognition, automatic translation, etc. &amp;nbsp;Instead this is focused strictly on the most basic display and simple operations like collation (sorting), case conversion, and character classification.)&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;1. Too many code points.&amp;nbsp;&lt;/h2&gt;Some languages (from Eastern Asia) have way way too many code points. &amp;nbsp;There are so many that these languages can&#39;t actually fit into 16-bits all by themselves. &amp;nbsp;Yes, I&#39;m saying that there are languages with over 65,000 characters in them! &amp;nbsp;This explosion means that generating data for languages results in intermediate lookup tables that are megabytes in size. &amp;nbsp;For Unicode, this impacts all languages. &amp;nbsp;The intermediate sources for the Unicode supported in illumos blow up to over 2GB when support for the additional code planes is included.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;2. Your language requires me to write custom code for symbol names.&amp;nbsp;&lt;/h2&gt;Hangul Jamo, I&#39;m looking at you. &amp;nbsp;Of all the languages in Unicode, only this one is so bizarre that it requires multiple lookup tables to determine the names of the characters, because the characters are made up of smaller bits of phonetic portions (vowels and consonants.) &amp;nbsp;It even has its own section in the basic conformance document for Unicode (section 3.12). &amp;nbsp;I don&#39;t speak Korean, but I had to learn about Jamo.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;3. Your language&#39;s character set is continuing to evolve.&amp;nbsp;&lt;/h2&gt;Yes, that&#39;s Asia again (mostly China I think). &amp;nbsp; The rate at which new Asian characters are added rivals that of updates to the timezone database. &amp;nbsp;The approach your language uses is wrong!&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;4. Characters in your language are of multiple different cell widths.&amp;nbsp;&lt;/h2&gt;Again, this is mostly, but not exclusively, Asian languages. &amp;nbsp;Asian languages require 2 cells to display many of their characters. &amp;nbsp;But, to make matters far far worse, some times the number f code points used to represent a character is more than one, which means that the width of a character when displayed may be 0, 1, or 2 cells. &amp;nbsp; Worse, some languages have both half- and full-width forms for many common symbols. &amp;nbsp;Argh.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;5. The width of the character depends on the context.&amp;nbsp;&lt;/h2&gt;Some widths depend on the encoding because of historical practice (Asia again!), but then you have composite characters as well. &amp;nbsp;For example, a Jamo vowel sound could in theory be displayed on its own. &amp;nbsp;But if it follows a leading consonant, then it changes the consonant character and they become a new character (at least to the human viewer).&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;6. Your language has unstable case conversions.&lt;/h2&gt;There are some evil ones here, and thankfully they are rare. &amp;nbsp;But some languages have case conversions which are not reversible! &amp;nbsp;Case itself is kind of silly, but this is just insane! &amp;nbsp;Armenian has a letter with this property, I believe.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;7. Your language&#39;s collation order is context-dependent.&amp;nbsp;&lt;/h2&gt;(French, I&#39;m looking at you!) &amp;nbsp;Some languages have sorting orders that depend not just on the character itself, but on the characters that precede or follow it. &amp;nbsp;Some of the rules are really hard. &amp;nbsp;The collation code required to deal with this generally is really really scary looking.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;8. Your language has equivalent alternates (ligatures).&amp;nbsp;&lt;/h2&gt;German, your ß character, which stands in for &quot;ss&quot;, is a poster child here. &amp;nbsp;This is a single code point, but for sorting it is equivalent to &quot;ss&quot;. &amp;nbsp;This is just historical decoration, because it&#39;s &quot;fancy&quot;. &amp;nbsp;Stop making my programming life hard.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;9. Your language can&#39;t decide on a script.&amp;nbsp;&lt;/h2&gt;Some languages can be written in more than one script. &amp;nbsp;For example, Mongolian can be written using Mongolian script or Cyrillic. &amp;nbsp;But the winner (loser?) here is Serbian, which in some places uses both Latin and Cyrillic characters &lt;i&gt;interchangeably&lt;/i&gt;! Pick a script already! I think the people who live like this are just schizophrenic. &amp;nbsp;(Given all the political nonsense surrounding language in these places, that&#39;s no real surprise.)&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;10. Your language has Titlecase.&amp;nbsp;&lt;/h2&gt;POSIX doesn&#39;t do Titlecase. &amp;nbsp;This happens because your language also uses ligatures instead of just allocating a separate cell and code point for each character. &amp;nbsp;Most people talk about titlecase used in a phrase or string of words. &amp;nbsp;But yes, titlecase can apply to a &lt;i&gt;SINGLE CHARACTER&lt;/i&gt;. &amp;nbsp;For example, Dž is just such a character.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;11. Your language doesn&#39;t use the same display / ordering we expect.&lt;/h2&gt;So some languages use right to left, which is backwards, but whatever. &amp;nbsp; Others, crazy ones (but maybe crazy smart, if you think about it) use back and forth bidirectional. &amp;nbsp;And still others use vertical ordering. &amp;nbsp;But the worst of them are those languages (Asia again, dammit!) where the orientation of text can change. &amp;nbsp;Worse, some cases even rotate individual characters, depending upon context (e.g. titles are rotated 90 degrees and placed on the right edge). &amp;nbsp;How did you ever figure out how to use a computer with this crazy stuff?&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;12. Your encoding collides control codes.&lt;/h2&gt;We use the first 32 or so character codes to mean special things for terminal control, etc. &amp;nbsp;If we can&#39;t use these, your language is going to suck over certain kinds of communication lines.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;13. Your encoding uses conflicting values at ASCII code points.&lt;/h2&gt;ASCII is universal. &amp;nbsp;Why did you fight it? &amp;nbsp;But that&#39;s probably just me being mostly Anglo-centric / bigoted.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;14. Your language encoding uses shift characters.&amp;nbsp;&lt;/h2&gt;(Code page, etc.) &amp;nbsp;Some East Asian languages used this hack in the old days. &amp;nbsp;Stateful encodings are JUST HORRIBLY BROKEN. &amp;nbsp; A given sequence of characters should not depend on some state value that was sent a long time earlier.&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;15. Your language encoding uses zero values in the middle of valid characters.&amp;nbsp;&lt;/h2&gt;Thankfully this doesn&#39;t happen with modern encodings in common use anymore. &amp;nbsp;(Or maybe I just have decided that I won&#39;t support any encoding system this busted. &amp;nbsp;Such an encoding is so broken that I just flat out refuse to work with it.)&lt;br /&gt;&lt;br /&gt;&lt;h2 style=&quot;text-align: left;&quot;&gt;Non-Broken Languages&lt;/h2&gt;&lt;br /&gt;So, there are some good examples of languages that are famously not broken.&lt;br /&gt;&lt;br /&gt;a. &lt;b&gt;English&lt;/b&gt;. &amp;nbsp;Written English has simple sorting rules, and a very simple character set. &amp;nbsp;Dipthongs are never ligatures. &amp;nbsp;This is so useful for data processing that I think it has had a great deal to do with why English is the common language for computer scientists around the world. &amp;nbsp;US-ASCII -- and English character set, is the &quot;base&quot; character set for Unicode, and pretty much all other encodings use ASCII encodings in the lower 7 bits.&lt;br /&gt;&lt;br /&gt;b. &lt;b&gt;Russian&lt;/b&gt;. &amp;nbsp;(And likely others that use Cyrillic, but not all of them!) &amp;nbsp;Russian has a very simple alphabet, strictly phonetic. &amp;nbsp;The number of characters is small, there are no composite characters, and no special sorting rules. &amp;nbsp;Hmm... I seem to recall that Russia (Soviet era) had a pretty robust computing industry. &amp;nbsp;And these days Russians mostly own the Internet, right? &amp;nbsp;Coincidence? &amp;nbsp;Or maybe they just don&#39;t have to waste a lot of time fighting with the language just to get stuff done?&lt;br /&gt;&lt;br /&gt;I think there are probably others. &amp;nbsp;(At a glance, Geoergian looks pretty straight-forward. &amp;nbsp; I suspect that there are languages using both Cyrillic and Latin character sets that are sane. &amp;nbsp;Ethiopic actually looks pretty simple and sane too. &amp;nbsp;(Again, just from a text processing standpoint.)&lt;br /&gt;&lt;br /&gt;But sadly, the vast majority of natural languages have written forms &amp;amp; rules that completely and utterly suck for text processing.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/8778482429302443995/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=8778482429302443995' title='20 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8778482429302443995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8778482429302443995'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/10/your-language-sucks.html' title='Your language sucks...'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>20</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-6417258591013467960</id><published>2014-10-12T14:00:00.001-07:00</published><updated>2014-10-13T16:03:12.827-07:00</updated><title type='text'>My Problem with Feminism</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I&#39;m going to say some things here that may be controversial. &amp;nbsp;Certainly that headline is. &amp;nbsp;But please, bear with me, and read this before you judge too harshly.&lt;br /&gt;&lt;br /&gt;As another writer said, 2014 has been a terrible year for women in tech. &amp;nbsp;(Whether in the industry, or in gaming.) &amp;nbsp;Arguably, this is not a &lt;i&gt;new&lt;/i&gt;&amp;nbsp;thing, but rather events are reaching a head. &amp;nbsp;Women (some at any rate) are being more vocal, and awareness of women&#39;s issues is up. &amp;nbsp;On the face of it, this should be a good thing.&lt;br /&gt;&lt;br /&gt;And yet, we have incredible conflict between women and men. &amp;nbsp;And this is at the heart of my problem with &quot;Feminism&quot;.&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;The F-Word&lt;/h3&gt;&lt;br /&gt;Don&#39;t get me wrong. &amp;nbsp;I strongly believe that women should be treated fairly and with respect; in the professional place they should receive the same level of professional respect -- and compensation! -- as their male counterparts can expect. &amp;nbsp;I believe this passionately -- as a nerd, I prefer to judge people on the merits of their work, rather than on their race, creed, gender, or sexual preference. &amp;nbsp;A similar principle applies to gaming -- after all, how do you really know the gender of the player on the other side of the MMO? &amp;nbsp;Does it even matter? &amp;nbsp;When did gaming become a venue for channeling hate instead of fun?&lt;br /&gt;&lt;br /&gt;The problem with &quot;feminism&quot; is that instead of repairing inequality and trying to bring men and women closer together, so much of it seems to be divisive. &amp;nbsp;The very word itself basically suggests a gender based conflict, and I think this, as well as much of the recent approach, is counterproductive.&lt;br /&gt;&lt;br /&gt;Instead of calling attention to inequalities and improper behaviors (lets face it, nobody wants to deal with sexual harassment, discrimination, or some of the very much worse behavior that a few terribly bad actors are guilty of), we&#39;ve become focused on gender bias and &quot;fixing&quot; gender bias as a goal in and of itself, rather than instead focusing on fair and equal treatment for all.&lt;br /&gt;&lt;br /&gt;Every day I&#39;m inundated with tweets and Facebook postings extolling the terrible plight of women at the expense of men. &amp;nbsp;Many of these posts seem intended to make me either angry at men, or ashamed of being one. &amp;nbsp;This basically drives a wedge between people, even unconsciously, to the point that it has become impossible to avoid being a soldier on one side or the other of this war. &amp;nbsp;And don&#39;t get me wrong, it has indeed degenerated to a total war.&lt;br /&gt;&lt;br /&gt;I don&#39;t think this is what most feminists or their advocates really want. &amp;nbsp;(Though, I think it is what some of them want. &amp;nbsp;The side of feminism has its bad actors who thrive on conflict just as much as the other side has. &amp;nbsp;Extremism is gender and color and religion blind, as we&#39;ve ample evidence of.)&lt;br /&gt;&lt;br /&gt;I think one thing that advocates for women in tech can do, is to pick a different term, and a different way of stating their goals, and perhaps a different approach. &amp;nbsp;I think we&#39;ve reached the critical mass necessary for awareness, so the constant tweets about how terrible it is to be a woman are no longer helpful.&lt;br /&gt;&lt;br /&gt;I&#39;m not sure what &quot;term&quot; should replace feminism -- in the workplace I&#39;d suggest &quot;professionalism&quot;. &amp;nbsp;After all everyone wants to be treated professionally, not just women. &amp;nbsp;(Btw, I&#39;d say that in the gaming community, the value should be &quot;sportsmanship&quot;. &amp;nbsp;Sadly some will see that word is gender biased, but I don&#39;t ascribe to the notion that we have to completely change our language in order to be more politically correct. &amp;nbsp;You know what I mean.)&lt;br /&gt;&lt;br /&gt;Likewise, instead of dog piling on the one person (as I&#39;m sure will happen in response to this post) on someone who doesn&#39;t immediately appear to support the feminist agenda, perhaps a little more tolerance, and education should be used in the approach. &amp;nbsp;Focus should, IMO, be on public praise for the parties who are working to make conditions better.&lt;br /&gt;&lt;br /&gt;Educate instead of punish. &amp;nbsp;Make allies instead of enemies.&lt;br /&gt;&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Salary Gap&lt;/h3&gt;&lt;br /&gt;&lt;div style=&quot;text-align: left;&quot;&gt;The salary gap issue that was raised recently by Microsoft is another case in point.&lt;br /&gt;&lt;br /&gt;I don&#39;t agree with &lt;a href=&quot;http://valleywag.gawker.com/microsoft-ceo-tells-women-not-to-ask-for-a-raise-at-wom-1644473757?rev=1412886308615&quot;&gt;Satya Nadella&#39;s comments&lt;/a&gt; saying that women should not ask for raises, but I think many women are nearly as likely to get a raise upon requesting one as a man of similar accomplishments. &amp;nbsp;(Yes, it would be better if this statement could have been said without &quot;nearly&quot;.) &amp;nbsp; Far too few women feel comfortable asking for a merit based raise in the first place -- that is something that should change.  But using race or gender as a bias to demand pay increases is a recipe for further division. &amp;nbsp;Indeed, men may begin to wonder if women are being compensated unfairly because they are women, but in the reverse direction.&amp;nbsp;&lt;/div&gt;&lt;div style=&quot;text-align: left;&quot;&gt;&lt;br /&gt;&lt;/div&gt;Likewise, bringing up discrimination in a salary discussion puts the other party on the defensive. &amp;nbsp;It presumes to imply prior wrong-doing. &amp;nbsp;This may be the case, but it may well not be. &amp;nbsp;After all, I&#39;ve known many men that were under compensated simply because they sold themselves short, or were not comfortable asking for more money. &amp;nbsp; Why look for a fight when there isn&#39;t one? &amp;nbsp;(I suspect this is what Satya was really trying to get at.)&lt;br /&gt;&lt;br /&gt;None of this helps the cause of &quot;professionalism&quot;, and probably not the cause of &quot;feminism&quot;.&lt;br /&gt;&lt;br /&gt;Average tech salary figures are easily obtainable. &amp;nbsp;If a worker, man or woman, feels under compensated -- for any reason -- then they should take it to his employer and ask for a correction. &amp;nbsp;But to presume that the reason is gender, starts the conversation from a point of conflict.&lt;br /&gt;&lt;br /&gt;Far far better is to demand far pay based on work performance and merit, relative to industry norms as appropriate. &amp;nbsp; If an employer won&#39;t compensate fairly, just leave. &amp;nbsp;There is no shortage of tech jobs in the industry. &amp;nbsp;If you&#39;re a woman, maybe look for jobs at companies that employ (and successfully retain) women. &amp;nbsp;Ask the people who work at a prospective employer about conditions, etc. &amp;nbsp;That&#39;s true for minorities too! &amp;nbsp;Ultimately, an employer who discriminates will find itself at a severe competitive advantage, as both the discriminated-against parties, and their allies refuse to do business with them.&lt;br /&gt;&lt;br /&gt;An employer is not obligated to pay you &quot;more&quot; because of your gender. &amp;nbsp;But they must also not pay you less because of gender. &amp;nbsp;And yet every company will generally try to pay as little as they think they can get away with. &amp;nbsp;So don&#39;t let them -- but keep discrimination out of the conversation unless there is really compelling proof of wrong doing. &amp;nbsp;(And if there is such evidence, I&#39;d recommend looking elsewhere, and possibly explore stronger legal measures.)&lt;br /&gt;&lt;br /&gt;And yes, I strongly strongly believe that most men feel as I do. &amp;nbsp;They support the notion that everyone should be treated equally and professionally, and would like to stamp out sexism in the workplace, but many of us are starting to show symptoms of battle fatigue, and even more of us just don&#39;t want to be involved in a conflict at all. &amp;nbsp; Frankly, I think a lot of us are annoyed at feminist attempts to draw us into the conflict, even though we do support many of the stated goals of equal pay, fair treatment, etc. etc.&lt;br /&gt;&lt;h3 style=&quot;text-align: left;&quot;&gt;Closing Thoughts&lt;/h3&gt;As for me, I support the plight of women who find themselves discriminated against based on their gender, and I would like to see more women in my industry. &amp;nbsp;And I&#39;ve put my money where my mouth is.&amp;nbsp;&lt;br /&gt;&lt;br /&gt;But at the same time, you won&#39;t find me supporting &quot;feminism&quot;. &amp;nbsp;I want to heal the rift, and work with awesome people -- and I happen to believe at least half of the awesome people in the world are of a different gender than I am. &amp;nbsp;Why would I want to alienate them?&lt;br /&gt;&lt;/br /&gt;I happen to believe that many well meaning people of many causes damage their cause by basically forcing people to deal with their &quot;diversity&quot; first, instead of of being able to deal with people as people on their own merit. &amp;nbsp;Its so much harder to appreciate a person on her own merits, when at least half of what she is saying is that she&#39;s unfairly treated because of gender, race, sexual preference, etc. &amp;nbsp;This true for everyone. &amp;nbsp;Show me how you&#39;re excellent, and I promise to appreciate you for your awesomeness, and to treat you fairly and with the same respect I would for anyone of my own gender/race/sexual preference.&lt;br /&gt;&lt;br /&gt;You are awesome because of your accomplishments/innovations/contributions, not because of your gender or race or sexual preference.&lt;br /&gt;&lt;br /&gt;But, if you won&#39;t let me look past your race/gender/etc. identity, then please don&#39;t be offended if I don&#39;t see anything else. &amp;nbsp;If you want to be treated like a &quot;person&quot;, then let me see the person instead of just some classification in an equal opportunity survey.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/6417258591013467960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=6417258591013467960' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/6417258591013467960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/6417258591013467960'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/10/my-problem-with-feminism.html' title='My Problem with Feminism'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-2247759060905481071</id><published>2014-10-02T14:24:00.003-07:00</published><updated>2014-10-02T14:24:45.479-07:00</updated><title type='text'>Supporting Women in Open Source</title><content type='html'>Please have a look at &lt;a href=&quot;http://ceph.com/community/support-ada-initiative-challenge-open-storage-community/&quot;&gt;Sage Weil&#39;s blog post&lt;/a&gt; on supporting the Ada Initiative, which supports women in open source development.&lt;br /&gt;&lt;br /&gt;Sage is sponsoring an $8192 matching grant, to support women in open source development of open storage technology.&lt;br /&gt;&lt;br /&gt;You may have heard my talk recently, where I expressed that there have been no female contributions to illumos (that includes ZFS by the way!) &amp;nbsp;This is kind of a tragedy; intelligence and creativity of at least half the population are simply not represented here, and we are worser for it.&lt;br /&gt;&lt;br /&gt;If you want to try to do something about it, heres a small thing. &amp;nbsp;There&#39;s a week remaining to do so, so I encourage folks to step up. &amp;nbsp;($3392 has already been granted.)&lt;br /&gt;&lt;br /&gt;I&#39;m making a donation myself, if you think supporting more women in open source is a worthwhile cause, please join me!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/2247759060905481071/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=2247759060905481071' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2247759060905481071'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2247759060905481071'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/10/supporting-women-in-open-source.html' title='Supporting Women in Open Source'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-4888050947994817475</id><published>2014-09-07T09:10:00.000-07:00</published><updated>2014-09-07T18:31:49.286-07:00</updated><title type='text'>Modernizing &quot;less&quot;</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I have just spent an all-nighter doing something I didn&#39;t expect to do. &lt;br /&gt;&lt;br /&gt;I&#39;ve &quot;&lt;a href=&quot;https://bitbucket.org/gdamore/illumos-gate/commits/db22b5423fe1dd6bd58f0c3abd71ac1bf89155ff&quot;&gt;modernized&lt;/a&gt;&quot; &lt;b&gt;less&lt;/b&gt;(1). &amp;nbsp;(That link is to the changeset.)&lt;br /&gt;&lt;br /&gt;First off, let me explain the motivation. &amp;nbsp;We need a pager for illumos that can meet the requirements for POSIX IEEE 2003.1-2008 &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/9699919799/utilities/more.html&quot;&gt;&lt;b&gt;more&lt;/b&gt;&lt;/a&gt;(1). &amp;nbsp;We have a suitable pager (barely), in closed source form only, delivered into &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;/usr/xpg4/bin/more&lt;/span&gt;. &amp;nbsp;We have an open source &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;&lt;a href=&quot;http://src.illumos.org/source/xref/illumos-gate/usr/src/cmd/more/more.c&quot;&gt;/usr/bin/more&lt;/a&gt;&lt;/span&gt;, but it is incredibly limited, hearkening back to the days of printed hard copy I think. &amp;nbsp;(It even has Microsoft copyrights in it!)&lt;br /&gt;&lt;br /&gt;So closed source is kind of a no go for me. &lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;http://www.greenwoodsoftware.com/less/&quot;&gt;&lt;b&gt;less&lt;/b&gt;&lt;/a&gt;(1) looks attractive. &amp;nbsp;It&#39;s widely used, and has been used to fill in for more(1) to achieve POSIX compliance on other systems (such as MacOS X.)&lt;br /&gt;&lt;br /&gt;So I started by unpacking it into our tree, and trying to get it to work with an illumos build system.&lt;br /&gt;&lt;br /&gt;That&#39;s when I discovered the crazy contortions autoconf was doing that basically wound up leaving it with just legacy BSD termcap. &amp;nbsp; Ewww. &amp;nbsp; I wanted it to use &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/7908799/cursesix.html&quot;&gt;X/Open Curses&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;When I started trying to do that, I found that there were severe crasher bugs in less, involving the way it uses scratch buffer space. &amp;nbsp;I started trying to debug just that problem, but pretty soon the effort mushroomed.&lt;br /&gt;&lt;br /&gt;Legacy less supports all kinds of crufty and ancient systems. &amp;nbsp; Systems like MS-DOS (actually many different versions with different compiler options!) and Ultrix and OS/2 and OS9, and OSK, etc. &amp;nbsp;In fact, it apparently had to support systems where the C preprocessor didn&#39;t understand &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;#elif&lt;/span&gt;, so the &lt;span style=&quot;font-family: Courier New, Courier, monospace;&quot;&gt;#ifdef&lt;/span&gt; maze was truly nightmarish. &amp;nbsp;The code is K&amp;amp;R style C even.&lt;br /&gt;&lt;br /&gt;I decided it was high time to modernize this application for POSIX systems. &amp;nbsp;So I went ahead and did a sweeping update. &amp;nbsp;In the process I ditched thousands of lines of code (the screen handling bits in screen.c are less than half as big as they were).&lt;br /&gt;&lt;br /&gt;So, now it:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Speaks terminfo (X/Open Curses) instead of ancient BSD termcap&lt;/li&gt;&lt;li&gt;Uses &lt;b&gt;glob&lt;/b&gt;(3C) instead of a hack involving the shell and a helper program (&lt;b&gt;lessecho&lt;/b&gt;, which I&#39;ve removed from my tree.)&lt;/li&gt;&lt;li&gt;Functions properly as /usr/bin/more, both with and without -e (even on broken xterms)&lt;/li&gt;&lt;li&gt;Is fully ANSI C (or ISO C, if you prefer)&lt;/li&gt;&lt;li&gt;Passes illumos&#39; cstyle code style checks&lt;/li&gt;&lt;li&gt;Is &lt;b&gt;lint&lt;/b&gt;(1) clean&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;There is more work to do in the future if someone wants to. &amp;nbsp;Here are the ideas for the future:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;li&gt;Internationalization. &amp;nbsp;This is a pretty easy task involving &lt;b&gt;gettext&lt;/b&gt;().&lt;/li&gt;&lt;li&gt;Make less use getopt() instead of its byzantine option parser (it needed that for PC operating systems. &amp;nbsp;We don&#39;t need or want this complexity on POSIX.)&lt;/li&gt;&lt;li&gt;Fix its character set handling so it can use the &lt;b&gt;mbstring&lt;/b&gt; and &lt;b&gt;wcstring&lt;/b&gt; routines in the platform instead of relying on it&#39;s own implementation of UTF-8. &amp;nbsp;(This would make it support other multibyte locales.)&lt;/li&gt;&lt;li&gt;Make it support port events instead of sleeping when acting in &quot;tail -f&quot; mode.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;If someone wants to pick up any of this work, let me know. &amp;nbsp;I&#39;m happy to advise. &amp;nbsp;Oh, and this isn&#39;t in illumos proper yet. &amp;nbsp;It&#39;s unclear when, if ever, it will get into illumos -- I expect a lot of grief from people who think I shouldn&#39;t have forked this project, and I&#39;m not interested in having &amp;nbsp;a battle with them. &amp;nbsp;The upstream has to be a crazy maze because of the platforms it has to support. &amp;nbsp;We can do better, and I think this was a worthwhile case. &amp;nbsp;(In any event, I now know quite a lot more about less internals than I did before. &amp;nbsp;Not that this is a good thing.)&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/4888050947994817475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=4888050947994817475' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/4888050947994817475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/4888050947994817475'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/09/modernizing-less.html' title='Modernizing &quot;less&quot;'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-3767819768476018717</id><published>2014-08-20T22:15:00.001-07:00</published><updated>2014-08-20T22:15:12.688-07:00</updated><title type='text'>It&#39;s time already</title><content type='html'>&lt;div&gt;(Sorry for the political/religious slant this post takes... I&#39;ve been trying to stay focused on technology, but sometimes events are simply too large to ignore...)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The &lt;a href=&quot;http://www.cbsnews.com/news/james-foleys-parents-he-was-courageous-to-the-end/&quot;&gt;execution of John Foley&lt;/a&gt; is just the latest. &amp;nbsp;But for me, its the straw that broke the camel&#39;s back.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Over the past weeks, I&#39;ve become extremely frustrated and angry. &amp;nbsp;The &quot;radical Islamists&quot; have become the single biggest threat to world peace since Hitler&#39;s Nazi&#39;s. &amp;nbsp;And they are worse than the Nazi&#39;s. &amp;nbsp;Which takes some doing. &amp;nbsp;(Nazi&#39;s &quot;merely&quot; exterminated Jews. &amp;nbsp;The Islamists want to exterminate everyone who does&#39;t believe exactly their own particular version of extreme religion.)&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;m not a Muslim. &amp;nbsp;I&#39;m probably not even a Christian when you get down to it. &amp;nbsp;I do believe in God, I suppose. &amp;nbsp;And I do believe that God certainly didn&#39;t intend for one group of believes to exterminate another simply because they have different beliefs.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Parts of the Muslim world &lt;i&gt;claim&lt;/i&gt;&amp;nbsp;that ISIS and those of its ilk are a scourge, primarily, I think, because they are turning the rest of the world against Islam. &amp;nbsp;If that&#39;s true, then the entire Muslim world who rejects ISIS and radical fundamentalist Islam (and it&#39;s not clear to me that rejecting one is the same as the other) needs to come together and eliminate ISIS, and those who follow its beliefs or even sympathize with it.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;That hasn&#39;t happened. &amp;nbsp;I don&#39;t see a huge military invasion of ISIS territory by forces from Arabia, Indonesia, and other Muslim nations. &amp;nbsp;Why not?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don&#39;t believe it is possible to be a peace loving person (Muslim or otherwise), and stand idly by (or advocate standing by) why the terrorist forces who want nothing more than to destroy the very fabric of human society work to achieve their evil ends.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Just as Nazi Germany and Imperial Japan were an Axis of Evil during our grandparents&#39; generation, so now we have a new Axis of Evil that has taken root in the middle east.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It&#39;s time now to recognize that there is absolutely &lt;i&gt;no&lt;/i&gt;&amp;nbsp;chance for a peaceful coexistence with these people. &amp;nbsp;They are, frankly, subhuman, and their very &lt;i&gt;existence&lt;/i&gt;&amp;nbsp;is at odds with that of everyone everywhere else in the world.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;It&#39;s time for those of us in civilized nations to stop with our petty nonsense bickering. &amp;nbsp;The actions taking place in Ukraine, unless you live there (an in many case even if you do live there), are a diversion. &amp;nbsp;Putin and Obama need to stop their petty bickering, and cooperate to eliminate the real threat to civilization, which is radical Islam.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To be clear, I believe that the time has now come for the rest of the world to pick up and take action, where the Muslim world has failed. &amp;nbsp;We need to clean house. &amp;nbsp;We can no longer cite &quot;freedom of expression&quot; and &quot;freedom of religion&quot; as reasons to let imam&#39;s recruit young men into death cults. &amp;nbsp;We must recognize that these acts of incitement to terrorism are indeed what they are, and the perpetrators have no more right to life and liberty than Charles Manson.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;These are forces that seek to overthrow from within, by recruitment, by terrorism, or by any means they can. &amp;nbsp;These are forces that place no value on human life. &amp;nbsp;These are forces with which are inimical to the very concept of civilization.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;There can be no tolerance for them. &amp;nbsp;None, whatsoever.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To be clear, I&#39;m advocating that when a member of one of these organizations willing self identifies as such, we should simply kill them. &amp;nbsp;Wherever they are. &amp;nbsp;These are the enemy, and there is no separate battlefield, and they do not recognize &quot;civilians&quot; or &quot;innocents&quot;; therefore, like a cancer, radical Islam must be purged from the very earth, by any means necessary.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The militaries of the world should unit, and work together, to eradicate entrenched forces of radical Islam wherever it exists in the world. &amp;nbsp;This includes all those forms that practice Sharia law, where a man and woman can be stoned to death simply for marrying without parental consent, as well as those groups that seek to eliminate the state of Israel, that seek to kill those who don&#39;t believe exactly as they do, that would issue a &lt;i&gt;fatwa&lt;/i&gt;&amp;nbsp;demanding the death of a cartoonist simply for depicting their prophet, &amp;nbsp;and those who seek to reduce women to the status of mere cattle.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To be clear, we have to do the hard work, all nations of the world, to eliminate this scourge, and eliminate it at its source. &amp;nbsp;Mosques where radicalism are preached must no longer be sanctuaries. &amp;nbsp;Schools where &quot;teachers&quot; train their students in the killing of Christians and Jews, and that their God demands the death of &quot;unbelievers&quot; and rewards suicide bombers with paradise, need to be recognized as the training camps they are. &amp;nbsp;Even if the students are women and children.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Your right to free speech and to religion does not trump my right to live. &amp;nbsp;Nor, by the way, does it trump my own rights to free speech and religion.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I suppose this means that we have to be willing to accept some losses of combat, in the fight against radicalism. &amp;nbsp;We also have to accept that &quot;collateral damage&quot; is inevitable. &amp;nbsp;As with rooting out a cancer, some healthy cells are going to be destroyed. &amp;nbsp;But these losses have to be endured if the entire organism that is civilization is to survive.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If this sounds like I&#39;m a hawk, perhaps that&#39;s true. &amp;nbsp;I think, rather, I&#39;m merely someone who wants to survive, and wants the world to be a place where my own children and grandchildren can live without having to endure a constant fear of nut jobs who want to kill them simply because they exist and think differently.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Btw, if Islam as a religion is to survive in the long run, it &lt;i&gt;must&lt;/i&gt;&amp;nbsp;see these forces purged. &amp;nbsp;Because otherwise the only end result becomes an all out war of survival between Muslims and the rest of the world. &amp;nbsp;And guess which side has the biggest armies and weapons? And who will be the biggest losers in a conflict between Muslims and everyone else?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, it&#39;s time to choose a side. &amp;nbsp;There is no middle ground. &amp;nbsp;Radical Islam tolerates no neutrality. &amp;nbsp;So, what&#39;s it going to be?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;As for me, I choose civilization and survival. &amp;nbsp;That means a world without radical Islam. &amp;nbsp;Period.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/3767819768476018717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=3767819768476018717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3767819768476018717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3767819768476018717'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/08/its-time-already.html' title='It&#39;s time already'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-7476308653358552214</id><published>2014-07-11T20:54:00.000-07:00</published><updated>2014-07-11T20:54:25.769-07:00</updated><title type='text'>POSIX 2008 locale support integrated (illumos)</title><content type='html'>A year in the making... and finally the code is pushed. &amp;nbsp;Hooray!&lt;br /&gt;&lt;br /&gt;I&#39;ve just pushed &lt;a href=&quot;https://www.illumos.org/issues/2964&quot;&gt;2964&lt;/a&gt;&amp;nbsp;into &lt;a href=&quot;http://illumos.org/&quot;&gt;illumos&lt;/a&gt;, which adds support for a bunch of new libc calls for thread safe and thread-specific locales, as well as explicit locale_t objects. &amp;nbsp; Some of the interfaces added fall under the BSD/MacOS X &quot;&lt;a href=&quot;https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/xlocale.3.html&quot;&gt;xlocale&lt;/a&gt;&quot; class of functions.&lt;br /&gt;&lt;br /&gt;Note that not all of the xlocale functions supplied by BSD/MacOS are present. &amp;nbsp;However, all of the routines that were added by &lt;a href=&quot;http://pubs.opengroup.org/onlinepubs/9699919799/functions/contents.html&quot;&gt;POSIX 2008&lt;/a&gt; for this class are present, and should conform to the POSIX 2008 / XPG Issue 7 standards. &amp;nbsp;(Note that we are not yet compliant with POSIX 2008, this is just a first step -- albeit a rather major one.)&lt;br /&gt;&lt;br /&gt;The &lt;a href=&quot;http://cr.illumos.org/~webrev/gdamore/posix2008/&quot;&gt;webrev&lt;/a&gt; is also available for folks who want to look at the code.&lt;br /&gt;&lt;br /&gt;The new APIs are documented in newlocale(3c), uselocale(3c), etc. &amp;nbsp; (Sadly, man pages are not indexed yet so I can&#39;t put links here.)&lt;br /&gt;&lt;br /&gt;Also, documentation for some APIs that was missing (e.g. strfmon(3c)) are now added.&lt;br /&gt;&lt;br /&gt;This project has taken over a year to integrate, but I&#39;m glad it is now done.&lt;br /&gt;&lt;br /&gt;I want to say a big -- huge -- thank you to Robert Mustacchi who not only code reviewed a huge amount of change (and provided numerous useful and constructive feedback), but also contributed a rather large swath of man page content in support of this effort, working on is own spare time. &amp;nbsp;Thanks Robert!&lt;br /&gt;&lt;br /&gt;Also, thanks to both Gordon Ross and Dan McDonald who also contributed useful review feedback and facilitated the integration of this project. &amp;nbsp;Thanks guys!&lt;br /&gt;&lt;br /&gt;Any errors in this effort are mine, of course. &amp;nbsp;I would be extremely interested in hearing constructive feedback. &amp;nbsp;I expect there will be some minor level of performance impact (unavoidable due to the way the standards were written to require a thread-specific check on all locale sensitive routines), but I hope it will be minor.&lt;br /&gt;&lt;br /&gt;I&#39;m also extremely interested in feedback from folks who are making use of these new routines. &amp;nbsp;I&#39;m told the Apache Standard C++ library depends on these interfaces -- I hope someone will try it out and let me know how it goes. &amp;nbsp; Also, if someone wants/needs xlocale interfaces that I didn&#39;t include in this effort, please drop me a note and I&#39;ll try to get to it.&lt;br /&gt;&lt;br /&gt;As this is a big change, it is not entirely without risk. &amp;nbsp;I&#39;ve done what I could to minimize that risk, and test as much as I could. &amp;nbsp;If I missed something, please let me know, and I&#39;ll attempt to fix in a timely fashion.&lt;br /&gt;&lt;br /&gt;Thanks!&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/7476308653358552214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=7476308653358552214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/7476308653358552214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/7476308653358552214'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/07/posix-2008-locale-support-integrated.html' title='POSIX 2008 locale support integrated (illumos)'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-8248767765081061272</id><published>2014-05-27T10:30:00.000-07:00</published><updated>2014-05-27T10:30:07.661-07:00</updated><title type='text'>illumos, identification, and versions</title><content type='html'>Recently, there has been a bit of a &lt;a href=&quot;http://www.listbox.com/member/archive/182179/2014/05/search/dW5hbWU/sort/time_rev/page/2/entry/11:39/20140512232339:F8462336-DA4D-11E3-A66B-CA7946192C8A/&quot;&gt;debate&lt;/a&gt; on the &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt; mailing lists, beginning I suppose with an initial &lt;a href=&quot;http://wiki.illumos.org/display/illumos/Modernizing+Uname&quot;&gt;proposal&lt;/a&gt; I made concerning the output from the &lt;b&gt;&lt;a href=&quot;http://www.illumos.org/man/1/uname&quot;&gt;uname&lt;/a&gt;&lt;/b&gt;(1) command on illumos, which today, when presented with &quot;-s -r&quot; as options, emits &quot;SunOS 5.11&quot;.&lt;br /&gt;&lt;br /&gt;A lot of the debate centers on various ways that software can or cannot identify the platform it is running on, and use that information to make programmatic decisions about how to operate.  Most often these are decisions made at compile time, by tools such as &lt;b&gt;autoconf&lt;/b&gt; and &lt;b&gt;automake&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Clearly, it would be better for software not to rely on uname for programmatic uses, and detractors of my original proposal are correct that even in the Linux community, the value from uname cannot be relied upon for such use. &amp;nbsp;There are indeed better mechanisms to use, such as &lt;b&gt;&lt;a href=&quot;http://www.illumos.org/man/3c/sysconf&quot;&gt;sysconf&lt;/a&gt;&lt;/b&gt;(3c), or the ZFS feature flags, to determine individual capabilities. &amp;nbsp;Indeed, the GNU autotools contains many individual tests for such things, and arguably discourages the use of uname except as a last resort.&lt;br /&gt;&lt;br /&gt;Yet there can be no question that there are a number of packages that do make such use. &amp;nbsp;And changes to the output from uname become risky to such packages.&lt;br /&gt;&lt;br /&gt;But perversely, &lt;i&gt;not changing&lt;/i&gt;&amp;nbsp;the output from uname also creates risk for such packages, as the various incarnations of SunOS 5.11 become ever less like one another. &amp;nbsp;Indeed, illumos != SunOS, and uname has become something of a lie over the past 4 years or so.&lt;br /&gt;&lt;br /&gt;Clearly, the focus for programmatic platform determination -- particularly for enabling features or behaviors, should be to move away from uname. &amp;nbsp;(Actually, changing uname may actually help package maintainers in identifying this questionable behavior as questionable, although there is no doubt that such a change would be disruptive to them.)&lt;br /&gt;&lt;br /&gt;But all this debate completely misses the other major purpose of uname&#39;s output, which is to identify the &lt;i&gt;platform&lt;/i&gt;&amp;nbsp;to humans. &amp;nbsp;Be they administrators, or developers, or distributors. &amp;nbsp;There is no question in mind that illumos&#39; failure to self identify, and to have a regular &quot;release&quot; schedule (for whatever a release really means in this regard) is harmful.&lt;br /&gt;&lt;br /&gt;The distributors, such as &lt;a href=&quot;http://www.joyent.com/&quot;&gt;Joyent&lt;/a&gt; (&lt;a href=&quot;http://www.smartos.org/&quot;&gt;SmartOS&lt;/a&gt;), would prefer that people only identify their particular distribution, and I believe that much of the current argument from them stems from two primary factors. &amp;nbsp;First, they see additional effort in any change, with no direct benefit to them. &amp;nbsp;Second, in some ways these distributors are disinclined to emphasize illumos itself. &amp;nbsp; Some of the messages sent (either over IRC or in the email thread) clearly portray some resentment towards the rest of the illumos ecosystem, especially some of the niche players), as well as a very heavy handed approach by one commercial concern towards the rest of the ecosystem.&lt;br /&gt;&lt;br /&gt;Clearly, this flies in the spirit of community cooperation in which illumos was founded. &amp;nbsp;illumos should not be a slave to any single commercial concern, and nobody should be able to exercise a unilateral veto over illumos, or shut down conversations with a single &quot;&lt;a href=&quot;http://www.listbox.com/member/archive/182179/2014/05/search/dGhlcm1vbnVjbGVhcg/sort/time_rev/page/1/entry/1:2/20140513133849:6E4BE378-DAC5-11E3-9A47-C75DCFAA59E1/&quot;&gt;thermonuclear&lt;/a&gt;&quot; post.&lt;br /&gt;&lt;br /&gt;So, without regard to the merits, or lack thereof, of changing uname&#39;s output, I&#39;m quite certain, with sufficient clear evidence of my own gathering, that illumos absolutely needs to have a regularly scheduled &quot;releases&quot; of illumos, with humanly understandable release identifiers. &amp;nbsp;The lack of both the releases, and the identifiers to go with them, hinders meaningful reviews, hurts distributors (particularly smaller ones), and makes support for the platform harder, particularly when the questions of support are considered across distributions. &amp;nbsp;All of these hinder &lt;i&gt;adoption&lt;/i&gt;&amp;nbsp;of the illumos platform; clearly an undesirable outcome.&lt;br /&gt;&lt;br /&gt;Some would argue that we could use &lt;b&gt;&lt;a href=&quot;http://www.git-scm.com/&quot;&gt;git&lt;/a&gt;&lt;/b&gt; tags for the identifiers. &amp;nbsp;From a programmatic standpoint, these would be easy to collect. &amp;nbsp;Although they have problems as well (particularly for distributions which neither use git, or use a private fork that doesn&#39;t preserve our git versions), there are worse problems.&lt;br /&gt;&lt;br /&gt;Specifically, a humans aren&#39;t meant to derive meaning from something like &quot;e3de96f25bd2ea4282eea2d1a86c1bebac8950cb&quot;. &amp;nbsp; While &lt;a href=&quot;http://en.wikipedia.org/wiki/Neo_(The_Matrix)&quot;&gt;Neo&lt;/a&gt; could understand this, most of use merely mortal individuals simply can&#39;t understand such tags. &amp;nbsp;Worse, there is no implied sequencing here. &amp;nbsp;Is &quot;e3de96f25bd2ea4282eea2d1a86c1bebac8950cb&quot; newer than &quot;d1007364f5b14efdd7d6ba27aa458669a6365d48&quot; ? &amp;nbsp;You can&#39;t do a meaningful comparison without examining the actual git history.&lt;br /&gt;&lt;br /&gt;This makes it hard to guess whether a given running release has a bug integrated or not. &amp;nbsp;It makes it hard to have conversations about the platform. &amp;nbsp;It even makes it hard for independent reviewers of the platform &amp;nbsp;to identify anything meaningful about the platform in the context of reviewing a distribution.&lt;br /&gt;&lt;br /&gt;Furthermore, when we talk about the platform, its useful for version numbers to convey more than just serial meaning. &amp;nbsp;In particular, version numbers help set expectations for developers. &amp;nbsp;Historically Solaris (or rather SunOS, from which illumos is derived), set those expectations in the form of stability guarantees. &amp;nbsp; A given library interface might be declared as Stable, or Evolving, (or Committed or Uncommitted), or Obsolete. &amp;nbsp;This was a way to convey to developers the relative risks of an interface (in terms of interface change), and it set some ground rules for rate of change. &amp;nbsp;Indeed, Solaris (and SunOS) relied upon a form of &lt;a href=&quot;http://www.semver.org/&quot;&gt;semantic versioning&lt;/a&gt;, and many of the debates in Sun&#39;s architectural leadership for Solaris (PSARC) revolved around these commitments.&lt;br /&gt;&lt;br /&gt;Yet today, the illumos distributors seem over willing to throw that bit of our heritage into the waste bin. &amp;nbsp;A trend, I fear, which ultimately leads to chaos, and an increase in the difficulty of adoption by ISVs and developers.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;illumos is one component -- albeit probably the most important by far -- of a distribution. &amp;nbsp;Like all components, it is useful to be able to determine and talk about it. &amp;nbsp;This is not noticeably different than Linux, Xorg, gnome, or pretty much any of the other systems which you are likely to find as part of a complete Ubuntu or RedHat distribution. &amp;nbsp;In fact, our situation is entirely analogous other than we combine our libc and some key utilities and commands with the kernel.&lt;br /&gt;&lt;br /&gt;Technically, in Solaris parlance, illumos is a &lt;i&gt;consolidation&lt;/i&gt;. &amp;nbsp;In fact, this distinction has alway been clear. &amp;nbsp;And historically the way the consolidation is identified is with the contents of the utsname structure, which is what is emitted by uname. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;Furthermore, when we talk about the platform, its useful for version numbers to convey more than just serial meaning&lt;br /&gt;&lt;br /&gt;In summary, regardless of whether we feel uname should return illumos or not, there is a critical need, although one not necessarily agreed upon by certain commercial concerns, for the illumos platform to have a release number at a minimum, and this release number must be useful to convey meaningful information to end-users, developers, and distributors alike. &amp;nbsp;It would be useful if this release number were obtainable in the traditional fashion (uname), but its more important that the numbers convey meaning in the same way across distributions (which means packaging metadata cannot be used, at least not exclusively).&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/8248767765081061272/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=8248767765081061272' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8248767765081061272'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8248767765081061272'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/05/illumos-identification-and-versions.html' title='illumos, identification, and versions'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-4903361205291680757</id><published>2014-04-06T20:31:00.000-07:00</published><updated>2014-04-06T21:20:13.061-07:00</updated><title type='text'>SP protocols improved again!</title><content type='html'>&lt;h2&gt;Introduction&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;As a result of some investigations performed in response to my &lt;a href=&quot;http://garrett.damore.org/2014/03/early-performance-numbers.html&quot;&gt;first performance tests&lt;/a&gt; for my &lt;a href=&quot;https://bitbucket.org/gdamore/sp&quot;&gt;SP implementation&lt;/a&gt;, I&#39;ve made a bunch of changes to my code.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;First off, I discovered that my code was rather racy. &amp;nbsp;When I started bumping up GOMAXPROCS, and and used the -race flag to go test, I found lots of issues.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, there were failure scenarios where the performance fell off a cliff, as the code dropped messages, needed to retry, etc.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ve made a lot of changes to fix the errors. &amp;nbsp;But, I&#39;ve also made a major set of changes which enable a vastly better level of performance, particularly for throughput sensitive workloads. Note that to get these numbers, the application should &quot;recycle&quot; the Messages it uses (using a new &lt;a href=&quot;https://godoc.org/bitbucket.org/gdamore/sp#Message.Free&quot;&gt;Free()&lt;/a&gt; API... there is also a &lt;a href=&quot;https://godoc.org/bitbucket.org/gdamore/sp#NewMessage&quot;&gt;NewMessage() &lt;/a&gt;API to allocate from the cache), which will cache and recycle used buffers, greatly reducing the garbage collector workload.&lt;br /&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Throughput&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;So, here are the new numbers for throughput, compared against my previous runs on the same hardware, including tests against the &lt;a href=&quot;http://www.nanomsg.org/&quot;&gt;nanomsg&lt;/a&gt; reference itself.&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table border=&quot;2&quot; style=&quot;color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.790000915527344px;&quot;&gt;&lt;caption&gt;Throughput Comparision&lt;br /&gt;(Mb/s)&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;transport&lt;/th&gt;&lt;th&gt;nanomsg 0.3beta&lt;/th&gt;&lt;th&gt;old gdamore/sp&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(1 thread)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(2 threads)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(4 threads)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(8 threads)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc 4k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;4322&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;5551&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;6629&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;7751&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;8654&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;8841&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc 4k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;9470&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;2379&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;6176&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;6615&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;5025&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;5040&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp 4k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;9744&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;2515&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;3785&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4279&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4411&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;4420&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc 64k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;83904&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;21615&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;45618&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;35044&lt;sup&gt;b&lt;/sup&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;44312&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;47077&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc 64k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;38929&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;7831&lt;sup&gt;a&lt;/sup&gt;&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;48400&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;65190&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;64471&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;63506&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp 64k&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;30979&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;12598&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;34994&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;49608&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;53064&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;53432&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;sup&gt;a&lt;/sup&gt; I think this poor result is from retries or resubmits inside the old implementation.&lt;br /&gt;&lt;sup&gt;b&lt;/sup&gt; I cannot explain this dip; I think maybe unrelated activity or GC activity may be to blame&lt;br /&gt;&lt;br /&gt;The biggest gains are with large frames (64K), although there are gains for the 4K size as well. &amp;nbsp;nanomsg still out performs for the 4K size, but with 64K my message caching changes pay dividends and my code actually beats nanomsg rather handily for the TCP and IPC cases.&lt;br /&gt;&lt;br /&gt;I think for 4K, we&#39;re hurting due to inefficiencies in the Go TCP handling below my code. &amp;nbsp;My guess is that there is a higher per packet cost here, and that is what is killing us. &amp;nbsp;This may be true for the IPC case as well. &amp;nbsp;Still, these are very respectable numbers, and for some very real and useful workloads my implementation compares and even beats the reference.&lt;br /&gt;&lt;br /&gt;The new code really shows some nice gains for concurrency, and makes good use of multiple CPU cores.&lt;br /&gt;&lt;br /&gt;There are a few mysteries though. &amp;nbsp;Notes &quot;a&quot; and &quot;b&quot; point to two of them. &amp;nbsp;The third is that the IPC performance takes a dip when moving from 2 threads to 4. &amp;nbsp;It still significantly outperforms the TCP side though, and is still performing more than twice as fast as my first implementation, so I guess I shouldn&#39;t complain too much.&lt;br /&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Latency&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;The latency has shown some marked improvements as well. &amp;nbsp;Here are new latency numbers.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;table border=&quot;2&quot; style=&quot;background-color: white; color: #333333; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 15px; line-height: 20.790000915527344px;&quot;&gt;&lt;caption&gt;Latency Comparision&lt;br /&gt;(usec/op)&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;transport&lt;/th&gt;&lt;th&gt;nanomsg 0.3beta&lt;/th&gt;&lt;th&gt;old gdamore/sp&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(1 thread)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(2 threads)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(4 threads)&lt;/th&gt;&lt;th&gt;new&lt;br /&gt;(8 threads)&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;6.23&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;8.47&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;6.56&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;9.93&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;11.0&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;11.2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;15.7&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;22.6&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;27.7&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;29.1&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;31.3&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;31.0&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp&lt;/th&gt;&lt;td align=&quot;right&quot;&gt;24.8&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;50.5&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;41.0&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;42.7&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;42.9&lt;/td&gt;&lt;td align=&quot;right&quot;&gt;42.9&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;All in all, the round trip times are reasonably respectable. I am especially proud of how close I&#39;ve come within the best inproc time -- a mere 330 nsec separates the Go implementation from the nanomsg native C version. &amp;nbsp;When you factor in the heavy use of go routines, this is truly impressive. &amp;nbsp; To be honest, I suspect that most of those 330 nsec are actually lost in the extra data copy that my inproc implementation has to perform to simulate the &quot;streaming&quot; nature of real transports (i.e. data and headers are not separate on message ingress.)&lt;br /&gt;&lt;br /&gt;There&#39;s a sad side to story as well. &amp;nbsp;TCP handling seems to be less than ideal in Go. &amp;nbsp;I&#39;m guessing that some effort is done to use larger TCP windows, and Nagle may be at play here as well (I&#39;ve not checked.) Even so, I&#39;ve made a 20% improvement in latencies for TCP from my first pass.&lt;br /&gt;&lt;br /&gt;The other really nice thing is near linear scalability when threads (via bumping GOMAXPROCS) are added. &amp;nbsp;There is very, very little contention in my implementation. &amp;nbsp;(I presume some underlying contention for the channels exists, but this seems to be on the order of only a usec or so.) &amp;nbsp;Programs that utilize multiple goroutines are likely to benefit well from this.&lt;br /&gt;&lt;h2&gt;&lt;/h2&gt;&lt;h2&gt;Conclusion&lt;/h2&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;Simplifying the code to avoid certain indirection (extra passes through additional channels and goroutines), and adding a message pooling layer, have yielded enormous performance gains. &amp;nbsp;Go performs quite respectably in this messaging application, comparing favorably with a native C implementation. &amp;nbsp;It also benefits from additional concurrency.&lt;br /&gt;&lt;br /&gt;One thing I really found was that it took some extra time to get my layering model correct. &amp;nbsp;I traded complexity in the core for some extra complexity in the Protocol implementations. &amp;nbsp;But this avoided a whole other round of context switches, and enormous complexity. &amp;nbsp;My use of linked lists, and the ugliest bits of mutex and channel synchronization around list-based queues, were removed. &amp;nbsp;While this means more work for protocol implementors, the reduction in overall complexity leads to marked performance and reliability gains.&lt;br /&gt;&lt;br /&gt;I&#39;m now looking forward to putting this code into production use.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/4903361205291680757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=4903361205291680757' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/4903361205291680757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/4903361205291680757'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/04/sp-protocols-improved-again.html' title='SP protocols improved again!'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-3285456204920379322</id><published>2014-03-27T09:27:00.000-07:00</published><updated>2014-03-27T09:27:30.733-07:00</updated><title type='text'>Names are Hard</title><content type='html'>So I&#39;ve been thinking about naming for &lt;a href=&quot;http://bitbucket.org/gdamore/sp&quot;&gt;my pure Go implementation&lt;/a&gt; of &lt;a href=&quot;http://nanomsg.org/&quot;&gt;nanomsg&lt;/a&gt;&#39;s SP protocols.&lt;br /&gt;&lt;br /&gt;nanomsg is trademarked by the inventor of the protocols. &amp;nbsp;(He does seem to take a fairly loose stance with enforcement though -- since he advocates using names that are derived from nanomsg, as long as its clear that there is only one &quot;nanomsg&quot;.)&lt;br /&gt;&lt;br /&gt;Right now my implementation is known as &quot;bitbucket.org/gdamore/sp&quot;. &amp;nbsp;While this works for code, it doesn&#39;t exactly roll off the tongue. &amp;nbsp;Its also a problem for folks wanting to write about this. &amp;nbsp;So the name can actually become a barrier to adoption. &amp;nbsp;Not good.&lt;br /&gt;&lt;br /&gt;I suck at names. &amp;nbsp;After spending a day online with people, we came up with &quot;&lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt;&quot; for the other open source project I founded. &amp;nbsp;illumos has traction now, but even that name has problems. &amp;nbsp;(People want to spell it &quot;illumOS&quot;, and they often mispronounce it as &quot;illuminos&quot; &amp;nbsp;(note there are no &quot;n&quot;&#39;s in illumos). &amp;nbsp;And, worse, it turns out that the leading &quot;i&quot; is indistinguishable from the following &quot;l&#39;s&quot; -- like this:&amp;nbsp;&lt;span style=&quot;font-family: helvetica;&quot;&gt;Illumos&lt;/span&gt; -- &amp;nbsp;when used in many common san-serif fonts -- which is why I never capitalize illumos. &amp;nbsp;Its also had a profound impact on how I select fonts. &amp;nbsp;Good-bye Helvetica!)&lt;br /&gt;&lt;br /&gt;go-nanomsg already exists, btw, but its a simple foreign-function binding, with a number of limitations, so I hope Go programmers will choose my version instead.&lt;br /&gt;&lt;br /&gt;Anyway, I&#39;m thinking of two options, but I&#39;d like criticisms and better suggestions, because I need to fix this problem soon.&lt;br /&gt;&lt;br /&gt;1. &quot;gnanomsg&quot; -- the &quot;g&quot; evokes &quot;Go&quot; (or possibly &quot;Garrett&quot; if I want to be narcissistic about it -- but I don&#39;t like vanity naming this way). &amp;nbsp;In pronouncing it, one could either use a silent &quot;g&quot; like &quot;gnome&quot; or &quot;gnat&quot;, or to distinguish between &quot;nanomsg&quot; one could harden the &quot;g&quot; like in &quot;growl&quot;. &amp;nbsp; The problem is that pronunciation can lead to confusion, and I really don&#39;t like that &quot;g&quot; can be mistaken to mean this is a GNU program, when it most emphatically is &lt;i&gt;not&lt;/i&gt;&amp;nbsp;a GNU. &amp;nbsp;Nor is it GPL&#39;d, nor will it &lt;i&gt;ever&lt;/i&gt;&amp;nbsp;be.&lt;br /&gt;&lt;br /&gt;2. &quot;masago&quot; -- this name distantly evokes &quot;messaging ala go&quot;, is a &lt;a href=&quot;http://blog.orlandoichiban.com/2010/01/what-is-masago.html&quot;&gt;real world word&lt;/a&gt;, and I happen to like sushi. &amp;nbsp;But it will be harder for people looking for nanomsg compatible layers to find my library.&lt;br /&gt;&lt;br /&gt;I&#39;m leaning towards the first. &amp;nbsp;Opinions from the community solicited.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/3285456204920379322/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=3285456204920379322' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3285456204920379322'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/3285456204920379322'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/03/names-are-hard_27.html' title='Names are Hard'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-5202122699299016631</id><published>2014-03-26T22:30:00.001-07:00</published><updated>2014-03-26T22:30:49.037-07:00</updated><title type='text'>Early performance numbers</title><content type='html'>I&#39;ve added a benchmark tool to &lt;a href=&quot;https://bitbucket.org/gdamore/sp&quot;&gt;my Go&lt;/a&gt; implementation of &lt;a href=&quot;http://www.nanomsg.org/&quot;&gt;nanomsg&lt;/a&gt;&#39;s SP protocols, along with the inproc transport, and I&#39;ll be pushing those changes rather shortly.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the meantime, here&#39;s some interesting results:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;table border=&quot;2&quot;&gt;&lt;caption&gt;Latency Comparision&lt;br /&gt;(usec/op)&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;transport&lt;/th&gt;&lt;th&gt;nanomsg 0.3beta&lt;/th&gt;&lt;th&gt;gdamore/sp&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc&lt;/th&gt;&lt;td&gt;6.23&lt;/td&gt;&lt;td&gt;8.47&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc&lt;/th&gt;&lt;td&gt;15.7&lt;/td&gt;&lt;td&gt;22.6&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp&lt;/th&gt;&lt;td&gt;24.8&lt;/td&gt;&lt;td&gt;50.5&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;p1&quot;&gt;The numbers aren’t all that surprising. &amp;nbsp;Using go, I’m using non-native interfaces, and my use of several goroutines to manage concurrency probably creates a higher number of context switches per exchange. &amp;nbsp;I &lt;i&gt;suspect&lt;/i&gt; I might find my stuff does a little better with lots and lots of servers hitting it, where I can make better use of multiple CPUs (though one could write a C program that used threads to achieve the same effect).&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;The story for throughput is a little less heartening though:&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class=&quot;p1&quot;&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;table border=&quot;2&quot;&gt;&lt;caption&gt;Throughput Comparision&lt;br /&gt;(Mb/s)&lt;/caption&gt;&lt;tbody&gt;&lt;tr&gt;&lt;th&gt;transport&lt;/th&gt;&lt;th&gt;message size&lt;/th&gt;&lt;th&gt;nanomsg 0.3beta&lt;/th&gt;&lt;th&gt;gdamore/sp&lt;/th&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc&lt;/th&gt;&lt;td&gt;4k&lt;/td&gt;&lt;td&gt;4322&lt;/td&gt;&lt;td&gt;5551&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc&lt;/th&gt;&lt;td&gt;4k&lt;/td&gt;&lt;td&gt;9470&lt;/td&gt;&lt;td&gt;2379&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp&lt;/th&gt;&lt;td&gt;4k&lt;/td&gt;&lt;td&gt;9744&lt;/td&gt;&lt;td&gt;2515&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;inproc&lt;/th&gt;&lt;td&gt;64k&lt;/td&gt;&lt;td&gt;83904&lt;/td&gt;&lt;td&gt;21615&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;ipc&lt;/th&gt;&lt;td&gt;64k&lt;/td&gt;&lt;td&gt;38929&lt;/td&gt;&lt;td&gt;7831 (?!?)&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;th&gt;tcp&lt;/th&gt;&lt;td&gt;64k&lt;/td&gt;&lt;td&gt;30979&lt;/td&gt;&lt;td&gt;12598&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;I didn&#39;t try larger sizes yet, this is just a quick sample test, not an exhaustive performance analysis. &amp;nbsp;What is interesting is that the ipc case for my code is consistently low. &amp;nbsp;It uses the same underlying transport to Go as TCP, but I guess maybe we are losing some TCP optimizations. &amp;nbsp;(Note that the TCP tests were performed using loopback, I don&#39;t really have 40GbE on my desktop Mac. :-)&lt;br /&gt;&lt;br /&gt;I think my results may be worse than they would otherwise be, because I use the equivalent of NN_MSG to dynamically allocate each message as it arrives, whereas the nanomsg benchmarks use a preallocated buffer. &amp;nbsp; Right now I&#39;m not exposing an API to use preallocated buffers (but I have considered it! &amp;nbsp;It does feel unnatural though, and more of a &quot;benchmark special&quot;.)&lt;br /&gt;&lt;br /&gt;That said, I&#39;m not &lt;i&gt;unhappy&lt;/i&gt;&amp;nbsp;with these numbers. &amp;nbsp;Indeed, it seems that my code performs reasonably well given all the cards stacked against it. &amp;nbsp;(Extra allocations due to the API, extra context switches due to extra concurrency using channels and goroutines in Go, etc.)&lt;br /&gt;&lt;br /&gt;A litte more details about the tests.&lt;br /&gt;&lt;br /&gt;All test were performed using nanomsg 0.3beta, and my current Go 1.2 tree, running on my Mac running MacOS X 10.9.2, on 3.2 GHz Core i5. &amp;nbsp;The latency tests used full round trip timing using the REQ/REP topology, and a 111 byte message size. &amp;nbsp;The throughput tests were performed using PAIR. &amp;nbsp;(Good news, I&#39;ve now validated PAIR works. :-)&lt;br /&gt;&lt;br /&gt;The IPC was directed at file path in /tmp, and TCP used 127.0.0.1 ports.&lt;br /&gt;&lt;br /&gt;Note that my inproc tries hard to avoid copying, but does still copy due to a mismatch about header vs. body location. &amp;nbsp;I&#39;ll probably fix that in a future update (its an optimization, and also kind of a benchmark special since I don&#39;t think inproc gets a lot of performance critical use. &amp;nbsp;In Go, it would be more natural to use channels for that.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/5202122699299016631/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=5202122699299016631' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5202122699299016631'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5202122699299016631'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/03/early-performance-numbers.html' title='Early performance numbers'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-7592756121287745743</id><published>2014-03-24T22:39:00.000-07:00</published><updated>2014-03-24T22:39:57.831-07:00</updated><title type='text'>SP (nanomsg) in Pure Go</title><content type='html'>I&#39;m pleased to announce that this past weekend I &lt;a href=&quot;https://bitbucket.org/gdamore/sp&quot;&gt;released the first version&lt;/a&gt; of my implementation of the SP (scalability protocols, sometimes known by their reference implementation, &lt;a href=&quot;http://nanomsg.org/&quot;&gt;nanomsg&lt;/a&gt;) implemented in pure &lt;a href=&quot;http://golang.org/&quot;&gt;Go&lt;/a&gt;. This allows them to be used even on platforms where cgo is not present. &amp;nbsp;It may be possible to use them in playground (I&#39;ve not tried yet!)&lt;br /&gt;&lt;br /&gt;This is released under an &lt;a href=&quot;http://www.apache.org/licenses/LICENSE-2.0.html&quot;&gt;Apache 2.0 license&lt;/a&gt;. &amp;nbsp;(It would be even more liberal BSD or MIT, except I want to offer -- and demand -- patent protection to and from my users.)&lt;br /&gt;&lt;br /&gt;I&#39;ve been super excited about Go lately. &amp;nbsp;And having spent some time with ØMQ in a previous project, I was keen to try doing some things in the successor nanomsg project. &amp;nbsp; (nanomsg is a single library message queue and communications library.)&lt;br /&gt;&lt;br /&gt;Martin (creator of &lt;a href=&quot;http://zeromq.org/&quot;&gt;ØMQ&lt;/a&gt;) has &lt;a href=&quot;http://250bpm.com/blog:4&quot;&gt;written rather extensively&lt;/a&gt; about how he wishes he had written it in C instead of C++. &amp;nbsp;And with nanomsg, that is exactly what he is done.&lt;br /&gt;&lt;br /&gt;And C is a great choice for implementing something that is intended to be a foundation for other projects. &amp;nbsp;But, its not ideal for some circumstances, and the use of async I/O in his C library tends to get in the way of Go&#39;s native support for concurrency.&lt;br /&gt;&lt;br /&gt;So my pure Go version is available in a form that makes the best use of Go, and tries hard to follow Go idioms. &amp;nbsp;It doesn&#39;t support all the capabilities of Martin&#39;s reference implementation -- yet -- but it will be easy to add those capabilities.&lt;br /&gt;&lt;br /&gt;Even better, I found it pretty easy to add a new transport layer (TLS) this evening. &amp;nbsp;Adding the implementation took less than a half hour. &amp;nbsp;The real work was in writing the test program, and fighting with OpenSSL&#39;s obtuse PKI support for my test cases.&lt;br /&gt;&lt;br /&gt;Anyway, I encourage folks to take a look at it. &amp;nbsp;I&#39;m keen for useful &amp;amp; constructive criticism.&lt;br /&gt;&lt;br /&gt;Oh, and this work is stuff I&#39;ve done on my own time over a couple of weekends -- and hence isn&#39;t affiliated with, or endorsed by, any of my employers, past or present.&lt;br /&gt;&lt;br /&gt;PS: Yes, it should be possible to &quot;adapt&quot; this work to support native ØMQ protocols (ZTP) as well. &amp;nbsp;If someone wants to do this, please fork this project. &amp;nbsp;I don&#39;t think its a good idea to try to support both suites in the same package -- there are just too many subtle differences.</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/7592756121287745743/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=7592756121287745743' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/7592756121287745743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/7592756121287745743'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/03/sp-nanomsg-in-pure-go.html' title='SP (nanomsg) in Pure Go'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-2555468172036091710</id><published>2014-02-06T09:54:00.001-08:00</published><updated>2014-02-06T09:54:44.187-08:00</updated><title type='text'>The Failed Promise</title><content type='html'>My dislike for C++ is well-known by those who know me. &amp;nbsp;As is my lack of fondness for Perl.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I have a new one though. &amp;nbsp;Java. &amp;nbsp;Oracle and Apple have conspired to kill it.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(I should say this much -- its been a long time, about a decade, since I developed any Java code. &amp;nbsp;Its entirely possible that I remember the language with more fondness than it truly warrants. &amp;nbsp;C++ was once beautiful too -- before ANSI went and mutated it beyond all hope back in 1990 or thereabouts.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Which is a shame, because Java started with &lt;i&gt;such&lt;/i&gt;&amp;nbsp;promise. &amp;nbsp;Write-once, run-anywhere. &amp;nbsp;Strongly typed, and a paradigm for OO that was so far superior to C++. &amp;nbsp;(Multiple inheritance is the bane of semi-competent C++ engineers, who often can&#39;t even properly cope with pointers to memory.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For years, I bemoaned the fact that the single biggest weakness of Java was the fact that it was seen as a way to make more dynamic web pages. &amp;nbsp;(I remember HotJava -- what a revolutionary thing it was indeed.) &amp;nbsp;But even stand-alone apps struggled with performance (startup times were hideous for anyone starting a Swing app.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Still, we suffered because of the write once, run-anywhere promise was just too alluring. &amp;nbsp;All those performance problems were going to get solved by optimization, and faster systems. &amp;nbsp;And wasn&#39;t it a shame that people associated Java with applets instead of applications? &amp;nbsp;(Java WebStart tried to drive more of the latter, which should have been a good thing.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But all the promise that Java seemed to offer is well and truly lost now. &amp;nbsp;And I don&#39;t think it can ever be regained.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here&#39;s a recent experience I had.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I had reason to go run some Java code to access an IPMI console on a SuperMicro system. &amp;nbsp;I don&#39;t run Windows. &amp;nbsp; The IPMI console app seems to be a mishmash of Java and native libraries produced by ATEN for SuperMicro. &amp;nbsp;Supposedly it supported MacOS X and Linux.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I lost several&amp;nbsp;&lt;i&gt;hours&lt;/i&gt;&amp;nbsp;(&lt;b&gt;several&lt;/b&gt;, as in more than two) trying to get a working IPMI console on my Mac. &amp;nbsp;I tried Java 7 from Oracle, Java 6 from Apple, I even tried to get a Linux version working in Ubuntu (and after a number of false starts I did actually succeed in the last attempt.) &amp;nbsp;All just to get access to a simple IPMI console. &amp;nbsp;Seriously?!?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;What are the problems here?&lt;/div&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;Apple doesn&#39;t &quot;support&quot; Java officially anymore.&lt;/li&gt;&lt;li&gt;Apple disables Java by default on Safari even when it is installed.&lt;/li&gt;&lt;li&gt;Apple disables Java webstart almost entirely. &amp;nbsp;(The only way to open an unsigned Java webstart file -- has anyone ever even &lt;i&gt;seen&lt;/i&gt;&amp;nbsp;a signed .jnlp?)&amp;nbsp;is to download it, and open it with a right-click in the finder and explicitly answer &quot;Yes, I know its not from an approved vendor, but open the darn thing anyway. &amp;nbsp;Even though &lt;i&gt;Java&lt;/i&gt;&amp;nbsp;also asks me the same question. &amp;nbsp;Several times.)&lt;/li&gt;&lt;li&gt;Oracle ships Java 7 without 32-bit support on Macs, so only Safari can use it (not Chrome)&lt;/li&gt;&lt;li&gt;Oracle Java 7 Update 51 has a new security manager that prevents most unsigned apps from running at all. &amp;nbsp;(The only way to get them to run at all is to track down the Java preferences pane and reduce the security setting.)&lt;/li&gt;&lt;li&gt;Developers like ATEN produce native libraries which means that their &quot;Java&quot; apps are totally unportable.&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div&gt;All of this is because people are terrified of the numerous bugs in Java. &amp;nbsp;Which is appropriate, since there &lt;i&gt;have&lt;/i&gt;&amp;nbsp;been bugs in various JVMs. &amp;nbsp;Running unverified code without some warning to the end-user is dangerous -- really these should be treated with the same caution due a native application.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But, I should also not have to be a digital contortionist to access an application. &amp;nbsp;I am using a native IPMI console from an IP address that I entered by hand on a secured network. &amp;nbsp;I&#39;d expect to have to answer the &quot;Are you sure you want to run this unsigned app?&quot; question (perhaps with an option to remember the setting) once. &amp;nbsp;But the barriers to actually executing the app are far too high. &amp;nbsp;(So high, that I &lt;i&gt;still&lt;/i&gt;&amp;nbsp;have not had success in getting the SuperMicro IPMI console running on my Mac -- although I did eventually get it to work in a VM running Ubuntu.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, shame on Apple and Oracle for doing everything in their power to kill Java. &amp;nbsp;Shame on ATEN / SuperMicro for requiring Java in the first place, and for polluting it with native code libraries. &amp;nbsp;And for not getting their code signed.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And shame on the Java ecosystem for allowing this state of affairs to come about.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ll most likely never write another line of Java, in spite of the fact that I happen to think the language is actually quite elegant for solving OO programming problems. &amp;nbsp;The challenges in deploying such applications are just far too high. &amp;nbsp;In the past the problem was that the cost of the sandbox meant that application startups are slow. &amp;nbsp;Now, even though we have fast CPUs, we have traded 30 second application startup times for situations where it takes &lt;i&gt;hours&lt;/i&gt;&amp;nbsp;for even technical people to get an app running.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I guess its probably better on Windows.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;But if you want to use that as an excuse, then just write a NATIVE APPLICATION, and stop screwing around with this false promise of &quot;run-anywhere&quot;.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If a Javascript app won&#39;t work for you, then just bite the bullet and write a native app. &amp;nbsp;Heck, with the porting solutions available, it isn&#39;t that much work to make native apps portable to a variety of platforms. &amp;nbsp;(Though such solutions necessarily leave niche systems out in the cold. &amp;nbsp;Let&#39;s face it, the market for native desktop apps on SPARC systems running NetBSD is pretty tiny.) &amp;nbsp;But covering the 5 mainstream client platforms (Windows, Mac, iOS, Android, Linux) is pretty easy. &amp;nbsp;(Yes, illumos isn&#39;t in that list. &amp;nbsp;And maybe Linux shouldn&#39;t be either, although I think the number of folks running a desktop with Linux is probably several orders of magnitude larger than all other UNIXish platforms -- besides MacOS -- combined.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, RIP &quot;write once, run-anywhere&quot;. &amp;nbsp;Congratulations Oracle, Apple. &amp;nbsp;You killed it.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/2555468172036091710/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=2555468172036091710' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2555468172036091710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2555468172036091710'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/02/the-failed-promise.html' title='The Failed Promise'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-2416913314770612199</id><published>2014-01-29T15:42:00.003-08:00</published><updated>2014-01-29T15:42:44.786-08:00</updated><title type='text'>Sorry for the interruption....</title><content type='html'>Some of you may have noticed that my email, or my blog, or website, was down.&lt;br /&gt;&lt;br /&gt;I discontinued my hosting service with BlueHost, and when I did, I mistakenly thought that by keeping my domain registration with them, that I&#39;d still have DNS services. &amp;nbsp;It was both a foolish mistake, and yet an easy one to make. &amp;nbsp;(I should have known better...)&lt;br /&gt;&lt;br /&gt;Anyway, things are back to normal now, once the interweb&#39;s negative caches have timed out...&lt;br /&gt;&lt;br /&gt;It does seem unfortunate that BlueHost:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Does not include DNS with domain registration, nor do they have a service for it unless you actually host content with them.&lt;/li&gt;&lt;li&gt;Did not backup my DNS zone data. &amp;nbsp;(So even if I paid them to reactivate hosting, I was going to have to re-enter my zone records by hand.) &amp;nbsp;This is just stupid.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;So, I&#39;ve moved my DNS, and when my registration expires, I&#39;ll be moving that to another provider as well. &amp;nbsp;(Dyn, in case you wondered.)</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/2416913314770612199/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=2416913314770612199' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2416913314770612199'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/2416913314770612199'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/01/sorry-for-interruption.html' title='Sorry for the interruption....'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-8804127152337960786</id><published>2014-01-18T16:40:00.000-08:00</published><updated>2014-01-18T16:40:36.126-08:00</updated><title type='text'>Worst Company ... Ever</title><content type='html'>So I&#39;ve not blogged in a while, but my recent experience with a major mobile provider was so astonishingly bad that I feel compelled to write about my experiences. &amp;nbsp;(Executive summary: never do business with T-mobile again!)&lt;br /&gt;&lt;br /&gt;I had some friends out from Russia back in November, and they wanted to purchase an iPhone 5s for their son as a birthday gift. &amp;nbsp;Sadly, we couldn&#39;t get unlocked ones from the Apple Store at the time, because they simply lacked inventory.&lt;br /&gt;&lt;br /&gt;So we went to the local T-mobile store here on San Marcos Blvd (San Marcos, CA.) &amp;nbsp;I knew that they were offering phones for full-price (not subsidized), and it seemed like a possible way for them to get a phone. &amp;nbsp;Tiffany was the customer service agent that &quot;assisted&quot; us. &amp;nbsp;She looked like she was probably barely out of high school, &amp;nbsp;but anyway she seemed pleased to help us make a purchase. &amp;nbsp;I asked her no fewer than three times whether the phone was unlocked, and was assured that, yes, the phone was unlocked and would work fine with Russian GSM operators. &amp;nbsp;I was told that in order for T-mobile to sell us the phone, we had to purchase a 1-month prepaid plan for $50, and a $10 sim card. &amp;nbsp;While I was little annoyed at this, I understood that this was their prerogative, and the cost of wanting to buy the device &quot;right now&quot; and not being able to wait 2 weeks for Apple to ship one. &amp;nbsp;(My friends had less than a week left in California at this time.) &amp;nbsp;We were buying the phone outright, so it seemed like there ought to be no reason for the device to have a carrier lock on it.&lt;br /&gt;&lt;br /&gt;So, &lt;i&gt;of course&lt;/i&gt;, the phone was &lt;b&gt;not&lt;/b&gt;&amp;nbsp;unlocked. &amp;nbsp;It didn&#39;t work at all when it got to Russia. &amp;nbsp;Clearly Tiffany didn&#39;t have a clue about the product she sold us. &amp;nbsp;I guess I shouldn&#39;t have been too surprised. But we had put down $760 in cash for a device that now didn&#39;t work. &amp;nbsp;Worst of all, I was embarrassed, as was my friend, when his son got what was essentially a lemon for his birthday gift.&lt;br /&gt;&lt;br /&gt;I was pretty upset, and went back to the store. &amp;nbsp;Tiffany was there, and apologized. &amp;nbsp;She offered to pay up to $25 for me to use a third party service to unlock the phone since &quot;it was her fault&quot;. &amp;nbsp;Of course, the third party service stopped offering this for iPhones, and their cost for iPhone 5&#39;s was over $100 when they &lt;i&gt;were&lt;/i&gt;&amp;nbsp;offering it.&lt;br /&gt;&lt;br /&gt;I tried to get T-mobile to unlock the phone. &amp;nbsp;I waited in the store for a manager for about 2 hours, but Tiffany finally got upset and called the police to get me to leave the store after I indicated that I preferred to wait on the premises for a manager. &amp;nbsp; I left the store premises, unhappy, but resolved to deal with this through the corporate office.&lt;br /&gt;&lt;br /&gt;I went home, and called T-mobile customer service. &amp;nbsp;It turns out that T-mobile store is really a 3rd party company, even though they wear T-mobile shirts, and exclusively offer T-mobile products. &amp;nbsp;(More on that later.)&lt;br /&gt;&lt;br /&gt;I spent quite a few hours on the phone with T-mobile. &amp;nbsp;Somewhere in the process, the customer service people called Tiffany, whereupon she immediately reversed her story, claiming she &lt;i&gt;had&lt;/i&gt;&amp;nbsp;informed me that the phone was locked. &amp;nbsp;This was just the first of a number of false and misleading statements that were made to me by T-mobile or its affiliates. &amp;nbsp; I spent several hours on the phone that day. &amp;nbsp;At the end of the call, I was told that T-mobile would unlock my phone only &lt;i&gt;after&lt;/i&gt;&amp;nbsp;at least 40 days had passed from the date of activation. &amp;nbsp; The person at corporate assured me that if I would just wait the 40 days, then I&#39;d be able to get the phone unlocked. &amp;nbsp;Since the phone was already in Russia, I figured it would take at least that long to send it back and send a replacement from another carrier.&lt;br /&gt;&lt;br /&gt;Oh one other thing. &amp;nbsp;During that first call, I discovered that Tiffany had actually taken the $50 prepaid plan we purchased, and kept it for herself or her friends. &amp;nbsp;We didn&#39;t figure that out until T-mobile customer service told me that I didn&#39;t have a plan at all. &amp;nbsp;Nice little scam. &amp;nbsp;While dishonest, I would not have begrudged the action had the phone actually worked. &amp;nbsp;Of course it didn&#39;t.&lt;br /&gt;&lt;br /&gt;(During all this, on several different occasions, T-mobile customer service personnel tried to refer me to the same 3rd party unlocking service. &amp;nbsp;Because hey, if T-mobile can&#39;t get its own phones unlocked, maybe their customers should pay some shady third party service to get it done for them. &amp;nbsp;But it turns out that whatever backdoor deal that service had previously doesn&#39;t work anymore, because they&#39;ve stopped doing it for Apple phones.)&lt;br /&gt;&lt;br /&gt;So we waited 40 days.&lt;br /&gt;&lt;br /&gt;And then we called to have the phone unlocked.&lt;br /&gt;&lt;br /&gt;And T-mobile refused again. &amp;nbsp;This time I was told that I needed to have $50.01 or more, not just $50 on the plan. &amp;nbsp;After a few more hours on the phone and escalation up through a few levels of their management chain, they credited my account for $0.20, and then resubmitted the unlock request. &amp;nbsp;I was &lt;i&gt;guaranteed&lt;/i&gt;&amp;nbsp;that the phone would be unlocked.&lt;br /&gt;&lt;br /&gt;Two days later, T-mobile denied the unlock request.&lt;br /&gt;&lt;br /&gt;At this point, I was informed that the phone had to have T-mobile activity on it within 7 days of the unlock request. &amp;nbsp;This was simply not going to happen. &amp;nbsp;The phone was in Russia! &amp;nbsp;I complained, and I spent quite a few more hours on the phone with T-mobile. &amp;nbsp;It seems like the folks who control the unlocking process of their phones have &lt;i&gt;nothing&lt;/i&gt;&amp;nbsp;to do with the people who answer their customer service lines, nor those people&#39;s bosses, nor &lt;i&gt;those&lt;/i&gt;&amp;nbsp;people&#39;s bosses. &amp;nbsp;Astonishing!&lt;br /&gt;&lt;br /&gt;At this point I had spent over a dozen hours trying to get T-mobile to unlock the darned thing. &amp;nbsp;T-mobile had got their money from me already, and had done pretty much everything possible to upset me. &amp;nbsp;The amount of money T-mobile spent dealing on the phone with me, trying to enforce a stupid policy, which wouldn&#39;t have been necessary if they had just admitted their mistake &lt;i&gt;and fixed it (which would have cost them nothing&amp;nbsp;whatsoever)&lt;/i&gt;&amp;nbsp;is astonishing. &amp;nbsp;Talk about penny-wise and pound foolish.&lt;br /&gt;&lt;br /&gt;At that time, T-mobile told me that I would be able to return the other phone, provided I got it back from Russia. &amp;nbsp;They agreed to this even though the usual 14 days &quot;buyer&#39;s remorse&quot; window had passed.&lt;br /&gt;&lt;br /&gt;So at this point, I went and purchased a phone from Verizon (and paid a $50 premium because I was at BestBuy instead of the Apple store and the Verizon store wouldn&#39;t sell the phone unless it was part of a plan), and I sent it to Russia with my step-son, who was going their for Christmas. &amp;nbsp;That phone &lt;i&gt;did&lt;/i&gt;&amp;nbsp;work, and my step-son exchanged the T-mobile phone for it, bringing the T-mobile phone back.&lt;br /&gt;&lt;br /&gt;The next day, I went to return the phone at the store where I bought it. &amp;nbsp;Sadly, Tiffany was there. &amp;nbsp;So was her manager, Erica.&lt;br /&gt;&lt;br /&gt;After spending about an hour at the store trying to return it, they agreed to take it back, minus a $50 restocking fee. &amp;nbsp;And as I paid cash, I had to provide my checking account information so they could do a deposit for me, which would take a few days. &amp;nbsp;I got a paper showing that they were sending me a refund, but nothing indicating the account number. &amp;nbsp;(Turns out it took a few calls from Erica -- who claimed to be the store manager and probably was about 10 minutes older than Tiffany -- the next day, since she apparently had no clue what she was doing and needed to get two separate pieces of information that she failed to collect while I was in the story.)&lt;br /&gt;&lt;br /&gt;I did spend a bunch of time with customer service on the phone -- a few more hours I guess, trying to get that last $50. &amp;nbsp;At this point it was just a matter of principle. &amp;nbsp;I resented the whole thing, and I wanted as much of my money back as possible. &amp;nbsp;The customer service person tried to make it right, but because the store (Hit Mobile is the company apparently) is separate from T-mobile, the store&#39;s decision was final. &amp;nbsp;The store manager (Erica) refused to refund the stocking fee, and there was nothing T-mobile could do about it. &amp;nbsp;To their credit, they &lt;i&gt;did&lt;/i&gt;&amp;nbsp;offer me a $50 service credit if I was inclined to keep an account with them. &amp;nbsp;Needless to say, I have &lt;i&gt;no&lt;/i&gt;&amp;nbsp;interest in ever being a T-mobile customer, so I thanked them and declined... indicating that I&#39;d prefer to have funds back in cash. &amp;nbsp;(Nobody ever mentioned the restocking fee; on the contrary I was told I&#39;d receive the full purchase price less the $60 service plan and SIM card. &amp;nbsp;Again, story and reality don&#39;t match at T-mobile.)&lt;br /&gt;&lt;br /&gt;I did eventually get $650 credited back to my account.&lt;br /&gt;&lt;br /&gt;So, I was out $110, plus the extra $50, plus the 13+ hours of my time, plus the embarrassment and long turnaround time to get the replacement out to Russia. &amp;nbsp;All because T-mobile wouldn&#39;t fix a mistake they made, even though numerous people at that company recognized that it was clearly the Right Thing To Do.&lt;br /&gt;&lt;br /&gt;Turns out that Verizon iPhones are all unlocked. &amp;nbsp;And I&#39;m already a Verizon customer. &amp;nbsp;I was thinking about T-mobile&#39;s plans -- some of them are attractive on paper, and potentially could have saved me money relative the rather premium prices I pay for Verizon. &amp;nbsp;Needless to say, I will &lt;i&gt;not&lt;/i&gt;&amp;nbsp;be changing my provider any time soon. &amp;nbsp;In spite of the high prices, I&#39;ve always been dealt with honestly and fairly, and I&#39;ve been happy with the service I&#39;ve gotten at Verizon.&lt;br /&gt;&lt;br /&gt;If for some reason, you decide to get a T-mobile phone, please, please avoid the store located on San Marcos Blvd. &amp;nbsp;In fact, I urge you to verify that the store is owned by T-mobile corporation. &amp;nbsp;Its my belief that I might have had more satisfactory results had I been dealing with just a single entity. &amp;nbsp;That said, numerous people at T-mobile corporate lied to me and made false promises.&lt;br /&gt;&lt;br /&gt;I feel so strongly about this, that I&#39;m happy to have spent the hour or so writing up my terrible experiences with them. &amp;nbsp;I hope that I save someone else these painful experiences. &amp;nbsp;I won&#39;t be unhappy if it also costs T-mobile many potential customers.&lt;br /&gt;&lt;br /&gt;For the record, I also think it should be illegal to sell a carrier locked device without clearly indicating this is so as part of the transaction. &amp;nbsp;The practice of carrier locking devices makes sense when the cost of the device is being subsidized by the carrier as part of a service plan. &amp;nbsp;But it should be possible to purchase the device outright and remove any such lock. &amp;nbsp;T-mobile&#39;s practices here are a disservice to their customers, and their partners. &amp;nbsp;The handset manufacturers should apply pressure to them to get them to change their policy here.</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/8804127152337960786/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=8804127152337960786' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8804127152337960786'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8804127152337960786'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2014/01/worst-company-ever.html' title='Worst Company ... Ever'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/101751336283999515602</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-iK1shT81XTE/AAAAAAAAAAI/AAAAAAAAAJA/MSN7V7X_7mM/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-8030092895269029694</id><published>2013-10-17T22:17:00.002-07:00</published><updated>2013-10-17T22:17:21.672-07:00</updated><title type='text'>illumos corporate entity... non-starter?</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I want to give folks a status update on the &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt; corporate entity.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In a nutshell, the corporate entity seems to be failing to have traction. &amp;nbsp;In particular, the various corporate contributors &amp;nbsp;and downstreams for illumos have declined to step up to ensure that an illumos corporate entity has sufficient backing to make it successful.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;While at first blush, this seems somewhat unfortunate, I think this is not nearly quite as bad a thing as it might first seem. &amp;nbsp;In particular, the failure of a corporate entity does not correlate to the health of the ecosystem -- indeed many successful open source projects operate without an umbrella organization or entity.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Instead, we see corporate contributors and downstream distributions focusing on developing the communities behind their distributions such as &lt;a href=&quot;http://www.smartos.org/&quot;&gt;SmartOS&lt;/a&gt; and &lt;a href=&quot;http://omnios.omniti.com/&quot;&gt;OmniOS&lt;/a&gt;. &amp;nbsp;Those downstreams play an active role in improving illumos for the benefit of all, and its my sincere hope and belief that they will continue to evangelize illumos, and contribute to the common core.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Furthermore, incorporation in the state of California requires paying about $800 of taxes per year. &amp;nbsp;This is true even for organizations without any revenue. &amp;nbsp;This is money that would have to be taken from sponsors that would serve only to enrich our state government with no direct benefit to the illumos community. &amp;nbsp;(Non-profit status is a way around that, but its exceedingly difficult to obtain, and a number of &lt;a href=&quot;http://programming.oreilly.com/2013/06/irs-wasnt-fond-of-open-source-either.html&quot;&gt;open source organizations are finding themselves under very close scrutiny&lt;/a&gt; from the state and federal authorities. &amp;nbsp; &amp;nbsp;Indeed, the &lt;a href=&quot;http://x.org/&quot;&gt;X.org&lt;/a&gt; community themselves &lt;a href=&quot;http://slashdot.org/story/13/08/27/1244247/xorg-foundation-loses-501c3-non-profit-status&quot;&gt;lost&lt;/a&gt; their 501(c)3 status not that long ago.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, without corporate sponsors to justify the tax and administrative load, I&#39;ve decided that the illumos corporate entity should expire. &amp;nbsp;I do want to thank &lt;a href=&quot;http://www.beginningwithi.com/&quot;&gt;Deirdré Straughan&lt;/a&gt; for the non-trivial amount of effort she put into this, as well as the &lt;a href=&quot;http://softwarefreedom.org/&quot;&gt;Software Freedom Law Center&lt;/a&gt; for the pro-bono work they did for us while we were trying to navigate the waters of becoming a true non-profit open source organization.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;And, if any corporate sponsors are out there watching this, and interested in resurrecting the illumos organization, then I&#39;m happy to entertain the possibilities. &amp;nbsp;I think there is value in an actual organization with a legal status to receive and distribute funds, and who can hold certain items of intellectual property, including the rights to the illumos trademark itself. &amp;nbsp; But there has to be enough of a sponsorship behind this to make it worthwhile.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;In the meantime, I will continue to hold the illumos mark as a trademark that I keep in trust for the community. &amp;nbsp;The &lt;i&gt;code&lt;/i&gt;&amp;nbsp;is something that is already subject to distributed ownership, and so is completely unimpacted by any of this.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Thanks.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&amp;nbsp; - Garrett&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/8030092895269029694/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=8030092895269029694' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8030092895269029694'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/8030092895269029694'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2013/10/illumos-corporate-entity-non-starter.html' title='illumos corporate entity... non-starter?'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-1240454310538521045</id><published>2013-10-13T21:45:00.002-07:00</published><updated>2013-10-13T21:45:57.918-07:00</updated><title type='text'>Moving on (Adieu to Studio?)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;I think illumos is at a key juncture, and the issue relates to our toolchain.&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have gcc 4.4.4 working thanks in large part to the efforts of folks like Rich Lowe.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We have historically relied on Sun Studio (now Solaris Studio) as our &quot;base&quot; or &quot;default&quot; compiler for C and C++ programs, and also to supply lint coverage.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I&#39;ve been thinking for a long time that its past time we (the illumos community) moved on from this. &amp;nbsp;Not only are the Studio 12 compilers not available in source form, they are now not available in suitable form for building illumos as binaries either. &amp;nbsp;(Apparently it is possible under some terms to get Solaris Studio 12.3, but who knows if those compilers are suitable for building illumos. &amp;nbsp;In the past we have always needed specifically patched compilers for Solaris.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;The situation where a general developer cannot obtain the necessary tool chain for working with illumos is untenable.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Today we require &quot;lint&quot; as part of an official build. &amp;nbsp;But not just &quot;any&quot; lint, but lint generated by a specific patched older version of Sun Studio 12. &amp;nbsp;A version that is no longer available to the community at large.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;(And in full disclosure, the problem for me is brought to a head by the fact that the machine I had my local installation of these tools on has been retired, and I find I don&#39;t have another backup of them readily at hand to install on my new machine.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;So, I&#39;m placing this as a call to the illumos community at large, and especially to our RTI advocates. &amp;nbsp;Its time. &amp;nbsp;Really.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Really.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Studio has to go.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I don&#39;t care if we leave the infrastructure in place for people that want to continue to use Studio, but we need to switch to gcc. &amp;nbsp;Rich&#39;s 4.4.4 version gets the job done for now. &amp;nbsp;It would be great if we could support newer versions, but I understand that this requires some non-trivial amount of effort (some gcc patches that need to be upstreamed, as I understand it.)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;We cannot be tied to a closed tool chain; especially a tool chain that doesn&#39;t at least include binary redistribution privileges.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;For the record, I&#39;ve posted the same content to the illumos developer and advocates lists.&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/1240454310538521045/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=1240454310538521045' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/1240454310538521045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/1240454310538521045'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2013/10/moving-on-adieu-to-studio.html' title='Moving on (Adieu to Studio?)'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-5179295673144657187</id><published>2013-08-29T15:07:00.000-07:00</published><updated>2013-08-29T15:07:12.561-07:00</updated><title type='text'>Responding to Trolls</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;We have an... ahem... toxic personality in our midst in &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt;. &amp;nbsp;I&#39;m going to respond here to his most recent &lt;a href=&quot;http://www.listbox.com/member/archive/182179/2013/08/sort/time_rev/page/1/entry/1:547/20130829164020:36CA17F2-10EB-11E3-AC85-974F16BEB7CA/&quot;&gt;post&lt;/a&gt;, to avoid wasting the time on the illumos developers mailing list. &amp;nbsp;If you don&#39;t care about non-sense like this (although it may have entertainment value), please just ignore this post and move on.&lt;br /&gt;&lt;br /&gt;The only reason I&#39;m replying even here, is to set the record straight, and establish firmly the history -- at least my side of it -- for posterity.&lt;br /&gt;&lt;br /&gt;In the early days of illumos, I invited those I could think of from the Solaris and OpenSolaris communities to participate. &amp;nbsp;I even reached out to some parties, like Jörg Schilling, who had a bad reputation as difficult people to work with.&lt;br /&gt;&lt;br /&gt;I had hoped to repair those broken relationships since there was no longer a corporate controlling entity for illumos. &amp;nbsp;(&lt;a href=&quot;http://www.nexenta.com/&quot;&gt;Nexenta&lt;/a&gt; sponsored my efforts, and paid some of the early operating costs for illumos, but it has always been the case that illumos operates by and for the community -- and not at the behest of any corporate master. &amp;nbsp;As I&#39;ve since left Nexenta to start my &lt;a href=&quot;http://www.dey-sys.com/&quot;&gt;own company&lt;/a&gt;, and illumos has carried on, I think there is fairly ample evidence in support of this fact.)&lt;br /&gt;&lt;br /&gt;I reached out, and tried to help Jörg with some integrations; but those integrations did not go well. &amp;nbsp;Jörg did not like our policy requiring a build or test of changes on the primary distribution (&lt;a href=&quot;http://www.openindiana.org/&quot;&gt;OpenIndiana&lt;/a&gt; at the time) used for the vast majority of developers and users, and so several of his changes did not get integrated. &amp;nbsp;(It turns out this was a good thing, because at least one of those changes, a &quot;fix&quot; for a keyboard problem, was mis-designed and would have broken international keyboards for the majority of illumos&#39; user community.)&lt;br /&gt;&lt;br /&gt;We also required code review, as we do now.&lt;br /&gt;&lt;br /&gt;Jörg has long had a desire to have &quot;&lt;a href=&quot;http://en.wikipedia.org/wiki/Tar_(file_format)#Key_implementations&quot;&gt;star&lt;/a&gt;&quot; integrated as the main replacement for all archivers. &amp;nbsp;That didn&#39;t take place, because he couldn&#39;t find reviewers. &amp;nbsp;And after several negative interactions with him, I withdrew my offer to sponsor his work personally, as I found the process of trying to do so unbelievably painful. &amp;nbsp;(There was an extremely long telephone call with Joerg that sticks in my memory.) &amp;nbsp;I suggested he find someone else willing to code review and sponsor his work for integration into illumos. &amp;nbsp;To date, that has not happened.&lt;br /&gt;&lt;br /&gt;Somewhere during that time, Jörg indicated that he would not offer any other code up for integration until star was integrated. &amp;nbsp;Basically, he took his toys and went home. &amp;nbsp;Except he just took his toys, but forgot to go home, as he&#39;s still trying to create noise on our developer mailing lists.&lt;br /&gt;&lt;br /&gt;There was another negative experience we had, mirroring today&#39;s thread, where Joerg&#39;s response to a tool I wrote (an open replacement for &quot;od&quot;) was non-constructive criticism. &amp;nbsp;(In fact, his response was &quot;it&#39;s broken, why don&#39;t you use this thing I haven&#39;t finished writing yet&quot;. &amp;nbsp;(He modified his &quot;hexdump&quot; utility to behave like od, apparently in &lt;i&gt;response&lt;/i&gt;&amp;nbsp;to my effort instead of simply offering helpful review feedback.)&lt;br /&gt;&lt;br /&gt;This is typical of Jörg -- the only &quot;right&quot; answer as far as he is concerned is to accept his code, even if it isn&#39;t written yet or is buggy!&lt;br /&gt;&lt;br /&gt;Jörg is what is known as a &lt;a href=&quot;http://google%20i/O%202008%20-%20Open%20Source%20Projects%20and%20Poisonous%20People%20...&quot;&gt;poisonous personality&lt;/a&gt;. &amp;nbsp;At least in every context that I&#39;ve seen him operate. Which is why usually I try to just ignore him, and hope he&#39;ll go away; yet like certain garden pests he just keeps coming back. &amp;nbsp;He&#39;s even been &lt;a href=&quot;http://slashdot.org/story/06/09/04/1335226/debian-kicks-jrg-schilling&quot;&gt;kicked out&lt;/a&gt; of another prominent open source community.&lt;br /&gt;&lt;br /&gt;He&#39;s also said made some incorrect and defamatory statements about both Nexenta and illumos at a prominent academic conference in Germany. &amp;nbsp;(I can&#39;t find the link right now, I&#39;ll update if I find it.)&lt;br /&gt;&lt;br /&gt;So, where in his post today he asks Gordon if he&#39;s willing to change the rules for integration, I have this in reply:&lt;br /&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;&lt;i&gt;Are you willing to change this?&amp;nbsp;&lt;/i&gt;&lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;Gordon isn&#39;t empowered to. &amp;nbsp;Neither, for that matter, am I. &amp;nbsp;The rules that have been established for collaboration here are by common consent of the major contributors, and no single individual can change them. &amp;nbsp;Notably, those were the rules in force in Summer 2010, and you were the one that wanted special treatment. &amp;nbsp; Those rules have served this community well for the past several years, and there has been no movement to change them.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I am interested in setting up a phalanx of OpenSolaris activities because this&lt;br /&gt;is the only way we have a chance to continue with OpenSolaris development but&lt;br /&gt;this is hard as long as Illumos is not willing to play nicely.&lt;/i&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;OpenSolaris is dead. &amp;nbsp;The entire illumos community has moved on. &amp;nbsp;You have not, but then I have long since stopped considering you a part of the illumos community.&lt;br /&gt;Especially given your repeated attacks against both illumos and numerous of its contributors -- even fairly early on you made a number of defamatory and incorrect statements about the nature of both illumos and its contributors in technical presentation before the German academic community. &amp;nbsp;This was not the behavior of someone who is a constructive contributor.&lt;br /&gt;To be completely honest, I think I&#39;m not alone in wishing that you&#39;d come to the same conclusion: that is that you are not part of this community.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;I recently tried to build a bridge by propising that Illumos should implement&lt;br /&gt;the proposals from Summer 2010 to regain credibility. Unfortuntely there was no&lt;br /&gt;reaction.&lt;/i&gt;&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote class=&quot;tr_bq&quot;&gt;That should speak volumes all by itself.&amp;nbsp;&lt;/blockquote&gt;&lt;div class=&quot;p3&quot;&gt;As someone else in another open source community said,&amp;nbsp;&lt;a href=&quot;https://www.google.com/url?sa=t&amp;amp;rct=j&amp;amp;q=&amp;amp;esrc=s&amp;amp;source=web&amp;amp;cd=11&amp;amp;ved=0CGAQFjAK&amp;amp;url=http%3A%2F%2Flists.debian.org%2Fdebian-devel%2F2004%2F10%2Fmsg00487.html&amp;amp;ei=usIfUtyGNuKZjAKr04G4DA&amp;amp;usg=AFQjCNHOEtZf4_iBmGJyhvP2WzRe7OgMnQ&amp;amp;bvm=bv.51495398,d.cGE&quot;&gt;Jorg Schilling is damage; the community should route around him.&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/5179295673144657187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=5179295673144657187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5179295673144657187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5179295673144657187'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2013/08/responding-to-trolls.html' title='Responding to Trolls'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-5325877764177684187</id><published>2013-08-27T09:33:00.001-07:00</published><updated>2013-08-27T09:33:36.916-07:00</updated><title type='text'>An important milestone</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;Yesterday, with very little fanfare, &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt; passed an important milestone.&lt;br /&gt;&lt;br /&gt;This milestone was the integration of&amp;nbsp;&lt;a href=&quot;https://www.illumos.org/issues/195&quot;&gt;195 Need replacement for nfs/lockd+klm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This is work that I originally tasked Gordon Ross and Dan Kruchinin to work while we were colleagues at&amp;nbsp;&lt;a href=&quot;http://www.nexenta.com/&quot;&gt;Nexenta&lt;/a&gt;. &amp;nbsp;Gordon started the work, picking up bits from &lt;a href=&quot;http://www.freebsd.org/&quot;&gt;FreeBSD&lt;/a&gt; as a starting point and gluing it to the illumos entry points. &amp;nbsp;Dan continued with it, and fleshed out a lot of the skeleton that Gordon had started. &amp;nbsp;It was subsequently picked up by the engineers at &lt;a href=&quot;http://www.delphix.com/&quot;&gt;Delphix&lt;/a&gt;, and -- after some important bug fixing work was completed -- was integrated into their product quite some time ago -- reportedly its been stable since December in their product.&lt;br /&gt;&lt;br /&gt;The reason this is such an important milestone, is two fold:&lt;br /&gt;&lt;br /&gt;First, this represents a substantial collaborative effort, involving contributions from parties across several organizational boundaries. &amp;nbsp;The level of collaboration achieved here is a win for the greater good of the community.&lt;br /&gt;&lt;br /&gt;Second, this effort represents the replacement of the last of the truly closed source code in our kernel proper. &amp;nbsp;There are still some closed source drivers (although I will point that we&#39;re now seeing more traction with vendors to supply open drivers, with recent open source code contributions coming from places like &lt;a href=&quot;http://www.solarflare.com/&quot;&gt;SolarFlare&lt;/a&gt;, &lt;a href=&quot;http://www.lsi.com/&quot;&gt;LSI&lt;/a&gt;, and &lt;a href=&quot;http://www.hp.com/&quot;&gt;HP&lt;/a&gt;. &amp;nbsp;(HP&#39;s contribution -- through illumos partner&amp;nbsp;&lt;a href=&quot;http://www.joyent.com/&quot;&gt;Joyent&lt;/a&gt; -- means that at least one important closed source driver will soon be open -- cpqary3.)&lt;br /&gt;&lt;br /&gt;I want to personally thank everyone who contributed to make the integration of the new open source NFS lock manager possible. You&#39;ve done a big service to the community, and we are grateful!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/5325877764177684187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=5325877764177684187' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5325877764177684187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/5325877764177684187'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2013/08/an-important-milestone.html' title='An important milestone'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-6365849139750216065</id><published>2013-01-17T20:13:00.002-08:00</published><updated>2013-01-17T20:13:38.630-08:00</updated><title type='text'>ZFS Compression Enhancements in illumos</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;The ZFS code in &lt;a href=&quot;http://www.illumos.org/&quot;&gt;illumos&lt;/a&gt; has gained another differentiator thanks to the hard work of Saso, who integrated &lt;a href=&quot;http://wiki.illumos.org/display/illumos/LZ4+Compression+In+ZFS&quot;&gt;LZ4 improved compression&lt;/a&gt; into our code base.&lt;br /&gt;&lt;br /&gt;This is a nice achievement, and enhanced compression should be quite useful for most applications of ZFS. &amp;nbsp;If LZJB was always recommended to be turned on (it was by our team at least!), then LZ4 is even more recommended, unless all of your data is totally incompressible. &amp;nbsp;(Most data is highly compressible.)&lt;br /&gt;&lt;br /&gt;You should check out his wiki post above, which contains a lot more details about the work, including some benchmark data.&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/6365849139750216065/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=6365849139750216065' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/6365849139750216065'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/6365849139750216065'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2013/01/zfs-compression-enhancements-in-illumos.html' title='ZFS Compression Enhancements in illumos'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-7528831701633643336.post-805143750392114476</id><published>2012-10-27T19:18:00.000-07:00</published><updated>2012-10-27T23:25:54.170-07:00</updated><title type='text'>hackathon project: pfiles - postmortem analysis</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;During the first days of October 2012, we had an &lt;a href=&quot;http://www.zfsday.org/&quot;&gt;illumos day&lt;/a&gt;, and a one day illumos hackathon that was very well attended by some of the best and brightest in our community (and I daresay, in &lt;i&gt;any&lt;/i&gt;&amp;nbsp;open source community.)&lt;br /&gt;&lt;br /&gt;The purpose of the hackathon, besides just doing some cool projects, is to give folks a chance to interact with other domain experts, and code, particularly in areas &lt;i&gt;outside&lt;/i&gt;&amp;nbsp;their particular area of expertise.&lt;br /&gt;&lt;br /&gt;This year a number of interesting projects were worked on, and I think some of these are at the point of starting to bear fruit. &amp;nbsp;The project I undertook was the addition of post-mortem analysis support for &lt;b&gt;pfiles&lt;/b&gt;(1). &amp;nbsp;That is, making it possible to use pfiles against a &lt;b&gt;core&lt;/b&gt;(4) file. &amp;nbsp;Adam Leventhal suggested the project, and provided the initial suggestion on the method to use for doing the work.&lt;br /&gt;&lt;br /&gt;This is a particularly interesting project, because the information that pfiles reports is located in kernel state (in the uarea) and has not traditionally been available in a core file.&lt;br /&gt;&lt;br /&gt;To complete this project, I had to work in a few areas that were unfamiliar to me. &amp;nbsp;Especially I had never looked at the innards of ELF files, nor at the process by which a core file is generated. &amp;nbsp;To add the necessary information, I had to create a new type of ELF note, and then add code to generate it to libproc (used by gcore) and elfexec (for kernel driven core dumps). &amp;nbsp;I also had to add support to parse this to libproc (for pfiles), and elfdump. &amp;nbsp;The project turned out to be bigger than anticipated, consisting of almost a thousand lines of code. &amp;nbsp;So it took me a little more than a day to complete it.&lt;br /&gt;&lt;br /&gt;A &lt;a href=&quot;http://cr.illumos.org/~gdamore/pfiles&quot;&gt;webrev with the associated changes&lt;/a&gt; is presented for your enjoyment. &amp;nbsp;I&#39;d appreciate any review feedback, and especially any further testing.&lt;br /&gt;&lt;br /&gt;Here&#39;s a sample run:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;garrett@openindiana{250}&amp;gt; cat &amp;lt; /dev/zero &amp;amp;&lt;/b&gt;&lt;br /&gt;[2] 144241&lt;br /&gt;&lt;b&gt;garrett@openindiana{251}&amp;gt; pfiles 144241&lt;/b&gt;&lt;br /&gt;144241:&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cat&lt;br /&gt;&amp;nbsp; Current rlimit: 256 file descriptors&lt;br /&gt;&amp;nbsp; &amp;nbsp;0: S_IFCHR mode:0666 dev:526,0 ino:35127324 uid:0 gid:3 rdev:67,12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDONLY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /devices/pseudo/mm@0:zero&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:72712192&lt;br /&gt;&amp;nbsp; &amp;nbsp;1: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:72704245&lt;br /&gt;&amp;nbsp; &amp;nbsp;2: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:72704245&lt;br /&gt;&lt;b&gt;garrett@openindiana{252}&amp;gt; gcore 144241&lt;/b&gt;&lt;br /&gt;gcore: core.144241 dumped&lt;br /&gt;&lt;b&gt;garrett@openindiana{253}&amp;gt; pfiles core.144241&amp;nbsp;&lt;/b&gt;&lt;br /&gt;core &#39;core.144241&#39; of 144241:&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cat&lt;br /&gt;&amp;nbsp; &amp;nbsp;0: S_IFCHR mode:0666 dev:526,0 ino:35127324 uid:0 gid:3 rdev:67,12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDONLY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /devices/pseudo/mm@0:zero&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:195125248&lt;br /&gt;&amp;nbsp; &amp;nbsp;1: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:161882375&lt;br /&gt;&amp;nbsp; &amp;nbsp;2: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:161882375&lt;br /&gt;&lt;b&gt;garrett@openindiana{254}&amp;gt; kill -11 144241&lt;/b&gt;&lt;br /&gt;&lt;b&gt;garrett@openindiana{255}&amp;gt; pfiles core&lt;/b&gt;&lt;br /&gt;core &#39;core&#39; of 144241:&lt;span class=&quot;Apple-tab-span&quot; style=&quot;white-space: pre;&quot;&gt; &lt;/span&gt;cat&lt;br /&gt;&amp;nbsp; &amp;nbsp;0: S_IFCHR mode:0666 dev:526,0 ino:35127324 uid:0 gid:3 rdev:67,12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDONLY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /devices/pseudo/mm@0:zero&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:419414016&lt;br /&gt;&amp;nbsp; &amp;nbsp;1: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:296960430&lt;br /&gt;&amp;nbsp; &amp;nbsp;2: S_IFCHR mode:0620 dev:527,0 ino:893072809 uid:101 gid:7 rdev:27,2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; O_RDWR|O_NOCTTY|O_LARGEFILE&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; /dev/pts/2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; offset:296960430&lt;br /&gt;[2] &amp;nbsp;- Segmentation fault &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;cat &amp;lt; /dev/zero (core dumped)&lt;br /&gt;&lt;br /&gt;&lt;b&gt;garrett@openindiana{256}&amp;gt; elfdump core&lt;/b&gt;&lt;br /&gt;&lt;div&gt;...&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; entry [10]&lt;br /&gt;&amp;nbsp; &amp;nbsp; namesz: 0x5&lt;br /&gt;&amp;nbsp; &amp;nbsp; descsz: 0x440&lt;br /&gt;&amp;nbsp; &amp;nbsp; type: &amp;nbsp; [ NT_FDINFO ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CORE\0&lt;br /&gt;&amp;nbsp; &amp;nbsp; desc: (prfdinfo_t)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fd: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_mode: &amp;nbsp; &amp;nbsp; &amp;nbsp;[ S_IFCHR S_IRUSR S_IWUSR S_IRGRP S_IWGRP S_IROTH S_IWOTH ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_uid: &amp;nbsp; &amp;nbsp; &amp;nbsp; 0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_gid: &amp;nbsp; &amp;nbsp; &amp;nbsp;3&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_major: &amp;nbsp; &amp;nbsp; 526 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_minor: &amp;nbsp; &amp;nbsp;0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rmajor: &amp;nbsp; &amp;nbsp;67 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rminor: &amp;nbsp; 12&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_ino: &amp;nbsp; &amp;nbsp; &amp;nbsp; 35127324&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_size: &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_offset: &amp;nbsp; 419414016&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fileflags: [ O_RDONLY O_LARGEFILE ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fdflags: &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_path: &amp;nbsp; &amp;nbsp; &amp;nbsp;/devices/pseudo/mm@0:zero&lt;br /&gt;&lt;br /&gt;&amp;nbsp; entry [11]&lt;br /&gt;&amp;nbsp; &amp;nbsp; namesz: 0x5&lt;br /&gt;&amp;nbsp; &amp;nbsp; descsz: 0x440&lt;br /&gt;&amp;nbsp; &amp;nbsp; type: &amp;nbsp; [ NT_FDINFO ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CORE\0&lt;br /&gt;&amp;nbsp; &amp;nbsp; desc: (prfdinfo_t)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fd: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_mode: &amp;nbsp; &amp;nbsp; &amp;nbsp;[ S_IFCHR S_IRUSR S_IWUSR S_IWGRP ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_uid: &amp;nbsp; &amp;nbsp; &amp;nbsp; 101 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_gid: &amp;nbsp; &amp;nbsp; &amp;nbsp;7&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_major: &amp;nbsp; &amp;nbsp; 527 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_minor: &amp;nbsp; &amp;nbsp;0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rmajor: &amp;nbsp; &amp;nbsp;27 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rminor: &amp;nbsp; 2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_ino: &amp;nbsp; &amp;nbsp; &amp;nbsp; 893072809&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_size: &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_offset: &amp;nbsp; 296960430&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fileflags: [ O_RDONLY O_NOCTTY O_LARGEFILE ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fdflags: &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_path: &amp;nbsp; &amp;nbsp; &amp;nbsp;/dev/pts/2&lt;br /&gt;&lt;br /&gt;&amp;nbsp; entry [12]&lt;br /&gt;&amp;nbsp; &amp;nbsp; namesz: 0x5&lt;br /&gt;&amp;nbsp; &amp;nbsp; descsz: 0x440&lt;br /&gt;&amp;nbsp; &amp;nbsp; type: &amp;nbsp; [ NT_FDINFO ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; name:&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CORE\0&lt;br /&gt;&amp;nbsp; &amp;nbsp; desc: (prfdinfo_t)&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fd: &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_mode: &amp;nbsp; &amp;nbsp; &amp;nbsp;[ S_IFCHR S_IRUSR S_IWUSR S_IWGRP ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_uid: &amp;nbsp; &amp;nbsp; &amp;nbsp; 101 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_gid: &amp;nbsp; &amp;nbsp; &amp;nbsp;7&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_major: &amp;nbsp; &amp;nbsp; 527 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_minor: &amp;nbsp; &amp;nbsp;0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rmajor: &amp;nbsp; &amp;nbsp;27 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_rminor: &amp;nbsp; 2&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_ino: &amp;nbsp; &amp;nbsp; &amp;nbsp; 893072809&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_size: &amp;nbsp; &amp;nbsp; &amp;nbsp;0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;pr_offset: &amp;nbsp; 296960430&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fileflags: [ O_RDONLY O_NOCTTY O_LARGEFILE ]&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_fdflags: &amp;nbsp; 0&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pr_path: &amp;nbsp; &amp;nbsp; &amp;nbsp;/dev/pts/2&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://garrett.damore.org/feeds/805143750392114476/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=7528831701633643336&amp;postID=805143750392114476' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/805143750392114476'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/7528831701633643336/posts/default/805143750392114476'/><link rel='alternate' type='text/html' href='http://garrett.damore.org/2012/10/hackathon-project-pfiles-postmortem.html' title='hackathon project: pfiles - postmortem analysis'/><author><name>Garrett D&#39;Amore</name><uri>https://plus.google.com/114484106466928611830</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-3UzpztUh9YI/AAAAAAAAAAI/AAAAAAAADRI/7gIavrAWW5k/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>

If you would like to create a banner that links to this page (i.e. this validation result), do the following:

  1. Download the "valid Atom 1.0" banner.

  2. Upload the image to your own server. (This step is important. Please do not link directly to the image on this server.)

  3. Add this HTML to your page (change the image src attribute if necessary):

If you would like to create a text link instead, here is the URL you can use:

http://feedvalidator.org/check.cgi?url=http%3A//gdamore.blogspot.com/atom.xml

Copyright © 2002-9 Sam Ruby, Mark Pilgrim, Joseph Walton, and Phil Ringnalda