Standing in the Field
Notes from SJS Application Server Field Engineering
Hmmm. Was looking at the referrer logs and saw that someone reached my blog by doing a Google search on "sparc ecache failure".I mention ecache failures obliquely in my post on why I'm blogging as an example of bad communication from Sun's past. But didn't think I had enough information to show up on a Google search.
So I ran the search myself in Google to see what happens. This blog was the #1 hit! How strange. So I did a little more investigation. I used Google to see who was linked to that article and found that there aren't any external links to that article. So how does an article with no external links and only two of the three keywords rise to the top of Google? Google PageRank is a quirky beast.
(2005-01-05 06:59:01.0) Permalink Comments [2]
I had a half finished post on podcasting drafted on MarsEdit (which I've been using to post since Roller 1.0 went live). But I wanted to finish my second post on Java annotations before I spent any time posting about iPods. But now Tim Bray has posted an excellent article on podcasting and I have to put in my two cents.
I admit to playing around with podcasts recently. Gio had been talking about them a month ago, some of the topics on IT conversations had been really interesting, and NetNewsWire added it as a feature in its 2.0 beta. Which made downloading podcasts pretty much point and click. So with all of this, you'd think I'd be a big podcast fan. I have a Mac. I have an iPod. I'm usually up for the latest new gizmo.
But as both Adam Curry and Tim point out, you can't really be listening to a podcast while you do anything else mentally engaging. Unlike music, podcasts really don't function too well as "background sound". So, for me, that limits listening to podcasts to plane and train rides. And when I do have dedicated "iPod time", I'm not sure I want to use that precious downtime listening to an amateur audio show.
Plus, like Tim, I have a bias towards text. You can read at your own pace depending on your interest and mood. You can skip around an article, skimming past stuff you aren't interested in reading. You can search it and index it for keywords. Plain text is just efficient and versatile.
But podcasting is still interesting to me as a phenomenon, even if I'm not going to be an early adopter. Because it's amazing how easy that podcasting makes audio production. Back in 1975 creating an amateur newsletter or brochure required expensive equipment and produced poor results. (Remember mimeographs?) Home production of audio or video wasn't really feasible at all except for rudimentary Super8 splicing. The desktop computer revolution has changed that. In 2005 a low end home computer, with moderately priced software, is easily capable of doing semi-professional print or audio production. And a mid range computer is capable of doing basic video production.
Amateurs are publishing blogs that are taken just as seriously as professional productions. To the point where the line between amateur and professional is very blurry.
Film students are creating films that are reaching professional quality with budgets under $100,000.
Mac Geeks are creating their own iPod ads that are arguably more professional looking than the real thing.
And now we are seeing the emergence of the semi-pro home audio production studio. I found this description of a semi-pro audio production studio fascinating.
I'm not the first to have noticed this phenomenon. It's been called the "prosumer" trend. (Consumers that are also producers of content. Apparently the term was coined by Alvin Toffler in 1980.) But with the rise of blogging and podcasting in 2004 it really makes me wonder what the media will be like in 2020. What will the next generation be able to create when they grow up with iMovie, Garage Band, iPodder, and TypePad? And what will the home studio be capable of producing when everyone has a desktop Hero server?
I can't say for sure, but it will be nice having a few episodes of IT conversations saved up on my iPod for my next flight.
(2005-01-04 20:51:50.0) PermalinkIf you want Firefox to open a new window when you click on a URL outside of Firefox (instead of the default: reusing an existing window), go to Preferences->Advanced->Tabbed Browsing and then select the "a new window" radio button.
I knew that this was a preference setting somewhere, but it took me a little while to find it again. If you are going to change Firefox to be your default OS X browser, this is a much more intuitive way to handle URLs in my opinion. (To change Firefox to be your default browser go to Safari and select Preferences->General->Default Web Browser, by the way.)
(2004-12-28 14:33:07.0) PermalinkLike David Johnson, I've wanted to switch to FireFox was but was annoyed by not being able to open a link in a new tab with the mouse wheel button.
I generally like Safari, but there are some Sun intranet pages that it doesn't render well. And even though Safari is fast on lightweight pages, it seems to get very bogged down on complicated pages and when too many windows are open at the same time. I had one complicated HTML page that used to take minutes to render in Safari. Some of the fault was surely on the part of the page designer, but FireFox was much better able to handle the complexity.
I tend to use tabs a lot and being able to open tabs with a single click was important to me. I also want my browser to be able to sync its bookmarks via iSync and to be aware of the system proxy settings. I already knew how to getting around the sync'ing problem by using the Bookmarks Synchronizer Plugin. And while the SwitchProxy plugin doesn't add system proxy awareness, it does make it easier to adjust the proxy settings.
But I didn't know of a plugin that would add the ability to open tabs with the mouse wheel button. After reading David's post, however, the answer became clear. If you can't change the app, change the mouse. I downloaded the Logitech driver for my mouse and modified the mouse wheel button to be command click. Now FireFox works perfectly.
And while I was in the Logitech control center, I added a few more cool shortcuts. Copy/Paste buttons on the thumb buttons. (Why do non-UNIX keyboards have caps lock, but no Copy/Paste?) Tab left/Tab right buttons by the mouse wheel. And my favorite, an Expose button in the middle of the mouse.
Just goes to show you how the my obvious solutions can sometimes elude you.
(2004-12-24 13:03:32.0) PermalinkI'm absolutely swamped with comment spam, as is the rest of blogs.sun.com. I'm shutting down comments for a while until this storm passes.
(2004-12-16 07:57:48.0) PermalinkI'm at a Java conference at Sun's headquarters. Yesterday I saw Tim Bray and a bunch of people I knew I should recognize, but couldn't quite put my finger on.
Now I know what was going on. What a cool thing to be happening. I'm excited both because we are welcoming cool technologies like Python and Perl into the Java world, but also because we just being more open to the innovation outside of Sun. Although now I'm kicking myself for not recognizing Larry Wall.
(2004-12-08 16:58:17.0) PermalinkI'm a new convert to David Allen's Getting Things Done.
Working in client engineering, especially pre-sales client engineering, is a constant battle of prioritization. I've often said that every pre-sales engineer has a hundred times more work to do than can possibly done. And the first, and arguably most important, skill is to pick the fifty most important hours of work to do every week.
I still think that priorization is a critical skill. But after being exposed to Getting Things Done I've learned how much better I could be at choosing and organizing those fifty hours. In my head, I've always known the importance of keeping focus on the important tasks, even in the face of lots of distractions and day to day urgencies. But reading Getting Things Done has shown me how much I let other people determine my priorities and how little conscious thought I put into my own agenda.
I'm still only beginning with Getting Things Done (frequently known just as GTD). But I thought that I would chronicle my process in my blog. I know that I'm markedly more productive already. And it does reduce stress too, because it makes you feel much more in control of your life.
In this inaugural GTD post, I'll include some of the links that inspired me to start my own GTD process:
I said several weeks ago that I would like to post my presentation on metadata that I originally gave to the Harrisburg Java Users Group. I'm not completely sure that I'm going to be able to post all of the code, but I'd like to get what I can posted. Because, as I said, I don't think there are many good resources on annotations that go past the basics.
I'm still working on converting the presentation into a bloggable format. (Without my commentary, I'm not sure the slides could stand on their own.) But here is the first section. It's more flushed out than the original presentation, but still has the conversational tone of a presentation rather than a paper. If you spot any errors or ambiguities, please feel free to contact me.
Metadata is one of the major features of Java 5.0 in the "developer ease of use" theme. It is valuable both in its direct ability to make life easier for developers and also indirectly by enabling future technologies, such as EJB 3.0. By making the Java language more "declarative", developers can implement functionality in fewer lines of code and with more maintainability and readability.
Metadata is a generic term for this type of declarative functionality: literally meaning data about the data (and therefore code about the code). Annotations refers to the specific implementation of metadata chosen by JSR 175: special interface-like markers in the Java code that have declarative behaviors.
Declarative programming is not new to Java. There are a number of existing Java features that are declarative: marker interfaces, JMX naming conventions, and JavaBean properties are just some examples of declarative behavior in Java. Annotations, however, introduces a complete framework for expanding the languages with declarative metadata instead of just ad hoc, case by case naming conventions. This adds both consistency and the ability for tools and compilers to spot errors. (I know that I've personally spent a lot of time chasing down typos in JavaBean getter/setter names.)
Tool support for metadata was one of the design goals for metadata. The goal being to enable tools to understand the declarative meaning associated with metadata and also to enable tools to use annotations for their own functionity. (Imagine annotations that mark tool generated code. A tool that was aware of these annotations could freeze those sections of code and regenerate them as necessary based on the annotation parameters.)
Although EJB 3.0 is still in early draft stage, I'd suggest downloading the EJB 3.0 specification and taking a look at how annotations are used in that specification. Simplifying J2EE was one of the original reasons for metadata and the EJB 3.0 specification is a glimpse into the plans for annotations going forward.
Annotation BasicsThis post is not meant to be a syntax guide for annotations. There are plenty of introductions to the annotation syntax available on the web. I'd recommend starting with the language documentation on java.sun.com. However, as a quick refresher, basic annotations look like JavaDoc comments (including the fact that they begin with @ symbols, except that they exist directly in the code outside of comment delimeters.
Simple examples of annotations built into the Java language include:
@Deprecated
@Author("David F. Ogren")More complicated annotations can have name/value arguments.
@NamedQuery(name="findcust",querystring="SELECT c FROM ...")
[I'd like to expand this section in the future. I admittedly handwaved over this in the original presentation due to time constraints and the fact that many in the audience had already experimented with the basics of annotations.]
Built in annotationsJava 5.0 includes several built in annotation types that are defined directly in the language.
@Override is annotation that is used to mark methods that are meant to override methods in the super class. This declaration enables the compiler to catch bugs where you meant to override a method but the method signature doesn't match properly.
@Override
public int getValue() { return someValue() }
This annotation is of limited value, at least in my opinion, since it depends on the user manually adding an annotation in order to detect a relatively obscure typo. The ratio between effort required to potential payoff doesn't seem worth it to me. But it is a good illustration of one of the key pieces of annotation functionality: the ability to affect the compiler.
@Deprecated is the new way to declare methods as deprecated. Like the old JavaDoc way, this will cause the compiler to generate compile time warnings when the deprecated method is used.
@Deprecated public int getValue() { return someValue(); }
I never liked the fact that JavaDoc could affect the compiler with deprecated flags. It was a very useful feature, but I was philosophically opposed to comments affecting the compiler. Moving the deprecated flag to an annotation is a more elegant solution: this is exactly the kind of declarative functionality that annotations are meant to address.
@SuppressWarnings allows you to turn off compiler warnings for a specific piece of code. Useful because of how touchy the compiler can be with warnings regarding collections now that generics have been implemented. [I have had some problems getting @SuppressWarnings. I'm not sure if this is a bug yet.]
@SuppressWarnings(“unchecked”);
public void nonGenericList(List myList) { myList.add(“new value”) ; }
There are also built-in meta annotations that are used to annotate annotations. @Retention indicates whether annotations should be compiled into .class files and retained in memory. @Target indicates the types of objects that can be annotated. @Documented indicates whether an annotation should appear in JavaDoc. @Inherited indicates whether annotating a class also affects subclasses.
Continued later this week in part two where I will talk about creating custom annotations and the apt tool.
(2004-11-28 23:16:13.0) PermalinkOne of the things that we are struggling with at blogs.sun.com is how to deal with source code. Putting a code sample on blogs.sun.com is technically considered by the US government to be exporting software. Which is subject to restriction by a considerable number of export laws.
So, in theory, this means that every single time someone wants to publish a "Hello World" example it should be cleared by Sun's legal department as export regulation compliant before it gets posted. Sun's legal department is working on a way to streamline this process, but in the meantime I'm playing it safe and not publishing code.
This is my long and convoluted excuse about why I haven't published my annotations presentation here. I originally wrote this presentation for the Harrisburg Java User's Group because I couldn't find any good examples for the advanced use of Java 5.0 annotations (aka metadata). There were lots of examples on the web of how to use the new builtin annotations and even how to make your own annotation types and parse them with reflection.
But when it came to doing advanced things, like modifying the behavior the compiler to autogenerate code and supporting files, I couldn't find anything on the web other than the apt tool documentation. But, to me, this was the important part of annotations: the ability to create declarative behavior. So I did a little experimentation and built some sample applications that demonstrated the power of annotations. My favorite (and largest) sample was using annotations to automatically build a factory pattern in front of any class with just a simple annotation. The apt tool would automatically generate and compile the factory front end. The actual generated code was pretty simplistic, but I was excited by the potential.
But if I stripped out the code examples from my presentation, there isn't much of a presentation left. So, despite wanting to put that content up here, I'm going to wait until the lawyers get their act straight. In the meantime, you check out the apt documentation yourself:
Update: A couple of Sun blogging gurus read this post and have emailed me. Perhaps the legal team is further along in their streamlining that I had thought. I may be able to post the code after all. Stay tuned.
(2004-11-01 07:43:13.0) Permalink Comments [1]
A few follow ups to my last software economics post. I'm anxious to get back to more technical topics, but Chris Rijk brought up some good points worth further discussion. I quote from Chris' comments several times below.
" I was a bit surprised that the general theme that it is typical for support services to be unprofitable. Many companies also offer multiple support options - eg bronze, silver, gold and platinum. The general impression I see in the press is that support contracts are a cash cow, not a drag on the business."
Yes, most companies do have tiered service offerings. Sometimes the tier is determined by the size of the product order, and sometimes based on the amount of a premium the customer is willing to pay. And, yes, it does seem surprising that the service business isn't a cash cow. It certainly is a cash cow in other businesses: consumer products for example.
So why is enterprise software support a breakeven or money losing proposition? The hands on attention required by enterprise level customers, as well as the difficulty in reproducing enterprise level complexity. Picture the typical J2EE application server deployment. In in addition to the application server itself, a very complex piece of software, the deployment consists of:
A failure in the application could be caused by any of the above. I frequently work on escalations that take thousands of hours of analysis from Sun. A "continuous effort" escalation will have staff working on the problem around the clock as well as a half dozen other people working part time on the issue. Only to find out a week or two later that the problem was with a third party product or a some bad code written by the customer. It's hard to turn a profit when a single escalation can consume so many resources.
"In addition, R&D can be spent to reduce support costs . . . . Apart from simply having fewer bugs, this can include better defaults options, making it harder to go wrong with settings, self-tuning software, self-diagnostics and corrections, remote monitoring and so on. Given the huge huge steps forward Solaris 10 has in this regard, I was a bit surprised that this wasn't mentioned."
Yes, there definitely is an effort from Sun in this area. Solaris 10 is one example, and so are the Java Enterprise System and the performance ergonomics of Java 5.0. This hasn't been one of Sun's strengths historically though. One of Sun's perceived strengths was how "tunable" the systems were. Solaris and Java both had lots of knobs and buttons to allow users to tweak performance. It's only recently that Sun has invested in the R&D to self-tune a lot of those knobs and buttons.
I was also surprised to see relatively little mention of upgrade licensing. (maybe because generally Sun sells a RTU for any version on any platform?) For a lot of larger software companies, a lot of revenue seems to come not so much from "new" licenses, but upgrades.
There are some exceptions, but upgrade pricing is much more common in consumer software and enterprise desktop software than enterprise server software. Most maintenance contracts for enterprise server software that I've seen (including those from Sun) include upgrades.
Another "trick" is to pull support for older versions when a new version comes out.
I'm sure that that seems like a trick from the customer's perspective. But that's just another way that vendors try to reduce their costs. There's only so many different versions of a product that a vendor can afford to support. Each version takes up lab machines, training budget, and requires endless compatability tests. So when a new version is released and older version is often dropped from support to make room for the new version.
(2004-10-21 21:22:18.0) Permalink
Discovered a new utility today: Mail.appetizer. It's a plug-in to Apple's Mail.app. When you receive a new email, the plug-in displays a transparent window that has a preview of the contents of the email. You can click on it to bring up the email in Mail.app or just ignore the window and it will disappear in a few seconds.
This allows you to quickly triage emails. If an email is important, you can open it up and immediately respond. But if it is just some piece of electronic bureaucracy, the preview pane lets you know that you can safely ignore that "new messages waiting" indicator. All without having to leave your current application. It's probably the coolest use of transparency that I've ever seen.
Simple, useful, cool, pretty. Very Mac like.
(2004-10-20 22:14:28.0) Permalink Comments [1]When I got my new Application Server job I decided that I was going to use this blog to post some of my presentations, papers, and notes regarding J2EE and Sun's application server. This decision led me to invest in a little site redesign. Both to improve the UI and to make it stand out from the rest of the blogs.sun.com crowd. (Previously I had been using a slightly modified version of one of the standard Roller templates.)
If I have to say so myself, I'm pretty pleased with the results. There's still some tweaking I need to do here and there, but the design is really pleasing to my eye at least. The new page validates, which is nice, and it's actually a CSS box layout which I usually shy away from. It probably looks like crap in Netscape 4.x, but I think that people still using Netscape 4.x are used to that already. I'm a little nervous about it looking OK in IE, but I don't have any Windows machines I can test with.
Some site credits:
Remaining todos:
OK the site update is posted and looks pretty much the way I intended. I was worried about how all of the Roller macros would expand in the new layout and CSS, but it seems to be OK. I've tested in Safari and Mozilla and it looks good. I'm a little worried about the various flavors of IE: I'm using CSS box layout that I know gets a little wonky in IE. But I've compensating for all of the IE bugs that I know of. If you are running IE 5 or 6, drop me a comment and let me know if the box layout looks OK. (There should be a top box with the title and a photo, a content box on the bottom left, and a navbar on the bottom right.)
I'll post some more details tomorrow, but it's late and I just wanted to get these layout changes done tonight while traffic is low. Most importantly, I'll let you know a little bit about the banner photo and about the CSS resources I used to help build this design.
(2004-10-18 00:20:59.0) Permalink Comments [4]I'm updating the site template. The site may get a little wonky in the meantime. Stay tuned.
(2004-10-17 23:04:58.0) Permalink| « November 2009 | ||||||
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | |||||
| Today | ||||||