tag:blogger.com,1999:blog-82798542008-07-22T10:40:07.169-04:00Stan's SpaceStan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comBlogger96125tag:blogger.com,1999:blog-8279854.post-41618513236397283922008-07-10T14:54:00.002-04:002008-07-10T15:10:34.314-04:00Some Answers?<p>Hmmm. Seems like it may be Parkinson's after all. Let's see what L-dopa and a good, old-fashioned acetylcholinesterase inhibitor do for me. It would be nice to have both my mind and body back again -- I've kinda missed having them around for the ride.</p> <p>Have you ever had a project where you have written every line of code, and know what everything is doing right down to the iron, yet can't figure out why the whole system won't play nice together? Medicine can be a lot like that. I've had neurologists measuring this, scanning that and analyzing the other thing for quite a while now. It took a GP to put it all together, blow the whistle, throw the flag and issue a fifteen-yard penalty for excessive bullshit in the backfield. Now that everybody is re-focused, we ought to be able to make a bit of progress.</p> <p>On a lighter note, today marks exactly twenty-three years since my last drink. You know, this diagnosis thingy might just turn out to be the best birthday present I've had in a very long time.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-6983169098127496072008-05-20T16:19:00.003-04:002008-05-20T17:09:08.684-04:00Like butter scraped over too much bread<p>Today, I was supposed to attend the Toronto edition of LotuSphere Comes To You. I'd been looking forward to the event, hoping to catch a glimpse of some of what's to come, and maybe get a bit of that convention high that happens when a bunch of enthusiasts get together for a common purpose. Sadly, that was not to happen. Today was, instead, one of those increasingly frequent days when my arms and legs simply would not do what I wanted them to do when I wanted them to do it.</p> <p>As much as I hate to admit it to myself, I have reached the point where I can no longer look after myself in any reasonable sense of that phrase. Yes, I have been working with the local social services agencies to try to find a supported living situation, but I've been fighting the process as well. I'm just forty-seven years old and most of the time my self-image is that of someone who hasn't quite gotten to thirty yet. I don't feel like someone who is ready for the nursing home. And then I run into a stretch of time when I can't dress or feed myself, and I feel so effing helpless.</p> <p>Contrary to what may seem to be the overall tone of this posting, my spirits are pretty high for the most part. As far as I can, I've been a pretty active participant in this life of mine, and I've been able to maintain some sense of usefulness. When I can, I've been picking some of the low-hanging fruit on the <a href="http://www-10.lotus.com/ldd/nd6forum.nsf/">Notes and Domino 6 &amp; 7 Forum</a> (although I would rather be taking on the bigger problems), and I still have little trouble finding people to work with who are worse off than I am in the wider world. It's getting a little harder, though, since I can no longer really make any commitments to be anywhere or do anything in the future. Life really has become a one day at a time affair, so I have to do what I can <strong>right now</strong> since there may not be a chance later.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-24373433628374627492008-02-18T17:53:00.000-05:002008-02-18T17:55:23.260-05:00Another Good Idea Jammed<script type="text/javascript"> <!-- inwidth = 500;inheight = 320;id = "5BD1CBCCEB7B8826862573F300734FBE";//--> </script> <script type="text/javascript" src="http://ideajam.net/IdeaJam/P/ij.nsf/ideajamblogthis.js"> </script>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-7201463304795368542008-01-23T07:05:00.000-05:002008-01-23T07:08:32.971-05:00News from Lotusphere '08<p>Okay, I'm not there. I'm not bitter or anything -- really, I'm not; I'm doing a lot better, but there's just so much THERE there this year (again) that I'd probably look like the sci-fi robot thinking about the Cretan paradox right about now if I were there. I can read the news releases and blogs and whatnot, though, and wrap my tiny little mind around the summaries.</p> <p>So what's really big? Notes on Ubuntu is going to be big from a marketing perspective, I'd think. The Designer for 8.5 looks to be a bigger deal for folks like me, what with the Eclipse-born syntax hinting and class browser and so on. Foundations? Been asking for something like that for a while (see the ND6 beta forum). Bluehouse? Sounds good to me. Real integration with SAP? A genuine off-platform migration stopper, and a great alternative to Outlook/Exchange for those thinking of having their business SAPped. But all of that stuff is merely good news. There is bigger and better.</p> <p>No, the biggest news by far in everything I've read is something that's barely gotten a mention: the xPages design element. And it's not so much xPages as a whole, but the <strong>server-side JavaScript</strong> it allows. A language with first-class functions. On Domino. I hope I'm not dreaming.</p> <p>Yeah, I know that we've gotten accustomed to seeing JavaScript in the browser. It kinda seems like a toy language to most developers, but that's because they're not doing a whole lot with it. Validate this field, update that one, throw some text over here and change the colour of that thingy over there. Even AJAX, all by itself, doesn't seem like much to get excited about -- unless you look under the hood of those plug-in libraries you're using.</p> <p>Most of us have never programmed <em>in</em> JavaScript to any extent. We may be using JavaScript to get the job done, but we're mostly writing Basic, C or Java code using the JS vocabulary. JavaScript isn't a miniature Java, it's Haskell in disguise. Well, maybe that's going a bit overboard (can you say "side effects"?), but it's not too far from the truth, either. I can't wait to see what the implementation looks like. I wonder if they'll step it up to ECMAScript 4 at some point.</p> <p>Now if we could just get a Rhino-style JS engine for agents....</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-6903486608452637142007-12-30T03:24:00.000-05:002007-12-30T03:30:33.012-05:00IdeaJam -- I Needs This<script type="text/javascript"> <!-- inwidth = 500;inheight = 320;id = "4B991FF54F6C104D862573B0001487E5";//--> </script> <script type="text/javascript" src="http://ideajam.net/IdeaJam/P/ij.nsf/ideajamblogthis.js"> </script>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-77408903319736588132007-12-25T22:24:00.000-05:002007-12-26T13:01:55.207-05:00A Tale of Two Christmasses<p>It was the best of times, it was the worst of times.</p> <p>Let's talk about the worst first, shall we? I had planned a nice Christmas dinner with friends, but things worked out just a little bit differently. I spent my Christmas in the emergency department of St. Michael's Hospital after having fallen unconscious in the shower for a couple of hours. There was much testing and poking and prodding and removal of blood and insertion of intravenous lines. After about seven hours, the conclusion was that I was merely dehydrated -- two and a half litres of saline and a "lovely" "roast" "turkey" hospital meal later, I was discharged to the ongoing care of my general practitioner, cardiologist and neurologist. I should be fine and dandy, but it would be nice to know why I was a half-gallon (Imperial) short of a full tank.</p> <p>Then there was the best of times. It seems a few members of our dear Lotus community got together to give me a Christmas present that will see a lot of use, and which should go a long way towards getting my life back on track. I am composing this entry on a wonderful new Thinkpad T60 with all the trimmings -- 2 GHz Core2Duo, 2 GB RAM, 120 GB hard drive, mungo road-warrior battery, DVD/CD-RW combo optical drive, XP vice Vista, et cetera, et cetera, et cetera (always loved that line when Yul Brynner said it). It actually runs some of my favorite Eclipse-based programs without seeming like a VT-101 emulator (complete with wait-for-it screen echo). Aptana goes like stink, and there's a Lotus offering that failed miserably on the borrowed PIII-800 with 128 MB I should be able to play with now. I'll be toting that around in what is definitely the best-organised backpack-style laptop case I've ever run across. Data backup (and files of questionable business use) will go to a dead-quiet 500 GB LaCie external USB 2.0 HDD. And I'll be printing and scanning on an HP OfficeJet 5610 MFP. Pretty damned sweet setup altogether, and a lot more than I could ever have imagined.</p> <p>I have to thank the following people for their contribution and generousity:</p> <ul> <li>Eileen Fitzgerald <li>Kevin Pettitt <li>Rob Novak <li>John Head <li>Francie Whitlock <li>Vince Schuurman <li>Christopher Byrne <li>Andre Hausberger <li>Mac Guidera <li>Bill Buchan <li>Charles Robinson <li>Richard Schwartz <li>Declan Lynch <li>Julian Robichaux <li>Ben Langhinrichs <li>Ben Poole <li>Warren Elsmore <li>Joe Litton <li>Thomas "Duffbert" Duff <li>Jess Stratton <li>Vitor Pereira <li>Rob McDonagh <li>Bruce Elgort <li>Gregg Eldred <li>Pete McPhedran <li>Paul Mooney (added -- thanks, Ed) <li>and, of course, Ed Brill </ul> <p>Your gift to me has been the basis for a new life. My gift to you will be what I do with that life. There's still a bit of cleaning up of the past to do, but it's starting to look like I won't just find another mess underneath.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-83596535245273633342007-09-19T00:51:00.000-04:002007-09-19T00:52:50.728-04:00More than a nerd. Really.<blockquote>Let&apos;s break out the booze<br />And have a ball<br />If that&apos;s all<br />There is...</blockquote> <p>I&apos;ve spent a lot of time lately contemplating the larger meaning of life. Most of that has been in the context of the recovery community, and that&apos;s been because a handful of poor lost souls have gathered under my wing looking for guidance. I <em>could</em> let something like that go to my head, but if I choose to believe that they&apos;ve decided that it is far better to learn from my mistakes than to make their own, I can maintain some of the humility that keeps me alive.</p> <p>Writing about this part of my life here hasn&apos;t been an easy decision. There is a very important tradition in the Twelve Step community, all springing from the A.A. experience, that says we need to maintain our anonymity at the level of press, radio and films. A blog certainly counts, since it is as public as a community newspaper or a low-power broadcast, so bringing this part of my life to light is, strictly speaking, a no-no. There are a couple of reasons why we value anonymity so highly. The first, and most obvious, is that there is still a stigma attached to addiction, and newcomers need some assurance that nobody will &quot;out&quot; them. A little less obvious is our need to divorce the program of recovery from the people. We are all fallible, and the validity of the twelve steps as a program of recovery should not be judged on the success, failure, flaws or foibles of any one person.</p> <p>My readers, though, are not the public at large for the most part; they are friends I have made, mostly in the professional community. Since I have been both occupied and preoccupied with my work in the recovery community, almost to the exclusion of everything else, that leaves very little to tell my online friends. I&apos;ll address the anonymity issue, then, by stating that I do not speak for A.A. or any other Twelve Step community, that my opinions are entirely my own, and that anyone foolish enough to take anything that might look like advice to heart without first consulting a sponsor or another member of your particular Fellowship who is familiar with your situation is likely to be setting him/herself up for calamity.</p> <p>In any case, I have taken up the formal and informal sponsorship (mentorship) of a number of younger folk. Twentysomethings, mostly, but all are facing a similar problem &mdash; what to do after the plug&apos;s in the jug.</p> <p>Addiction&apos;s a son-of-a-bitch. Nobody who has ever watched a loved one throw away a perfectly good life, behaving in the most bizarre and inexplicable ways, all the while failing to see the glaringly obvious signs of impending death, can have much of an argument with that. There is at least one proven solution, though, for the people who are willing to do the things that have to be done. It does have one small problem, though.</p> <p>The Twelve Steps of Alcoholics Anonymous <em>are</em> the Program, but the implementation of those steps is largely based on the accumulated experience of the millions of people who have tried, successfully and otherwise, over the years to get and stay sober. Unfortunately, most of that wealth of wisdom is aimed at older folks, people in their forties and older who make up the vast majority of the membership of the A.A. fellowship. That is unavoidable. Young people with fully-developed drinking problems tend to die before they reach out for help, and far too many of the few who manage to reach the meeting rooms look around at the sea of grey hair and decide that they&apos;re in the wrong place for them. The few who do stay are mostly at the mercy of well-meaning people who simply can&apos;t fathom looking forward to fifty or more years of sober living.</p> <p>That, I think, is where I come in. Although my drinking and drugging progressed very rapidly from zero to severe, I have been sober nearly half of my life now. I have been through enough careers in sobriety to fill a half-dozen lives, and I've had my share of ups and downs along the way. I also remember what it was like to have a couple of years of sobriety under my belt, attending a dozen or more meetings a week, keeping in the constant company of the &quot;winners&quot; and thinking to myself, &quot;is that all there is?&quot;</p> <p>That&apos;s the world in which my new prot&egrave;g&eacute;s live. All the larger A.A. community offers them is a way to cling to life. I&apos;m not knocking that at all &mdash; first things first, after all, and keeping the inevitable end toward which active alcoholism leads at bay is Job One &mdash; but try to imagine being in your early twenties and thinking that simply not dying is as good as it gets. Doesn't leave a lot to look forward to, does it? That&apos;s a danger point for a lot of people.</p> <p>So what&apos;s the secret to staying sober over the long haul? Simple. One merely needs to live a meaningful, purposeful life. Our collective experience tells us that a life led in service of a higher purpose rarely needs artificial enhancement to sustain. Ah, but there's the rub. What, exactly, does that mean? A.A. offers one solution in the box, and that is to work with other alcoholics. It works, of course, but it is a fall-back course of action, something that we do as an adjunct to an otherwise full life. Our &quot;textbook&quot;, the book from which the fellowship of Alcoholics Anonymous takes its name, was written in 1939 and addressed to men of a certain age who were assumed to have families to look after and so forth. There is little in the book for people who have been living in oblivion since adolescence, and who still don't know what they want to be when they grow up.</p> <p>It is tempting to think in terms of a life devoted to the service of ones fellow man, and there are some people who are of a temperament to set off on that journey. They are able to derive all of the satisfaction they need from the contribution they make to the lives of others. Most of us, though, are not of that temperament, and will eventually find ourselves wondering what&apos;s in it for us. While we may look like we are leading the lives of saints, we are actually seething cauldrons of resentment. Sooner or later we <strong>will</strong> boil over.</p> <p>Most of us understand that we are not saints. Looking for something else, we dive into the kinds of lives and careers that seem to work so well for the normal folk around us. We are determined to be successful, believing that we can use the rewards of our success to develop and support families and maybe, just maybe, ease the way for some of the less fortunate out there. Some of us will dive so deep into that life that we become workaholic &mdash; slaves to our visions of success. Others will seem to find a balance for a while. Still young, and with a bit of sobriety under our belts, we may delude ourselves into believing we are just like normal folk. We forget about the things we need to do to keep ourselves alive. Before you know it we start trying to drink like normal folk. The lucky ones live to tell the tale. The lucky ones are also few and far between.</p> <p>The real answer is as individual as we are ourselves. The Program tells us to seek guidance from a higher power (or &quot;God <em>as we understood Him</em>&quot;, to quote the Eleventh Step). That, in itself, proves difficult for a lot of people. The word &quot;God&quot; carries with it a lot of baggage, as I&apos;m sure you can imagine. Whether one is a follower of a religious denomination, an agnostic, atheist or what have you, the word itself will bring to mind a wealth of images, not all of them particularly useful.</p> <p>As a sponsor (or mentor, if you prefer), it is not my job to <strong>be</strong> that higher power, but to help others to get in contact with the small, quiet voice within. Trinitarian Christians would call it the Holy Spirit. Jungian psychologists would call it the collective unconscious. Some new-agers might call it Gaia. Douglas Hofstadter would likely call it Ant Hillary (if he could suppress his prejudices long enough to realise that he proposed a perfectly plausible explanation for a God entity in <cite>G&ouml;del, Escher, Bach</cite>). I am not particularly concerned with what to call it; I merely need to make it accessible.</p> <p>In that spirit, I have been constructing and deconstructing that which connects us all. Dealing with hard heads has its advantages in this kind of game &mdash; I&apos;ve reached a point where I can make mincemeat of the likes of Richard Dawkins (whose own arguments against anything beyond conscious interpersonal connection are based entirely upon prejudice and emotion). I do not claim to be able to prove the existence of a Creator God (and believe such proof to be impossible). I can, however, present a pretty convincing argument for an extrapersonal moral authority <em>and</em> for a mechanism by which those three-question-mark coincidences in life might arise.</p> <p>The hard part now is arranging the arguments (and the background behind them) into a single, coherent work. I guess that the whole &quot;nerd god&quot; thing just might be true, since I have somehow managed to work talk of black holes into the text. (I was hoping that my engaging personality, my sense of humor willingness to burst into song at the drop of a hat, and my interest in the well-being of individual humans and mankind as a whole might have lost me a few points on the dorky/awkward scale.) Because the book is aimed at the recovery community, it will be published under a pseudonym: Oolon Colluphid. Some of you might know why.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-26202253798171268182007-09-12T18:43:00.000-04:002007-09-12T18:49:04.935-04:00This is better?<a href="http://www.nerdtests.com/nt2ref.html"> <img src="http://www.nerdtests.com/images/badge/nt2/b86f47ac1a7fd6ea.png" alt="NerdTests.com says I'm a Mega-Dorky Nerd God. What are you? Click here!"> </a> <p>Via <a href="http://smokey.rhs.com/web/blog/poweroftheschwartz.nsf/d6plinks/RSCZ-76W7CZ" title="The Power of the Schwartz">Rich</a>.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-57558655954192498412007-07-31T17:04:00.000-04:002007-07-31T17:06:42.781-04:00I'm not sure I like this, but...<a href="http://www.nerdtests.com/nq_ref.html"> <img src="http://www.nerdtests.com/images/badge/0be1f02317a0472f.gif" alt="I am nerdier than 100% of all people. Are you a nerd? Click here to find out!"></a> <p>Thanks for the link, <a href="http://www.ns-tech.com/blog/geldred.nsf/d6plinks/GELD-75GHRL" title="This was Gregg Eldred's fault">Gregg</a></p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-29339627842165359842007-07-02T19:18:00.000-04:002007-07-02T19:19:19.440-04:00Mired in quicksand<p>Okay, I lied. I didn't know it at the time, but it undeniably so.</p> <p>I have never particularly liked delving into someone else's code. There's always that feeling of disorientation that comes from looking at a landscape that was apparently painted by the love child of Pablo Picasso and Salvador Dali while on heavy-duty psychedelic drugs, and that's when the code is fundamentally sound. Let's face it, at a certain level, code is more a matter of art than engineering, and each of us has our own aesthetic. My artistic sensibilities are easily offended, but I can usually make allowances for taste by gritting my teeth and muttering &quot;chacun a son gout&quot; under my breath.</p> <p>The code I was going to &quot;fix&quot;, though, is diseased to the root. Patternitis, and a fatal case of it, I'm afraid. I tried a simple Fa&ccedil;adectomy, but I found that the unnecessary wrappers had metastacised throughout the entire body. Why do people insist on doing this:</p> <pre> function proprietary_do_something($param) { return generic_do_something($param); } </pre> <p>Now, that kind of thing might be forgivable if one had created, say, a fa&ccedil;ade interface for a database connection and a particular database's class happened to correspond exactly to the interface. There is no trace of that kind of foresight here. For database activity, one basically has a choice between mySQL. And there is neither interface nor class to be seen &mdash; nothing but proprietary wrappers around native PHP functions. I have to be generous here and try to convince myself that the wrappers had once been necessary, but the fact that the only difference between the proprietary method names and the built-in ones is a prefix leads me to believe otherwise.</p> <p>Then there are the multiple if statements in a single function that repeatedly test exactly the same conditions. To the Notes folk out there, many of these instances are the equivalent of:</p> <pre> @If( @IsError(@DbLookup("":"NoCache"; ""; "view"; key; 2); ""; @DbLookup("":"NoCache"; ""; "view"; key; 2))</pre> <p>Yep, they're not just doing the same test over and over, but they're doing the same <em>high-cost</em> test over and over. Now, I ain't no PHP guru, but I'd'a thunk that doing the test <em>once</em> and setting a flag variable based on the result, then basing your conditionals on the flag woulda been the way to go. But what do I know? The last time I did anything in PHP, Rasmus Lerdorf was still in Toronto and PHP stood for &quot;Personal Home Page Tools&quot;.</p> <p>So the code that I once thought not too bad (if one ignored the HTML) goes from being the backbone of my project to a mere sketch of the functionality that I'll need. I'll grant that it works, but merely working is not enough. This thing does &quot;thumbnails&quot; by setting the width and height attributes on full-sized images (when PHP can easily do image resizing/resampling &mdash; not fast enough to create them on the fly, but they can be created and stored when the big image is uploaded and modified when the application is reconfigured). Even the database schema needs help (said the Notes guy), and so I'll need to include a conversion utility with the &quot;installer&quot;. I kinda feel like Mike Holmes (of <cite title="Television show - HGTV Canada">Holmes on Homes</cite>, whose claim to fame is fixing criminally shoddy home renovation work).</p> <p>I've got a lot more work to do, but at least I can take some pride in what I'm doing. Shouldn't we all?</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-29361389239262563732007-06-13T06:50:00.001-04:002007-06-13T06:52:22.545-04:00Let's see ... where were we?<p>Well, it seems I'm starting to get some of my smarts back. There's still the occasional bad day, but things are nowhere near where they were just a couple of months ago. The biggest problem now is an annoying tremulousness, but it's nothing I can't learn to live with.</p> <p>Anyhow, I'm at the point where I can start to take on the occasional bit of work. Unfortunately, that work probably won't have a whole lot to do with Notes or Domino for a while &mdash; my health isn't yet good enough to take on the challenges of all-day, every day slogging, so I kinda have to stick to the world of lower expectations for a while yet. These days, I'm busy building online stores with PHP and mySQL. In a way, I'm glad for the opportunity to work on a different platform. It gives me the chance to see for myself that Domino developers, as a class, are not the only ones ignoring web standards for the sake of convenience.</p> <p>This new adventure started when I was asked to set up a small site using the osCommerce open-source online store package. I thought it was going to be the proverbial piece of cake &mdash; FTP the package up, run the database installer to create the mySQL tables, configure some images and colours &mdash; right up until the point where I examined the underlying HTML. Don't get me wrong. The overall quality of the osCommerce package is pretty good, at least as far as the PHP and database code goes. But, my God(!) the HTML makes me shiver.</p> <p>One of the things I was asked to do for the first site was to see about driving traffic to the site. That ain't gonna happen with code like this unless the site's owner is willing to pay HUGE for something like AdWords. There is nothing in the HTML to make the page discoverable. Tables control the layout, font settings are used to create headlines and such, bare-naked images are used to convey information to sharp-eyed users. Sound familiar? At least Domino developers have Designer WYSIWYG and Notes client coexistence as excuses. There's nothing like that here &mdash; the guys (and, perhaps, gals) who built osCommerce are developing exclusively for the web (and, being Open Source wonks, are probably using emacs or vi to do it all). Dammit, <strong>everybody</strong> ought to know better by now.</p> <p>HTML is a text markup language, not a display description language. If your work tells the browser what the page looks like but never quite gets around to telling it what it <em>means</em>, then, as a developer or designer, you haven't really done your job. Yahoo! can't tell what the text you rendered into your logo image says, and it doesn't give extra importance to the alternate text no matter how big the picture of the words is. Google doesn't care much which words are rendered as 18 point bold text. Both <strong>do</strong> pay a lot of attention to the words inside your &lt;h1&gt; tags. Do I really have to bring up the visually impaired user again?</p> <p>So that leaves me creating a &quot;derivative work&quot; under the GPL, re-writing significant parts of an open-source project for fun and profit. At least I hope there'll be some profit in it. Between cleaning up the HTML, making all of the data discoverable, adding RSS feeds for new products and specials, and eliminating scads of conditional code used to support PHP3 (think R4.5 in the Domino world), there's more than enough work here for me to do for now. And, need one say, more than customer number one can be expected to bear the cost of alone, so I've gotten another couple of pigeons lined up as well. &quot;Template&quot; pricing seems to be the order of the day in this world, so I've got to sell the work more than a couple of times to make it pay for itself. Luckily, the end result &mdash; clean, semantically-valid HTML and a versatile set of basic CSS layouts &mdash; mean that future sales will be a little bit more profitable. And, while the GPL (and, let's face it, the very nature of PHP) requires that I give them the source code, these aren't folks who are likely to modify or redistribute my work. I mean, these are people who are hiring a semi-disabled, self-taught, mostly-Domino-dedicated and kinda worn-out looking fellow like myself to create their killer online commerce sites. What are the chances that they're hiring out work they could have done for themselves?</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1170363079229599922007-02-01T15:20:00.000-05:002007-02-01T15:51:19.246-05:00Oh. That explains a lot.<p>Seems we've found the root cause of things. Apparently, severely restricting the blood flow to ones brain can cause mood swings, memory loss, confusion and all kinds of other Alzheimer's-like symptoms. Who'd'a thunk it?</p> <p>I knew my cholesterol was high. I wouldn't be allowed to attend any family functions if I weren't able to prove that I was at an extreme risk for sudden, catastrophic cardiovascular collapse. It's the closest thing to a heritage that we Rogerses have, you know. What I didn't know was quite how bad things had gotten in the last year.</p> <p>For someone in my risk group, a total cholesterol level of 4 mmol/L is considered borderline (that translates to about 140 mg/dL for the Americans in the audience, quite a bit lower than the 200 or so that &quot;normies&quot; would be scared of). I knew I was high-risk, given my family history, so I'd been doing the good diet and exercise things. And I was getting regular checks. Somehow, though, my total cholesterol managed to drift a bit higher than I'd planned. To a point somewhere northward of 25 (that's around 900 on the American scale). My HDL level is normal, which means that my LDL (boo, hiss) is sitting at the &quot;why are you still alive&quot; level. And that's just the serum level &mdash; the metric tonne is probably a better unit of measure for the deposits on my artery walls.</p> <p>If I hadn't been ignoring the chest pains, thinking them simply a consequence of the damage I did to my heart in my wild years, I'd probably have caught it sooner. As it was, it wasn't until my vision started to go and my hands and feet kept falling numb that I figured out that something was wronger (that <em>should</em> be a word) than usual. An optometrist was able to see rich deposits and stake a claim on my retinas &mdash; if there's a market for this stuff, he's going to be a rich man.</p> <p>Needless to say, the pipes are being treated with Drano now (er, Lipitor, and rather a lot of it &mdash; thank God and the government of Ontario that I don't have to pay for it). It's a race to see if the clogs can be cleared before anything major fails permanently. But at least I know what's wrong. I wasn't going crazy. I was just dying quietly.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1167338114129366362006-12-28T15:33:00.000-05:002006-12-28T15:35:14.153-05:00Out of the silent blog<p>I know it's been a while since I last surfaced. The past couple of months haven't been a whole lot of fun, and I certainly haven't been my usual self. I'm not sure who I <em>have</em> been, or even where I have been at some points along the way.</p> <p>I'm afraid I don't do muddled and confused very well. I've been severely depressed before. I've been known to become reclusive from time to time. I'm not even surprised by the occasional suicidal ideation anymore. But this is the first time that things have ever been this bad. Before I hit the hospital, I was in a dissociative fugue for about three weeks. Luckily, I was jolted back into the moment in the midst of hanging myself. Another thirty seconds, and the story would have been much different.</p> <p>Did I actually want to die? Not at all. But I did have a couple of years worth of unresolved stress that I had entirely failed to deal with, and at some level I wanted so badly to be rid of it that I was willing to do whatever it took. Whatever, that is, except recognize that I had a problem and ask for help with it.</p> <p>Since I walked into the CAMH emergency department, shaking uncontrollably and in tears, I've had a few good days, but most of the time I've been lost &mdash; I can't concentrate, I've had nothing that resembles a short-term memory at all, and I can find even the simplest problems overwhelming. Not exactly the ideal arrangement for a guy who's supposed to be able to make a living by making soluble molehills out of intractable mountains, is it?</p> <p>SSRIs (specifically, fluoxetine) are (so far, at least) keeping the suicidal thoughts, or, rather, my willingness to act upon them, at bay, but I'm left with an enormous, undirected anxiety. No, I don't think anxiety is the right word; it's more of an adrenaline rush that simply won't go away. All of the physical components of anxiety without any of the emotional complications. For the moment, I'm controlling that somewhat with a low-dose bezodiazapene (clonazepam) every so often, but that's not an acceptable long-term solution, especially for someone who has a proven track record of susceptibility to addiction. It may be a while before I find the right medication. I'll know I've found it when that JavaScript library starts to make sense again.</p> <p>I'm out of the hospital now, and have just moved back into the world from a Salvation Army post care facility. The Sally Anne? Yeah, I had done everything leading up to my move to ZA, including divesting myself of unnecessarily bulky winter clothing and remaining furniture, etc. I count myself incredibly lucky to have had my melt-down before getting to the airport; I can't imagine what might have happened had I arrived in a foreign country in a catatonic state.</p> <p>For the next little while, my life will be a mix of doctors, support groups and the like. And I need the support, if for no other reason than that I need to vent a little of the frustration I feel at being reduced to a comparative idiot. All my life, I have been able to take my intellect for granted. It has been my defining personal quality, informing everything else that I am. Without it, or at least without full-time access to all of it, I am a little less sure of who I am and where I fit into this world.</p> <p>It's not all bad news, though. There's always been something about being knocked off of my high horse that brings the truly important things in life back into sharp focus. My time at the Sally Anne reminded me that, despite my breakdown, things could always have been worse. I have become very active in AA again. If nothing else, my story can serve as an example to others that a bad break or two in sobriety is <em>not</em> a sufficient excuse for relapse, and that sobriety alone does not necessarily mean and end to the struggle of living. There is, after all, no problem so big that alcohol can't make it bigger. And whether my story helps anyone else or not, working with still-suffering alcoholics is pulling me out of my little cesspool of self-pity. I have only ever really been myself when I've forgotten about myself.</p> <p>I hope to be able to get back into the development game again someday soon, but that day is not today. And if the day should never come, if I should never completely regain my abilities, that's okay too. I can be at peace with it. It was incredibly flattering to see myself described as a &quot;legend&quot; by colleagues I've admired since I began working with Notes and Domino, but my inability to accept that reputation was a large part of what led to my near-demise.</p> <p>I am used to coasting through life. I have had a lifetime of accolades arising entirely from my innate talents, all the while knowing that I had been pulling the wool over everyone's eyes. I have played the great impostor, knowing enough of how to talk the talk that I could fool most experts into believing that I was an expert on any subject. This Lotus stuff was the first time I ever really put an effort into learning anything, and yet there was always the feeling in the back of my mind that I was fooling everyone again, that whatever reputation I had developed was a shoddy fa&ccedil;ade that would collapse the moment I was actually challenged. And let's face it, I <em>don't</em> know everything there is to know about Notes and Domino, even on my good days. I don't think anybody does, or that anybody can anymore. There's just too much <em>there</em> there. Nonetheless, I was determined that I would need to know everything before I could really feel like I knew enough. Talk about setting oneself up for catastrophic failure!</p> <p>Thanks to all who have written. I needed the boost. And my most sincere wishes for you and yours that the new year bring happiness, love and contentment in generous measure.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1158773865213687742006-09-20T13:30:00.000-04:002006-09-20T13:37:45.276-04:00Greetings from CAMH<p>A funny thing happened on the way to South Africa -- I ended up in a <a href="http://www.camh.net">mental hospital</a> instead. Still trying to figure out what's going on -- but as long as I'm here, the likelyhood that I'll find myself wandering the streets for days with a couple of suitcases in hand, pulling knives on strangers are fairly low. Could be severe depression, could be hypomanic bipolar. SSRIs seem to be working for now, but it will be a while before we know anything for certain.</p> <p>I wish I had seen this coming. It could have saved a lot of people a lot of trouble, and may even have saved a life. Sorry.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1156870977817880922006-08-29T13:00:00.000-04:002006-08-29T13:03:23.363-04:00Building the Behaviour Layer<p>With all of this talk of fancy libraries and so forth, and with the whole Domino web world abuzz with tales of Ajaxian glory, it's sometimes hard to remember that Domino already provides us with a lot of sophisticated functionality. You say you need a field to refresh? There's a checkbox on the Field Properties box to handle that for you. Sure, it takes a post-back to do it, but most web application platforms have done much the same thing since the dawn of time (about eight years or so ago). All Ajax brings to the party is immediacy and fluidity, really. You <em>can</em> make an Ajax app last all day on a single page &mdash; something like Writely is meant for that sort of user experience &mdash; but the average Domino-suited application (or application suite) is more generally suited to defined &quot;locations&quot;. That is, each task type would have its own workspace. Changing pages is not a dread thing to be avoided at all costs.</p> <p>Okay, what does all of this blathering mean? It means that Domino views, forms and pages created in Designer already do pretty much what our users expect them to do. They just might not do them in the most elegant of ways. For instance, it may take a user several seconds (during which, of course, she has been typing madly away to record one of those elusive thoughts that will never be formulated quite the same way again) to realise that the form has already been submitted for refresh and all of her recent work has gone for naught. That is something that the immediacy and fluidity of Ajax can alleviate.</p> <p>Now, as proud as I am of the bits of the library I've already put together, I am aware that as it stands, it still requires that a developer's efforts be concentrated on cooking a web application. atDbLookup() is way freakin' kewl (and will be <em>so</em> much kewler when I've gotten the <a href="#marshallingExplanation" title="An explanation of this appears below -- click to go there now" name="returnFromMarshallingExplanation">automatic request and callback marshalling</a> bulletproofed), but somebody still has to add it to a form, field, or button event in order to make it work. I really can't wait to see what other people can do with the tool once it has matured beyond the pre-alpha stage. I'm sure there are a couple or three web wonks out there who will build things of exquisite beauty when they don't have to concentrate so much on the mechanics of the app. They will, though, be aware that they are building a web application at every step along the way. Even something like prettyView() takes developer input, if only to add the code to the database and the passthru tag to the $$ViewTemplate. It doesn't have to be that way.</p> <p>This is where <a href="http://jackratcliff.com/" title="When will Jack blog again?">Jack Ratcliffe</a> and I meet face-to-face, so to speak. The <a href="http://www.openntf.org/projects/pmt.nsf/adb7158ebcdb348b862570e8005347e9/416de981e0b6f08b86256dc100765895!OpenDocument" title="DWT Project Home at OpenNTF.org">Domino Web Tools</a> project was meant to automate a lot of those processes, and I'm pretty sure that having direct Formula analogues handy will make that go a lot more smoothly. As I get deeper into the library project, it's easy to see how something like DWT can become overwhelming and go fallow for a while. Its a Project with a capital P. It was great to see Jack responding to the original library posting.</p> <p>Right now, when you have "Use JavaScript to generate pages" turned on and select one of the refresh options on a field, Domino generates an event handler like this in the onchange: _doClick("$Refresh",this,null). Overriding a handler like that is very easy to do in JavaScript: document.forms[name].FieldName.onchange = someNewFunction. As long as it's called after the form is loaded, it's nearly foolproof. That means that right now, today, almost anyone reading this has all of the tools they need to create a "behaviour layer" that runs through Domino web page and hangs the stuff <strong>they</strong> want to hang off of field events, etc. It isn't at all difficult, but it <em>is</em> extra effort, and it is oh, so easy for the behaviour layer (the custom event script for a page) to get out of sync with the form or page design.</p> <p>That's where the more ambitious part of Domino Web Tools comes in. In the early hours of the project formation, at least, there was much talk of automating as much of the webbification stuff as possible. You know, reading a form's design, say, and auto-generating the replacement parts. Adding datepicker widgets with the appropriate regionalisation to date fields, that sort of thing. It's all of that event code, though, that's the real sonofabee, at least when you have to create equivalent client-side web code. That is, I hope, where this library would make the greatest difference.</p> <p>There are boatloads of Notes-client-only developers out there, many of whom never, ever stray beyond "pure Notes" applications (if they have to talk to another system, they'll use something like Notrix to do the talking), and who never step foot outside of the comfortable world of Formula Language. Many are only part-time developers &mdash; thay have &quot;real&quot; jobs filling up most of their time, and learning the intricacies of HTML, CSS and JavaScript is not something they'll give up their precious family time to do. Now imagine what it would be like for them to be able to create a truly usable, responsive, and (perhaps) even good-looking Domino web application by merely copying a couple of Design Notes into their database (or running an agent against the db to do it for them). Imagine the appearance transformed to look more like the thing they created in Designer. Imagine &quot;Allow values not in list&quot; still allowing a drop-down selection. Date fields with the date selector enabled still having them on the web. View dialogs and name-and-address pickers acting just the way you'd always imagined they should. Post-back behaviours replaced by in-browser updates. Computed fields computing right there in front of the user the way God intended. The one critical customer-interactive application a small Notes shop has does not have to be an aesthetic or functional embarrassment.</p> <p>Ultimately, that's what I'd like to see happening. As much as I'm jazzed about super-innovative web development on Domino, I think that it may be far more important to the platform to make the low-hanging fruit hang a whole bunch lower.</p> <a name="marshallingExplanation"></a><p style="border-top: dotted silver 1px; padding-top: 1ex;">It's one thing to add calls to a function like atDbLookup to a form. It's a <em>relatively</em> simple thing to make a server request to update something on the web page. But if you use the example I've given before, where the onchange of a field contains something like refreshSelectOptions("FieldName",atDbLookup("cache","","LookupView",this,2)), there is an implied contract of synchronicity. The refreshSelectOptions() function can't do what it needs to do until the atDbLookup() function has returned its values. Well, hell &mdash; we've just managed to lock up the user's browser the same way we would have by posting the form for refresh. Maybe not for nearly as long (and thanks to the way I do the caching, not every time, either), but there is that moment where the browser can't do much but wait for a reply. The big &quot;A&quot; at the start of the word &quot;Ajax&quot; stands for &quot;Asynchronous&quot;. The object of the game is to notify the user that something is happening, but stay out of their way otherwise. That means divorcing the main activity from the event that caused it, and giving the request all of the info it needs to look after its own affairs when it's complete.</p> <p>That gets a little dicey when you want to abstract things away from the developer. In normal Ajax development, one would be hands-on enough to know where you are making requests and what sort of response handler you should attach to the request. That is precisely the sort of thing I want to take off of the developer's plate. In the example above, if the lookup isn't in the cache, then atDbLookup() should immediately return <em>something</em> to the refreshSelectOptions() function so it can terminate and let the user get on with life. In the meantime, the lookup can take as long as it takes (that depends on the connection speed and server load), and when it's done, it should be able to complete what refreshSelectOptions() started. Making that work cross-browser and one hundred percent reliably while preserving the entire calling context is one of those easier-said-than-done things. (<a href="#returnFromMarshallingExplanation" tile="Return to main text">Return to main text</a>)</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1156611840769676082006-08-26T13:02:00.000-04:002006-08-26T13:04:00.776-04:00And people wonder why I prefer passthru....<p>Well, it seems that you folks were able to break my little piece of script pretty darned thoroughly. The "No Documents Found" bit was entirely my fault. Pulling any old bit of script off of the ol' hard drive and posting it with only minimal testing is not a good idea. It worked in the project I was doing, but that's because I had "pinned" documents so there was always something in the view.</p> <p>The other breakage, though, I would never have picked up. You see, I never, ever, use Domino WYSIWYG to create headings and so forth. There is no semantic value to anything created with FONT tags, so I always make sure that things like that are done in passthru. And I never use the alignment settings, since it creates markup that you can't override with CSS. (The behaviour here was actually better in R5, since CSS could tell the browser to render a CENTER tag with any alignment you saw fit to use. The DIV with an inline style can only be changed using JavaScript, because inline styles will trump whatever is in the stylesheet.)</p> <p>The problems with the script are twofold. First, if you create a WYSIWYG heading, Domino generates a DIV around the FONT tag soup it needs to render your semantically useless verbiage (sorry, folks, but unless you use an Hx tag to mark a heading, it ain't a heading). That wouldn't be so bad, except that it will eat the passthru DIV you created around the view by putting the heading's closing /DIV tag <strong>after</strong> your passthru. Easy to fix, you'd think -- just make sure there's at least one line of not-centred text between the heading DIV and the passthru, right?</p> <p>Well, that <em>does</em> close the alignment DIV tag before the passthru DIV, but it creates a new problem. Domino may throw in an unclosed P tag, just for fun. Now, I have no problem with Domino rendering a line break with a paragraph. It might not be semantically correct when there is no actual paragraph content, but it's not a biggie, either. What burns my butt is the fact that the tag is never closed. That throws the whole document structure for a loop. The P will not be logically closed until its parent, Domino's FORM tag, is also closed.</p> <p>There are three ways to try to handle this. The first is to futz around with the form in Designer until you can force Domino to render a BR instead of a P. A BR tag is not a container, so it won't interfere with stepping through the hierarchy in either direction. I'm not quite sure what the magic words are, or what face you have to make while doing it, but it CAN be done. Obviously, it's not particularly reliable, and the next developer to touch the form is going to break it. You can also try closing the P tag yourself, but this will get you no further -- eventually, someone is going to do something that changes the P to a BR. Or worse, they're going to try to get rid of the extra space between the heading and the view, closing off the DIV tag yet again.</p> <p>The second is to expand the script yet again to cover all of the possible bases, searching every nook and cranny of the DOM until the view table, and only the view table, is finally found. You saw how big the original script was. Scanning the whole DOM tree until you find something that looks like it might be a view will make that little script just a little bit bigger. I'm not afraid of a little scripting (remember the library I keep talking about?), but I do resent having to write that much code to get around something that should never have been a problem in the first place.</p> <p>The third is to lobby IBM for fixes. No, I don't expect them to add an HTML-prettifying function to the view rendering. In fact, it's just about the last thing I'd want to see, since it would mean that "normal" rendering could never be controlled with CSS -- you'd absolutely need to run some script to change the look of what Domino renders. (Yes, I know I'm running script now, but that's to add stuff that doesn't need to be there.) To my mind, something like that would be far worse than the current state of affairs. What I <strong>would</strong> like to see is a fix that gets Domino out of my way. If I start some passthru on a new line, and that whole line is marked as passthru, I want it to appear in the HTML source <strong>exactly where I put it</strong>, not inside a tag that Domino needs to render the previous line. In this case, if I wanted the viewPanel DIV to begin inside the heading alignment DIV, I should have to put in in the centre-aligned part of the text. Things like the document selection JavaScript should be moved completely out of the way -- the &lt;head&gt; sounds like a nice place to put that, doesn't it?. And since response-only columns are the last usable column in a response document row in a view, wouldn't it make a lot more sense to colspan the host cell all the way to the end (as this script does)?</p> <p>No, folks, I am <strong>not</strong> whining about Domino's overall HTML rendering. While it can be improved somewhat (and Mark Vincenzes and team are working on it for Domino Next), it is very nearly impossible to create semantically-correct markup from purely visual formatting in a reliable way. A human being with good vision looking at the page can intuit the meaning of the text based on its formatting, but a machine can only do so much. What if your headings are smaller than the body text (a common-enough thing in trendy print publications)? There are some things we need to do ourselves if we want the end result to be meaningful and accessible. But there <em>are</em> a few little bugs that need to be squashed. They might not get the fixes into the current code streams (6.5.x & 7.x), but we can try to make sure that they are gone for Domino Next (no fixed number has been announced yet, but it has been stated that the number will be somewhere between 7.9 and 8.1). </p> <p>In any case, the script as it now stands has been through the wringer. It'll find the view table if it's there and at least comes somewhere after the viewPanel DIV tag, as long as you don't put another table between the view and the div tag. If there's a "No Documents Found", it fails gracefully -- again, as long as you don't put an H2 tag into the middle of the actual viewPanel DIV AND use a centred, justified, or right-aligned WYSIWYG heading right above the passthru. (I'm only looking for the H2, since I can't predict the language of the message.) I've done everything I can to mangle the $$ViewTemplate and the view, and it seems to be bulletproof. Well, at least until one of you folks tries to use it, that is -- somebody's going to have done something I never would have though of trying, and that will probably result in Domino rendering the table cells outside of the table tag or something. Can you ever really win at this game?</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1156538636946280112006-08-25T16:42:00.000-04:002006-08-25T16:43:56.950-04:00Library again....<p>Working on the Formula Language analogue functions in the JS library has got me wondering. There are several @Functions (well, a lot of them, really) that will return either a single value or a list of values. In Formula Language, that's all fine and dandy, because except in a very few cases, EVERYTHING is a list. That is, you can spend most of your time oblivious to the actual output of the various lines of code you write; you don't need to make special concessions for "text" versus "text list". I've honoured that in the JS functions' inputs -- they can take a single value, an array of values, an HTML field object, or, in combination with atGetField(), a fieldname.</p> <p>But what about the output? As it stands right now, I am creating the output in an array, then passing the array out if there is more than one value, and passing a scalar if there is only one value. While that's great if you want to cascade these &quot;@Functions&quot;, I was thinking that it might make it unnecessarily difficult if you merely want to borrow a function or two to use in your own JS code. For instance, using atReplaceSubstring() is easier than writing something to iterate through two arrays, generate regular expressions on the fly, and do the replacement oneself. But is the return type uncertainty (array or scalar) going to be a problem? Should the return always be an array when the corresponding @Function allows a multi-value return?</p> <p>For the record, these are the functions I've already completed:</p> <ul> <li>function atDbLookup()</li> <li>function atDbColumn()</li> <li>function atExplode()</li> <li>function atGetDocField()</li> <li>function atGetField()</li> <li>function atImplode()</li> <li>function atLeft()</li> <li>function atMember()</li> <li>function atMiddle()</li> <li>function atReplace()</li> <li>function atReplaceSubstring()</li> <li>function atRight()</li> <li>function atSetDocField()</li> <li>function atSetField()</li> <li>function atSort()</li> <li>function atTrim()</li> <li>function atURLDecode()</li> <li>function atURLEncode()</li> <li>function atURLQueryString()</li> <li>function atWord()</li> </ul> <p>As much as I would like to have used a proper "@" in the names, it's an illegal character thanks to Microsoft's conditional evaluation. Okay, the list isn't very long yet, but the atDbLookup() and atDbColumn() functions took a while, as did atGetDocField() and atSetDocField(). All of them rely on XmlHTTPRequests, and the xxxDocField functions need a server-side agent to work. Okay, we're talking about the simplest, smallest web agent ever, but it's still an extra piece. And it will grow as more server-interactive atFunctions are added, like atUserRoles(). Even atURLQueryString() has more to it than you'd think. And don't get me started on atReplaceSubstring(). There are also a few helper functions to do listwise and permuted operations, since JavaScript doesn't know that [text array] + [string] should add the string to every member of the array.</p> <p>I am also posting this, or something like it, on the LDD forum, but again, your input is valuable to me.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1156458864408769172006-08-24T18:22:00.000-04:002006-08-26T13:02:30.746-04:00SntT -- A prettier view<p>Not everything needs to be Ajaxian. A simple bit of JS can make a standard &quot;Display using HTML&quot; on a $$ViewTemplate look and work a whole bunch better. No hand-coded "Treat as" views, no fancy background requests need apply. Just a passthru &lt;div&gt; tag around the embedded view, this script, and init() in the onload event of the $$ViewTemplate.</p> <p>By way of explanation for the long listing to follow:</p> <p>First, I NEVER comment code quite this way in production. The comments here are for the benefit of people who may not be very familiar with JavaScript, and might have trouble following the "story" otherwise. If you want to use the code, do everybody a big favour and delete the comments. If you are at all familiar with JS, you'll probably find it easier to follow the code without the comments anyway. (They do get in the way, don't they?)</p> <p>Second, there is a lot of explicit use of getElementsByTagName(). I'd never let something like this hit production with all of those wasted characters floating around in there. I use a simple little function instead:</p> <pre>function $tn(tn,el){el=el?el:document;return el.getElementsByTagName(tn);}</pre> <p>So, instead of:</p> <pre>var viewTable = viewPanel.getElementsByTagName("table")[0]</pre> <p>I would write:</p> <pre>var viewTable = $tn("table",viewPanel)</pre> <p>That is a half-truth at best. I'd probably write "var vw=$tn("table",vP)". Or at least have an obfuscator do it for me. I'm not "into" obfuscation, as a rule, but in an interpreted language where the user has to download the source code, sometimes over a bad POTS modem connection, killing off characters is the best way to save the plot.</p> <p>The following little bit of JavaScript takes an ordinary, Domino-created, "Display using HTML" view and transforms it into something that looks and acts a little more "applicationy". It preserves the selection margin and any clickable headers. Flat? Single category? LOTS of categories? Response docs? Response-to-responses? Action bar? It's all good. Try it out, play with it. You may like it, you may not. And no, Peter, it doesn't mess with the correct functionality when you open and close categories -- the clicked category scrolls to the top if the page is long enough to be scrollable. Sorry about the formatting -- it's gonna be a little bit on the wide side. You'll want to copy and paste this into something that has syntax highlighting (like a JS script library in Designer) -- trying to make it really pretty here makes it too wide for the screen. Even if you have a fifty-incher.</p> <pre> function prettyView(){ var debugPos = ""; /************************************************ This function adds a whole-row mouseover and click event to a Domino "Display using HTML" view. ************************************************/ var panel = document.getElementById('viewPanel'); //assumes you have wrapped the view in a DIV with an ID of "viewPanel" /*************************************************** Getting to the view may take some work. You KNOW the table lies inside your DIV, but Domino may just have closed your passthru DIV without asking. No, it SHOULDN'T happen. Yes, it DOES. ***************************************************/ //Try the easy way first var viewTable = panel.getElementsByTagName("table")[0]; //If that didn't work... if (!viewTable) { //It might be because there were No Documents Found... if (panel.getElementsByTagName("h2").length) { return; } //...or maybe Domino ate your DIV for lunch. else { panel = panel.parentNode; if (panel.tagName) { viewTable = panel.getElementsByTagName("table")[0]; } //Of course, the No Documents Found rule could still be in effect... if (!viewTable && panel.getElementsByTagName("h2").length) { return; } } } //First, fix the situation where a collapsed categorized view //is all squished over to the left-hand side of the browser viewTable.width="100%"; //Then get the collection of rows. var rows = viewTable.getElementsByTagName("tr"); if (rows.length) { //We don't want to mess with the header row if it's there. //It may contain column resort hinkies. //Domino 6 and up renders the header cells as TH elements. var startRow = (rows[0].getElementsByTagName("th").length)? 1 : 0; for (var i=startRow;i&lt;rows.length;i++){ //Now, make sure the row is in the view table. //Response documents may be rendered in nested tables. var grandparent = rows[i].parentNode.parentNode; if (grandparent === viewTable) { //the first "parent" is an imaginary tbody element //so it's row->tbody->table to get to viewTable var href = ""; var titleText = ""; //Add the mouseover highlight to each row... rows[i].onmouseover = new Function("this.bgColor='#ffff99'"); //...and return to the original color on mouseout. //This maintains any alternate colors set in the View Properties. rows[i].onmouseout = new Function("this.bgColor='" + rows[i].bgColor + "'"); //Now get all of the cells in the row... var cells = rows[i].getElementsByTagName('td'); for (var j=0; j&lt;cells.length; j++) { try{ //There is going to be an error at the end of this TRY //related to garbage collection of the objects we create here. //It is unavoidable. //The best we can do is CATCH the error and ignore it. //We don't want to change the behaviour of cells in the //selection margin. if (!(cells[j].getElementsByTagName("input").length>0)) { //We need to find links to create the whole-row click. var links = cells[j].getElementsByTagName("a"); if (links.length) { var count = 0; var link = links[0]; //Not all A tags represent links. We will pass over //any named anchors (A tags with a NAME and no HREF). while (!link.href || link.href == "") { link = links[++count]; } href = link.href; //We also need to know what's inside the link. var children = link.childNodes; var testNode = children[0]; if (testNode && (typeof testNode == "object")){ if (testNode.tagName && testNode.tagName.toLowerCase() == "img"){ //In this case, it's a picture -- probably a twistie titleText = testNode.alt; } else { //Otherwise, there's got to be text in there somewhere. //It may be nested in FONT tags, and there may be empty //DOM nodes. while (testNode.childNodes.length) { testNode = testNode.childNodes[0]; } while (testNode && testNode.nodeType!=3 && testNode.nodeValue!=""){ testNode = testNode.nextSibling; } //After all of that, we may not have any text... if (testNode) { //...but if we do, we replace the original link with plain text. var swapNode = link.parentNode; swapNode.replaceChild(testNode,link); /************************************************************ NOTE: Those last two lines help the view LOOK a lot prettier, but they also affect accessibility. Keyboard-only users will not be able to tab from link to link. If accessibility is important, comment those two lines out. ************************************************************/ titleText = "Click to open " + testNode.nodeValue; /************************************************************ For some unknown and unholy reason, Domino renders response documents in nested tables in one column of the main table. Not only does it make this sort of code harder (whine, grumble), but it also means that response docs will shove the main document content over to the right. This will fix that by removing the final cells in the main table's response row and adding their width to the response cell. The rest of the table can then collapse back to normal size. ************************************************************/ if (rows[i].getElementsByTagName("table").length) { //This is a response doc, and we are stuck in a nested table. //In order to keep the responses from pushing everything over, //we need to find the outer cell containing the table... var parentCell = cells[j].parentNode; while (!parentCell || parentCell.nodeType != 1 || parentCell.tagName.toLowerCase() != "td") { parentCell = parentCell.parentNode; } //...and work on getting rid of the following cells var killCell = parentCell.nextSibling; var removedCellCount = 0; while (killCell) { //Before removing any cells, we need to find out how wide they were. var oldColspan = killCell.colSpan; rows[i].removeChild(killCell); killCell = parentCell.nextSibling; removedCellCount += oldColspan; } //Now we add the width we removed to the response cell... parentCell.colSpan = parentCell.colSpan + removedCellCount; //...add the onclick event ... parentCell.onclick = new Function("getLink('" + href + "')"); //... and the mouseover text. parentCell.title = titleText; //Finally, we change the cursor to tell the user they're //mousing over a link. parentCell.style.cursor = "pointer"; } } } } } if (href != "") { //If, after all of that, we have a link location to use, //we add an onclick to the cell to take the user to the link... cells[j].onclick = new Function("getLink('" + href + "')"); //... and add the mouseover text. cells[j].title = titleText; //Finally, we change the cursor to tell the user they're //mousing over a link. cells[j].style.cursor="pointer"; } } } catch(e){ alert(e.message); //ignore -- it's because of nested tables on response rows } } } } } } function getLink(){ var el=arguments[0]; if (typeof el == "string") { window.location.href = el; } } function init(){ prettyView(); } </pre> <p>I try to avoid calling any function in the onload that isn't called "init()" -- that means I can change the function names in JavaScript with a search-and-replace and never have to worry about changing the body onload. The init() function calls the prettyView() function, and the prettyView() function adds an onclick call to the getLink() function. You'll need all three in your JS script library or JS Header.</p> <p>You can improve the appearance of the view by adding the following CSS:</p> <pre> TABLE { font-size: 1em; border-collapse: collapse; } #viewPanel TR, #viewPanel TD, #viewPanel TH { border-bottom: solid black 1px; } #viewPanel TABLE TABLE TR, #viewPanel TABLE TABLE TD, #viewPanel TABLE TABLE TH { border-bottom: none; } </pre> <p>You need to set the border-bottom of the TD and TH in order to get any lines at all. The lines won't extend all the way across all of the cells, though, unless you also set the border-bottom for the TR. The border-collapse: collapse; makes sure that both sets of lines look like one. The selectors with TABLE TABLE in them make sure that the response document nested tables don't get multiple bottom borders. </p> <p><strong>UPDATE:</strong>Sometimes I hate this posting of snippets stuff SO much. There was a small problem with what I posted yesterday, in that it came from an earlier version of the original file. (A quick look at getLink() should tell you that it was excerpted from a bigger mess -- it's designed to handle links based on table row ids as well as href values.) The actual, honest-to-goodness production code lives in a template on a server (or group of servers) to which I haven't had access in a couple years, so I had to rely on what I had in text and *.js files here. I gave it a quick test before posting, but then I tested it again, and, well....</p> <p>The changes live in the little loop where I go looking for the parent cell of response documents. The original code would break if something other than 10pt Default Whatever Plain is selected as the font for the responses-only column. That has been changed so the code will continue upwards to find the containing cell. I've also made the link replacement code two lines instead of one to solve a node resolution problem introduced when looking for the outer cell. For some reason, doing this: <pre> someNode.replaceChild(testNode,link); </pre> was a problem, but doing this instead: <pre> var theSameNode = someNode; theSameNode.replaceChild(testNode,link); </pre> fixes it. As the code above implies, <em>it's the same node</em>. Not just the same HTML element, but the <em>identical object</em>. The identity check, (theSameNode === someNode), will return true. Yet the two-line version works in every browser I could test, and the one-line version fails in almost all of them. Only Opera, usually the worst browser for complex JS because it swaps engine components when you change its spoofing settings, actually got it right all of the time. Mozilla and IE would bail if the link was on a responses column with a font setting. <p>I've thrown in the only fix I could think of for the view title alignment problem noted in the comments. Oh, and the &lt;h2&gt;No Documents Found&lt;/h2&gt; has been fixed, too (that was in the working original). NOW I know that multiple, seemingly-identical bits of snippetalia on a drive probably means that one is right and most of the rest are just-in-case backups that should have been nuked. Oh, well.</p> <p>Technorati: <a href="http://technorati.com/tag/show-n-tell+thursday" rel="tag">show-n-tell thursday</a></p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1155937770171370712006-08-18T17:45:00.000-04:002006-08-18T17:49:49.100-04:00Speaking of huge libraries ...<p>... is there any interest out there in a general-purpose JS/Ajax library specifically for Domino?</p> <p>I've seen adaptations of <a href="http://prototype.conio.net/">Prototype</a>, <a href="http://sourceforge.net/projects/sarissa">Sarissa</a>, <a href="http://script.aculo.us">Scriptaculous</a> (and even <a href="http://openrico.org">Rico</a>, which is a lovely library but wants everything in its own format) and so on, but would there be a market for a library of components that grok Domino? One that would not force you to write responses that conform to a library designed for other platforms? One that would include not only JS functions that already know about ?ReadViewEntries, categorized views and response documents, but design elements that can make up for the difference between server time and workstation time, that can prevent save conflicts, and so on? One that lets you dynamically refresh fields using, oh, let's say @DbLookup syntax <em>in JavaScript</em>?</p> <p>If there is any interest, what features would you like to see? Be wild and scary if necessary. There's no law that says I have to include everything everybody could ever want. And I've already got a few tricks up my sleeve that may be as wild and/or scary as what you have in mind. I haven't quite rewritten the Formula Language engine in JavaScript yet, but I have borrowed a few of the more useful list-processing bits, along with their familiar-to-us syntax.</p> <p>It is my intention to release such a library into the wild. The library itself will be free to use anywhere, both as in speech and as in beer. Thanks to View->Source and browser extensions, there's no good way around that. Even if the code is obfuscated (and it is, has been, and will continue to be, for compactness' sake), a determined developer can copy it and find a way to use it. The API documentation, though, I can charge for, so I will. Or, rather, <em>somebody</em> will.</p> <p>The documentation will include the clear, unobfuscated code with comments. While the clear code would be entirely impractical as a user download (it is not a little file, or even a bunch of little files), forcing an interested developer to figure out which bits do what in the obfuscated code alone is not going to result in better code or in a better developer. Properly done, this might make a good addition to a certain training materials package, since the doco is as much about &quot;why&quot; as &quot;what&quot;.</p> <p>You see, I'd like to see this, or something not unlike it, become a standard part of the Domino developer's toolkit. While I would like to see every developer equipped with the knowledge and skills to do all of the work themselves, it just doesn't make sense that each of us needs to reinvent the wheel with every new application. Okay, the truth is that I was tired of reinventing wheels by the third go-around. So I've taken the bits and pieces of what I've been doing over the last year or so, located the reusable bits (and refactored to include them where they'd been redone), and come up with something I think is worth sharing. But I know that I've only included features that I needed at the time, and that there have to be things you might think are commonplace that have never occurred to me.</p> <p>So if you can think of anything you'd like to see, anything that can help you elevate a garden-variety web-enabled database to a holy-crap-gotta-have-it application with minimum effort, let me know. Your suggestion may be what makes the whole thing worthwhile.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1155937494277181192006-08-18T17:43:00.000-04:002006-08-18T17:44:54.296-04:00How nifty does it need to be?<p>A while back, <a href="http://www.lotusgeek.com" title="Rocky Oliver's blog">Rocky Oliver</a> floated the idea of <a href="http://www.lotusgeek.com/SapphireOak/LotusGeekBlog.nsf/d6plinks/ROLR-5NBK7N">resurrecting the Nifty Fifty</a>, a group of fifty minimal sample applications that IBM threw into the box with every purchase of Notes 3.somethingorother. They didn't do much, and were never really intended to do much. They were fifty sets of ideas, fifty starting points for developers to build upon.</p> <p>Lately, the idea has been getting a lot of play, thanks mainly to <a href="http://www.johndavidhead.com/jhead/johnhead.nsf/dx/maybe-it-is-time-we-all-step-up-...">John Head</a>. John suggested that, with Microsoft entering the fray and including application templates with the various incarnations of Sharepoint, the community should step up and contribute a set of &quot;real&quot; applications to run on Notes and Domino. The community consensus seems to be that the idea would not fly unless the apps were distributed and supported by IBM.</p> <p>I guess it's time to throw my coupla cents in.</p> <p>Should there be a set of application templates available that go beyond Discussion, Document Library and TeamRoom? You betcha. Does the set need IBM distribution and support? Again, you betcha. Do these applications need to be everything an organisation could lust after out of the box? Not on your nelly, nor on mine, neither. Not no-how.</p> <p>What Domino needs is fifty (give or take) Really Good Ideas&trade; rolled into a neat little package. The applications need to be useful and usable, but each should really only try to do One Thing Right&trade;. They should do that clearly and with voluminous documentation even for the most obvious bits. And while an application would need to include all of the ancillary bits that make its particular Really Good Idea&trade; work, it should absolutely cry out for extension and customisation.</p> <p>A big part of what got me started down this track was <a href="http://www.jonvon.net/jonvon/blog/blog.nsf/dx/nifty-nifty.htm">jonvon's list of suggestions</a>. In particular, it was the suggestion that there should be no obfuscated JavaScript (as one finds in Domino Web Access). As I've been doing a lot of webby things lately, it occurred to me that clear, self-documenting JavaScript on the scale required for a genuine Web Application&trade;, complete with all of the neat Ajaxian features and behaviour layers and everything else that represents large-scale functionality these days, would make the needed libraries huge. Not merely big, but <strong>huge</strong>. Obfuscation might be a maintenance programmer's worst nightmare, but failing to make the downloadable component as small as it can be by using short names and proxy functions is working at cross purposes to the user community. Sure, it's easier for a developer to see what's going on and make modifications to the code (that is, without having the same obfuscator and replacement key file), but at a cost that can be as much as 80% larger code.</p> <p>Let's take the Prototype library's $ function as a basic example. The name is impenetrable (and forget about documentation &mdash; Prototype was not intended for human developers to interact with, so it's enough that Rails understands what's going on), but by the simple act of replacing <span class="inlineSnippet">document.getElementById("someID")</span> with <span class="inlineSnippet">$("someId")</span>, you save twenty-two characters with every call, recouping the cost of the function in only two calls. Twenty-two characters might not sound like much, but one might make a call like that a hundred times or more in a complex script, and that's more than 2KB saved right there. Short variable names come with similar savings, as do snippet &quot;constants&quot; fed into the constructor of a function or an object.</p> <p>When it means the difference between 2KB and 10KB, even over a bad <acronym title="Plain Old Telephone Service">POTS</acronym> connection it's not worth sweating. But when the same ratio takes you from 30KB to 150KB, you start running into usability issues over dialup and on slow, crowded networks. Sure, the file is cached, but that's on a per-database basis (and what if the user is using several applications of the same or similar design?) and only after that first slow download. The fact that the application is better-stronger-faster <strong>after</strong> it loads means very little if the initial hit feels like one is installing Office. Users will not put up with slow, and it will be Domino's fault no matter who actually wrote the code. Chuck one application, and maybe even the platform it runs on. That means that if clarity and extensibility are among the chief aims of the project, as I believe they should be, then we have to aim lower than Google Maps or BaseCamp with our web examples.</p> <p>I agree that the templates in the set need to be as simple and clear as they can be. We are, after all, trying to sell the possibilities of the platform, and if a developer can't figure out what's going on, she's going to have a hell of a time trying to build her own custom applications. And they should be no simpler than necessary. Each application needs to do something that will be useful to someone, if for no other reason than to encourage the &quot;Notes guy&quot; to open the thing up in Designer to take a look under the hood. There almost needs to be a hole in every application, though; something that is obviously missing, but not so obvious that the template will be discounted as useless right away. NiftyNext&trade; should be at least as much about teaching as it is about value added to the platform. Let the all-singing, all-dancing, impenetrably complex applications remain as they are now &mdash; commercial ventures and the province of internal corporate developers.</p> <p>After all, if <em>everything</em> comes in the box, we're all out of work.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1155320291405862692006-08-11T14:13:00.000-04:002006-08-11T14:18:11.420-04:00From the Mail & Guardian online:<blockquote id="dinkum_moron"><p>When Australian cricket commentator Dean Jones was fired for calling Hashim Amla a &quot;terrorist&quot;, the manne were delighted. After all, if everyone went around indulging provocative and childish stereotypes, the Oom might be tempted to call Jones a livestock-romancing wife-beating string-vest-wearing racist bigot Australian yahoo from the arse end of nowhere whose gigantic mouth is writing cheques his tiny brain can’t cash.</p><cite>&quot;Dinkum moron&quot; by Krisjan Lemmer, 11 August, 2006</cite></blockquote>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1154481168564077952006-08-01T21:10:00.000-04:002006-08-03T15:04:43.053-04:00@Command([NavigateNext])<p>First off, I'd like to apologize for still not having gotten back to everyone who has written me. The flood of email has been a bit overwhelming, and I've only recently had the wherewithal to download the messages and compose replies offline (thanks again, <a href="http://www.devinolson.net" title="Devin 'Spanky' Olson">Devin</a>).</p> <p>Among the messages have been proposals for independent contract work, possible positions in and around Toronto, and positions elsewhere. There has been an awful lot to consider, and not just in the philosophical, &quot;you've given me a lot to think about&quot; sense.</p> <p>A big part of what I had to consider was the simple mechanics of getting back to work. As I mentioned before, my life had taken a bit of a downhill slide, and there is a point below which it becomes exceedingly difficult, if not quite impossible, to recover gracefully. I live in a dark, dank and moldy 90-square-foot basement room in a building (and neighborhood) populated primarily by the drug-addled and the insane. People who are self-medicating in extreme excess, and people who are failing to medicate adequately. The noise, the fights and the screaming can get to be a bit much. Working at home is difficult, but alternating doses of headphones and earplugs make it possible, and the occasional escape to the local intarweb cafeteria is welcome respite. Living a normal scheduled life, though, is pretty much out of the question. I sleep when I can, but I haven't had a stretch of time that would have allowed a full night's sleep in some time, and even then the time wasn't at night. So getting up at a normal time and reporting to work during normal office hours would be hit-and-miss at best. I haven't been particularly successful trying lately.</p> <p>The fix is a simple one. I just need to move. But moving is expensive and disruptive, no matter how one looks at it. Staying in Toronto puts me in a chicken and egg situation -- I'd need to make a considerable amount of money relatively quickly in order to finance a move that would make a regular job possible, but until I move I won't be able to keep the regular hours that would let me keep a regular job.</p> <p>My current circumstances, then, are not exactly conducive to a conventional approach. So I've decided on the nuclear option. Killing all of the birds in the vicinity with a single, powerful stone. Relocation. A fresh start in a new environment. New country, new surroundings, new type of work, the whole nine yards.</p> <p>And so I follow friend <a href="http://www.openntf.org/nathan/escape.nsf" title="Escape Velocity -- Nathan T. Freeman's blog">Nathan</a> to South Africa. Not to Joburg, though; I'll be heading for Cape Town. And not to the same kind of job, nor to the same sort of pay scale. Heck -- I ain't Nathan, and neither are most of you. But I couldn't ask for a better situation, really -- one foot firmly in the realm of the uber code monkey, and the other in the realm of education. That is, assuming I can manage to complete the seemingly trivial tasks of getting a passport and visa done without learning I'm PNG in a country I'm pretty sure I haven't visiteed before. Oh, and I have to hope that my criminal background check doesn't reveal any new and hitherto unknown details from my blackout days. (The hardest part of a return to consciousness was always hearing about my escapades for the first time. I'm pretty sure I know everything I should know now, but you never know, ya know?)</p> <p>If all goes according to plan, I'll fill in the rest of the blanks for you soon. I'd still be doing the Notes and Domino thing, but I'd be spending a lot more time doing the things that I do best. And that's already coming too close to saying too much for now.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1151788245051338102006-07-01T16:53:00.000-04:002006-07-02T17:29:14.160-04:00Gobsmacked.<p>First of all, I want to thank you all from the bottom of my heart for all of the support and encouragement I've received over the past few days. Frankly, I was at the end of my rope, and was absolutely sure that my programming career had come to an end. My previous posting wasn't meant to beg; it was just my best explanation of my absence. Thanks to all of you, though, things are not just looking up, but moving up as well. I will be replying personally to all of the email you've sent, but there's enough of it that it may take me a little while to get around to you. Oh, and enough with the donations already -- we're not quite at the dying-wish-scam level of monies or anything, but you have given me enough to take advantage of the other opportunities I've been presented, and if I manage to blow it from this point onward, then I would fully deserve to crash and burn.</p> <p>(For those who are interested, and in the interest of fairness and transparency, the total was just under twelve hundred dollars Canadian, which is just about the total sum I had to work with over the previous ten weeks. It means I don't have to be particularly careful using the intarweb today. Since I have real prospects in the offing, I'd prefer to be off the community dole. I'm not going to turn down token recompense for actual help rendered, which is why the button was there in the first place, but I don't particularly like being a charity case. Them what's gone a bit overboard should expect return when I can afford it.)</p> <p>But <a href="http://bbenz.typepad.com/softwaresoapbox/2006/06/stan_rogers_get.html" title="Stan Rogers gets a hard lesson -- Software Soapbox">Brian Benz was right</a>. This was a hard-learned and hard-earned lesson. There are a lot of things I could have done a lot differently along the way, and I'm pretty darned sure that I'll be doing a little more effective networking and leveraging from now on.</p> <p>I've been coasting through life, depending on technical talent to get me where I wanted to go. Not that I haven't put any effort into things -- I have spent at least as much time as anyone else learning and practicing my craft (whatever that craft may have been at any given point in my life). That is as true in the Notes world as it was in my avionics life (something that disappeared when discrete electronics gave way to reliable LSIs) or even when I mastered the art of bringing funky old footwear back to life. But as Brian pointed out, mere technical competence is not enough for any of us anymore.</p> <p>Even those of us who are &quot;mere&quot; employees can't afford to have an employee mentality these days. I come from a long line of labourers and tradesmen who have pretty much had a job for life as long as they did the work and didn't make too much noise along the way. I had pretty much the same thing with my first couple of jobs (including the military), and although I've watched the world around me change, I failed to change with it. I've always believed that there was work out there, and that all one could do, really, was to apply for jobs, shopping oneself out as a commodity labourer. But showing up at the factory gates with work boots and hardhat in hand, hoping that you were close enough to the front of the line to get one of the jobs on offer that day ain't cutting it anymore. That's more or less what I was doing, and it shouldn't have surprised me to find that everything was going to young 'uns with crisp new diplomas and little or no experience -- in the commodity world, price point is king. (And yes, I was testing the waters on the Dark Side as well &mdash; I can speak Dotnetese, even if my VB does come out with LotusScript accent and my C# sounds a lot like Java.) I simply didn't have the financial resources to last long enough to make that approach work, and that approach takes time. More time than any of us have.</p> <p>I haven't had a chance yet to explore all of the &quot;Stan needs help&quot; traffic out there. I was pointed to <a href="http://vowe.net/archives/007401.html" title="Stan Rogers needs help -- vowe.net">Volker's posting</a> by <a href="http://www.billbuchan.com/web.nsf" title="Will Bill Buchan's blog">Wild Bill</a> and Ben Dubuc in emails, and found Brian's ruminations from the comments there. I only had a half-hour to look at the mail, this blog, check the ol' PayPal account (there was an implied &quot;don't bother&quot; in my previous posting that I am now immensely happy several of you chose to ignore or failed to infer) and so forth -- I was able to scrape up a buck for that, but that didn't leave a whole lot of time to do anything else, really. I have seen enough, though, and in surprising enough places, to finally realise (I hope) that I am not, and cannot treat myself as, a commodity resource. Even if my name wasn't the proverbial household word, I really had no reason to believe that being just one more CV in the pile on some HR desk was going to get me anywhere.</p> <p>You know, for a guy who spends so much time showing off his m4d 5|&lt;i77z and hanging about in spaces with the elite in the game, I'm pretty clueless in real life.</p> <p>The only thing that kept the week from being the best of my life, really, was that I was completely in the dark about the Toronto geek dinner with Ed Brill. I didn't have a chance to see Ed's posting on his own site, and the half-hour I was able to manage on the net on Wednesday was timed perfectly to end minutes before a personal invitation/exhortation hit my inbox. The word &quot;dammit&quot; comes to mind. Well, actually, &quot;dammit&quot; is what comes to finger &mdash; the word or words that actually come to <em>mind</em> are somewhat less socially acceptable. I believe that makes three times now that I've managed to avoid meeting Ed in person in my own back yard. That's definitely enough of that.</p> <p>Again, thank you all. As much as the technical sharing in this community has always amazed me, this episode has me utterly gobsmacked.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1151349561249427602006-06-26T15:18:00.000-04:002006-06-26T15:19:21.260-04:00Thanks for all the fish....<p>Some blogs die of neglect. Some are withdrawn by people who have second thoughts about being public. This one is dying of poverty and malnutrition. I can't afford to feed it any more.</p> <p>This whole Notes developer thing has been a blast. The past tense really seems appropriate now, though. I don't have a computer to use since my ancient laptop's power supply took up smoking. Things had been going slowly downhill for a while -- the floppy drive was long gone, the trackpad was just a nuisance that would randomly select and cut things rather than merely point, the battery had just enough capacity for a safe shut down in the event of an AC outage -- but I was really hoping to be able to replace the computer before anything failed that would keep me from working altogether. With a working machine and a wireless card, I could always piggyback on someone else's internet service and at least keep up the appearance of having resources available to me. With that gone, though, I might be able to afford to triage my email once every week or two at an internet cafe, and I can only use my pay-as-you-go cell phone when I'm not at home (I basically had a choice between a place I could afford and one that had cell signal). Combined, that makes it awfully damned difficult to get a programming job. I can't even take work-at-home stuff unless there's enough money up front to cover the price of a power supply and comms costs, and I really can't imagine anyone being that stupid.</p> <p>So that's it, folks. It's been a slice. I have enjoyed working on the Notes and Domino platform. And I have met some pretty fantastic people along the way, at least in the online sense of the word &quot;met&quot;.</p> <p>I don't know if I'll ever be in a position to rejoin the fold. I sold everything I had of value to keep up appearances, hoping that I would land a job before I ran out of resources. Well, that didn't quite work out the way I had hoped. I am literally using my last disposable dollar for the month of June to post this entry. I certainly won't be able to spend time and money composing or responding to blog entries or posting on the LDD forum on next month's budget unless I've found a job in the meantime. And when I do find work, it's not very likely to be Notes-related, or even computer-related, and probably won't be full-time or pay well enough to get me out of the hole I've dug for myself anytime soon.</p> <p>Feel free to leave comments or <a href="mailto:stan.rogers@gmail.com" title="Send Stan a message">send email</a>, but be aware that I won't be able to read either right away. (Same thing goes for the PayPal panhandling button in the navigation area &mdash; while I'd be immensely appreciative of any spare change tossed my way, I probably wouldn't be aware of it for some time.) I'll try to keep you up to date, but I'm not sure that it'll be relevant reading for anyone who isn't fascinated by train wrecks. Sorry about that, folks.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.comtag:blogger.com,1999:blog-8279854.post-1144873095156112882006-04-12T16:00:00.000-04:002006-04-12T16:18:15.246-04:00Back in business<p>Yes, folks, it has been a little while. A number of things have been happening of late that have sort kept me in a perpetually flummoxed state of mind, and I haven't really known what to say.</p> <p>First off, for those who are keen to know, my back problems seem to be behind me now. (That seems to be a pun, but isn't really.) I've lost about fifty pounds along the way (only my socks and shoes still fit from last year's wardrobe), and I'm feeling capable, almost to the point of chipper. There's still a bit of work to go before I can say I've achieved chipperousity, but we're getting there. In the meantime, I'm ready to get back to work.</p> <p>Therein lies the problem. IT hiring is a Process, and I was really expecting that part of things to go slowly. What I wasn't expecting is that it would be so damned difficult to get an interim job to generate some kind of income. Even after dumbing my resume down so it wouldn't look too scary, I've found that the McJob world isn't too excited about my return to the workforce. Now, I can understand that managers might think a fellow like me might not stick around to make a career of things, but come on &mdash; these places <strong>depend</strong> on staff turnaround to avoid paying benefits. That's what the McJob is all about.</p> <p>Oh, well &mdash; at least I'm getting some nibbles on the developer contract front. With any luck at all, one of them will pan out soon.</p>Stan Rogershttp://www.blogger.com/profile/13819463953609361042noreply@blogger.com