Ryan Lowe has reached the end of his rope on the (lack of) security in MS products. To be fair, newer revs of Outlook (etc) have most or all of the dangerous features off, and most people will never turn them back on. The main problem is the legacy of win98, winME - and even win95! - clients out there with dated software. Too many of these people are out there, running on DSL or cable modems, always on, and apparently always infected. I cut MS no slack on this stuff. It wasn't necessarily clear that these services were a problem when 95 shipped; but it should have been by the time 98 went out, and clearly was by the time ME shipped. And yet here we are, still in hackers paradise. Backwards compatibility is a big deal, I know - we try very hard to achieve as much of it as we can in Cincom Smalltalk releases - but for some issues, there are overriding concerns.
The Register points out that many, many office workers don't think that they have any role to play in security at all:
Two-thirds of the 1,000 people quizzed by market researchers TNS in January admit they are not aware of even the most basic virus prevention measures. Meanwhile a third of those polled in the Novell-sponsored study said they are too busy to check their emails before opening them.
Depressingly, nine in ten of the workers quizzed believe that have no part to play in preventing the spread of viruses, preferring to leave responsibility to "their IT department, Microsoft or the government".
This was in a survey of UK office workers; the rest of the report is even more depressing...
Rich has a few interesting thoughts on the way promotion and technical advancement work in large companies.
Everything you need to know about XML 1.1 can be summed up in two rules:
- Don't use it.
- (For experts only) If you speak Mongolian, Yi, Cambodian, Amharic, Dhivehi, Burmese or a very few other languages and you want to write your markup (not your text but your markup) in these languages, then you can set the version attribute of the XML declaration to 1.1. Otherwise, refer to rule 1.
Well, regardless of what people should use, rest assured that they will use 1.1. Now, we don't have a 1.1 parser in VW at this point (we likely will by the next release). In the meantime, after a couple of small hacks, BottomFeeder handles Mark's feed just fine. I've posted the update to the dev stream; I may back it down to the regular stream if I don't see any issues with it
This is one of the really nifty things about using Smalltalk, actually - anyone use Java or .NET, and using the shipping XML libraries, is kind of up the creek - you can't easily make small changes to these libraries, and even subclassing could be problematic (I have no idea if critical classes in these frameworks are declared final, but they could be). Meanwhile, I was able to deal with this in a work-around kind of way in minutes - and I'm no parser expert....
The Industrial Light and Magic folks won't be sleeping much if they have to stick with this schedule. Time to get that caffeine drip going!
One of the people now running a blog on this site asked me about improving the look and feel of the pages. I'll admit, I'm no whiz when it comes to laying out web pages - I settled on what's here now more out of exasperation than anything else. The upshot of the request was for a few new, convenient API's for getting content from the back end - allowing for a more flexible layout. That's where the power of Smalltalk helped me out again. I fired up the test server here, wrote some new code, tested it out (against the running test server) - and then versioned it off. Once I did that, I posted two things to the server
- The incremental changes I just made
- The new version of the loadable components
I didn't have to restart the server - it has a convenient patch interface. So I loaded up the patch, and now the new interfaces are available for use. No fuss, no muss, no restarts. That's what I love about Smalltalk
Vassili Bykov explains why seemingly "little things" can't always be fixed right now - no matter how small you think the change is, there's almost always a snowballing effect of related changes that have to be made.
This is actually one of the constant tensions that exist between product management and engineering. In my role as PM, I want to see the product become easier to use and more consistent. This can often lead to my asking for "a simple tool" over here, or a "cleaner interface" over there. What I'm not always seeing (until it's pointed out!) is the downstream effect of those "simple" requests.
This is also where larger projects - such as Pollock are born. In order to really fix the current UI, it's not enough to simply tweak and tune - a general overhaul is called for. That general overhaul has its own downstream effects - all the tools have to be changed to match the new UI.
I've always wondered about the efficacy of team building exercises; this morning, I see that Frank Patrick has some thoughts on the subject as well. This is something project managers should definitely pay attention to...
This post I made yesterday generated a couple of comments, one worrying that I'd end up with a less readable site. That's certainly not the goal. The issue with the current layout is one of screen turf - there's way too much of it taken up by the top of the page search forms, and the the links at the bottom are not laid out at all well. In any case, it's all an experiment - we'll see what happens.
I've just posted a BottomFeeder update that cleans the UI up. The button bar is gone; all of those options exist in the View menu anyway. The feed icon is banished from the main ui, instead living in the Feed Properties dialog. That also eliminates a background process in the main UI, the one that fetched the image. You get notified of alerts (assuming you've set any) in a part of the status bar now. With all of those cleanups, I moved the rest of the UI to take up all the screen turf - no more wasted space at the top. If you grab this as a dev update, you should not load it on the fly; it's best to restart after grabbing it
I spotted this complaint over on Dave Winer's blog:
"...programs will express compatibility in terms of products, not formats. Then you'd have to use one aggregator to read BBC feeds, for example, and another to read SF Chronicle feeds." Well I guess we didn't have to wait too long for that to happen.
Funny - I have Evan's Atom Feed (and boy, does it have a lot of errors!) and Dave's RSS Feed in BottomFeeder - no need to use a different application to read both. This, even though I've posted extensively on what a huge waste of time I think Atom is. The bottom line is, it doesn't really matter what I think. My users are going to want to read Atom feeds, so I implemented support back when the spec was at 0.2. I now support 0.2 and 0.3. Looks to me like Dave needs a better aggregator....
Patrick Logan spots a gathering storm in the world of static languages:
When a language is formed by piling feature on top of feature, you run out of gas sooner rather than later. Such is the case with "partial classes". Could one have foreseen the desire for "partial methods"?
What do you do when your language is not dynamic enough, but the next feature may be the straw that breaks the camel's back? You resort to code generators.
Mind you, the developers living in this world think all of this is great - they have manifest typing, so the larding on of tons of cruft - cruft that makes it incrementally harder to actually understand written code - is seen as a good thing. What these people need is a few months of Smalltalk, Python, or Ruby immersion...
There is clearly a performance aspect to it. One possible solution would be to say, "There are no value types. All types are heap allocated. Now we have representational identity, and so we're done, right?" Except it performs like crap. We know that from Smalltalk systems that did it that way, so something better is needed.
Anders solution - make the language immensely complex for the truly small number of cases where any of this matters. Yes, there are people doing maths in software where they need that level of performance on a day to day basis. And no, most people aren't part of that club. For most people, applications look like this:
- Pull data from the data store
- Massage data for screen display
- Allow user to modify data as needed
- Push data back into data store
Like it or not, the vast majority of developers are working on an application that looks, in rough terms, like that. Most of us aren't doing matrix manipulations or fast fourier transforms - but to hear Anders speak of it, we have to optimize for those few because... well, because he hasn't thought that deeply about the problem, that's why. When we do come across parts of our system that we have to optimize for those cases, we can call out to C (etc) - and that work-around is typically a much lower effort than having to deal with the world Anders wants us to live in. I know there are applications that have such strict optimization needs that this strategy is impractical - and I also know that such applications are not what most of us are building.
Here's another thing - as Patrick says on his blog, 64 bit implementations will erode the number of cases where that stuff matters even more - so the development time suckage of .NET and Java will persist, long after the supposed "need" for it has expired. Bonus question - I wonder when the last time guys like Hejlsberg or Gosling actually had to work on a real project for a real customer, so that they could see what they've wrought? I'd guess it's been a long, long time. Actually, that topic is worthy of a post of its own - developers who have been cut off from end users too long, and how easy it is for them to wander off the reservation...
Don Park comes up with a great phrase in the midst of a post on XML 1.1:
Another reason for not using XML 1.1 now is that next version of XML is likely to arrive before XML 1.1 is widely adopted. Why? Because engineers are like blacksmiths without a hobby.
Don has a definite way with the turn of a phrase....
Ted Leung discusses fervor in politics. It's funny, but I keep seeing marketing in many of these political posts. Like this:
You can do it -- if you can change someone's mind. But (ideally) you can't force them to change their mind, you actually have to persuade them. Persuasion is tough. There are different components to persuasion. There's the idea you are trying to push. That better look good in the other person's mind. Then there's the persuader. You can have a good idea, but if people don't trust you, you may not be able to persuade them. There's also relevance. You may have a perfectly good idea, and be trustworthy, but your idea may be irrelevant to the hearer. They just won't care. Many people believe that they know how to persuade, when in reality they only know how to give orders.
That's something that all Smalltalkers - and Lispers - should read and ponder. A lot. One of the problems we have in making our case for Smalltalk (and I've seen the same problem, possibly worse from Lisp people) is arrogance. We are so sure that we have a better answer than (fill in today's language of choice) that we tick people off. Instead of presenting what we have, and letting them start asking "how did you do that?", we insist on running down the other technology. The problem with that strategy is that it puts many developers right on the defensive. They chose to use that technology; by denigrating it so loudly, we implicitly impugn their intelligence. That's no way to convince; in fact, it's a sure way to get people walking out of the room.
That's one of the reasons I have started using BottomFeeder and this blog as examples - it's easier to point to fast turn around and ease of development by example than it is to do so by tearing down (Java, .NET, etc). Here's another interesting thing Ted quotes:
Imagine if a mailing list had to issue a formal opinion on the issues discussed, and lurkers got a vote. The high-flow posters would complain that the lurkers votes would not reflect the actual discussion that took place, merely the aggregate opinions of the group, and yet that is how the primaries work. Talking loudest or most or even best means nothing
One of the hardest things to remember is that most of the people you want to influence won't necessarily be asking questions. They'll be sitting back, and listening. And maybe not listening all that hard either - many of them will come away remembering more about the tone and attitude of the conversation - so if you come across as condescending, it'll leave a bad taste in their mouths. The tragedy is, you might feel like you walked away from a long conversation about the efficacy of manifest typing having won a few points - and never realize that lots of people walked away from it thinking "jerk". The longer I stay in this business, the more I realize that Alan is exactly right when he says that the person who leaves an argument without losing his temper wins
Vassili created a nice CSS for the blog, and I've gone ahead and added code support for the kinds of queries necessary to easily (and generically) support this. I'll likely try swapping my page out for the CSS page sometime this evening, and see how reactions go. If it all works out, I'll start making it possible for the userblogs to select from a small range of styles, or create their own and submit it.
With some help from Sames, I now have the entire BottomFeeder obeying the user's text size settings - including the menus, which previously ignored them. This makes the whole thing much more consistent.
Update - The html pane scales up and down with changes in text size as well. To get that work, you'll need to grab the updated Twoflower (html) as well as the updated BottomFeeder. Many thanks to Holger Kleinsorgen for making this possible!
Anyway, if the file system itself had a concept of metadata, there are whole rafts of ways that metadata could get added to files without having users enter data into forms. Another one I talked about in the interview. What about if you had a QuarkXpress document. And you imported a picture. What if the QuarkXPress document had the words "Patrick's 10th Birthday." Wouldn't the file system be able to assume that "Patrick's 10th Birthday" could be associated with the file named DSCN6133.jpg that I had just imported? Isn't that metadata? Couldn't that be used to improve search? Shouldn't the photo come up now on searches for "Patrick's Birthday Photo?"
The problem with this scenario is the cases where it works badly. You could easily end up with files that have bogus metadata - and then have searches of your file system bring up some of the same crap that comes up on many Google searches. I have very, very little faith in auto-generated metadata - it's too easy to have tons of auto-crap
Here's Scoble on a Trippi (former Dean campaign manager) speech, wherein Trippi blames the media for much of what happened to the campaign. That's amusing. Why? Because that sort of spin is what happens in the media. Journalists are looking to simplify and "boil down" a story. Recall what they did to Dan Quayle, for instance. The same thing happens with the tech industry stories - look at the coverage of Oracle's attempt to buy PeopleSoft, and you'll see a heavy focus on Ellison - because that's a way to simplify the story. This is just the way it is, and it's hardly unique to politics or the Dean campaign. You can see it even in word choice - companies try really hard to make a name common, but then cry foul when said term becomes commoditized (by journalists) into overall usage (think xerox).
The interesting part is how and where blogs play a role in this. In politics, blogs didn't help Dean shape the general view of him - because most of the electorate isn't reading blogs. On the other hand, I think blogs such as Scoble's are doing a fair amount of good for MS - because a meaningful percentage of the developer community is reading blogs - in particular, many of the trade press journalists are reading blogs. The difference with the political world is pretty clear here - Dan Gillmor reads blogs, and writes one himself - the pundits you see on the Sunday shows almost certainly do not. That might change, over time - Virginia Postrel and Andrew Sullivan are examples of pundit blogging - but it's not (yet) enough to influence the voices on tv.
Panopticon Central has a good article on performance tuning - I especially liked this, and it rings very true:
Rule #1: Don't assume you know anything.
In the immortal words of Pogo, We have met the enemy, and he is us. Your biggest enemy in dealing with performance is by far all the little assumptions about your application you carry around inside your head. Because you designed the code, because you've worked on the operating system for years, because you did well in your college CS classes, you're tempted to believe that you understand how your application works. Well, you don't. You understand how it's supposed to work. Unfortunately, performance work deals with how things actually work, which in many cases is completely different. Bugs, design shortcuts and unforeseen cases can all cause computer systems to behave (and execute code) in unexpected, surprising ways. If you want to get anywhere with performance, you must continuously test and re-test all assumptions you have: about the system, about your components, about your code. If you're content to assume you know what's going on and never bother to prove yyou know what's going on, start getting used to saying the following phrase: I don't know what's wrong It's supposed to be fast!
That's something many of us forget - we know far less about even our own code than we think we do (BottomFeeder and the blog server have demonstrated that to me time and time again!
Another thing that came to me while reading this is this - release early and often. I don't care how good your benchmarks are, actual usage by real users will teach you a lot - far more than benchmarks ever will
With the latest stylistic change to this blog, the server needs a fair amount of weeding - there's tons of 'relic' code lying around that needs to be cleaned out. That will likely occupy me for awhile, as any such "spring cleaning" will need good testing before deployment
Every so often, Scoble posts about IE, or asks for comments on it. Well, I've got one. With the help of a colleague, I've got a nice looking site now thanks to CSS. We have had a few issues though, and have had to add some ugly hacks specific to IE - because the IE team refuses to do a compliant CSS implementation. Come on guys - are you telling me that the mighty MS can't keep up with the guys doing Opera, or Mozilla? I'd really, really like it if MS acted responsibly about this. Most people use IE, because way back when - when IE 4 and NS 4 were battling - IE was better. Enough resting on your laurels - get the heck back to work!
The Ottawa Carleton Smalltalk Users Group will be holding a general meeting on Feb 25, 2004.
Smalltalk in Eclipse: How to build your favorite language IDE
Feb 25, 2004, 7:00 pm
The Eclipse IDE is definitely not just for Java. This talk will describe the creation of a Smalltalk IDE on the eclipse platform and some of the architectural decisions that went into building it. We will explore the levels of integration that a language IDE implementor should consider when bringing their language to the eclipse platform. If you have a favorite language and you have been thinking about writing an eclipse plug-in to support it, this talk is for you.
The meeting will be held in Room 5115, Herzberg Laboratories (building 13 on the map ). Pay-parking is available in Lot 1, 2, and parking meters can be found along University Drive. Free parking is available across Bronson Avenue opposite Lot 5. Please RSVP to firstname.lastname@example.org if you plan to attend.
Visit the Ottawa Carleton Smalltalk Users Group web site at http://smalltalk.ottawa.on.ca for more details on the group.
The Squeak guys have another interesting looking service deployed - a Monticello based, web accessible source code control system. I can't link to the Seaside blog item directly, due to the fact that SmallBlog doesn't actually provide item links....
Arcterex explains why so many people have Windows Update in the off position:
A font update that may cause me to restart my computer. What the hell? Do they attach that warning to every update these days, or does repacing a font seriously mean that I have to reboot.
Under linux you reboot when you change hardware, update the kernel, or something is completely f***** up and it's causing a hang (normally driver issues, doesn't happen that often, but it does happen).
Under windows you reboot when you change a font. <shaking head> There's that old windows joke about "you moved the mouse, please reboot to continue"... suddenly it's not so funny anymore.
Heck, quitting and updating AIM yesterday resulted in a plea by the installer to restart Windows. I can understand wantiing to restart the app; no problem there. But Windows? Sheesh...
If you have been using the dev stream updates to BottomFeeder, then you may have seen a toolbar related problem. I've had a few people report problems with mode switching - i.e., once they are in "all new" or "alerts" view, they can't switch back to "all". I have a few thoughts on what might be causing this, but nothing definite. In the meantime, here's a work-around. If toolbar options become unresponsive, then open settings, and change the look policy. Then change it back to your preferred policy - that should clear the issue.
Sci Fi Fans have a new series to watch - the new Battlestar Galactica is going forward. The plot looked loads better than the original - I just hope that they get a reasonable effects budget.
As much as I think the Atom effort is a waste, it's going forward, and I support Atom - both the older 0.2, and the newer 0.3 - in BottomFeeder. Dave's torqued because Google (Blogger) is defaulting to Atom feeds now. I think it's a mistake; Atom isn't done, and supporting it this early will simply fragment Atom as effectively as RSS has been fragmented (and we all know how much fun that's been!). Still, the key thing is end users of aggregators - and they don't care. What they want is to be able to subscribe to content, and most aggregators either already support RSS and Atom, or will soon. Google can ship Atom, or RSS, or both - and people won't care so long as they can read the results.
Dare expands on the issues with metadata, and cites a few interesting sources on the problem. Good stuff
Paul Strassman has some interesting conclusions about outsourcing:
- My 1995 assertion that "outsourcing is a game for losers" still stood up in 2002, even though in this case I don't propose to connect the outsourcing of IT with negative profitability. The current findings offer a managerial perspective on the economics of outsourcing.
- My calculations indicate that only 26% of the low profitability results are attributable to outsourcing. Companies already failing for other reasons will tend to outsource increasing amounts of work, thus diminishing their value-added.
- My findings don't support the frequent predictions that U.S. firms will tend to outsource in order to increase profits and thus eventually leave us with a "hollow" economy
It's not that outsourcing causes problems - it's that companies in trouble run to outsource - and such companies, already having process issues, manage the outsourcing as well as they manage everything else (which is to say, not well). Interesting article
Smalltalk Solutions 2004 Is Fast Approaching,
So Mark Your Calendars Now!
When: May 3-5, 2004
Where: Crowne Plaza Seattle
Register Now for Smalltalk Solutions 2004!
To register for Smalltalk Solutions 2004, please visit www.smalltalksolutions.com.
Smalltalk Solutions, sponsored by the Smalltalk Industry Council (STIC), is the premier trade show and conference for Smalltalk users, developers and enthusiasts. This three-day conference and exhibit program will bring together hundreds of buyers and sellers of Smalltalk products and services, while updating the industry on the latest in Smalltalk technologies.
Conference program highlights include:
Key Smalltalk technology exhibitors, including Cincom, GemStone, IBM, Knowledge Systems Corporation, Mission Software, and Silvermark.
Keynote speeches by Avi Bryant of Beta4.com on continuation-based web frameworks, and Lars Bak of OOVM on Smalltalk for extremely small embedded systems. Plus a third keynote that will be announced shortly!
For information regarding sponsorship or to exhibit at the show, please contact Joy Murray or call 1-800-2CINCOM.
For information on participating in the technical program, please contact Alan Knight.
Smalltalk Industry Council
For information on the Smalltalk Industry Council, please contact Allen Davis, Chairman, STIC
For hotel reservations at the Crowne Plaza Seattle, visit www.smalltalksolutions.com/hotel/hotel or call 206-464-1980.
The server got hit with its first dose of comment spam just now - likely though the comment API, but I'll have to take a look at the log files to be sure....
Update: It turns out I was wrong - both were entered via the web form, and both from the same IP address. Which likely means some moron actually went to the trouble to spam two older posts by hand.
So I'm just getting started with my morning catch up on news and email when boom - Eudora up and dies on me. I restart, and it offers to rebuild my inbox index. This is something you have to do, but - if you haven't compacted your mailboxes recently - sucks. I had 2480 messages in inbox - pretty much everything since the last time I compacted. Here's the best part - Eudora, which has some decent filtering capability, won't re-run filtering on inbox. Gah! There went an hour, resorting messages. Grrrrr
The marketing group here has decided that an RSS feed for the press releases would be a good thing. So, I've created a small snippet of Smalltalk code to do that this morning - all I need to do now is get it deployed by the IT guys.
Mark Bernstein comments on the ongoing Atom/RSS silliness, and points to something new:
Have you noticed how little new syndication software is showing up lately?
It's been my contention all along that Atom is nothing but a tax on aggregator developers; it serves no useful purpose as a syndication format, but does manage to create tons of extra work (with more to come - the spec is only 0.3, and people are implementing). Wait awhile, and we'll have as many versions of Atom - and of the Atom API - as we have of RSS. As crappy as the Blogger and MetaWebLog API are (passwords in the clear) - at least there are only two of them....
Resilient releases a preview of their embedded development kit
According to the application filed by Microsoft, the patent involves "systems, methods and data structures for encompassing scripts written in one or more scripting languages in a single file."
"The scripts of a computer system are organized into a single file using Extensible Language Markup (XML)," Microsoft's patent document continues.
The document explained that each script is delimited by a file element and the script's instructions are delimited by a code element within each file element. When a script is executed, the file is analyzed to create a list of script names or functional descriptions of the scripts.
One or more scripts are selected and the code for those scripts is extracted from the file and executed by the appropriate scripting process, the document said. The scripting process that executes a particular script is identified from the scripting extension attribute that is included in the XML format of the file.
Maybe these yahoos should look at the XML based fileouts that VisualWorks has been using since 1999. Just look at the bozo example here - scroll all the way down. Now go file some VW code out.....
BC4J comments on the efficacy of visual cues - pointing out that the 3.5" disk icon is meaningless to his child :) Perhaps it is time to update some of the older icon standards :)
Dare Obasanjo talks about the specs and reality, and the variances thereof, in the encoding of xml docs on the web:
All files are sent with a content type of text/xml and no encoding specified in the charset parameter of the Content-Type HTTP header. According to RFC 3023 which Mark Pilgrim quoted in his article that clients should treat them as us-ascii. With the above examples this behavior would be wrong in all four cases.
He then goes on the list the way a client application actually needs to deal with this conundrum - check for:
- the encoding given in the charset parameter of the Content-Type HTTP header, or
- the encoding given in the encoding attribute of the XML declaration within the document, or
Which is what I stumbled on for BottomFeeder awhile back. I wish Dare had posted this back when I was stumbling in the dark :)
Patrick Logan points to an interesting usage of Squeak by Mitsubishi
This is from one of our internal bug reports:
If you lose your connection (which happens to me a lot), Store will offer to reconnect. In many circumstances this is useful, but if you're in the middle of publishing, it's a very bad idea. In the best case, the publish won't succeed, as you'll almost certainly encounter errors due to data Store thinks it wrote, but which was in a different transaction. Even worse, it might succeed, leaving partial data in the database.
The bottom line is this - if you are publishing to Store and the db connection drops, do not accept the offer the reconnect. Yes, this is an ugly, ugly bug - and it will get addressed. In the meantime, be aware that it's a nasty one...
Martin Fowler discusses the idea of domain specific languages, and relates it to code generation:
I've always used the analogy of creating a DSL to help think about building up a design - developing classes and methods with an eye to making them be a DSL. As much as possible I do this within the language I'm using, but if I can't I'm very ready to switch to code generation. At ThoughtWorks we've used code generation and similar techniques widely on our larger systems. The point at which I pull the separate language DSL lever is clearly different between languages. I never really felt the need in Smalltalk to use a separate language, while it's quite common in C /Java/C#.
I think this is another one of those places were C (etc) developers and Smalltalk (or Lisp, or Ruby) developers talk right past each other. Interesting article; go read the whole thing
Scoble references someone worried about scaling syndication requests:
RSS and Atom feeds are pulled down by news aggregators like the NewsGator I use every hour. Multiply that by 20 million people and that's a bandwidth bill that's many times higher than it is via a web browser (because browsers only visit occassionally, and not every day).
RSS and Atom feeds pull down all the content every time, even content that hasn't changed since last time. Is there a way for him to only send down a feed that's changed, or even better, a partial feed with only new items? (My feed sends down 75 items each time whether new or not).
This is one of the things that already has a stock set of answers:
- Have your server handle conditional-get
- Have your server use mod-gzip
That's pretty much it - it has worked for years to scale the web, and I expect it will work for years to scale syndication as well...
I noticed earlier this evening that my blog page - not any of the other CST blogs - was messed up - the link bar, post footers, and title were all pushed to the right. This was only on IE; I checked with Mozilla, and it looked fine. I was sure that I had dropped a closing tag (or something) in a recent post, so I started looking through the recent ones... and they all looked ok. Finally, I scrolled all the way down the page - and lo and behold, one of the referral links was long - off the right side of IE. I fixed that by having long URLS shortend, and now it's back to looking good again. Yep, HTML and CSS - the replacement for complex client interfaces....
The Buffyverse is closing out - this is the last season of Angel. I've been pretty happy with the way the series has been progressing this year too. This may not be entirely bad news; Buffy lingered at least one season too long, and Boreanaz can't look young forever. Better to go out while it's still going well, but still - one more good show off the air. Can we please have Firefly back now?