Subscribe: WorldOfWebObjects
Added By: Feedage Forager Feedage Grade B rated
Language: English
application  java  library webobjects  library  people  system library  system  things  time  web services  web  webobjects 
Rate this Feed
Rate this feedRate this feedRate this feedRate this feedRate this feed
Rate this feed 1 starRate this feed 2 starRate this feed 3 starRate this feed 4 starRate this feed 5 star

Comments (0)

Feed Details and Statistics Feed Statistics
Preview: WorldOfWebObjects


Updated: 2016-07-24T03:54:12.384-07:00


A Breath of Fresh Air in my WO World


I have actually found a paying gig at a company in the SF Bay Area doing WebObjects application work. It is DynEd, a company that sells client software for people learning English. Or, as someone said, Rosetta Stone in reverse. The WO applications track the student meta-data, things you would expect, such as quiz results, what has been done, etc.

It will be interesting to see, over the long run, how I can evolve the site. Of course the possibility of using something other than WO has occurred to management. But a lot can be done to rationalize their system with WebObjects now, and it does not make sense to replace a working legacy system without re-factoring and re-forming the old system.

We'll see. And it is nice to be working for a company with a bit of an educational mission and not a company making yet another fancy jeejaw. Hey! Has anyone claimed the name "iJeejaw" yet? Opportunity strikes!

coexisting installs of WO 5.3/5.4 on Tiger/Leopard?


I am wondering what people think about these (very random) ideas.

I have to admit I have not jumped onto using a Leopard system yet. For one thing, I have midterms, and for another, I am tempted to wait until I can get hardware with Leopard on it (which I probably cannot yet) and get a new laptop with Leopard on it. Then I will be able to transition things over from my current laptop as I desire, and not try to upgrade my somewhat beat-up laptop.

I am pretty sure of some things, some of which are represent competing viewpoints:

1) WO 5.3 is not and will not be supported on Leopard.

2) WO 5.3 works with Java 1.4, which is on Leopard, and so the WO 5.3 runtime should work on Leopard.

3) It has been possible, for quite a while, to have more than one version of WO on a machine, but Apple will never support this. Essentially, the theoretical cost of supporting configuration goes up exponentially, not linearly, with the number of versions on a system. There will never be a reason for Apple to take on the job of supporting a machine that has two different versions of WO. But....

Having no tool support, it should be a lot easier to configure runtimes for multiple versions. Things like soft-linked directory branches work a lot better when they do not have to deal with the ObjC bridge and all its associated noise. Project Wonder, for instance, could include scripts for configuring this. A script could even check the integrity of deployment installs. While at Apple, I wrote a "verify your versions" direct action. Too support-ish and not enough aqua, so not shippable.

4) EOModeler and WebObjects Builder may work on Leopard, but one would have to get the apps and many of their private frameworks over by hand and Apple may have done something to make these apps not launch, or they will launch but be crashy in the extreme. I still use them on Tiger, but I will have to give up on them for Leopard. :-(

Has Apple announced a public API for plugins in Xcode? Probably not. The amusing thing is, Xcode being an ObjC app, there are lots of APIs used by the plugins that Apple has written. That's actually the crux of the biscuit. Each group of people doing a plugin or two has created a new internal API....

I know I should take the time to get comfortable with Eclipse. I just have had other things to do. Like creating WO apps. Sorry.

6) I am willing to bet I can take Xcode templates for WebObjects projects and make them work in Leopard. It should not even be difficult. Project templates are, after all, just a resource. I cannot decide if this is worth any time.

I am sure I will come up with other ideas, some even more useless than some of these, when I actually have a Leopard system. We'll see. I am open to suggestions, question, jibes, innuendoes, catcalls, or anything short of insults. No, insults are ok, too. :-)

happy halloween - ray

Torwards a Re-usable Object-Category Pattern?


I just built an application. The idea behind it is very simple. The implementation turned out to be surprisingly not so. Some of this reflects my own blind spots, which are legion, and some of it reflects some messiness inside WebObjects. It feels as though there should be a way to create an EO that captures some of what I am seeing here.

The application keeps track of a thing. In this case, I am keeping track of URLs, but it could be anything. The base EO has a primary key and a string for a name, and that is all. So, storing two of these, I would have (1001, '') and (1002, ''), for instance. Then there is a many-to-many relationship between this and another object. This other object is a Category and looks like (2001, 'color', 'green'), (2002, 'priority', 'highest'), (2003, 'arfblat', 'Wednesday'). Then I implemented handleQueryForUnboundKey and handleTakeValueForUnboundKey in the URL object from the NSKeyValueCoding.ErrorHandling interface.

Essentially, what I am doing is taking this from the database:

URL: (1001, '')
URL: (1002, '')
cat: (2001, 'color', 'green')
cat: (2002, 'priority', 'highest')
cat: (2003, 'arfblat', 'Wednesday')
join: (1001, 2001)
join: (1001, 2003)
join: (1002, 2002)
join: (1002, 2003)

and turning these into EOs which look like this:

{ pk: 1001, url: '', color: 'green', arfblat: 'Wednesday' }

{ pk: 1002, url: '', priority: 'highest', arfblat: 'Wednesday' }

Simple? Well, probably not. But if you think about what Key Value Coding actually allows you to do, it makes sense.

If you use KVC to ask a URL object for an arfblat, it looks in the base EO and does not find anything. I implemented the handleQueryForUnboundKey method in the URL object to get the categories and see if any of them has a category name of 'arfblat'. If there is such a category, I get the category value, 'Wednesday', and return that.


url.valueForKey("arfblat") -> "Wednesday"

Well, it was surprising to me how difficult it was to get this application to work right. It is still not quite working. I had to remove the ability to add new categories. If you create a new category and add objects to it, they look wrong, even though they are stored correctly in the database. Restart the app and all the objects behave correctly. There are a bunch of these kinds of quirks in dealing with this application.

I am going to have to think about this some more. If anyone has ideas or suggestions, please comment.

Coolness at WOWWDC


It's a conference. It is all about WebObjects. It is from Apple, NOT!

A conference has been put together by dedicated WebObjects user who wanted to get it together and decided not to wait for Apple to, you know, get it together!

These notes are going to be rough. It is a long day....

Key to Names:
PR = Pascal Robert
CH = Chuck Hill
AC = Alex Cone
MS = Mike Schrag
?? = presented web svcs with AC

PR: intro, PF is not here, Scott Keith is here. Sponsors, etc.

CH: What is this Eclipse?
- open source, java tools
- WOLips extends eclipse with specific knowledge about WO
- WOProject - ant-based command-line tool

- you can do a lot more a lot faster than eclipse
- What does your IDE do? code completion? debugging? error reporting?
- is it slightly slow? on new hardware, not a problem...
- GUI is not OS X.
- no GUI component editor
- custom build steps? compatible?
- used WOPetStore for example....

AC - from CodeFab

web services preso

"SOAP is the C++ of web services...."
REST - HTTP POST to get XML back
very cool demo of GoogleWoCheckout, from CodeFab, for using Google WS API in a WO app

?? -
girlfriend has a hat shop and needed credit card, with no hassle....

Ajax preso:

AC: page executes JavaScript which creates XMLHttpRequest (XHR)
XMLHttpRequest messages Server
Server responds:
MS: watch out for stateful components

how does WO work?

- backtrack cache
- one page ~ one context
- limited depth

cache gets blown out easily in a Ajax-ified page - "Who will save the day?"

3 most important things to work with....


See AjaxExample.


- totally revamped
- deterministic property and framework init
- properties usable for staic vars
- classpath munging
- extend ERXFrameworkPrincipal
- report problems!


much cooler localization

- value-GID cache
- replaces SEC

ERXConstant class - POJO singletons


Prototypes -
- now stackable
- ERPrototypes now loaded first
- works only with EntityModeler
- Prototype flattening


Nothing Serious To Say


For some reason, I find myself unable to work on anything serious. I have lots of application ideas and databases to build and interfaces to work out and I am just not wanting to jump in the pool right this minute. I'm unemployed and darned proud of it. Say it once and say it loud! :-)

So, I'm just going to sit in this lounge chair and do something silly.

I have made various versions of Memory games over the years. Memory is the card game where you lay out cards and try to flip them over in pairs. I did the first version after someone, several years ago, put up a Memory game based on pictures of Cindy Crawford and the page became, briefly, insanely popular in the way these things get popular to 30 seconds on the Internet. I am putting this one up today. It is just an amusement. I am dynamically pulling photos from the "Interesting Photos" bucket of a certain web site. That is why the session start up is slow. I thought, before I started the series of inevitable re-designs and fixes, that I would just put it up first.

Is it possible to build an application so small that there are no obvious design enhancements? I think not.

To Do:
- document design of said silly game
- fix app to get pictures for session more quickly
- could WOHTTPConnection be any more lame? Probably not.
- various clever things, etc, etc, etc, and so on.

RSLD? A Really Simple Linux Deployment for WebObjects


I was expecting this to be much harder than it was. I read some of the pages out there on getting WebObjects installed onto Linux systems and looking at them just made my eyes cross. WebObjects is just java, isn't it?

I think the hardest part of this whole process was getting the right version of java onto the Linux box. I started with a RedHat-based system with java 1.4 as the default. Getting 1.5 onto it was a bit of a chore. Mac OS X just, you know, has stuff on it already. The Darwin ports stuff is there for other things. But a lot of things are just not that hard. Ok, working 15+ years at Apple may have given me a bit too much familiarity with it, but I doubt it.

Linux is just quirky. It can be nice. But it can also be deeply frustrating.

But, surprisingly, getting WebObjects to work on Linux was not hard.

First, I went to the /System/Library/Frameworks directory on my Mac. Then I just tarred up the Java* frameworks (sans JavaVM and such). Then I ftp-ed them over, created a /System/Library/Frameworks directory on the Linux system and slammed them down.

Then there was the question of what to do about a WOAdaptor. I tend to delete my /Developer/Examples contents on my various systems, so I could not put my hands on the adaptor sources. But then I realized I might not need them. I am not deploying huge apps. Not building a business on it yet. I just wanted to stop trying to deploy WO apps from my laptop.

I had started up my app by doing:
./myApp -WOPort 55555 &

So, I added some lines to the /etc/httpd/conf/httpf.conf file:

ProxyRequests Off
ProxyPass /cgi-bin/WebObjects/myApp.woa http://myHost:55555/cgi-bin/WebObjects/myApp.woa
ProxyPass /WebObjects/myApp.woa http://myHost:55555/cgi-bin/WebObjects/myApp.woa
ProxyPass /WebObjects/myApp/ http://myHost:55555/cgi-bin/WebObjects/myApp.woa
ProxyPassReverse /cgi-bin/WebObjects/myApp.woa/ http://myHost:55555/cgi-bin/WebObjects/myApp.woa/

And it just worked! Sweet. Wait. Hold on a second. I know what you are going to ask. "Does Apple support this?" OMG, I had not thought of that! Do they? Well, you know what. I do not care whether they support it or not! So, do not ask!


WebObjects 5.3.3 A Quick First Look


Well, I just wanted to see if there was something other than the DST stuff in here. There does not seem to be much. But that is to be expected.

I did notice that, even though this is an update, it looks pretty much like a complete install. I did not do a thorough check yet and your system may be different than mine, but it looks to me as though the changes are:





I am not worried about any of these removals. The JavaPlaybackManager still works in command-line mode, so it may be a good idea to put a copy aside before the install deletes it. Unless you have other tools for recording and testing sessions against your apps.

What systems could this go on? I would only point out two things.

First, it looks like a complete install to me. I have not finished checking, but that is my initial guess.

Second, you can get the pkg from Software Update by using the softwareupdate command-line tool. See the man page for details. Then, in the .pkg, there is a file: /Library/Packages/WebObjects5.3.3Update.pkg/Contents/WebObjects5.3.3Update.dist
There are javascript functions in there with names like checkIfTiger(), checkNotAlreadyInstalled(), and so on. Those functions check things and return true or false. The file could be modified so it returns, for example, true. Then, if you asked if you would be able to do an install, the answer would be yes.

Not Exactly Masters of Time and Space...


Code example and downloadable project corrected on 2007/01/16.Previous correction note corrected on January 28, 2007. That is January. And the editors of the last correction have been sacked. And their moose also.We are coming up on a change in the rules of Daylight Saving Time (DST) in the United States. The US government has written quite a bit about it. Sun has updated the JVM to deal with it. Apple has even updated its JVM to deal with it. But Apple has not yet updated WebObjects.Even if an update to WebObjects is shipped before the DST change, one can still have a problem right now. If an application stores a date or time anywhere between March 11, 2007 and April 1, 2007, any arithmetic on that date might have a problem.Let us try an example. Suppose that it is 7 pm on January 13, 2007 and I request an alarm for two months from now. Then I ask the application when that alarm will occur. The application says that the alarm will occur at March 13, 2007 at 7 pm. The application would be wrong.One can fix the javafoundation.jar file, which I will describe below. But it is possible to avoid many problems of this type. I am going to write more about this later, perhaps much more, but a short answer is this. First, a date and time without a time zone means nothing. If your application lets users put in dates and times without letting them specify the time zone, you are asking for trouble. Second, always store dates and times in UTC. Period. Simply put, databases should never know about any time zone except UTC, and a user should never have to guess what the assumed time zone is for a particular date and time string.If I followed these rules, I would be able to figure out the problem. I created the alarm at 7 pm on January 13, 2007, PST (Pacific Standard Time). Then I ask the application when that alarm will occur. The application says that the alarm will occur at 7 pm on March 13, 2007, PST. The application would still be wrong. But knowing that March 13 is after the DST change, I could figure out that 7 pm in PST is equal to 8 pm in PDT, which stands for Pacific Daylight Time. It may still be confusing, but if one displays the time zones, one does have enough information to figure out what has happened.If you end up having a problem from the DST change, your problem may not look like this. But these kinds of application problems are confusing. Something that depends on date calculations may break in subtle ways. You may understand what is happening when you see it. But imagine explaining this to your manager, or your manager's manager. I would not want this job.Enough talk. Here is some code, in the form of a jUnit test. The project that contains this code can be found here.public void test2006SpringForward() { NSTimestampFormatter formatter = new NSTimestampFormatter("%Y/%m/%d %H:%M:%S %Z"); String target1 = "2006/04/02 01:59:00 America/Los_Angeles"; String target2 = "2006/04/02 03:00:00 America/Los_Angeles"; // start at 1 minute before 2:00 AM on April 2, 2006 in the Pacific time zone NSTimestamp ts1 = new NSTimestamp(2006, 4, 2, 9, 59, 0, TimeZone.getTimeZone("America/Los_Angeles")); assertEquals("creating time", target1, formatter.format(ts1)); // add 1 minute to bring us to 12:59, a minute before midnight NSTimestamp ts2 = ts1.timestampByAddingGregorianUnits(0, 0, 0, 0, 1, 0); assertEquals("flipped over DST or not? ("+target2+") != ("+formatter.format(ts2)+")", target2, formatter.format(ts2));}public void test2007SpringForward() { NSTimestampFormatter formatter = new NSTimestampFormatter("%Y/%m/%d %H:%M:%S %Z"); String target1 = "2007/03/11 01:59:00 America/Los_Angeles"; String target2 = "2007/03/11 03:00:00 America/Los_Angeles"; // start at 1 minute before 2:00 AM on March 11, 2007 in the Pacific time zone NSTimestamp ts1 = new NSTimestamp(2007, 3, 11, 9, 59, 0, TimeZone.getTimeZone("America/Los_Ange[...]

Quick and Useful Way to Edit Data from an EOModel


I created something useful. It did not take very long, but it is useful and I do not remember anyone mentioning this kind of thing in the past.

I have a Direct to Web app built that, when I give it an EOModel as a parameter, launches a fresh, new web interface that allows me to edit data in the entities of the model. Imagine if you could do a "Browse Data" in EOModeler and then edit the data. One cannot do that, but one can take just an EOModel and put data into the entities without creating a fresh project. I used to create a D2W app to administrate every EOModel I have in any app, so I find this useful. I no longer need those duplicate projects around.

Here is how you do this:

- Using Xcode, create a "Direct to Web Application" project named "d2Model". When it asks you to specify an EOModel, just specify some model. It does not matter which model.
- You may want to build the project at this point. There is no reason for this, but I usually do. I just always build a project first thing, after I create it.
- Delete the model from your project. Make sure that you delete the references and the files and do a build in the project for "Clean All Targets".
- Edit the project's Application class's constructor as so:

public Application() {
System.out.println("Welcome to " + + "!");
String modelPath = System.getProperty("eomodel.full.path");
if (modelPath == null)
throw new java.lang.IllegalArgumentException("Please give me a \"eomodel.full.path\" to use as a model.");
try {
EOModel model = new EOModel(new"file://"+modelPath));
} catch ( mue) {
throw new java.lang.IllegalArgumentException("Could not find EOModel: "+modelPath);

- build the project
- launch Terminal
- If you have Xcode set up in the default manner, you can cd to the build directory, inside the project, then the Development directory inside that. If you have Xcode set up differently, you will know where the woa is already.
- I moved the woa to a useful location. For example, you can do:
mv d2Model.woa ~/d2Model.woa

To use the application, I then do the following:

- open Terminal
- type the following:
~/d2Model.woa/d2Model -Deomodel.full.path=/Users/ray/Projects/MyToDo/ToDo.eomodeld

This lets me edit the data in the "to do" app I have been playing with. When I am done editing, I log out, close the browser window, and do a ^C in the Terminal window.

There are lots of better things to do here.

For example, a while back I had a droplet for this. One would drop a model on it and, like magic, there it was.

But this is version 0.1.

On the "to do" list for this is:

1) put the project somewhere, where I decide to put things.
2) create a double-clickable java app that I can drop an EOModel on, as I used to do with the droplet.
3) shorten the session time-out and put a "System.exit(0)" somewhere convenient in the Session subclass, so that I do not have to ^C the application instance
4) turn the woa into a standalone-app, so that one can use it on a machine that does not a WO installation.
5) whatever else I think of later....

soon to be ex-Apple


I am leaving Apple at the end of this year. The reasons for this are many and varied. I have been at Apple since 1990 and, frankly, I love this company and some of the people here. But times change.

I will be making much more use of this blog after the new year. I have often felt constrained in what I could say as an Apple employee. Let us just say that I believe in the dictum that if one does not have anything good to say, it is sometimes better not to say anything. And let us leave it at that for now.

Have a great holiday.

Not So Practical, But a Digression on Web Services


I was going to use this entry to explain about how to set up a simple web service and access it via AppleScript. It is taking too long, though, so I am going to leave this. I am just editorializing here. I will put some code up for this as well.


It is good to sweep the dust out of those corners every once in a while. Web Services is, in some sense, in a corner of the product. It is a late addition and it has not been extended to or added to since.

I find it a bit difficult to talk about Web Services. For one thing, different people have different views of them. Some people get a lot of use from them. Some people do not. Some people say that the WSDL based Web Services, such as those pushed by Sun, are dead and that Microsoft has won the day. That seems like hand-waving to me. WSDL-based Web Services are useful. As long as they are useful, they will be used. And I am never ever really sure that "Web Services", capitalized as it is, is the right way to write this. It just seems wrong somehow. The capitalization seems to give them a grandeur they do not deserve.

It appears the UDDI idea has passed on to a better place, but that concept always seemed strange to me. Let's take something that removes data dependencies, something that is useful because it can be used to tease apart systems with data dependencies on each other, and layer in a lot of other kinds of dependencies. Why would this be a good idea? I never got it. It seemed to me to be a idea that only big companies could love.

Web Services are really only interesting because they are fairly uninteresting. It is a bit like XML. It is most useful when there is really nothing to talk about. One just uses it. Not that this keeps people from writing articles about it, but they have little or no information content, and I do not have to read them and I do not. If one has to get some information from one place and get it to another and one does not want to say very much about the stuff in the middle, use Web Services.

So, I mostly use Web Services in WebObjects in a fairly brain-dead manner. I figure that anything more sophisticated than that is probably not worth the effort. I think that Web Services are often used to make up for bad design. Parts of an organization need to communicate, but they cannot figure out the right way to talk to each other, so they can use Web Services. If I am using Web Services, I do not feel the need to pretend that it is anything more than a hack. In a better world, there would be no need for Web Services, but there we are.

So, I use Direct To Web Services. If I want something smart to be accessible in a Web Service, I give it a name and I have a method in my EO class that will respond to that via key-value-coding. That is it. Really, key-value-coding gives me all the flexibility I need. I do not try to be cute in the WSDL. The WSDL is just a dumb interface to the place where it is easier and more productive to put some smarts, my EO classes.

WebObjects and Questions on Versions


There has been a bit of confusion or consternation about the recent Xcode 2.3 release and the version of WebObjects it contains.

It is understandable that things are unclear. With the recent change to WebObjects, which made it ship as part of Xcode and not as its own product, some big issues were clarified. But there is also some follow-up work that needs to be done. WebObjects is, in important ways, a bigger product than Xcode. It is certainly older. Fitting the multi-colored, day-glo-painted WebObjects bus into the back seat of the Xcode two-seater sports car has been a challenge.

Some things are being done which are not designed to have externally visible effects and this is causing some of the versioning issues that people see.

It is recognized within the developers at Apple that "Xcode", as it is now, is not the monolith it might have been at one point. Information on versioning of Xcode needs to be provided at a finer granularity. Exactly when this might be done is not known.

Developers should realize, though, that WebObjects ships with Xcode. To be more precise, it ships inside the Developer Tools release of which the Xcode application is the "flag ship" signifier.

So, the label "WebObjects 5.3.1" has less meaning than it used to and it definitely has less meaning than some developers seem to think it does. From a technical perspective, it is not clear what meaning it has. Does the meaning of the version have marketing value or technical value? I do not grok marketing, at all, so I do not know.

In my view, the "version" of WebObjects on a machine is derivable from this procedure:

  1. Execute:

    find /System/Library/Frameworks /System/Library/PrivateFrameworks /Developer/Applications/WebObjects /Library/WebObjects /System/Library/WebObjects -name version.plist

  2. Find all of these that are installed by WebObjects. This is, um, left as an exercise for the reader.

  3. Get the union of the keys in these plist files.

In a very real way, though not in a very user-friendly way, that is the way to precisely determine the version of a WebObjects system.

I think that we want to give developers the kind of information that will provide them with the information that they need to understand what a particular release means to them. I believe that we want to provide information about a particular release that explains the benefits and risks of a given release.

All I can say is that this is hard to do. We are open to suggestions, but the WebObjects team also has to follow the rules placed on them by the corporation. And that means lawyers. But that is the world we live in. It is not going to be possible to make everyone happy. Some people want a depth of information that an enterprise products company would provide. Apple is not an enteprise products company. It is Apple.

JavaOne - The Mid-Week Hump, a Little Late


Sometimes a week can seem like a really long time.

There is a certain simplicity to going to an out-of-town conference. You get on a plane, and you go. It is a bit like the "gathering of the tribes" that used to happen among the tribes on the Great Plains. Except we do not bring our kids, our wives, our horses and our houses with us. We call room service.

JavaOne is a little too close to home for me. I still need to get the kids to school in the morning. I think it makes the conference a different kind of experience. I cannot get the really concentrated information dump that some people get. I cannot wait to get a bean bag chair in the main hall. I need to keep trying to find the part of the conference where the wireless network actually works. Thankfully, it is Firday and Moscone Center is almost networked enough. Who would have thought that so many JavaOne participants would want wireless connection? Certainly not the people who set up the wireless here.

But I also do not get that washed-out, spiritually empty feeling that can come from being out of town at a conference. A conference can be a beautiful thing, a forum for talking about those things that bore most people we know. And most of us get it. But it can also be like coming off a bad meth jag. Too much of the wrong kind of food, too much time in a bar with people you really do not know, and there you are. You know what I mean.

But this is turning out well. I like the fact that they show most of the keynotes in the hall. It is nice to be able to see it, see what they are saying and, yeah, it is still a lot of marketing and you can walk away. And that part of the conference is fast approaching. The part where everyone walks away.

First, I would like to mention one of the technical talks. I went to the talk on Generics. This has been around a while. There has been lots of press on Generics. I have read some of this and most of the time I feel as though not much has been explained. Really, there is not much there. Generics are not a large shiny feature, but they are nice. Could you take them or leave them? Yes. But on the other hand, if you work on frameworks, they can do some nice things.

If you use Generics, it can be really nice. One can stop casting so often. Every time, every single time, I cast an object when bringing it out of an NSArray or from a key-value-coding call, I remember the guy who said that in a real type-safe language, one should not cast. I do not remember his name, but I remember what he said.

If you use Generics, you stop casting so much. Going back to casting then feels even stupider. Can't we get past this already? Perhaps we can. We'll see.

JavaOne - First Day


I had not been to a JavaOne for a few years. They are usually scheduled at the same time as Apple's WorldWide Developer Conference and I usually have to present at that, or do other work for the conference.Yesterday was good. There was good energy and a lot of interested people. Asking random people what they worked on almost always got people going about this and that, usually with a lot of passion. There were a lot of internationals, inclusing a recent grad from Brasil who won a ticket and a gentleman from South Africa. There were some suits who had some behemoth app for some insurance company and they want to make sure their behemoth can keep chugging along. But there really were not too many of those. And you cannot get rid of these people completely. After all, they usually have money.The session I most wanted to go to was the Concurrent Collection talk by the guys at Sun who brought you JSR 166 and all that great stuff.Most of the talk was a walk through the classes. It was useful to hear the rationale and the "canonical use case" for a given class. It is always unclear, at these talks, if one could have just more completely read the web pages and got the same info. I think some of this was not just "stuff from the web".For example, looking at BlockingQueue and the SynchronousQueue, I do not think I would have seen this. Brian Goetz explicitly called out that the SynchronousQueue was not like the other BlockingQueue sub-classes but was most usefully thought of as a pipe for producer-consumer situations.Another class was the Exchanger, which was described as being one of the "Syn chronizers". I think that "Synchronizer" is a casual term. I do not see it in the classes. The use case for this as, again, a producer-consumer situation where one wanted to swap an empty arrow for a full one, for example. The other synchronizers namred were Semaphore, CountDownLatch, and CyclicBarrier.It always seems to me that some of these classes are just random bits of "hey this might be useful" stuff, but when such smart people are doing the classes, then I think that their random bags of "just stuff" are probably worth working with. We'll see.There were a couple of things that I had seen but that I now want to look at more closely.One was the Future interface. Brian described it as a thing to hold the result of a call that might occur in the future, might have occurred already, or might never occur. It gives you a way to decide whether the result is still expected and deal with the fallout from that. This is certainly an interesting way to approach the abstration.The other is the atomic instances. These were described as being like volatiles but better, as one had atomic operations on them.I do not know if this made it to the documentation or not. It was said that the Lock interface was useful in J2SE 5.0, but might not be so useful after that. Apparently, the synchronized keyword support in later versions of the VM is much better. It was said that the performance gains obtained through the use of the Lock interface became less notable after the fixes to synchronized. This is probably a good thing to know.I'll try to update this every day and find some of the things that are not hype. I do not try to go to a lot of sessions. I find one learns more by talking to people, keeping one's ears open and like that. One also has time for a few sessions with the new first-person shooters in the Games Lab. Not that I hang out there overmuch. Yeah, of course not....If you're at the conference, I hope you are having fun and remember, if you can see them in your scope, you might already be dead.[...]

command-line tool for fetching with EOF


There are too many things to write about. If I think about all the things I want to say about WebObjects, the things I think people should know, my head threatens to explode.

Additionally, I do not know which of these things are important. Being inside the WebObjects group for so long has given me an odd perspective. There are things I care about that I think will seem arcane and inconsequential to others. It is hard to tell.

So, let us just start. There is a question which comes up occasionally, year after year, on the mailing lists. How does one create a tool for fetching with EOF? Let me just start with this. It is not complex, or even very interesting. But it is a start.


import com.webobjects.eoaccess.EOModelGroup;
import com.webobjects.eoaccess.EOUtilities;
import com.webobjects.eocontrol.EOEditingContext;

public class fetch {

public static void main(String[] arg) {
(new fetch()).fetch();

public void fetch() {
EOModelGroup group = EOModelGroup.defaultGroup();
try {
catch ( mue) { System.out.println(mue.getMessage()); }
EOEditingContext ec = new EOEditingContext();
NSArray rows = EOUtilities.objectsForEntityNamed(ec, "Movie");
System.out.println("retrieved rows # "+rows.count());


The Perfect Beginning?


Staring at the blank screen. Thinking of how to come up with the perfect first post. O well. Never mind.

Camus comes to mind. A character in The Plague was trying to write the perfect novel. So, he needed the perfect first chapter. Really, he needed the perfect first sentence. He had spent years and years and filled up cabinets full of writing and had just the very first sentence. It was not yet finished.