MacBook, defective by design banner

title:
Put the knife down and take a green herb, dude.


descrip:

One feller's views on the state of everyday computer science & its application (and now, OTHER STUFF) who isn't rich enough to shell out for www.myfreakinfirst-andlast-name.com

Using 89% of the same design the blog had in 2001.

FOR ENTERTAINMENT PURPOSES ONLY!!!
Back-up your data and, when you bike, always wear white.

As an Amazon Associate, I earn from qualifying purchases. Affiliate links in green.

x

MarkUpDown is the best Markdown editor for professionals on Windows 10.

It includes two-pane live preview, in-app uploads to imgur for image hosting, and MultiMarkdown table support.

Features you won't find anywhere else include...

You've wasted more than $15 of your time looking for a great Markdown editor.

Stop looking. MarkUpDown is the app you're looking for.

Learn more or head over to the 'Store now!

Wednesday, March 31, 2004



I've recently been experimenting with AWT instead of Swing in Java. AWT is the "original" GUI widget toolset, and it essentially ties straight to the native GUI widgets of the Java virtual machine's host platform. Using it, you can't help but have a "native look and feel".

AWT was the "obvious" way to create GUIs at Java's birth. Grabbing native widgets saves you the extra programming of making something new. But this missed Java's goal to write once and run anywhere [with essentially the same feel, which is part of running [the same] anywhere].

Thus Swing was born. Now Java had a GUI toolkit that could "look like Java", the Metal Look and Feel, no matter where it was run. Swing made Java its own platform, and you could really feel like you weren't primarily running Windows or Linux or Solaris or Mac OS when you were using a Java application. The underlying OS really was just a foundational layer, and everything from server-side apps to the most complex GUI wouldn't care if you had one, two, or three buttons on your mouse. More importantly, developers could code knowing that if the Java L&F (Metal) worked on their dev platform, it'd likely behave in the same fashion anywhere.

What's more, because Swing is skinnable, look and feels that imitated native widgets on each OS coiuld be -- and were -- created as well. The Windows and Mac L&Fs are found only on that platform, b/c the look is copyrighted, but Motif for *NIX is found everywhere, though that's no cause for celebration! Finally, full GUI functionality, occasionally better than the native host's, ready crossplatform without more than one line of code changed to go from a generic look to a native one. Or back. Swing appeared to be the perfect solution, and for a while everyone was using/trying Swing.

Strangely, there is now another player for creating widgets in Java, IBM's SWT (example). SWT is doing exactly AWT was doing, but for a much different reason. SWT is trying to provide better performance than but the same functionality you'd find in Swing in a "pure Java" solution across OSes, but again using native widgets and a native-only look.

But if SWT is essentially just AWT, conceptually, at least, what's the reason for bothering?

Recently I had a fellow tell me his spin on what happened, and it's so obvious it can't help but be right. AWT development died at Sun about 140 computer-years ago at Sun. They can't kill AWT itself, as Swing is built on top of AWT; Swing extends AWT for its foundation. But Swing has so many more mature widgets in its bag than AWT could ever hope to claim (click on the button at the top), that we can quickly see the suggestion I got was on the money.

Why, then, doesn't IBM just contribute to AWT? Ha! That's funny. Sun's got it all closed up, licensing wise, afaik. And IBM is also trying to do something fancy that makes the method they summon up SWT's copies of the native widgets differnt than AWT's.

Anyhow, there you go, three types of GUI widgets for Java. I was initially blogging to suggest that you take another look at AWT and see if you can't get away with those widgets -- SWT requires a separate install and a relatively recent JVM; Swing requires a 1.2 JVM or a lot of coaxing/separate install. AWT based apps can run on WindowsXP and 2k right out of the box. No, really. Using AWT means you'll also have, as the same fellow suggested, an inside track on keeping things simple enough for the "Micro" edition of the JVM. But I'm not going to argue that now. The intro was much too long, and I'm tired o' blogging for now, bion.

posted by ruffin at 3/31/2004 12:16:00 PM
Monday, March 29, 2004



As I've ranted before, I believe, creating a cyborg does not give you ironclad job security, regardless of past perception. People feel better when there are parts of a computer system only they understand, but eventually you'll liable to get a manager worth their salt in there and suddenly those parts that used to require you will be replaced by adequate documentation.

And that's where the fallacy lies for so many people. Look, even with adequate docs you'll still know more about what you do than anyone else. Just remember that your goal should be to do your job well, including getting the position ready for your replacement -- whether you end up moving laterally, up, or away -- not making sure that you still have a job no matter what happens. If you're not able to do your job well, well, start looking for another job. You, and everyone down the line, will be happier for it.

Labels:


posted by ruffin at 3/29/2004 11:43:00 AM



To continue the iTunes ranting, it hit me today that it drives me crazy that iTunes isn't normalized to third normal form, heck, even 2NF! We've got a lot of repeated entries in there, namely music that's been released more than once.

Let's say I've got Between the Buttons and Singles Collection: The London Years. Well, now I've got two copies of Ruby Tuesday in iTunes, don't I? iTunes keeps track of number of times played, date last played, personal ranking (1-5 stars), playlist "parents", and all sorts of other info on each single track. I don't really want to keep the numbers separate for the two copies of the same song.

What needs to happen is to have a many to many relationship between songs and albums. Sites like FreeDB and CDDB need to have a concept of what's a verbatim repeat (like the example above) and what's not (like the pretty decent live version of Ruby Tuesday on Flashpoint). Then we can have an mp3 player that's worth its salt. Search for everything on Rolling Stones, the original version of Ruby Tuesday's there. Search for everything in Between the Buttons, you'll get that same entry. Same for The London Years. Not the same, obviously, for Flashpoint. And you'll get all your settings and properties for that entry in all [of the first] three listings.

Right now you could delete copied music, but then you lose the ability for the track to pop up in all of the first three search examples. It'll only show up in two.

Think Different, Apple, and normalize. ;^)

posted by ruffin at 3/29/2004 09:37:00 AM
Friday, March 26, 2004



Okay, for those of you having trouble making TRIGGERS in Oracle using ADO.NET, I may have, after about an hour of beating my head against the wall, figured out the culprit.

Here's the code I was trying:
create or replace trigger trigEntities before insert on entities for each row begin select seqEntities.nextval into :new.entityId from dual; end;
(Originally it had nice whitespace and everything, but I was trying to get rid of any unknowns there)

Here's the error I was getting:
PLS-00103: Encountered the symbol "" The symbol "" was ignored.

The trick there, of course, is that the "nothing" within the quotes is a carriage return. Why it's not splitting the error message into multiple lines, we'll ignore for now (in Oracleland, that's not a linebreak, I suppose).

So yes, that's the culprit: The carriage return. It appears that Oracle doesn't like carriage returns inside of triggers, though it'll forgive them in, say, table create statements with whitespace that includes an 0D (hex for 13 decimal).

How to get around it? Well, luckily that's pretty easy. Here's the code:
strSql = Me.GetFileContents("C:\files\" & strName & ".sql")
strSql = Replace(strSql, vbCr, "")
Console.WriteLine(strSql)


Don't tell me I ain't never given ya nuttin.

posted by ruffin at 3/26/2004 05:26:00 PM

Another note to self about Oracle:
show errors trigger trigger_name;

posted by ruffin at 3/26/2004 05:10:00 PM



I have 744 songs in iTunes at work right now. Today I've listened to 42 songs out of my complete library which were "randomly selected" by iTunes. Then they started repeating. It got pretty ludicrous. I noticed, and started hitting ctrl-right arrow to move on the the next tune. Five straight last played today. Changed the sort order, hoping that'd help, and ordered by date played. The arrow for what song was playing just climbed right up the list, every song picked having been played today.

I hit "next song" an obscene number of times, and when the needle came back up I was staring "I Ain't the One" in the face, which was last played 2/13/2004. Phew.

I'd heard complaints about the non-random nature of iTune's random selections, but had never seen it up close before. Before today, anyhow.

posted by ruffin at 3/26/2004 04:11:00 PM
Thursday, March 25, 2004

Hey, wow, I've got an ISBN! Let's both pretend you didn't see the title of the book, though. It paid fairly well, all things considered.

Pokemon Stadium
ISBN: 1584221240
Author(s): Ruffin Bailey
Format: Other
Publisher: GameSpot, Incorporated"

posted by ruffin at 3/25/2004 09:09:00 AM
Wednesday, March 24, 2004

Java: Java 1.4.1 Release Notes

java -Dapple.laf.useScreenMenuBar="true" yourApplication

or

System.setProperty("apple.laf.useScreenMenuBar", "true");

posted by ruffin at 3/24/2004 08:35:00 PM

The very definition of a *NIX geek:

Working with a bunch of Unix geeks -- who were all lovely people, I hasten to add -- was like stepping back in time fifteen years, only instead of people running 'csh' and 'vi' on a single VT220 terminal on their desktop, they now had a nice 20' color monitor displaying six or seven VT220s running 'csh' and 'vi'. This is progress?? Unix geeks are the Amish of the computer world.

posted by ruffin at 3/24/2004 10:22:00 AM
Tuesday, March 23, 2004

A "myfreakinname Complete Subscriber" Exclusive!

So this is what's wrong with my CW-built app...

> OSErr -35 processing classpath item

CodeWarrior 5 mistakenly builds JBound applications using absolute paths
to items added to your classpath. Use JBindery to build your
application and you should be fine.


Talk about your blast from the past. Though that post is from 2000. In computer years, still pretty old.

(no, there's no such thing as "myfreakinname Complete". Unless you'd pay. Then tell me and I'll set something up! ;^D)

posted by ruffin at 3/23/2004 09:17:00 PM
Monday, March 22, 2004

TikiWiki : RFCWiki: "The Wiki-Syntax given in this section can be located anywhere in the text so that specific characters, words, or sentences can be emphasized. "

posted by ruffin at 3/22/2004 04:06:00 PM

Historically, Java has not been incorporated in free software projects like GNOME because the Java license and standards bodies value cross platform portability over giving developers the right to fork the Java platform at their whim.

That's interesting -- I've always known that C++ is "the" langauge for Linux (as well as Perl, Python, and some other "langs"), but hadn't really thought about why. The above quote is dealing with a post called, "Java, Mono, or C++, that's discussing where GNOME should take its development next.

Now that I think about the issues and the options, it becomes pretty easy to see why Linux stays C++. There are concerns over licensing of certain APIs in Mono vs. .NET to the point that there are two main chunks of Mono, one that can be cast off in a moment's notice if MS pursues the issue (rather, "cast off" into "pay to play" land). Java is Sun's baby, and I can understand why you wouldn't want to build GPL on top of (c) 2004 Sun. And so you're nearly left only with C++ as a safe, universally accepted and used option. The heirs apparent are all closed source or wholly owned options. That's not so kewl for OSS.

posted by ruffin at 3/22/2004 02:39:00 PM

Will someone please forward this /. post to Elliott Rusty Harold for me, please?

RMS is the classic schoolyard radical. He has all these social theories that he's never had to test in the real world, because he's spent his entire professional career subsisting on grant money.

Don't get me wrong -- there's nothing wrong with taking grant money. Just because something isn't economically sustainable, doesn't mean it's not worth doing. I just get very tired of the way the 'Free Software' folk insist that they've transcended the evils of software 'ownership'. Which they've never actually done. Their bills are paid for by revenues from the very businesses they are too pure to work for.


(In case you're wondering, I'm referring to this quick discussion I had on the Apple Java development list with someone who was explaining to people that they could still sell their software after GPL'ing it -- omitting that it'd also mean that anyone who wanted to sell their software could after the GPL release, with no compensation to the original coders whatsoever. What's worse, the conversation was what you could use with Java in place of the temporarily-suspect LGPL that would do what the LGPL was thought to be doing before -- specifically be used and released with commercial, closed-source code without losing rights to the closed source code as well. That's all essential context when somone, potentially wowed by your stature (not mine; Harold's in this case), is eating up your words without knowing better.

Hey, I like the guy's books, and refer people to them when I get a chance, but Open Source Software licensing of your well-earned intellectual property just doesn't make sense in every case.)

posted by ruffin at 3/22/2004 12:55:00 PM
Friday, March 19, 2004



In the latest "Software Development magazine's Agile Modeling newsletter" (don't have the first clue when/why/if I signed up for this email, but it's been interesting so far and I haven't starting trashing yet), Scott Ambert talks about when to and when not to document, using "Agile Modelling" as his context.

Here's what "Agile Modelling" is in brief, taken from his site:

Agile Modeling (AM) is a practice-based methodology for effective modeling and documentation of software-based systems. Simply put, Agile Modeling (AM) is a collection of values, principles, and practices for modeling software that can be applied on a software development project in an effective and light-weight manner.

I'd like to look at three of his points, the first a "when to document" and the next two are "when not to document" (bold is mine):

[A "when to document"]:
--To support communication with an external group.
It isn't always possible to colocate a development team, and it isn't always possible to have project stakeholders available at all times. When you need to work with an external group of people, you need to find ways to communicate with them. Shared documentation is often part of the solution -- along with occasional face-to-face discussions, teleconferencing, e-mail and collaborative tools -- but it should play only a supporting role. Documentation should be a last resort for communicating with an external group, because it's far too easy to misunderstand something that's been written.


[Two examples of "when to not document"]:
-- Your process says to create the document.
Although this isn't a problem with agile software processes, it can be with prescriptive processes.

-- You're specifying work for an internal group.
Documentation is one way to communicate, but it isn't the best. Instead, consider working sessions with the other group or the use of collaborative tools.


Let me clue in the ill-informed: You're always programming for the guy/gal who's going to replace you. Likely you don't who know this person is going to be. You can't assume they're already in your working group. You have to write code that "passes the bus test" ("in case you get hit by a bus tomorrow") -- or, as I like to phrase it, pass the less violent "techno-hermit test" ("in case you go all ludophobic and run for the hills without your laptop tomorrow"). Chances are after any programmer turns in their notice, those two weeks or so won't leave enough time to find a replacement and adequately effect a knowledge transfer. Nor is it very useful to shove the knowledge into an intermediary. It's best to have the code have docs with it as it's being created so that a new schmoe can get that knowledge without the original hacker there -- and it also has a near-magical effect of creating better code as well.

(Aside: I'm not asking for mad docs. You should have exactly as much documentation as necessary for a programmer with equal skills to pick up and understand what's going on in a general sense without looking at the code. This could very well mean just a collection of well written flowerboxes to objects and methods, but could be something a bit nicer, with pix of the interface, etc.)

Although the belief that programmers can be thought of as inhuman, interchangable resources, which is obviously not the case, is too widely held, the best programmers and programming groups do their best to deliver high-quality code and documentation that makes the impossibliity of having interchangable programmers as nearly the case as possible.

So let's sum up. You're always programming for an external group, meaning that documentation can safely -- and should! -- be part of your process. Nothing, and I mean nothing, hurts a project like a developer leaving and the new fellow or gal coming to work on a cyborg with the human-half missing. Except for hiring boneheaded coders in the first (or second) place.

Labels:


posted by ruffin at 3/19/2004 05:02:00 PM

Got a $20 Mac laptop shipped, and it's a bit old. Finally got my ethernet adapter this week and was all ready to start Macing around on the cheap. No luck at home; tried everything I could think of doing. So I brought the thing to work. Seems to do well (more lights come on on the adpater anyhow), but now I've got a Mac with OS 7.6.1 on it and no way to get on the net! I've got MS Office on there (will wipe soon, I suppose, after asking if that was part of the bargin), but no way to get networked 0's and 1's.

Welp, I grabbed WannaBe browser, which works with 7.6.1, and put the compressed install on a floppy. Got it into the Mac and, you guessed, it, no Stuffit Expander. I'm stuck! I've got a Mac with ethernet and no way to get any info over the connection. No ftp, no zmodem, nothing [that I know of]. Happy tenth birthday, Mr. Powerbook 520.

Hopefully this post on usenet, entitled "Re: -Question: MAC and StuffIT - Chicken before the egg situation", will help. But we've only got three floppies in the shop, and even if I track down software from 1997, it'll be a pain shuffling all the files around.

Argh.

posted by ruffin at 3/19/2004 11:51:00 AM
Thursday, March 18, 2004



When will companies start receiving tax breaks for letting employees work on open source projects? I'd thought about Sourceforge becoming its own non-profit, which might help, but I wonder if [sf.net's owner; I forget atm] would ever go for that.

Still, if it costs companies, say 10-30% less for employees to contribute to open source code than closed source, up to a certain amount, well, we're on to something, aren't we?

posted by ruffin at 3/18/2004 02:30:00 PM

The Center of Open Source & Government, or, as it'll likely be known in gov't circles, TCoOSaG.

posted by ruffin at 3/18/2004 02:21:00 PM



ifnull is nvl in Oracle.

posted by ruffin at 3/18/2004 01:46:00 PM



from here:
Jeffrey 'The Dude' Lebowski is a carefree, bowling-loving slacker in LA whose life is turned upside down when his house is broken into by a pair of gangsters who piss on his carpet. The gangsters have mistaken Lebowski for his namesake, a millionaire whose wife owes the gangsters a large sum of money. The Dude calls on Lebowski looking for compensation and finds himself drawn into a plot to get the millionaire's abducted daughter back from the mob...

But it's so much more than that.

And if you can't see how that connects to programming, well, heaven help you.

posted by ruffin at 3/18/2004 01:23:00 PM

"[F]ormer Microsoft top exec Brad Silverberg", way back in 5/2000, talks about MS's MO, Brilliant Ideas Run Through a Profit Maximization Machine. Apparently takes quite a bit of overhead.

it has to be so that its energy can be 95% focused externally. rather than 80% internally, as is the case today. the company is so wrapped up in its shorts that it can't get anything done. it has an incredible amount of iq yet is getting only pennies on the dollar -- so much iq is wasted. the best example i can think of of what can happen when people are motivated and externally focused is ie3... so much done is [in?] so little time by so few people.

Just think, if he's right about those numbers (which I'm sure were outta his arse, but still, let's us 'em), MS could be producing 475% more useful software than it's doing now if they'd just stop the "money at all costs" scheme. Though that is the American/capitalist way, isn't it? And before you quote me out of context when I run for president, ask me what I mean, okay?

posted by ruffin at 3/18/2004 12:47:00 PM



Hrm, as I use Oracle's EM more today (and it's not like this is the first day I've used it by any stretch), I wonder what I was smoking twenty minutes ago.

posted by ruffin at 3/18/2004 12:03:00 PM



Oracle ships with management tools built around Java 1.1.8, as far as I can tell. This is, for whatever it's worth, the same version you find on Mac OS 9-. At any rate, Oracle's clients install their own local version of a 1.1.8 JVM, and use it no matter what other JRE/JVM you might have installed elsewhere.

The interesting part is that the GUI, almost certainly in Swing, is pretty responsive -- right fast at times. That's not normally what you think about Java code (though I'd argue that, too, is a sterotype... and the rest of the blog will play into this a bit).

So let's take this example and take the thinking a bit too far based on n=1 and say that if people coded for Java 1.1.8 all around, we might very well have lots of fast, responsive, yet still complex desktop Java apps.

Now let's turn to Java 1.3-1.5. Netbeans is still pretty slow. Apps on OS X written in Java & Swing are noticibly much slower than similar apps written in Objective C. Java GUIs are slower in 1.3+ than on 1.1.x implementations, all other things equal, in my experience.

Now let's add that nearly every Windows desktop out there has a 1.1.4 JVM installed on it fresh from Dell, HP, or what-have-you.

Why aren't we seeing Java 1.1 apps?!!

Here's the quick answer -- People nearly always go after the latest and greatest regardless of the overall picture. It's really quite strange. I've seen emails go across the Apple Java Development mailing list saying things like, "Our boss says we *have* to have generics, so Macs and their 1.4.x JVM are right out for development."

What the heck?! These are things you've been happily *not* using for all of Java's existence, that older code still works in 1.5, yet you're moving the whole of your development over b/c you think a new, just out of beta feature is cool? Not only that, as the VM bloats, likewise does (I'll argue on the strength of what I've seen from Oracle, which is admittedly weak by itself) performance plummet. Sure, perhaps there are places where generics will help, but surely they're not rewriting current code to use the new feature, are they? "As if code rusted."

It really makes you wonder, but as Micheal Crichton's A Case of Need pointed out back in 1968, there's something distinctly American about always accepting bigger and newer as better. This problem is taken to the nth degree in computer programming, where you don't even have to hit the store to buy New & Improved Tide, you can download the alpha this minute.

(Yes, obviously newer versions of Java and other languages (.NET is such an improvement over VB6 I can't begin chronicling the improvement) have features and libraries that are awfully useful, but remember folks, they're all 0's and 1's. There's nothing you can do in Java 1.5 that you couldn't do [essentially] with 1.1.x if you put enough effort into it. And you'd be surprised how much you wouldn't bother copying.)

posted by ruffin at 3/18/2004 11:38:00 AM
Wednesday, March 17, 2004



Ignoring the really big open source players (Eclipse, Apache, Tomcat, Linux itself, GNOME, GIMP, etc), why is there open source? Partially because we finally figured out that if we all scratch our most pressing itch and share it with everyone else, we'll all be less itchy. It's less trouble to trade itch-satisfying code for nothing on the honor system than for every itch-filled developer to bother creating a shareware shingle and hope people shell out $20 to use those tools we've created mainly for ourselves in our spare time.

posted by ruffin at 3/17/2004 02:55:00 PM

Check if an Oracle trigger exists:

SELECT Count(*) into cnt FROM user_triggers
    WHERE trigger_name='FUTURENONROUTTASKS_TRG';

posted by ruffin at 3/17/2004 12:09:00 PM

Welp, with the release of SharpDevelop 0.99b, the #develop team has redeemed themselves a bit. I can't seem to get the IDE to use ProFont Windows (a good font for tiny letters) working, but that's a minor complaint now that autocomplete and the RAD form designer seem to be happy again.

I suppose the issue here is awfully poor product testing. Each milestone release of #dev that I touch seems, in my experience, to have some pretty major, show-stopping bugs. Though it's a beta now, sure, this sort of release/deluge with bugs/really release cycle needs to stop soon. Once the stopgap comes out, though, things usually behave a bit better.

About all it's lacking -- and what would matter from a VB6 veteran's position -- is the "auto-de-VB6-ifier" that VS.NET has. For example, typing keystrokes that literally would look like:

msgbox "smack"

... automatically becomes...

MsgBox("smack")

... which is proper VB.NET syntax (the first, though valid in VB6, absolutely isn't in VB.NET). A similar autodeVB6ifier example is the following literal code snippet:

while intCount < 5
    intCount = intCount + 1
wend


... gets its wend (a VB6 term) changed to End While automatically. That's nice.

VS.NET also implicitly imports the Microsoft.VisualBasic namespace, that includes convenience functions like "MsgBox" in the first place, so code going f/ VS.NEt to #dev won't work "out of the box". Kinda sneaky, I suppose.

Tried importing a decently large VS.NET solution using the "Import Project" function in the file menu, and things went fairly well. A reference to the MS Internet Control in some UserControls were dropped and I wasn't able to look at my UI objects in the #dev GUI RAD, but that's something to be expected, I suppose. I'd also like to see some IDE somewhere pick up a GUI RAD that uses some sort of layout management tool (you know, like this thing), but that's a personal beef, I suppose. Lack of IDE integration with Visual SourceSafe (so lost in the import and not there to hook back up at all) is a more universally applicable complaint for a schmoe considering a switch.

#dev also has a number of rough edges. I've had 0.99b seemingly lock up saving preferences, but it ended up being a screen painting bug. It takes 2.5x the RAM VS.NET does with fewer features [that I use, at the very least]. Most actions seem to take longer (open a file, etc) than they do in VS.NET. That said, autocomplete seems to finally be about as fast as VS.NET, and you can essentially make the two IDEs look about the same as each other as far as windows now, making the transition easier (and showing #dev has as good an instrument panel as VS.NET now).

You can essentially leave work one day using the VB6 IDE, have your infrastructure guys come in to uninstall it & install VS.NET, and come back the next day and not miss a beat. #dev is hardly there yet, nor is it necessarily trying to be. Right now, though, it seems to have become a passable .NET IDE -- both VB.NET & C# now -- again. We'll see once I start hooking it up to some large projects again and see if it chokes like it did before.

posted by ruffin at 3/17/2004 11:05:00 AM
Monday, March 15, 2004

PlugProxy 2.00:

PlugProxy version 2.00 is a free port forwarder/port debugger implementation released under the Gnu General Public License (GPL)

Now that would have been nice to have before making my first Java app, the now infamous-for-not-using-threads-at-all-and-seemingly-locking-up-without-warning L4Q2. Well, infamous to me, at any rate.

posted by ruffin at 3/15/2004 09:04:00 PM



There are five main pots where you can make cash with your software product, namely sales, maintenance, modules (add-ons), customizations, and conversions.

If you run things the way many mid-level, not-quite-consumer-level software companies do, you'll only want to sell each software package to a consumer once. Your maintenance agreement, in these cases, should both provide something of obvious value to your consumer (support, free upgrades, etc) and can quickly become the bulk of your revenue. To maximize profit, once you've earned a customer, keep them. Don't plan on reselling your same package and let a customer return to the market as an unrestricted free agent. MS takes an slightly alternative tack with Office, as the app is both relatively easy to use for its power users, who won't need support, and works well past its next release (Word 98 on my iMac still does a reasonably good job, for example). Their strategy ends up being a hybrid support/resell. Anyhow...

Conversions are great places to hit up some cash. Find someone using a competing product and get them bought into yours. POOF, instance services sell as you arrange to take their custom data and slap it into your system.

[unfinished]

posted by ruffin at 3/15/2004 01:54:00 PM

Hey, look folks! A piece of Mircosoft software being released under what's effectively the MIT license! Who says MS hates Open Source?!

posted by ruffin at 3/15/2004 11:56:00 AM
Saturday, March 13, 2004

So this is why I couldn't check hotmail yesterday:

Bragg said problem appeared to be affecting people who were trying to log on to the system. Those who were able to get on the system did not appear to be having problems sending and receiving e-mail, she said.

What this story is obviously missing is what this would have meaned had Microsoft's Passport service -- the part that lets you log into hotmail -- would have gained the acceptence MS wanted. That workday of inability to login to check free (ha, Freudian'd "fee mail" first) mail would have meant a day of no online purchases for many major companies.

posted by ruffin at 3/13/2004 02:43:00 PM



Boy, now even live stat updating for games (in this case, I'm trying to get ACC tourney scores) at espn.com is a pay-to-play feature. It wasn't but a few years ago that listening to games' radio broadcast team was free. Luckily I've got a radio I purchased from Radio Shack for $10 about six years ago that picks up TV broadcasts as well, and have found a station carrying the game.

The worst thing about digital transmits versus radio/TV broadcasts is the fact that now they've got us -- there's no more one-way (and that one-way was, of course, out, and to us) only stuff being released. And I think even the pay-to-play services are capitalizing on the fact that we're used to commercials, which means we're getting bitten twice, the same way cable seems to do now but, iirc, didn't so much when it was still novel (ie, you paid for cable and there were relatively few, if any on some stations, commercials).

posted by ruffin at 3/13/2004 02:16:00 PM

Slashdot | Halloween X Author Mike Anderer Speaks Out:

It's obvious to me, even though I'm not a Lawyer, that he gave it away in the middle of the interview...

'I could easily see IBM, HP, Sun, and many of the other large hardware players solving this problem tomorrow by settling the dispute with SCO and maybe even taking the entire code base and donating it into the public domain.'

The real goal here is to strip the GPL away from Linux. Once its free of the severe restrictions of the GPL, they can take it, and start work on MS-Linux.


Interesting, but I tend not to agree. My /. post...

Seriously, what's Linux got that MS wants so bad that they can't steal from BSD legally, like Apple did? Rotor [microsoft.com]'s already on FreeBSD, and I'm not sure what MS would want to steal from Linux other than that basic foundation for their CLI, other than brand marketability (which, I suppose, could be enough).
MS doesn't like competition, and that's why they'd help out SCO and have this fellow essentially threaten Red Hat out of business. They don't have to want to have Linux to want to see it gone.


Looks like I'm not alone in my thinking.

posted by ruffin at 3/13/2004 01:34:00 PM
Friday, March 12, 2004

As if...

Industry giants Hotmail and Yahoo! are considering charging for every message sent in an attempt to curb spam clogging the internet.

Yeah, that's it. They're thinking about charging to cut down spam. That's the ticket. Not to get revenue from legitimate users. OH no.

Personally I don't see that much spam originate from hotmail (or admit to, at any rate). How hard can it be to ensure someone doesn't send 3,000 messages from the same hotmail address in a day? Or even that one IP is sending out requests to three-hundred hotmail accounts to send out ten messages each? That's a decent MS hacker in a room for three weeks, tops, and that's tested and ready to go.

Now if they wanted to charge people that send mail that's reported as spam, I'd be all for it. Unf. that's a very hard thing to set up without killing SMTP as we know it. Back to the drawing board.

Anyhow, this sounds like an idea that skipped the impressively savvy MS programmers all together and hit the Profit Maximization Bureau straight out of a manager's mouth.

posted by ruffin at 3/12/2004 03:55:00 PM
Thursday, March 11, 2004

In Oracle, people seem to call on some wacky table called "dual" a lot. What the heck is it? Seemed to me to act like an internal temp table, which it turns out is essentially what it is...

Oracle: dual table:

Here's the excerpt from the February issue of Oracle Magazine (SENDMAIL section):

I created the DUAL table as an underlying object in the Oracle Data Dictionary. It was never meant to be seen itself, but instead used inside a view that was expected to be queried. The idea was that you could do a JOIN to the DUAL table and create two rows in the result for every one row in your table. Then, by using GROUP BY, the resulting join could be summarized to show the amount of storage for the DATA extent and for the INDEX extent(s). The name, DUAL, seemed apt for the process of creating a pair of rows from just one.
Chuck Weiss, Oracle


So when you see "dual", go with it, I guess. Hopefully some Oracle mastermind will clue me in a bit better later.

posted by ruffin at 3/11/2004 02:27:00 PM



Jumped into PL/SQL stored procedures today, with the "help" of the O'Reilly book Learning Oracle PL/SQL. Turns out the place I started in on the material had no less than ten errors in just more than as many pages (152-165). Nice stuff there. Made it a bit more difficult to learn my PL/SQL (or, as I like to call it, pluhskwill). Guess that's what you get for $10.59. (To the book's credit, there are only 12 errors in the rest of the 401 pg book, at least errors listed on its errata page. But wouldn't you know I'd hit the motherlode right off the bat...)

posted by ruffin at 3/11/2004 12:29:00 PM
Wednesday, March 10, 2004



Hotmail's web interface now apparently opens up new emails with javascript. That is, instead of having each subject a link from the inbox to a new URL, it now executes some fancy smancy javascript function to navigate.

What does this mean? It means, for some reason, I can't open the email up in tabs like I'm used to doing. Is that a big deal for IE users? Of course not; they don't have tabs.

Do I think MS is trying to punish Mozilla & MozDeriv users? I kinda doubt it, at least no worse than Tester1: "This breaks tabs in Moz" TestRunner1: "Don't care. Next?". But they sure as heck aren't worried about them one iota.

posted by ruffin at 3/10/2004 05:21:00 PM

winLAME is the Windows GUI frontend for LAME that I used to go from mp3 to wav (mp3towav mp32wav)

posted by ruffin at 3/10/2004 11:27:00 AM

See, this is exactly the kind of brilliance I was talking about earlier:

Townshend noticed that downloads from servers connected to the phone network via digital links, such as T-1s, could reach 56K bit/sec because they didn't have to undergo speed-sapping analog-to-digital conversions. Uploads required these conversions, limiting speeds to 33.6K bit/sec. He patented technology essential to making fast-down, slow-up modems.

"I said, 'This is an easy thing to do. I can just license this to people that are in the modem business. I don't have to start competing with them or set up my own distribution,'" Townshend says.

...

He wouldn't detail how much he has reaped in modem license fees over the years. But with analysts estimating that roughly 100 million 56K modems were sold in each of the past two years, figure he's getting at least $22 million a year in license fees based on a 22-cent fee per soft modem.

posted by ruffin at 3/10/2004 10:18:00 AM

Microsoft users decry no bang for big bucks

posted by ruffin at 3/10/2004 07:46:00 AM
Tuesday, March 09, 2004

Not sure how much money it'll net, but this is a good idea:

Want to make a few extra bucks from your wireless Internet access? Start-up LinSpot announced on Wednesday that their LinSpot 1.0 application for Mac OS X (news - web sites) allows you to do just that, with the company taking a 15 percent cut for services sold over your wireless network.

The best ideas are the ones that harness resources that are already out there, going untapped. Looks like a smart one.

posted by ruffin at 3/09/2004 10:29:00 PM

Ah, heck, maybe posting here will help get the page into Google...

.NET GridLayout project, aka "GridLayout Panel for .NET".

The .NET GridLayout project provides a very simply programmed .NET-compliant library bringing Java's concept of Layout Management to .NET, with emphasis on the GridLayout.

Took it from the blog entry from back when where I started writing up some GridLayout code. Really not horrible stuff, though still a little rough in some outlier cases.

I still haven't figured out how to make it work short of extending each object where I'd want it in a similar fashion (right now it's just for Panels), but eventually I suppose I'll find a way.

Okay, Google, spider it, dang it!

posted by ruffin at 3/09/2004 03:19:00 PM

Argh. What was so easy before isn't with ADO.NET & Windows'Forms. I'm trying to validate a simple textbox to ensure that it contains either an empty string or a nine digit number. Unfortunately when I'm changing from a valid numeric of any length to an empty string, the bound textbox is reverting back to that numeric value (which means that's what the DataSet is doing) when I try to go to the empty string. If there's a null in the database initially, that translates to an empty string, but not vice versa.

Anyhow, here's the answer:

Me.dsTemp.Tables(0).Rows(Me.cm.Position).Item("T_NAMESSN1") = DBNull.Value

Thanks to this link for getting me that last inch with DBNull.Value. Note that Me.cm is a module-level CurrencyManager, which is needed to keep track of all where your GUI's pointing to in your DataSet.

posted by ruffin at 3/09/2004 12:48:00 PM

Well, if this isn't a whoopdie-dang-doo...

FileMaker Pro 7 goes relational

Well it's about danged time. It really is sad that htis was *the* dbms on the Macintosh for so many years.

posted by ruffin at 3/09/2004 09:46:00 AM
Monday, March 08, 2004

Sorry for the Joel-spam. Another interesting quote:

Ask Joel - Pricing Products:

$29 on a consumer product is a money-losing proposition. The cost to acquire a software consumer is around $100. And consumers are only willing to pay around $30-$40 for software.
...
The most successful company at the $30-$40 price point is Intuit with Quicken and TurboTax. When Intuit sells you a copy of Quicken, they're going to make you register (perhaps using a rebate offer). Then they're going to try to sell you Turbo Tax every year. Then they're going to sell you preprinted checks for your inkjet printer. Then they're going to charge you $10 for state tax returns. Over the lifetime of a customer they'll make a couple of hundred dollars, so acquiring a customer for $100 is worth it. That's why Intuit can do consumer and you can't: they're really a stationary company!


That's an interesting take. Obviously not true (Ultra-Edit seems to do okay), but interesting.

posted by ruffin at 3/08/2004 03:08:00 PM

Joel on Software:

But I think that if you try to ignore the fact that millions of programmers around the world have learned lisp and don't prefer to use it, you're in the land of morbid cognitive dissonance.

posted by ruffin at 3/08/2004 03:04:00 PM



How do you add VB.NET syntax highlighting to VIm? The built-in help does a poor job of describing one somewhat convoluted way. Here's the quick and dirty one. I'm going to assume you're on Windows, if only b/c the VIm help assumes you're on *NIX.

Go to the dir where you've installed VIm -- in my case D:\Program Files\vim\vim62. Inside that dir is a file called filetype.vim. Open it. Search for ".bas" (so that's hitting the "/" key to search, followed by the expression "\.bas").

Copy the line for *.bas files and replace .bas with .vb. That's it.

" BASIC or Visual Basic
au BufNewFile,BufRead *.vb call FTVB("basic")
au BufNewFile,BufRead *.bas call FTVB("basic")


Note that when you install a new version, it'll have its own filetype.vim file and this change won't be seen. That's the advantage of using the VIm help's method.

That's somewhat cheating -- note that all we've really done is to add the VB6 syntax package to .vb files -- but that's a great, easy place to start. It's relatively easy to start hacking on the vb6 file to add vb.net jive if you really get the inkling, and then you can try creating a brand new syntax file using the help in VIm.

But yeah, that's the quickest way to get useful VB.NET highlighting in VIm.

posted by ruffin at 3/08/2004 11:47:00 AM



Also wanted to follow up on threading -- threading itself isn't a big deal, but there is one more catch when adding Windows.Forms to the mix. If you get an error like:

An unhandled exception of type 'System.ArgumentException' occurred in system.windows.forms.dll

Additional information: Controls created on one thread cannot be parented to a control on a different thread.


... you need to read this technote at Microsoft. Better do it quickly, though; Microsoft has a bad habit of changing URLs.

posted by ruffin at 3/08/2004 10:57:00 AM



I've mentioned before that I recommend keeping debugging information around. At the same time, I'm not a big fan of code like the following at all.

Console.WriteLine(strSql)

strErrLocation = "before cmdTemp's second getCommand call"

cmdTemp = Me.getCommand(strSql)

strErrLocation = "after getCommand for long sql"

dreadParcelsAndFlags = cmdTemp.ExecuteReader

strErrLocation = "after long execute reader"

dsReturn = _
mdlEntryPageCustomDatasets.getFlagEditDataset(colFlags, _
dreadParcelsAndFlags)

strErrLocation = "before dreadParcels disposal"

dreadParcelsAndFlags.Dispose()
cmdTemp.Dispose()


I'm not talking about the haphazard, stream-of-consciousness remarks describing location either, though those could be changed. What I dislike is that my IDE -- not a text editor, mind you, my *IDE*; I'd obviously forgive a text editor -- makes me put this sort of dscription inline with the rest of the code.

VS.NET is making strides with its ability to collapse blocks of comments with the click of a checkbox, but we could use a little more flexibility with the way the tools handle inline debugging information/error trapping code as well.

posted by ruffin at 3/08/2004 10:52:00 AM
Friday, March 05, 2004

It's been a while since I've visited DotNetJunkies and slammed their site, but I certainly haven't missed my chance. They really do a good job showing what a true .NET "junkie" can expect -- the menubar on the top of the site isn't dynamic nor formatted in Firebird and the site search function doesn't even submit in my preferred browser.

Now, in IE, it appears that the menubar isn't dynamic other than an underline that appears on hover, but is formatted in a reasonable color there. Search, perhaps not surprisingly, works as well.

Guys, you have to buy quality third-party .NET controls or you might as well be delivering your content in a stand-alone app for all the xplat you're going to get.

posted by ruffin at 3/05/2004 03:43:00 PM

ATI Developer

posted by ruffin at 3/05/2004 03:30:00 PM

Hopefully an answer for the dreaded

If no exception handling is implemented, the following error message is displayed:
An unhandled exception of type 'System.ArgumentException' occurred in system.windows.forms.dll


... message.

posted by ruffin at 3/05/2004 02:54:00 PM

Can't Anyone Write Good SQL These Days?:

We are misusing SQL [in JDBC calls specifically] and pinning the blame for the resulting poor performance on the language. Worse, we are using these faulty assumptions, at least in part, as an excuse to replace a solid, proven technology like SQL with persistence systems like JDO and EJB.

posted by ruffin at 3/05/2004 12:44:00 PM



How difficult is threading in VB.NET? Not difficult at all if you understand events. For some reason the Threading examples on the net seem a bit more convoluted than they need to be. Here's all you need to know.

First, put a few convenience methods into your long task, as represented by the loop counting down in the below class, LongTask, centered around creating and destroying threads. Note that you'll need to include a module-level ref to your thread (in this case, myThread; not sure why it's Public in my example; that's probably silly).

Public Class LongTask

    Event allDone(ByVal strTemp As String)
    Public myThread As System.Threading.Thread
    Private lngUpperBound As Long = 10000

    Public Sub startMeUp()

        Me.myThread = _
            New System.Threading.Thread(AddressOf Me.countDown)
        Me.lngUpperBound = 99999
        Me.myThread.Start()

    End Sub

    Public Sub countDown()
        Dim i As Long

        For i = Me.lngUpperBound To 1 Step -1
            Console.WriteLine(i)
        Next

        RaiseEvent allDone("Doneige")
    End Sub

    Public Sub killThread()
        Me.myThread.Abort()
    End Sub
End Class


Note how lngUpperBound is changed. This is one method [albeit sloppy] to pass vars to your thread. If you've used VB6 much, you're used to this backdoor passing, for better or for worse.

Because the Thread we created contains a method that raises an event, all we need to do is add an event handler in a parent object to capture when that event is raised -- in other words, add an event handler to listen to the thread's end and we're essentially done.

To do this in a simplest-case fashion, create a Form called Form1 and add three Buttons, Button1, Button2, and Button3. Then slap in this jive:

Public Class Form1
    Inherits System.Windows.Forms.Form

    Public myTask As LongTask

    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load

        Me.myTask = New LongTask
        AddHandler Me.myTask.allDone, AddressOf Me.showMsg
    End Sub

    Private Sub showMsg(ByVal strMsg As String)
        MsgBox("Form1 message relay: " & strMsg)
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click

        Me.myTask.startMeUp()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button2.Click

        If Me.BackColor.Equals(System.Drawing.Color.LightSkyBlue) Then
            Me.BackColor = System.Drawing.Color.LightGreen
        Else
            Me.BackColor = System.Drawing.Color.LightSkyBlue
        End If
    End Sub

    Private Sub Button3_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button3.Click

        Me.myTask.killThread()
    End Sub
End Class


The end. Button1 starts the thread, Button2 shows that you can perform operations as the thread runs, and Button3 is your cancel button.

So there you have it, how to add multhreading with a cancel button to your VB.NET application.

posted by ruffin at 3/05/2004 10:43:00 AM
Thursday, March 04, 2004



Another wonderful Oracle Trick for Oracle Newbies from freakinname:

It seems there are three ways to start grabbing table names (as well as columns in the table, etc) from Oracle.

select distinct table_name from user_tab_columns where table_name like '%' order by table_name
select distinct table_name from DBA_TAB_COLUMNS where table_name like '%' order by table_name
select distinct table_name from ALL_TAB_COLUMNS where table_name like '%' order by table_name


user_tab_columns naturally limits to the user, etc. DBA & ALL are giving me supersets of that so far, and seem to have the same tables in them as each other right now. Tables in ALL that aren't in USER are things like:

ALL$OLAP1_CUBES
ALL$OLAP2UCATALOGS
ALL$OLAP2UCATALOG_ENTITY_USES
ALL$OLAP2UCUBES
ALL$OLAP2UCUBE_DIM_USES


eht-see eht-see.

Anyhow, using these tables in Oracle does the same thing you can do with the master database in SQL Server when you'd like to programmatically get to column names.

posted by ruffin at 3/04/2004 05:00:00 PM

How to upload to SourceForge once you've got a project?

Instructions for the "File Release System (FRS)" are here, but it's actually *very* easy. FTP in as anonymous to upload.sourceforge.net. Change dirs on the upload.sourceforge.net directory to the "incoming" folder and drop off your file. Then nav in your browser to your project's admin page and "claim your file". Tada. Not cvs'd, etc, but much much easier to learn to use.

posted by ruffin at 3/04/2004 03:45:00 PM

There are easier ways of getting your html pages to your SourceForge project's site from Windows than what's described in the sf.net FAQ. In fact, the best way I've found to do it from Windows is to use WinSCP, another project at SourceForge, no less. SCP to shell.sourceforge.net and navigate to your project's html home dir (example from sf docs: /home/groups/a/al/alexandria/htdocs). Then just move it all over like you're ftp'n.

posted by ruffin at 3/04/2004 03:25:00 PM

More on the same subject: Adding References to Gac'd Assemblies

posted by ruffin at 3/04/2004 01:30:00 PM

Used to be your could run regsvr32 and have a dll show up across your system and, to the point today, in the VB6 IDE.

As I discovered today, and as this blog describes in some detail, it's a bit more difficult nowadays.

6.) Now even after doing all this and having your assembly in GAC you shall not be able to see it when you try to open add referenes... For that there is another trick... See the point is Add Reference is a IDE specific stuff and so you need to alter those setting... for that reason you need to create certain keys in the Registry
7.)To display your assembly in the Add Reference dialog box, you can add a registry key, such as the following, which points to the location of the assembly
[HKEY_CURRENT_USER\SOFTWARE\Microsoft\.NETFramework\AssemblyFolders\Debug]@= 'C:\\MyProjects\\ClassLibrary1\\Bin\\Debug\\' where Debug is nothing but the name of the folder in which the assemblies resides. You will not file any enteries here in case you have never tempered this area... so create this whole structure in the registry...

posted by ruffin at 3/04/2004 01:27:00 PM



"In theory, theory and practice are the same. But in practice, they never are."
-- Pat Johnson, "old boss" of Jesse Liberty, who wrote "Programming C#" (quote quoted on page 432)

posted by ruffin at 3/04/2004 12:30:00 PM

NewsWatcher for OS 7+ is now found at John Norstad's Crufty Old Stuff.

posted by ruffin at 3/04/2004 11:56:00 AM

<< Older | Newer >>


Support freedom
All posts can be accessed here:


Just the last year o' posts:

URLs I want to remember:
* Atari 2600 programming on your Mac
* joel on software (tip pt)
* Professional links: resume, github, paltry StackOverflow * Regular Expression Introduction (copy)
* The hex editor whose name I forget
* JSONLint to pretty-ify JSON
* Using CommonDialog in VB 6 * Free zip utils
* git repo mapped drive setup * Regex Tester
* Read the bits about the zone * Find column in sql server db by name
* Giant ASCII Textifier in Stick Figures (in Ivrit) * Quick intro to Javascript
* Don't [over-]sweat "micro-optimization" * Parsing str's in VB6
* .ToString("yyyy-MM-dd HH:mm:ss.fff", CultureInfo.InvariantCulture); (src) * Break on a Lenovo T430: Fn+Alt+B
email if ya gotta, RSS if ya wanna RSS, (?_?), ยข, & ? if you're keypadless


Powered by Blogger etree.org Curmudgeon Gamer badge
The postings on this site are [usually] my own and do not necessarily reflect the views of any employer, past or present, or other entity.