The (or an) attraction of Twitter

As I was reading Sun documentation yesterday, I had a belated realization about one of the attractions ofTwitter: it is a public place to put snarky comments and quick reactionsthat are neither serious enough nor long enough for a blog entry, even avery short one.

Now, as it happens I already have social venues for these reactions, butthey suffer from two problems. First, they're not public, and second,they take more involvement than merely throwing something at Twitter,because they actually are social


My wishes for Sun's online documentation

I have some wishes for docs.sun.com , Sun'stheoretically helpful collection of online documentation.

Sun has a lot of documentation about how to do things with Solaris.Well, how to do things with specific versions of Solaris, for exampleone for each specific release of Solaris 10. This level of archiveddocumentation for each specific release is commendable, but it leadsdirectly to my first wish:

I wish that Sun had permanent URLs that were always the current versionsof any particular document; I would


My reaction to Solaris 10 update 6's ZFS changes

I've been talking about my wait for Solaris 10 update 6 for a while,because it promised improvements and bug fixes for various ZFS issuesthat had been giving me heartburn. Since it's been out for a while andwe've actually put it into production on one server, it's about time Idid a review on how its ZFS changes stack up.


How LiveJournal is sticky

Given the recent commotion over some of LiveJournal's business decisionsand people's unhappyness with LiveJournal as a result, I've beenthinking about the various ways that LiveJournal makes itself sticky(and thus hard to leave, and so on). I think that there are threegeneral levels of LiveJournal stickyness, in ascending order:

  • the simplicity and ease of use for individual users.

  • the network effects: the more that people that you want to read useLiveJournal, the more attractive it is to be there and

Thinking about what you do with undo

In thinking more about undo issues , I think that thefundamental misconception of designing an undo system is to think of itas purely operation based, instead of something more complex (I don'tthink that it's purely time based either). Undo is only operation basedover the very short term, where you are undo-ing an immediate mistake.

I've been trying to think about what things you do with undo, ingeneral. So far, what I have come up with is:

  • fix

Towards a better undo

Here is my growing theory: current versions of 'undo' functionalitygenerally aren't all that good. Having any undo is a lot better thannone, and having multi-level undo is a lot better than only a singlelevel of it (to the point where it's hard for me to consider singlelevel undo as 'undo' any more), but this is a long way from being reallyuseful.

(The problem with single-level undo are hopefully obvious: it's onlyuseful


The HTML tax (in Python, and in general)

The HTML tax is my name for all of those bits of verbosity that you haveto include when you write straight HTML, as opposed to something morecompact . What do I mean by that? Well, considerall of the things that you need for a well formed, standards compliantbasic HTML web page these days.

A relatively minimal page needs a doctype, a section witha </code> and ideally a <code> <meta> </code> declaration for the charset, andthen the boilerplate of the <code> <body></code></p></div></code></a></p></p></code></code></code></code></p></a></a></p></a></p></div> </div> <div class="read-more"> <a href="/read/562108/">Continue reading...</a> </div> </div> <hr> <div class="blog-post d-flex flex-column " hx-put="/api/viewership/" hx-vals='{"itemId": 565726}' hx-ext="viewed" hx-trigger="viewed once" hx-swap="none" hx-headers='{"Content-Type":"application/json"}'> <h2> <a class="text-dark animated" href="/read/565726/">The NFS re-export problem</a> </h2> <div class="blog-post-meta d-flex align-items-center flex-wrap mx-n1" hx-vals='{"itemId": 565726}'> <a class="text-muted mx-1" href="/list/?feed_id=34">Wandering Thoughts</a> | <a class="text-muted mx-1" href="/read/565726/" data-timestamp="1232601480.0" title="Created at May 3, 2024, 1:18 a.m.">Jan. 22, 2009, 12:18 a.m.</a> | <a class="text-muted mx-1" href="https://utcc.utoronto.ca/~cks/space/blog/unix/NFSReexportProblem">Original</a> <div class="ms-auto d-flex align-items-center"> </div> </div> <div data-entry-summary="565726" data-truncated> <div class="wikitext"> <p> One of the things that people traditionally ask for is an NFSserver that can re-export its own NFS mounts (possibly among otherthings). Unfortunately this is impossible in general, and now I canexplain why. </p> <p> (In the old days, one reason people wanted this was because user levelNFS servers were basically the only way to do user level filesystemsat all, and it would be useful if your machine could transparentlyre-export your interesting user level filesystem to other machines. I'mnot sure</p></div></p></a></p></p></p></p></div> </div> <div class="read-more"> <a href="/read/565726/">Continue reading...</a> </div> </div> <hr> <div class="blog-post d-flex flex-column " hx-put="/api/viewership/" hx-vals='{"itemId": 565643}' hx-ext="viewed" hx-trigger="viewed once" hx-swap="none" hx-headers='{"Content-Type":"application/json"}'> <h2> <a class="text-dark animated" href="/read/565643/">Why high availability NFS requires shared storage</a> </h2> <div class="blog-post-meta d-flex align-items-center flex-wrap mx-n1" hx-vals='{"itemId": 565643}'> <a class="text-muted mx-1" href="/list/?feed_id=34">Wandering Thoughts</a> | <a class="text-muted mx-1" href="/read/565643/" data-timestamp="1232428680.0" title="Created at May 3, 2024, 1:18 a.m.">Jan. 20, 2009, 12:18 a.m.</a> | <a class="text-muted mx-1" href="https://utcc.utoronto.ca/~cks/space/blog/unix/HANFSAndSharedStorage">Original</a> <div class="ms-auto d-flex align-items-center"> </div> </div> <div data-entry-summary="565643" data-truncated> <div class="wikitext"> <p> Suppose that you have a situation where you need transparent highavailability NFS for something that is read-only and updated onlyinfrequently. Instead of going to the expense and bother of settingup real shared storage, it's tempting to try to implement this bysetting up a number of fileservers with local copies of the filesystem,synchronizing it from a master machine with <code> rsync </code> , and then using aslight variant of the <a href="https://utcc.utoronto.ca/~cks/space/blog/sysadmin/BasicHANFS"> basic HA NFS setup </a> . </p> <p> Unfortunately, the tempting easy way doesn't work; <strong> you can't</strong></p></div></strong></p></a></a></p></code></p></code></p></a></p></div> </div> <div class="read-more"> <a href="/read/565643/">Continue reading...</a> </div> </div> <hr> <div class="blog-post d-flex flex-column " hx-put="/api/viewership/" hx-vals='{"itemId": 565712}' hx-ext="viewed" hx-trigger="viewed once" hx-swap="none" hx-headers='{"Content-Type":"application/json"}'> <h2> <a class="text-dark animated" href="/read/565712/">The inner life of NFS filehandles</a> </h2> <div class="blog-post-meta d-flex align-items-center flex-wrap mx-n1" hx-vals='{"itemId": 565712}'> <a class="text-muted mx-1" href="/list/?feed_id=34">Wandering Thoughts</a> | <a class="text-muted mx-1" href="/read/565712/" data-timestamp="1232428680.0" title="Created at May 3, 2024, 1:18 a.m.">Jan. 20, 2009, 12:18 a.m.</a> | <a class="text-muted mx-1" href="https://utcc.utoronto.ca/~cks/space/blog/unix/NFSFilehandleInternals">Original</a> <div class="ms-auto d-flex align-items-center"> </div> </div> <div data-entry-summary="565712" data-truncated> <div class="wikitext"> <p> The NFS protocol uses something called a 'file handle' to identifywhat file a given operation applies to; this is sort of analogous tohow a traditional Unix system internally identifies files by theirinode number (well, their device plus their inode number). </p> <p> In theory a NFS filehandle is opaque and an NFS server can use anyscheme it wants in order to uniquely identify files. In practice thereare a number of constraints on how a NFS server can form filehandles,based on preserving as many Unix semantics as possible</p></div></p></p></code></code></p></li></p></li></em></li></ul></p></p></p></div> </div> <div class="read-more"> <a href="/read/565712/">Continue reading...</a> </div> </div> </div> <nav> <ul class="pagination justify-content-center my-1 pagination-sm"> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=1"><<</a> </li> <li class="page-item"> <a class="page-link" data-previous tabindex="-1" href="?feed_id=34&page=651"><</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=649">649</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=650">650</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=651">651</a> </li> <li class="page-item active"> <a class="page-link">652</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=653">653</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=654">654</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=655">655</a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=653" data-next>></a> </li> <li class="page-item"> <a class="page-link" tabindex="-1" href="?feed_id=34&page=last">>></a> </li> </ul> <div class="text-center pb-3">Total: 8,061</div> </nav> <script> const gestureSwipe = () => { let touchstartX = 0; let touchstartY = 0; let touchendX = 0; let touchendY = 0; const gesuredZone = document.querySelector('body'); gesuredZone.addEventListener( "pointerdown", function (event) { console.log("touchstart"); touchstartX = event.screenX; touchstartY = event.screenY; }, false ); gesuredZone.addEventListener( "pointerup", function (event) { console.log("touchend"); touchendX = event.screenX; touchendY = event.screenY; handleGesure(); }, false ); events = [ "gotpointercapture", "lostpointercapture", "pointerover", "pointerenter", "pointerdown", "pointermove", "pointercancel", "pointerout", "pointerleave", "pointerrawupdate", ] function handleGesure() { var swiped = "swiped: "; if (touchendX > touchstartX) { alert(swiped + "right!"); } if (touchendY > touchstartY) { alert(swiped + "left!"); } if (touchendY == touchstartY) { alert("tap!"); } } }; // gestureSwipe(); </script> </main> <aside class="right"> <div id="tags-cloud" hx-get="/api/tags-cloud/" hx-trigger="load" hx-swap="outerHTML" class="d-flex flex-wrap bg-light p-3 rounded my-2 fw-bold small" hx-target="#tags-cloud"> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-9rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-9rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-12rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-9rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-12rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-9rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-6rem"></div> <div class="placeholder placeholder-wave rounded m-1 h-1rem d-inline-block w-3rem"></div> </div> </aside> </div> <div class="offcanvas offcanvas-start" tabindex="-1" id="sidebarMenu" aria-labelledby="sidebarMenuLabel"> <div class="offcanvas-header"> <h5 class="offcanvas-title" id="sidebarMenuLabel"> <i class="bi bi-rss-fill me-2"></i> Menu </h5> <button type="button" class="btn-close text-reset" data-bs-dismiss="offcanvas" aria-label="Close"></button> </div> <div class="offcanvas-body"> <!-- Sidebar Content --> <ul class="nav nav-pills flex-column mb-auto"> <li class="nav-item"> <a href="/" class="nav-link"> <i class="bi bi-house-door me-2"></i> Home </a> </li> <li class="nav-item"> <a href="/list/" class="nav-link"> <i class="bi bi-infinity me-2"></i> List View </a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="SideMenuFeedDropdown" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="bi bi-bell me-2"></i> Feed </a> <div class="dropdown-menu overflow-y-auto" id="sidebar-feed-list" hx-get="/api/side-menu-feed-list-htmx/" hx-trigger='click from:[data-bs-target="#sidebarMenu"] once' hx-target="#sidebar-feed-list" style="max-width: 100vw; max-height: calc( 90vh - 10rem )" aria-labelledby="SideMenuFeedDropdown"></div> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="CatDropdown" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="bi bi-bookmarks me-2"></i> Category </a> <div class="dropdown-menu" aria-labelledby="CatDropdown"> <a class="dropdown-item" href="/?category_id=1">Tech</a> <a class="dropdown-item" href="/?category_id=3">News</a> <a class="dropdown-item" href="/?category_id=4">Photography</a> <a class="dropdown-item" href="/?category_id=2">Blog</a> </div> </li> </ul> <hr class="border-secondary my-2"> <ul class="nav nav-pills flex-column mb-auto"> <li class="nav-item"> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="menuItemChild2" role="button" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <i class="bi bi-person me-2"></i> Accounts </a> <div class="dropdown-menu" aria-labelledby="menuItemChild2"> <a class="dropdown-item" href="/accounts/login/"> <i class="bi bi-box-arrow-left me-2"></i> Login </a> </div> </li> </li> </ul> </div> </div> <div id="overlay" hidden> <div id="imageContainer"> <img src="" alt="" srcset=""> </div> </div> <div id="messagesContainerOuter"> <div class="d-flex justify-content-end pb-2 pe-2"> <div id="messagesContainer" hx-on:htmx:after-settle="document.querySelector('#messagesContainer> div:last-child').scrollIntoView(false)"> </div> </div> </div> <script src="/static/htmx.min.js?sha384=H5SrcfygHmAuTDZphMHqBJLc3FhssKjG7w/CeCpFReSfwBWDTKpkzPP8c+cLsK+V" integrity="sha384-H5SrcfygHmAuTDZphMHqBJLc3FhssKjG7w/CeCpFReSfwBWDTKpkzPP8c+cLsK+V"defer></script> <script src="/static/htmx-ext-ws.js?sha384=1RwI/nvUSrMRuNj7hX1+27J8XDdCoSLf0EjEyF69nacuWyiJYoQ/j39RT1mSnd2G" integrity="sha384-1RwI/nvUSrMRuNj7hX1+27J8XDdCoSLf0EjEyF69nacuWyiJYoQ/j39RT1mSnd2G"defer></script> <script src="/static/bootstrap.bundle.min.js?sha384=YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz"defer></script> <script src="/static/hls.js?sha384=0jcNW9iCiA5ubCFYl7lNSG4LwBvMYnF0Y01esqxwlh1k5U2QDpcnW56N2J84a4Fh" integrity="sha384-0jcNW9iCiA5ubCFYl7lNSG4LwBvMYnF0Y01esqxwlh1k5U2QDpcnW56N2J84a4Fh"defer></script> <script src="/static/djangoql/js/completion.js?sha384=+T3tAo6aZKDoZt1Oh402cTJTylRv4w2ptE5sF3cHW71Sf7pAoSudxllwgXF+bUes" integrity="sha384-+T3tAo6aZKDoZt1Oh402cTJTylRv4w2ptE5sF3cHW71Sf7pAoSudxllwgXF+bUes"defer></script> <script src="/static/main.js?sha384=1NTlZSxE0VXMQHVencHzcLGFbqRzUnlC+iaedVDICTToRs5s5dyA25XzxINiKVuX" integrity="sha384-1NTlZSxE0VXMQHVencHzcLGFbqRzUnlC+iaedVDICTToRs5s5dyA25XzxINiKVuX"defer></script> <script src="/static/sweetalert2-v11.26.25.js?sha384=nLoOnA/BDh8A/jxqtckg4DumuCGOBYUnNJLZdQz/zfYNp3wcjGSoWTAzgko06G/2" integrity="sha384-nLoOnA/BDh8A/jxqtckg4DumuCGOBYUnNJLZdQz/zfYNp3wcjGSoWTAzgko06G/2"defer></script> <script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-9120464920243224" crossorigin="anonymous"></script> <script> if (document.createElement('link').relList?.supports('compression-dictionary')) { const link = document.createElement('link'); link.rel = 'compression-dictionary'; link.href = '/dictionary/133e82830eea5b79d7bb3d3b49eac6b64ebea190e869fe5f9cd1ec3239534bd8'; document.head.appendChild(link); } </script> <script type="speculationrules"> { "prerender": [ { "where": { "selector_matches": "a[data-next]" }, "eagerness": "immediate" } ] } </script> </body> </html>