Disavowal disavowal (annotated)

Borland just posted a new license agreement for the Diamondback preview.

My disavowal is hereby disavowed. I don’t know what I was talking about when I wrote that.

Of course, I could decide to be paranoid, and say that they can’t actually change the license agreement, since the first one was very clear about being the entire, final and exclusive agreement (clause 9.4) between me and Borland, and no provision was made for amending it, even in writing. But… I won’t.

You guys might want to think about dropping that “entire, final and exclusive” bit, though. Mistakes do get made from time to time, and it’s nice to give yourself a way to correct them. 😛

Here are the diffs between the two licenses, in case anyone’s interested.


BORLAND SOFTWARE CORPORATION EXPERIMENTAL TEST SOFTWARE LICENSE TERMS

BORLAND DIAMONDBACK FIELD TEST PREVIEW

NOTICE: THIS BORLAND SOFTWARE PRODUCT (TOGETHER WITH ITS ACCOMPANYING DOCUMENTATION, THE “PRODUCT”) IS THE PROPERTY OF BORLAND SOFTWARE CORPORATION (“BORLAND”). THE PRODUCT IS MADE AVAILABLE TO YOU, SUBJECT TO THE FOLLOWING LICENSE AGREEMENT (“LICENSE”). PLEASE READ THIS LICENSE CAREFULLY BEFORE INSTALLING OR USING THE PRODUCT. A COPY OF THIS LICENSE IS AVAILABLE FOR YOUR FUTURE REFERENCE IN THE “LICENSE.RTF” FILE PROVIDED WITH THE PRODUCT.

YOU MAY ACCEPT THIS LICENSE BY CLICKING THE “YES” BUTTON BELOW. YOU MAY REJECT THIS LICENSE, AND TERMINATE THIS INSTALLATION PROCESS, BY CLICKING THE “NO” BUTTON BELOW. IF YOU DO NOT ACCEPT THIS LICENSE, THEN YOU MAY NOT INSTALL OR USE THE PRODUCT. ANY USE BY YOU OF THIS PRODUCT ALSO CONSTITUTES YOUR ACCEPTANCE OF THESE TERMS.

You have received this Product because you have been invited to participate in the field test program (the”Beta Program”) for Borland’s pre-release software preview this Product in pre-release form. Borland is only willing to grant you this License if you obtained the Product from Borland. If you obtained the Product from any other source you may not install or use the Product.

If you and Borland have entered into a properly executed written field test license and non-disclosure agreement relating to the field testing of this Product (the “Non-disclosure Agreement”) then the terms of any such Non-disclosure Agreement shall control over any conflicting terms herein control, with respect to that field test, over any conflicting terms herein, and this License shall control, with respect to the Product obtained hereunder.

1. OWNERSHIP. The Product is proprietary to Borland. The Product is licensed, not sold, to you notwithstanding any reference herein to “purchases.” You acknowledge and agree that: (a) the Product is protected under U.S. copyright and other laws; (b) Borland and its licensors retain all copyrights and other intellectual property rights in the Product; (c) there are no implied licenses under this License, and any rights not expressly granted to you hereunder are reserved by Borland; (d) you acquire no ownership or other interest (other than your license rights) in or to the Product; and (e) Borland owns all copies of the Product, however made. You agree that you will not, at any time, contest anywhere in the world Borland’s ownership of the Product, nor will you challenge the validity of Borland’s rights in the Product. You have no rights hereunder to use any trademark or service mark belonging to Borland.

2. GRANT OF LICENSE AND SCOPE OF USE.

2.1 Grant of License. Subject to the terms and conditions of this License, Borland, for a limited time (the “Evaluation Period”), after which the Product will no longer operate, grants to you, if you are an individual, or, if you are an entity, one (1) designated person in your organization (“Named User”) a personal, nonexclusive, nontransferable and limited license to use the Product solely to create, compile (including byte code compile), and test, in source or object code form, your own application programs and other works (“Works”) for the sole purposes of evaluating the Product for the purpose of providing feedback to Borland and to develop and test the compatibility of your Works or systems which will operate in conjunction with the Product on the computer on which you have installed the Product, but you do not have a right to distribute or otherwise share those Works that you write or compile or any files of the Product which may be required to support those applications. All rights not specifically granted to you herein are retained by Borland. THE PRODUCT CONTAINS A TIME-OUT FEATURE THAT DISABLES ITS OPERATION AFTER THE EXPIRATION OF THE EVALUATION PERIOD. WORKS THAT YOU CREATE MAY REQUIRE THE PRODUCT IN ORDER TO RUN. UPON EXPIRATION OF THE EVALUATION PERIOD, THOSE APPLICATIONS MAY NO LONGER RUN. You should therefore take precautions to avoid any loss of data that might result.

At the end of the Evaluation Period, further use of the Product by you is prohibited. If you desire to continue to use the Product following the Evaluation Period, you should inquire with Borland or a Borland authorized reseller as to the availability of a final release of the Product.

2.2 Redistributables. The Product may include certain files, libraries and/or source code specifically designated as “redistributables” by Borland in the accompanying printed or on- line documentation and that are necessary to use Works created using the Product (“Redistributables”). From time to time, Borland may designate other files as Redistributables. You may not redistribute the Redistributables or otherwise provide such Redistributables to third parties.

2.3 Feedback. You agree to provide reasonable feedback about the Product to Borland, including but not limited to usability, bug reports and test results. You will use reasonable efforts to review and comment on all documentation supplied. All test results, bug reports and other feedback provided to Borland by You shall be the property of Borland and may be used by Borland for any purpose. Due to the nature of the development work, Borland provides no assurance that any specific errors or discrepancies in the Product will be corrected.

3. LIMITATIONS. You may not: (a) modify, adapt, alter, translate, or create derivative works of the Product or merge the Product with other software other than as described in the Product’s accompanying documentation or as approved of in writing by Borland; (b) lease, rent or loan the Product to any third party; (c) sublicense, distribute or otherwise transfer the Product or any component thereof to any third party; (d) reverse engineer, decompile, disassemble, or otherwise attempt to derive the source code of the Product; (e) remove, alter, or obscure any confidentiality or proprietary notices (including copyright and trademark notices) of Borland or its suppliers on the Product; (f) allow third parties to access or use the Product including but not limited to in a time-sharing arrangement or operate the Product as part of a service bureau or, otherwise for the use or benefit of third parties; (g) reproduce or use the Product except as expressly authorized under Section 2; or (h) disclose or publish performance benchmark results for the Product. The rights granted under this License apply only to this Product. You must procure a separate license to use other Borland software. The limitations in this Section 3 apply equally to your use of the Product, in whole or in part, including any component or Redistributable.

4 DISCLAIMER OF WARRANTY. BORLAND MAKES NO REPRESENTATIONS ABOUT THE SUITABILITY OF THIS PRODUCT OR ABOUT ANY CONTENT OR INFORMATION MADE ACCESSIBLE BY THE PRODUCT, FOR ANY PURPOSE. THE PRODUCT IS PROVIDED “AS IS” AND WITHOUT WARRANTY OF ANY KIND. BORLAND HEREBY EXCLUDES AND DISCLAIMS ALL IMPLIED OR STATUTORY WARRANTIES, INCLUDING ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, QUALITY, NON-INFRINGEMENT, TITLE, RESULTS, EFFORTS OR QUIET ENJOYMENT. THERE IS NO WARRANTY THAT THE PRODUCT WILL BE ERROR-FREE OR WILL FUNCTION WITHOUT INTERRUPTION. YOU ASSUME THE ENTIRE RISK FOR THE RESULTS OBTAINED USING THE PRODUCT. TO THE EXTENT THAT BORLAND MAY NOT DISCLAIM ANY WARRANTY AS A MATTER OF APPLICABLE LAW, THE SCOPE AND DURATION OF SUCH WARRANTY WILL BE THE MINIMUM PERMITTED UNDER SUCH LAW.

SOME STATES DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO THE ABOVE EXCLUSION MAY NOT APPLY TO YOU.

5. SERVICES; UPDATES; PRODUCT CHANGES. Borland is not required under this License to provide any installation, training or other services to you. BORLAND WILL NOT SUPPORT THIS SOFTWARE AND IS UNDER NO OBLIGATION TO ISSUE UPDATES TO THIS SOFTWARE. Borland reserves the right at any time not to release or to discontinue release of any Product (including a commercial release) and to alter prices, features, specifications, capabilities, functions, licensing terms, release dates, general availability or other characteristics of any future releases of the Product. In no event shall Borland be obligated to provide you a copy of the commercial release version of any Product in connection with your participation in the Beta Program or this License preview of this pre-release software.

6. CONFIDENTIALITY. You acknowledge that the Product including its existence and features, and related information remains a confidential trade secret of Borland. You agree to hold this information in confidence, not disclose it to any person, and not use it for any purpose other than the use and operation of the Product as permitted under this License. If you are an entity, you may disclose Products only to your employees who have a need to know in order to accomplish the purposes identified in Section 2.1 and if you have written nondisclosure or confidentiality agreements with your employees sufficient to enable you to comply with the terms of this License. All such use by your employees shall take place solely at your site. [Not in use]

7. LIMITATION OF LIABILITY. IN NO EVENT WILL BORLAND BE LIABLE TO ANY PARTY FOR ANY INDIRECT, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY, SPECIAL OR PUNITIVE DAMAGES, INCLUDING ANY LOSS OF PROFIT, REVENUE, BUSINESS OPPORTUNITY OR DATA, ARISING FROM OR RELATING TO THIS LICENSE OR THE PRODUCT, WHETHER IN CONTRACT, IN TORT OR OTHERWISE, EVEN IF BORLAND KNEW, SHOULD HAVE KNOWN OR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. BORLAND’S TOTAL CUMULATIVE LIABILITY ARISING FROM OR RELATED TO THIS LICENSE OR THE PRODUCT, WHETHER IN CONTRACT, IN TORT OR OTHERWISE, WILL NOT EXCEED THE FEES ACTUALLY PAID BY YOU UNDER THIS LICENSE OR $5 WHICHEVER IS GREATER. THIS SECTION 10 WILL APPLY EVEN IF AN EXCLUSIVE REMEDY HEREUNDER HAS FAILED OF ITS ESSENTIAL PURPOSE.

SOME STATES DO NOT ALLOW THE EXCLUSION OR LIMITATION OF INCIDENTAL OR CONSEQUENTIAL DAMAGES, SO THE ABOVE LIMITATION OR EXCLUSION MAY NOT APPLY TO YOU.

8. TERM AND TERMINATION.

8.1 Term. The term of this License will begin as of the date that you receive the Product and will remain in effect until the end of one year after the last date you received the Product or the commercial release of the Product, the Evaluation Period (as displayed in the startup screen) or December 31, 2004, which ever occurs first, unless earlier terminated under this Section 8.

8.2 Termination for Convenience. You may terminate this License for any reason, or for no reason, by giving Borland five (5) days’ written notice. Borland may terminate this License for any reason, or for no reason upon written notice to you.

8.3 Termination for Cause. Borland may terminate this License if you breach your obligations hereunder. Borland will effect such termination by giving you notice of termination, specifying therein the alleged breach.

8.4 Effect of Termination. Upon the termination of this License for any reason the following terms shall apply: (a) all rights granted under this License will immediately terminate and you must stop all use of the Product and any Redistributables; (b) you must return to Borland or destroy all copies of the Product provided to or made by you, and will, within ten (10) days after the effective date of termination, provide Borland with written certification that all such copies have been returned or destroyed; and (c) all provisions of this License with the exception of the licenses granted in Section 2 will survive termination of this License for any reason.

9. GENERAL PROVISIONS.

9.1 Canadian Transactions. If you are subject to Canadian law, you agree to the following:

The parties hereto have expressly required that the present License and its Exhibits be drawn up in the English language. / Les parties aux presentes ont expressement exige que la presente Convention et ses Annexes soient redigees en langue anglaise.

9.2 Hazardous Uses. The Product is not intended for use, and you may not use or allow others to use the Product, in connection with any application requiring fail-safe performance such as the operation of nuclear power facilities, air traffic control or navigation systems, weapons control systems, life support systems, or any other system whose failure could lead to injury, death, environmental damage or mass destruction. You agree that Borland will have no liability of any nature, and you are solely responsible, for any expense, loss, injury or damage incurred as a result of such use of the Product.

9.3 Governing Law. This License will be governed by and construed in accordance with the laws of the United States and the State of California, without giving effect to any conflicts or choice of laws principles that would require the application of the laws of a different jurisdiction. The parties expressly exclude the application of the 1980 United Nations Convention on the International Sale of Goods (if applicable).

9.4 Entire License; Severability. This License constitutes the entire, final and exclusive agreement between you and Borland regarding the specific license transaction described herein. If any provision of this License is held to be illegal, invalid or unenforceable for any reason, then such provision will be enforced to the maximum extent permissible and the remainder of the provisions of this License will remain in full force and effect.

9.5 Assignment. You may not transfer the Product media, assign this License or assign any of your rights or delegate any of your obligations under this License, by operation of law or otherwise (including by merger, sale of assets or consolidation), without Borland’s prior written consent. Any attempted assignment in violation of this Section 8.5 will be void.

9.6 Export Control. You may not directly or indirectly transfer the Product, including its documentation, to any country if such transfer would be prohibited by applicable law, including the U.S. Export Administration Act and the regulations issued thereunder. You agree to the foregoing and you are representing and warranting that you are not located in, under the control of, or a national or resident of any such country. You will be solely responsible for identifying and complying with all laws of any jurisdiction outside of the United States regarding the import, export or use of Products and technical data supplied by Borland. You will obtain at your own expense all licenses, permits or approvals required by any government to use the Product.

9.7 U.S. Government Rights. The Product is a “commercial item” as that term is defined at 48 C.F.R. 2.101, consisting of “commercial computer software” and “commercial computer software documentation” as such terms are used in 48 C.F.R. 12.212. Consistent with 48 C.F.R. 12.212 and 48 C.F.R. 227.7202-1 through 227.7202-4, all U.S. Government end users acquire the Product with only those rights set forth in this License.

9.8 Waiver and Modifications. All waivers must be in writing. Any waiver or failure to enforce a provision of this License on one occasion shall not be deemed a waiver of any other provision or such provision on any other occasion. This License may only be amended by a written document signed by both parties.

If you have any questions about this License, please contact Borland. If you agree to the terms and conditions of this License Agreement, please click the “YES” button below. This will be the legal equivalent of your signature on a written contract and the terms of this license shall be a legally binding agreement between you and Borland. You must agree to these terms and conditions in order to install and use the Product. If you do not agree with these terms and conditions, you should click the “NO” button below to exit this installation process, as Borland is unwilling to license the Product to you in such case, and you may return the Product within ten (10) days after you first received it to Borland.

Borland Software Corporation 100 Enterprise Way
Scotts Valley, CA 95066-3249

Carpet naming

So this morning at breakfast, I was flipping through the Lowe’s ad insert in the paper.

They have some very goofy sink fixtures. (Alternate picture from the manufacturer, since this blog will probably outlive the weekly ad on the Lowe’s Web site.) And some goofy sinks, for that matter (alternate link). Why on earth would you want a sink that sits on top of the counter?

No, don’t tell me. I don’t really want to know.

Some of the names of carpet patterns are really amusing. Royalty Moonshadow. Shaw Intrigue. Coronet Ravishing Beauty (ironically enough, this is a particularly ugly pattern — even on paper, it makes my eyes hurt). I like this one: Mohawk King Lear. That’s an interesting mental image, isn’t it?

(Sorry, no alternate links for the carpets — the main Lowe’s Web site doesn’t acknowledge the existence of carpet. And these particular patterns don’t seem to exist on their manufacturers’ Web sites, either. Interesting…)

Some of the tile pattern names are amusing, too. DaVinci Fossil Mosaic. Jennie’s comment: “Just what I need. Some dead guy’s bones in my bathroom.”

Thoughts on war

I have no firsthand experience with war, nor even secondhand. I’ve only ever known one person who was in active service while I knew them, and that was my wife’s brother Bryan, who is now out on a medical discharge. But every now and then, I’ll see something that really hits home.

My family went on vacation to Washington, D.C., oh, something like ten or fifteen years ago now. One of the things we stopped to see was the Vietnam Veterans Memorial — The Wall. It was staggering. You’ve seen the photos of people kneeling in front of the Wall, or leaving flowers, but until you’ve seen it live, seen the enormity of it… It still sends chills through me.

The Statler Brothers wrote a song about it, called “More Than a Name on a Wall“. I heard them perform it live before it was released on an album. Reading the lyrics isn’t the same as hearing it.

The Moving Wall, a half-size replica of the real Wall, came to Cedar Memorial in my hometown of Cedar Rapids. It was there two different times while I was living there (not sure if it’s been there again since), and I went both times. Even half-size, it’s still breathtaking.

And then there was one evening, just a couple of years ago, when I was watching an episode of M*A*S*H. Up until that time, I had only really seen M*A*S*H when I was a kid, and I had always thought of it as a comedy. But in this episode, “Death Takes a Holiday“, everyone was celebrating Christmas Eve, except for three doctors — BJ, Hawkeye, and Margaret — who were trying to save a wounded soldier who had been brought in. Actually, no. They weren’t trying to save him. They knew he was too far gone. But BJ found a photo of the soldier’s young son in his pocket. And they were just trying to keep him hanging on long enough that they wouldn’t have to send word home to this boy that his father had died on Christmas Eve.

And today’s Doonesbury gets added to this list. Alex is giving a class presentation about her father, who lost a leg fighting in Iraq. And she says, “That’s the thing about wounded soldiers, because everyone knows someone who has it worse or didn’t make it… they all feel lucky.”

There are tears in my eyes as I type this. I support our troops. That’s why I don’t support Bush and his goddamn crusade. He thinks war is a game, a toy. He thinks he can declare war on anybody, for any reason or no reason at all, and get away with it, and to hell with the cost, both dollars and lives. I’m no die-hard pacifist, but war is never the first choice.

Hotel: price vs. performance curve

Ahh… back in civilization.

Not back home yet, mind you, but back in civilization.

See, I’ve noticed a general trend in hotels: the more you pay, the more they go out of their way to screw you (above and beyond just the room rates).

I mean, you check into a mid-range place like Super 8, and you actually get a good deal: reasonable prices (most S8s I’ve stayed are in the $55-70/night range), you get free local calls and free continental breakfast, and sometimes even a data port for your modem (with, again, free local calls). Usually a microwave is available, and sometimes there’s even a refrigerator in your room. There’s no overpriced hotel restaurant; instead, they tell you exactly where to find inexpensive dining in the area, usually with a map right there in the Super 8 Directory. A lot of them even offer free HBO and a complimentary copy of TV Guide. Often a pool, sometimes even indoor.

Right now I’m staying in another midrange hotel, the Denver Fairfield Inn, which has a complimentary coffeemaker in the room (I probably won’t use it, but it’s a nice touch), a convenient power outlet right on top of the desk, and — glory of glories (after living in the digital Third World for a week, and only commuting to the real world) — free wireless Internet access in the room. Free continental breakfast? But of course. Indoor pool and Jacuzzi. They even have a free shuttle to and from the airport (runs 24 hours a day). Regular rates are in the $79 range (though the airline is only paying $42). And like Super 8, what you pay is what you pay.

And then you get to the hotels that want to think of themselves as “classy”, like the Fairmont in San Jose, which charges $169 (and up) per day plus:

  • Valet parking fee (I think it was $6, plus tip). Sorry, no other parking facilities available. So, so sorry.
  • Long-distance rates are through the roof, and you pay even for local calls
  • Four expensive restaurants in the hotel (and, it goes without saying, no maps of cheaper area fare)
  • Room service (outrageous prices plus a $3 delivery charge plus 20% gratuity)
  • Pay-per-view movies (around $13 each)
  • Pay-for-play Playstation (I forget how much they wanted for this. Probably should’ve made notes before I left)
  • In-room mini-bar ($4.00 for a 10-ounce bottle of Coke — and it goes up from there; I think the tiny bottle of wine was around $80)
  • If you want continental breakfast, you pay for it at their little cart (a 69-cent donut goes for around $3-4)
  • $14 a day surcharge for Internet access (even from the lobby)

That’s the beginnings of a list. I could probably go on for a while. (I don’t know all the specifics because, well, I didn’t actually pay for any of these things. Except for the expensive restaurants, and that scared me enough that I only did it once.)

And what do you get for your money? A shiny foyer. And, uhm, lots of polished marble tables. Err… yeah, that’s about it. (I’m scared to think what the deal must be like in the really fancy hotels. Pay-per-use bidets, maybe? Unless you want to call Room Service and have them send up some actual toilet paper…)

You don’t even get a well-engineered hotel room. The Fairmont apparently never stopped to think about little things like room logistics. For example, if (for some ungodly reason) you want to use their wired Internet, you have to hook your laptop up where the broadband modem is, unless you’ve got a really long network cable. That means you’re setting up your laptop at the writing desk, which (here comes the problem) offers no power outlets. None. That is, unless you haul the bed away from the wall and unplug one of the lamps, the clock radio, or, uh, the broadband modem.

They can’t even figure out whether they want the sink to be inside or outside the bathroom. Super 8s mostly have it figured out, and put it on the outside. The Fairmont just has one big (marble) bathroom with the sink, the shower (fully-transparent glass door), the tub (no curtain or doors at all), and a little toilet alcove (which actually does have its own separate door to close it off from the rest of the bathroom). Apparently the logic is: heaven forbid someone wander into the bathroom to brush their teeth and see you mostly covered up except for your arse, but no problem at all if they happen to see you totally naked. Glad I wasn’t sharing a room.

(It just struck me that this might be deliberate. Yet another way to ream the customers — if two people from the same company go on the same business trip, make their lives mightily inconvenient unless they’re so good as to pay for two separate rooms…)

So, yeah… I’m much, much happier here in a mid-range hotel. It’s far more satisfying to be in a place that actually cares about customers more than it cares about money-grubbing. Fairmont of San Jose: apart from semi-proximity to the convention center, just not worth it. But Fairfield by Marriott: two thumbs up. And extra bonus points for the free wireless; now that’s real class.

Disavowal

Suppose, for the sake of argument, that Borland had a new product coming out. Suppose they had programmers blogging about some of its features. Suppose that they went so far as to have a convention where they talked about this product at length, talking about everything to do with this product except for release dates, product names, and pricing/bundling. Suppose that they encouraged the community to blog about the new product.

Now suppose that Borland went on to give beta CDs to all the conference attendees.

(I’m not saying any of this is real, mind you. Nor am I confirming or denying the existence of this alleged new product.)

One would presume, if this situation were to unfold, that Borland’s intent would be to build buzz about this new product. To build awareness and enthusiasm about the product, and even to get a grassroots marketing effort underway.

Now suppose that those beta CDs, while having a very high-quality installer (way better than I would have expected for an early beta) and loads of good stuff on them, had one little glitch. Suppose that they still had the same license agreement as Borland had used for prior, nondisclosure-protected betas. Suppose that anyone who installed the software had to agree, as part of the license, not to talk about the product’s features. Suppose, further, that anyone who installed the software had to agree to not even acknowledge the product’s existence.

(You might wonder, in this case, whether I would honor my journalistic integrity by refusing the license terms and continuing to blog about the product, or whether I would give in and go for the cool new toy. You might wonder.)

Remember, I’m not confirming or denying any of this, because as far as I know, Borland isn’t releasing any new version of Delphi. And as far as I know, I was in some sort of sleep-deprival-induced haze when I wrote all those posts about that thing called “Diamondback”. I don’t know what this Diamondback thing is.

If all of this hypothetical scenario were to happen, of course, one might assume that I would try to track down John Kaster or Michael Swindell and see if I could get a license addendum in writing, lifting the “don’t talk about its features” and “don’t acknowledge its existence” clauses. However, until that hypothetical addendum is forthcoming, all of my prior posts about BorCon are (temporarily, I hope) hereby disavowed.

The BorCon2004 Wiki

There’s some really good info about BorCon and about Diamondback popping up on people’s blogs, but it’s scattered. There are eight or ten of us blogging here at BorCon, often all about the same topic or even the same session. So some information is duplicated, and what isn’t duplicated is scattered across several different blogs.

And even within a single blog, info is scattered. I’ve got something like six different posts about Diamondback alone. Some of them have clarifications or corrections to earlier posts. The folks who are following along live won’t be having a problem just yet, but when it comes time to refer back to the blogs for some information later, it’ll be hard to find anything.

So I started thinking about how cool it would be if we could all pull our observations into one place. Collaborative documentation. Kinda like a wiki. Or, perhaps, exactly like a wiki.

Nobody’s started a BorCon wiki yet, and I’m thinking that it would be very, very cool if we had one. So I’m starting one. Here it is, the BorCon2004 wiki.

It’s got an RSS feed, too. The feed leaves something to be desired at the moment (it’ll only tell you about the latest change to each page, not about every change, so you can’t really follow along with the diffs). But I’ll try to fix that soon (or con Sam into fixing it).

I haven’t had time to put a whole lot of my info on the wiki yet, but I’ll be working on that today and, in fact, probably for the next week or two. And I need you guys’ help.

BorCon bloggers (Allen, Craig, Danny, Dave, Jim, Marco, Nick, Paul, Robert, Serge, and anyone else I’ve missed), I — and the folks back home — would appreciate it if you could take some time to transcribe some of your notes on the wiki, or even just to edit pages and add links to some of your relevant blog posts. Just to help pull the info together, and make it easier to cross-reference all this mess of notes after the con. This will probably be an ongoing project for a while, so any time you can devote to it, whenever, would be very cool.

Everyone else, whether you’re attending the con or following along at home: Please help! This is going to be a community wiki, so post questions, post answers if you know them, point out holes, help us copy info from the blogs, and in general give the community one place to go to find all the info about Diamondback and everything else.

(BTW, if anyone else is better at wiki stuff than I am and wants to take over running this thing, hit the Contact link over there on the left. I don’t claim to be good at this, I just claim it needs to be done.)

Thanks, all, and may the wiki be with you.

WHOO! *Happy dance*

Had to blog this first thing.

I have, in my hot little backpack, a two-CD set of the Diamondback Preview. They handed them out to everyone after the What’s New in Diamondback / Meet the Delphi Team session tonight. (Now aren’t you sorry you missed the con?)

New toy. Hehehe…

Yes, it’s beta, yes it’s going to do some crashing. But… refactoring, man. Find References. Sync Edit. Debugging .NET and Win32. Delphi and C# in the same project group. I’m going to have some serious fun with this thing, especially after I get back home.

Oh, and a note for the guys back home: The Diamondback Win32 compiler still supports old-style objects. So we could use this thing’s refactoring tools to migrate them to classes. How long have we been waiting for that?

Wheeee…

What *wasn’t* in Danny’s Diamondback session

Stuff that came up after Danny‘s talk (which I briefly summarized here). Even those of you who were at the talk didn’t hear this stuff yet. (Well, except for Allen, but I suspect he already knew all of this anyway.)

Delphi for Mac?

Now, don’t get your hopes up. There is no official word on this yet. (It may be worth noting that this is not an official “no”.)

Yes, you can get partway there with Mono, but there’s not much there for GUI. However, when someone was asking Danny about this after the session, he pointed out that Diamondback will be a multi-personality IDE (with the three personalities out of the box — Delphi/Win32, Delphi/.NET, and C#/.NET). And personalities will be part of the Open Tools API. (Not sure if that’ll be totally cleaned up for Diamondback, but it’s there.) Open Personality API?

So, whether Borland writes a Mac personality or not (and mum’s the word on that so far, so you can still hold out hope), somebody else might be able to. This is a pretty darned intriguing concept, I think.

The features are coming! The features are coming!

I spent a while grilling Danny about what will be in Diamondback for Win32, and what will sneak in later. Here are the results. (Tabular format makes the holes a little more glaring, doesn’t it? Still, this is good stuff to hear word on…)

Feature Diamondback Diamondback+1
(Whidbeyish)
‘strict private’ and ‘strict protected’ in Win32 Yes
‘static’ keyword in Win32 No Forgot to ask
Class constructors in Win32 No Forgot to ask
Nested classes in Win32 Yes [Note 1]
Records with methods in Win32 No Yes [Note 2]
Operator overloading in Win32 No Yes [Note 3]
Custom attributes in Win32 No Forgot to ask
Generics in Win32 No Researching
Multicast delegates in Win32 No Researching

Note 1: Yes, they’ll be there, but you won’t be able to use them in published sections because RTTI won’t be able to cope with them.

Note 2: Records with methods will be there primarily because they’re a prerequisite for operator overloading.

Note 3: Will only be supported for record types.

Usual disclaimers about forward-looking statements, but if Danny thinks it’s going to be in a release, I’d say the odds are pretty darned good…

Danny’s “What’s New in the Diamondback Compiler” session

Covering Danny Thorpe‘s session about what’s new in the Diamondback compiler.

I’ve already posted several times about what’s new in Diamondback. I won’t duplicate any of that information here. And Danny was only talking about the compiler. Not about refactoring, not about databases, not about ASP.NET, not about ECO, not about VCL. Just the compiler.

Therefore, this is going to be a long post.

(Also, be sure to see my next blog post, with stuff Danny didn’t say during the session. In particular, when are some of the other Delphi/.NET language features coming to Win32?)

For..in

  • Loops over the elements of a collection, without actually requiring you to care about indexing into the collection
  • When is it useful?
    • When you don’t care about the index, but just want the elements
    • When you don’t want to do an indexed loop because getting a count and/or doing random access is expensive (linked lists, database tables)
    • Danny gave the example of asynchronous retrieval (a background thread is going out and getting the next element before you ask for it), which doesn’t work so well with array indexes
    • Unordered / non-indexed data (sets, hashtables)
  • You should think of the returned data as read-only. Do not change the collection while iterating. (You can change properties on the object you got, but don’t try to replace the object in the collection)
    • Modifying the underlying collection should cause the enumerator to throw an exception the next time you call MoveNext. (So don’t modify the collection while you’re iterating!)
    • Win32 implementation may allow writeback someday, but it might be full of gotchas. Assume that you should never modify the collection while you’re iterating it.
  • Because you treat the data as read-only (you are treating the data as read-only, right?), an enumerator should give you a stable view of the data.
    • That means that, if you call Reset on the enumerator, and enumerate a second time, you should get the same data.
    • Not guaranteed to be in the same order the second time, though.
    • This is the theory. In reality, things like databases may not guarantee a consistent view, for performance reasons (because doing a read-only transaction might be cost-prohibitive). But if they did offer a consistent view, wouldn’t that be nice?
  • Syntax: for MyObject in MyCollection do { statement };
    • Why not foreach?
    • Because Danny was reluctant to add a new keyword
    • Besides, should it have been ‘foreach‘ or ‘for each‘?
    • As a mathematician, Danny asked, “Wouldn’t ‘for all‘ be better?”
    • So, no new keywords for this.
  • Supported in both Win32 and .NET
    • .NET uses IEnumerable if it’s there, otherwise looks for the code pattern
    • Win32 only supports the code pattern (probably because interfaces carry all that reference-counting baggage)
  • The collection is held in a temporary variable.
    • So, if you did for MyRecord in LoadCollectionFromDatabase do, you’d still be fast, because LoadCollectionFromDatabase would only be called once.
    • Much like the way the for loop already caches its maximum value.
  • Collection must fit one of these:
    • Implement IEnumerable (.NET only, for now)
    • Have a method called GetEnumerator
    • Be an array, set, or string (or enumeration? Danny didn’t remember for sure)
  • Mechanics: (very familiar if you already know how C# does foreach)
    • GetEnumerator returns an enumerator object, with MoveNext and Reset methods and a Current property
      • You start with no current element (on a “crack”, per Danny) and must call MoveNext to make the first element current
      • MoveNext returns False when there are no more elements (if the collection is empty, it returns False the first time you call it)
      • Reset rewinds the collection to the beginning. for..in does not call Reset.
    • The enumerator is freed automatically at the end of the loop (inside a finally block).
  • As I mentioned before, many classes in the VCL will support for..in.
    • Not all, because when generics come out, they’ll all be generics and it will only need to be implemented once
    • TList has TListEnumerator, even in .NET (and even though TList is just a thin wrapper around ArrayList), simply because Win32 does need TListEnumerator. (It’s there as a placeholder for code compatibility between Win32 and .NET, for code that uses the enumerator directly instead of using for..in)

Multi-unit namespaces

  • Goal: Put symbols into a specific namespace while preserving unit make logic (which works by having a relationship between the unit name and the file on disk) and the syntax and the package support
    • Relationship between assemblies and namespaces is many-to-many
    • There is no relationship between the namespace and the file on disk
  • uses Namespace; always refers to a namespace, never to a filename
  • In Delphi 8: (the old way)
    • Unit name = .NET namespace. This works as an interim solution, let’s get it shipped.
    • Problem: Exposes structure to the world. Component and library authors want to split code into multiple files, but that’s a pain for their customers.
    • More segregated than most .NET namespaces
    • Can’t inject code into a namespace you don’t control (not that this was necessarily recommended practice to begin with)
  • Diamondback: (the new way)
    • unit Borland.Vcl.Classes;
      • Rightmost segment is dropped. Types in this unit end up in namespace Borland.Vcl. (Borland.Vcl.TList)
      • ‘Classes’ is still there behind the scenes (buried in the metadata), but it’s not in the C# programmers’ face
    • uses Borland.Vcl.Classes;
      • Compiler can find file on disk by appending ‘.pas’.
      • Compiler can also find this unit within a package, and only pulls symbols for that single unit.
      • This is using a unit, not a namespace.
    • uses Borland.Vcl;
      • This is using a namespace.
      • Only works for code that’s already compiled into an assembly. Cannot work for static linking (because there’s no way to find the .pas file).
      • Wide open; pulls in everything in the namespace, not just one unit.
    • uses Borland.Vcl.*;
      • This is either using a namespace, or using multiple units specified by a filespec. They amount to the same thing.
      • Works against code in packages, and against source/dcus.
      • Be careful. If you’re going against source, this loads a lot of symbols from disk. (Compilation will be slow.)
      • The smart linker will be even smarter for this. If a unit is dragged in by the wildcard, but you don’t ever reference any of its types, then its initialization section will not be compiled into the EXE.
      • This is here for completeness. Danny doesn’t recommend using it normally.
      • Danny didn’t talk about this, but I imagine it would be a bad idea for Borland.Vcl.Classes.pas to say using Borland.Vcl.*;
      • Globals (global procedures/functions, global constants, global variables) are as discussed in my earlier post: Borland.Vcl.Classes.MyGlobal becomes Borland.Vcl.Units.Classes.MyGlobal.
        • The ‘Units’ is stuck in there because Delphi already allows a global named ‘Classes’ inside the unit named ‘Classes’. (News to me! I thought that was a compiler error for duplicate identifier.) To avoid breaking it, they stuck an extra level in there.
    • Simple unit names (no dots in the filename) are an exception to this rule. When the rightmost segment is in fact the only segment, it’s not dropped.
      • But if the project has a default namespace, it’s considered part of the filename.
      • So if the default namespace is Borland.Vcl, and the file is Classes.pas, then the “fully-qualified filename” (I’m not sure if this is Danny’s terminology) is considered to be Borland.Vcl.Classes.pas, so the Classes is dropped.

A couple of interesting digressions

  • Arrays in .NET can’t be preinitialized, so if you have a global const array, it’s actually initialized in code in the unit’s class constructor (I’ll have to reread the IL book — I know there is global data, since that’s where strings are stored, but evidently it can’t be used for arrays)
  • Note on unit initialization sections: If you have circular unit dependencies, the initialization order may not be the same between Win32 and .NET. This is because, when unit A touches something inside unit B, unit B’s class constructor will fire immediately in .NET, whereas in Win32 the initialization section might not fire until later.

Function inlining

  • Involves persisting the compiler’s node tree to the .dcu. Not been done before.
  • Can produce significant speed boost in certain cases
  • Caution: Code bloat risk!
  • Not quite like C macros, because these aren’t textual replacements — instead, it grafts nodes into the syntax tree (it’s after parsing, not before)
  • Works for most anything: procedures, functions, methods, and local procedures
  • ‘inline;’ directive, looks like a calling convention
    • Didn’t Turbo Pascal have this a long time ago? Maybe it was just for assembler…
  • Works for both Win32 and .NET (and may beat the JIT compiler in some cases, since the JITter goes for fast optimizations and low impact)
  • The ‘inline’ directive is just a suggestion to the compiler. The compiler can disregard it if it thinks you’re wrong or stupid.
    • Could decide it would make the call site too complex (by needing too many temps and blowing your registers)
    • The same procedure may be inlined at some call sites and not others
  • This is still a top-down compiler. It must see the body of the inline procedure before it’s used.
    • In some cases with circular unit references, the compiler disables inlining on purpose.
  • Doesn’t work for procedures with an asm body, because that doesn’t emit compiler tree nodes
  • Spliced into node tree before optimization
    • Generates temps for stuff that’s passed into the procedure
    • Then probably optimizes those temps right back out
  • Restrictions on inlining stuff that access class privates
    • Hard and fast rule in .NET: Can’t inline these into another class
    • May relax this rule in Win32 code, post-Diamondback
  • Best practices:
    • Use only for very small functions
    • Always test performance and measure the benefit — don’t assume it will speed up your code. It may slow it down!
  • Caveats:
    • Hidden temps; burns registers and stack
    • Can actually hurt performance
    • Causes unit dependency brittleness: users depend not just on your interface, but also your implementation. May not matter much for our code, but for this reason, expect Borland to be very conservative about using inline within the RTL and VCL!
  • Since the procedure isn’t always inlined, the compiler actually does emit a “real” procedure body as well
    • @ operator returns this
    • Presumably the smart linker is vigilant, and if every call is inlined, the real body will be eliminated
  • {$INLINE ON/AUTO/OFF} directive
    • Affects the call site
    • AUTO = compiler picks “small routines” to inline. Per Danny, this option is “scary” and will never be the default.

Miscellaneous new features

  • MOVZX (Optimization for P4/PIII processors. Will cause smaller/maybe-slightly-faster code on newer processors, at the expense of running slightly slower on older processors)
  • UTF8 and UCS2 source for both Win32 and .NET
    • Danny, weren’t you going to show some amusing examples of this?
    • No Unicode allowed in published properties or methods (I think this restriction is Win32-only)
  • Improved overload discrimination (can overload on ‘type of’ types)
  • Forward declarations for record types (.NET only)

Coming in Diamondback+1

  • Whidbey support (well, yeah, you can compile against Whidbey in D8, but you can’t consume generics so you’re really a second-class citizen)
  • Generics (for .NET; see below)
  • May do something along the lines of partial classes
  • Records with methods for Win32?
  • (Also see my next blog post)