Saturday, June 30, 2007

Jazoon 2007: Last day

I didn't really get around to take any notes the last day. Or well, I did take some notes but I lost them.. Here's what I attended at least:
In the last talk, I asked the speaker whether he thought extensions of Java as a platform was a fair way of increasing complexity vs new languages better fit for the job (a more powerful platform does reduce the need for new components), with a particular regard to AOP and Closures. He answered that AspectJ in runtime would be considered a foreign component increasing complexity quite a bit, but closures would be more of a welcome addition to the language.

I asked the same question to Peter Sommerlad yesterday, and his answer was that he discussed this with Kiczales about this some ten years ago, and his belief was that the developers/tools weren't ready for it yet. We first have to master the art of OOP before we advance to AOP, but I'm not sure I agree. Alot of the GoF-patterns we use today are there because of restrictions in C++/Java, and maybe OO wouldn't be that much worse of having to be learned with AOP.. Just a thought.

(By the way, reason this post is done so many days after Jazoon is that we've been constantly occupied since, attending an internal AOP-workshop for the last two days straight. Thanks, Kaare! Great workshop.)

In the closing session/lightning talks I learned how to present the Semantic Web in 1 minute, some good books to read on python and management, and learned lots of other interesting facts that I have since forgotten.

To summarize my experiences of the first Jazoon:

Bad things:
  • Far from packed (700 people I think, was room for a bit more than that methinks)
  • Level of speakers were a bit up'n'down
  • Should've turned the lights in the theaters on during talks
  • The talks' slides (and hopefully video) aren't up yet
  • Zurich is *nearly* as expensive as Oslo. And pretty similar in every other aspect except the language :)
Good things about Jazoon:
  • Attracted a great score of central/south/eastern-European developers (where I predict great things will come from the next few years)
  • Organization was like clock-work
  • Wireless was constantly up
  • Lots of room :)
  • Power slots every other row in the theaters
Thanks to the Jazoon organizers. I really believe you have the infrastructure and organization to become a great conference in the future, perhaps already next year. So get your abstracts ready, folks :)

Oh, and as a side-note, my abstract didn't get accepted for JavaZone this year, so the material probably won't get any more "exposure" here in the blog, although I will continue implementing the pattern in my day-to-day work.

Thursday, June 28, 2007

Jazoon 2007: Day three

The last thing we attended yesterday was Neil Gafter's Java Quiz BOF. Will have to take a look at

Keynote with Erich Gamma. Eclipse Jazz looks mightily impressive. It's an Eclipse workbench addon that integrates *a lot* of groupware functionality in Eclipse. Think task-tracker, project members, svn commits and activities, the quick tour made it look really impressive (live demo). Unfortunately, Jazz is a commercial product. And would you really pay for anything that is based on Eclipse (being the obtrusively bug-filled platform it is)?

First session. SAP talk. Memory is split in heap space (objects) and perm gen. Heap dump content, objects, classes, classloaders, GC. Currently alive in memory objects.

Retained size of an object is not the same as the shallow size. Retained size includes the underlying chars for Strings f.ex. Retained size can be calculated by simulating a GC and see what objects remains.

By looking at dominator trees (parenting objects and their children), it becomes easy to calculate retained size. This technique (building dominator tree) is much cheaper in time use than to run a GC do discover what objects can be freed.

By grouping dominator tree by class it can be easier to the objects that are eating up your heap.

There's also a command line tool and an object heap qeuery language.

Critical problems encountered. Typical problems are innefficient data stcutures, XML, model/proxy driven classes.

All in all, this was a hidden product presentation for SAP's memory analyzer, but has some reasonably useful hints on debugging memory leaks/memory use.


Second session, JavaFX.

Lots of demos in this talk. More entertaining than it is useful, but nice to get some first hand input on JavaFX. Seems like it won't be useful performance-wise before after a year or so. Good, will check back on it then.


DTrace talk. Was split into two; a DTrace intro (fits me fine), and a case study done on Java across different OS'es (but the work/report there is not done).

Is like truss(1), but can inspect many other aspects It's scriptable. It's in java6 by default. Visual tool on the way for Leopard.

Is not intrusive/safe to the runtime. No impact on the probes that are enabled by default.

The awk-like language is called D.

Many performance bottlenecks can be found and analyzed with a couple of 1-liners of DTrace. Jaron Jenson has some good examples.

Over to the second part of the talk. They tried to reveal whether the Java behaviour/characteristics were different between OS'es.

Measured on different platforms, amd, intel and sparc.

The project isn't done because MacOSx does not have DTrace built into it. Won't be released until this fall. FreeBSD is there, but you have to get a snapshot. Results will be put on the developers' blogs.

For us not on java 1.6, we can use the DVM agent (prototype).

To properly make use of DTrace you should have good knowledge of OS, C, Java VM, etc. Have a long way to go.


After the technical sessions we were offered to see the Die Hard 4 premiere, but we preferred travelling to Rapperswil by boat for a bit of tourist activity. We stopped by HSR and met pattern-author Peter Sommerlad and got some interesting insight in research they're doing to reduce code complexity/increase code quality. First time I've seen academics deal with stuff so close to my actual field of work. Useful.

Rapperswil was an old village/castle like thing and we got a fine tour around the place with this excellent story teller guy who appearantly was keeper of the city records of something. Was a fine opportunity to socialize with other Jazooners.

After the tour we ate some nice pasta and headed back to Zurich for more free beer and karaoke. Great day.

Tuesday, June 26, 2007

Jazoon 2007: Magnolia product presentation

The chronology of this post isn't entirely correct, but I went to one product presentation last night, being Boris Kraft's Magnolia presentation. There weren't too many attendees (mostly likely because of late announcement), but it was still a nice presentation.

I spent a lot of time with Magnolia last year and the year before, and I have to say it is quite impressive to see how far they have come since Magnolia 2.0 in the recent 3.1 version. The user interface is much nicer, Document Management, lots of new paragraph types, workflow stuff, as well as a pretty slick site-designer for the enterprise version, just to mention a few new features.

And in my personal opinion, the price isn't bad compared to other proprietary CMS'es, and you still get a long way with the open source version. From a few years back their number of reference projects has been multiplied by the hundreds, and traffic on Magnolia-powered sites all in all is probably sky-high by now.

I've exchanged a fair number of mails with Boris and Magnolians in the past, so it was great to finally meet him. After the presentation we got some free beer (and expensive cola) and talked about open source, system development, Switzerland and puppetry, amongst other things. After he had to go home to Basel, we (the Objectware lads) headed out to town! Zurich by night is a fun place indeed :)

Jazoon 2007: End of day two

After lunch I dropped in on Øystein Grøvlen's intro to JavaDB/Derby.

Supports some cool things I didn't know about, like support for external authentication mechanisms, encryption, calling java from SQL (for whatever reasons you want to do that for).

Different persistence mediums (file, jar, memory). Derby must be started as a networkServer in order for other applications to connect to it outside the runtime.

SQuirrel is a nice tool for browsing the db.

Had a quick talk with him afterwards on HSQL vs Derby in typically JUnit tests (like in a subclass of Spring's AbstractTransactionalDataSourceSpringContextTests). HSQL is still faster, and in-memory implementation of Derby is still in the experimental phase. It can be tuned by turning off some logging, and doing setup in @BeforeClass (junit 4) should help.


David (Day) Nuescheler's talk on AJAX on top of JCR. At the same time as this was pushing their CRX content repo thingie, it was actually quite a cool product. R-JAX is a JS API for reading and manipulating a content repository (js read, form post to write).

The slides are real nice! Nice chalk on blackboard thing going on there..

It runs on CRX. David does us the favour of showing off CRX's user-friendly installer :)

He uses webdav to mount the content repository. Is this webdav connector the one in Jackrabbit, I wonder?

There is obviously a servlet that listens to rjax.js functions. Nice url mapping between actual content and the servlet. Good to see some good has come of Fielding joining Day :)

Any security implications? Well, many of the other AJAX talks have strifed that subject..

Live demo of reimplementing a blog in 15 minutes. Very cool.

Ah, he actually managed to do it in 10 minutes (write post + archive)! He says it's the first and last time he managed to do it in time. The whole thing was done in 15 minutes and about 10 seconds. Impressive!


Then there was this great talk on RESTful WS and Java support for this coming into a JSR. Paul Sandoz is spec lead on JAX-RS. His advice is read the book, Restful Webservices (ordered it from Amazon like two months ago but it still hasn't arrived).

An API that helps you develop RESTful services. Get rid of boiler-plate url and json mapping.

Soec is still in an early version.

Declarative annotation of doGet in servlets, like @ProductMime("application/xml") .

Servlet Artist is annotation @UriTemplate("/artists/{id}"). The annotations are also applicable to POJOs.

Nice with sub-resources (artist/13/recordings)

Greg Murray does some good blogging on the subject.

It reminds me slightly of Struts2's @Result annotations.

When it comes to responses, instead of returning outputstreams they use Block's builder pattern.

The @UriPram is pretty cool, does injection of parameter values. I wonder whether there are any advanced converters for going from request parameters to field values.

Still some open issues in the spec when it comes to filters, authorization, etc. Jersey is the reference implementation.

Demo with Netbeans, hitting on breakpoints in generated Resource classes when firing off Resource requests/uris.

Looks like Netbeans has got a webtest framework. Interesting.

This is really cool stuff, there's a MatisseBlogger thick client that utilizes the API. Will have to keep an eye on this.


Next up I had a hard time finding an interesting subject. JavaDB performance would be cool, but I'm pretty satisfied with the performance as it is. Besides, it's quite likely that I will bump into these guys back home some time.

Went to the Swing/flash/ajax integration. Mixing different technologies on the client side. It's nice to get some input on what to use for rich clients these days, so I'm hoping I'll get some of that in this talk.

After some theory it's a demo based on the flex hybrid phone store example.

Then onto the Flex/Ajax bridge.

Instead of getting the Flex app as a DOM element you use the bridge to access the Flex model.

Moving on to bridging Swing to Ajax. They've got a demo application, a Swing app that embeds a small browser window with a Google Maps underlay. The cool part is that the zoom-function, a JS-function in the Maps API has been extracted into a Swing controller. Inside the controller there's like fBrowser.executeScript(map.zoom..). The protocol for shipping these requests is proprietary, there is no native JS event handling in Swing, naturally.

Next up is integrating flash into a Swing application. ActiveXControl.CallFunction, only works through IE at the moment.

Nearly fell asleep at this point. I have to hand it to you, German/Swiss people have a *very* monotone voice when speaking English for some reason. Combine that with free beer during the evening before and you get nappy listeners :)

To wake back up, I tapped in on some blog analytics. Since I started blogging on Jazoon, the search income on the stats have pushed up traffic quite a bit. Sorry I'm not putting more energy into making these posts more readable/interesting.


Ajax enterprise for Java... By Greg Murray whose blog was mentioned in the previous presentation. This talk was great for a quick run-up in jMaki and various Ajax toolkits Sun are working with these days. I didn't take too much notes as I was listening carefully to lots of interesting tips about Javascript, cross domain scripting workarounds and request-keys used to restrict/control JS requests.


All in all, it has been a great day at Jazoon. The quality on the talks was generally higher than the ones I went to yesterday. Next up is dinner, then BOFs.

Jazoon 2007: Day two half done

Disclaimer: I'm just splashing in the notes I'm talking while listening to the talks here. All notes are not stated facts. Just stuff I manage to pick up.

Keynote by former Apache foundation chairman Roy T Fielding about the ideas and origin of REST, the re-discovery of REST (after SOA/SOAP). Fielding published the REST architecture in his dissertation 7 years ago, and advises us to be aware of buzz.

Second part of the keynote was an ELCA talk about integration between heterogenous systems and how Spring has helped them with that.. Very 2004'ish.


Glassfish V3 talk.

V1 was released at JavaOne last year. V2 is still in development (clustering, load balancing), most development will happen in V3. Lotsa changes going on.

It is essentially the same demo that was held at JavaOne some weeks ago.

Quickly in demo. Startup is in 800 ms and still able to serve static pages. Started off with deploying a RoR application.

asadmin deploy -- path ~/ror/mephisto

Deploying a RoR application starts the RoR container.

Same for a webapp, starts the web container

asadmin undeploy --name mpehisto

When killing and starting v3 with war still deployed startup time is 2.3 seconds. Undeploying returns the startup to 800 ms.

The architecture is based on maven and OSGi. The kernel is 50KB. Runs on SE.

The module control is meant to be handled with jsr277 due in java se 7.

Went on to talk about modules, classloaders and libraries, garbage collection. We have to be carfeul with use of threadlocal to let the GC run. Repositories hold modules. Eventually they want to tap into OSGi to add and remove repos at runtime. Already done in maven/directories.

Bootstrapping is done by implementating ApplicationStartup (interface). Dependencies can be declared in the manifest (that can be generated from the pom). But they do skip the POM file for performance. Use MF instead

Dependencies are package type "hk2-jar".

V3 is still not JEE compliant, but they're getting there.

Services. Annotation based service declaration. @Contract and @Service. Glassfish will find it and initialize it on startup.

Nice way of annotating actions, like "deploy".

Grizzly best web container on performance.

Dependency Injection. Looks like Google Guice.

Extraction. Lets objects produce ouput. @Extract on getter methods.

But how do they order of instantiation. It does inheritied componend dependencies with "cascading".

Good talk, very interesting even if I heard a run-through of the content before.


On to a SOA talk by Patrick Steger. Trip through WS* standards.

Nice and relaxed tone on the speaker. He's very concise and knows very well what he is talking about. Probably the most professionaly executed talk I've seen here so far (first guy who finished on time).

I've been lagging behind on ye old SOAP stack so its nice to get an update on the standards.

Starting off with WS-SecurityPolicy. Draft standard, suppotrted by some java and MS. Its an extension of the WS-Policy standard. It is done by OASIS

WS-MEX (metadata exchange) is used for getting policies over to the client.

SAML assertions are passports. WSDL get over http can be used to get the metadata used for future transaction. also supported by MS and some Java frameworks. Still protocol independent. It's based on WS-Transfer. Great for flexible endpoints. XML standard, draft review.

SAML is an OASIS standard. Used for key exchange.

The SAML is gotten hold of with a SecurityTokenService (running a dedicated server). Communication with this one is done with WS-trust.

Its basically key exchange mechanics done in WS. WS-Trust is an established OASIS standard supported by MS and Java projects.

WS-Trust is based on WS-Security. There are different token profiles for various security methods (kerbroros, user/pass, SAML, x509).

Passports are used for establishing secutiry for short intervals (40 secs). WS-ServiceConvercation is used for establishing longer sessions. This is done by getting a SecurityContextToken.

Finally the conversation can begin and SOAP messages are exchanged, client using service. All well authenticated, signed and encrypted.

WS-SecureExchange is an integration of all the mentioned standards into one standard.

Goes on to extend the example with an Authentication Service server. XACML is used for communicating with this server. This is the authorization part of the security. This is a mature OASIS standard with good access control.

Java vs MS on this one. WS-Security is supported in Axis 2, also lotsa support in proprietary products. There is a WS02 framework on the way.

Very little happening in the Java community for supporting the above standards, while the standards are already part of the platform in MS Communication Foundation.

Good slide in the end there, good talk. Very clear on what the facts are and what his personal opinions are.

Key findings include that these standards put a heavy load on developers. Best for Jva/MS integration is to use WCF on MS side and WSIT on the Java side.

Good idea to extract all this security into xml-firewalls, and reuse authentication/authorization mechanics across projects.

Question about whether it is difficult to deploy on IBM Websphere. It is a problem, but using WSIT instead of webpshere WS framework.

WSIT is a framework, project Tango. Spinoff from Sun. The aim is to provide a WS framework that interoperates with the MS world.

Monday, June 25, 2007

Jazoon 2007: Afternoon and evening

Great, I managed to do a java Black Belt attempt on Java 5 and ended up with 0/5 points. I've never even heard of that Scanner class. Think I better get started on that certification (again).


Went to a talk by Red Hat's Jan Wildeboer. Virtualization. RH now delivers a full stack with JBoss server and clustering. Most OS'es are built being able to dynamically use CPU and memory (not Windows of course).

Some keywords: VMWare invented x86 virtualization. Hypervisor, ring zero. There were performance issues (20% with heavy io, which is especially overhead intensive). Now there is something called para-virtualization with minimal overhead (1 - 5 %).

Talking about perfomance, live migration, upgrades..

Jboss clustering is still the solution for scaling up memory exploit as the JVM is not dynamically using memory or CPUs.

Virtualization offers us a lot of better perfomance, especially as more CPU's and memory are fitted onto boards.

The talk was a bit out of my league, but it is interesting to hear an alternative to Sun's Solaris/Zones we might consider. The RH guy claims he 's not allowed to present benchmarks, but that RH would win anyway.


The other guys went to see the GigaSpaces talk, so I'm tapping in on this one. I'm an old Hibernate user, and I've always wanted to dip into JDO, so that's bout the reason I'm here.

JPox Spatial, some GIS extension on the JDO standard.

Problem is mainly today that there are no tools with a DB back-end that supports GIS stuff. Or they're proprietary, etc.

JDO is a standard. JPOX is Sun's implementation. It also implements JPA.

Talks alot about different libraries from various commercial vendors that are compliant with JDO/Spatial, or the other way around.

The API for JPOX is pretty similar to Hibernate, only slighty worse (save, then get ID).

The spatial api for example gives us a query to ask whether a point is inside a polygon (or does polygons collide, etc).

All in all I think this might be a very exiting for GIS developers. There is an ISO standard on the way for doing these kind of data stores, and having a JDO API on top of these sounds like a good idea.

The speaker is doing some defence of JDO vs Hibernate, JDBC, EJB. Not new to me, I'm no happier with hibernate than I am with JPOX/JDO.

Runs with maven 1. Admittedly lacks the modularity of Spring/Hibernate.

Good idea, implementation sounds slightly immature, quite early into the market. Speaker is quite nervous, but engaged in what he's talking about.


Caught a talk on unusual use of Java to get stuff the way you usually would've done it in C. I've never been a C programmer so this talk went pretty much over my head, but it was still somewhat amusing to hear some innovative way of making your own iterators. Neil Gafter was in the seat behind me, and when he laughs it eases my mind thinking this is not stuff I have to do on my own, but can rather wait till it enters Java 7 (closures that is).


Now tapping into a talk on Java EE. Figured it was about time I try listening to something I actually know anything about. Leader of the Italian JUG presenting a year of experience with JEE 5. He's also written an Italian book on JEE 5.

The main difference is easier use with POJOs, annotations, injection, etc. Focus here is on EJB 3 and JPA. I've got to post this now but I'll post back on how it went. Probably not too many surprises in store here.

Jazoon 2007: Day 1 Keynote

And we're off. I'm listening to the keynote session. Taking place in a movie theater, seems like the conference is taking place inside some cinema metroplex called Sihl-city, or Movie-City.

We weren't really aware of the size or scale of Jazoon up front. Seeing the amount of people in the theater, it's not too positively surprising. The theater is about 2/3rds full, I think I can count the number of attendees in the hundreds. There is an okay amount of stands, many of which are naturally Swiss companies that I've never heard of, and I'm guessing most of the attendees are Swiss as well. I've only counted 6 Norwegians so far, the three of us from Objectware included. The other three are from Sun, two of them are doing talks on JavaDB later on.

After some welcomes and intros there were some (dry) words from the sponsors, including Andreas Knöpfli, manager Sun, Switzerland, a guy from Elca, Swizz IT service company. Red Herring, some magazine. Farley Duvall is talking bout globalization. Says that central Europe is the most promising part of the world concerning entrepeneur/capital/education and everything.

I'll hand it to them that the media videos in between sessions are pretty cool though.

Then its on to Ted Neward's talk on the past and future of our use of programming languages.

The program in Jazoon is quite Sun-dominated. Was sort of funny to hear Neward bashing early stages of the JDK, and not even mentioning Netbeans when it comes to IDEs.

Ted Neward is a good talker. He sounds and looks abit like Jeff Bridges. Spent alot of time convincing us how much work it is to develop a language from scratch. Goes on into DSL's, easy to develop new languages. Perfect storm. Talking about virtualization and tools and linguistics.
Mentioned Ruby. Green threads. Long story short, there are a lot of possibilites coming up when it comes to us developing and using langues on top the JVM (or any other VM).

Now it's off to lunch. Think I'll catch the talk on Java virtualization after the break.

Sunday, June 24, 2007

Arriving in Zurich (Jazoon 2007)

So after a slightly delayed flight and some easy public transportation, we've now arrived in Zurich. Jazoon starts tomorrow, and it seems like we've (accidently) managed to book ourselves into the same hotel as where the conference takes place (Sheraton). Sweet!

Unfortunately, our power-adapter won't fit the chargers of our laptops, so I've got approximately half an hour of battery time before I'm out. Will try to get a charger and post back frequently with reports on various talks through the week.

Give me a shout if there are any particular talks in the program you think I should attend! I haven't really had the chance to sort out the schedule.

Sunday, June 17, 2007

Scrumming the night away

Today I decided to do a small experiment.

I was scribbling up a tiny todo-list when I thought "Hey, why don't I do some rough estimation on how long these things will take?". This is what the list looked like at first (at 18:00):
  • Short bike trip - done at 18:30
  • Do some planning for Objectware-uni (training for the new folks) - done at 19:00
  • Fiddle with personal bank-stuff, bills, etc - done at 19:30
  • Write this blog entry - done at 20:00
  • Do some maintenance programming for a customer - done at 22:00
So off I went on my little bike trip, trying out those new bike-shoes that click on to the pedals (did I mention that I cycle to work and I think everybody should do the same?). Naturally, I bumped into my neighbour that I had to help out with moving a fence, and neighbour-chat with for a while. By the time I got back it was 19:20.

Darn. So I had to re-arrange my estimate:
  • Bike and neighbour - done at 19:20
  • Objectware-uni - done at 19:30 (would have to be quick!)
  • Bank business - 20:00
  • Blog - 20:30
  • Programming - 22:00 (1/2 hour less than originally estimated)
On I went to wiki down the uni-plans. Was I quick about it? No. It is very hard to rush stuff that involves thinking. In fact I was so enticed with the state of the wiki that I blew off half-an-hour cleaning and moving stuff around on the wiki. By the end, the time was 20:00. Re-estimating:
  • Bike and neighbour - 19:20
  • Objectware-uni - done at 19:30
  • Wiki-stuff - 20:00
  • Bank - 20:30
  • Blog - 21:00
  • Programming - 22:00 (1 hour less than originally estimated)
[In the moment of writing, it is 21:30, the deadline for my latest blog estimate, so I will have to hurry up now.]

The bank stuff went pretty quick (10 minutes). But then I felt hungry. I eat extremely slow, and I eat a lot (much to the annoyence of fellow lunchers and diners). I made dinner, ate (while reading TheServerSide discussions) and was ready to move on at 21:00.

New estimate:

  • Bike and neighbour - 19:20
  • Objectware-uni - done at 19:30
  • Wiki-stuff - 20:00
  • Bank - 20:30
  • Dinner - 21:00
  • Blog - 21:30
  • Programming - 22:00 (1,5 hours less than originally estimated)
And now my time for blogging is up. Spending a half hour programming doesn't seem very worthwhile, so I'll rather spend the rest of the evening relaxing and planning tomorrows bike-trip to work (lotsa logistics involved there).

  • Keeping a plan like that made me work more efficiently
  • I quickly discovered things I wouldn't have time for
  • I always discover new tasks I'll have to squeeze into the program
  • I'm easily distracted by these new tasks (will have to work on that)
  • Food takes time and must be planned for (will have to work on that too)
  • Your plan will continously be disturbed by people who want to chat on MSN/IM
Overall, the best thing about Scrum is that it makes you more aware of what you and your team is doing, and what steps can be taken to improve your development process. The next best thing is that it allows you to break estimates and openly admit it without anyone yelling "Sue these guys!"..

Sunday, June 10, 2007

Going to Switzerland/Jazoon!

Coming up, Jazoon, a four day conference filled with interesting talks on various Sun-self-bragging campaigns, Java 6 and 7 stuff, and some interesting things about JavaDB, Java Content Repository, scripting languages, etc.

Me and two colleagues from Objectware are heading down there on sunday the 24th of June. My first time in Switzerland, so it's definitely going to be a cool trip. And if I get some chance I'll drop by some old friends in Basel. Oh, speaking of which. You Jazoon guys might want to change the default Magnolia log-in on your website ;)

Regarding my JavaZone work, I'm not going to put too much effort into it before I know whether the abstact has been accepted. Will probably get feedback before the 20th of June.

That's all I have time for today! Need to get some sleep.

Sunday, June 03, 2007

No blog today folks

Today I've been busy playing Starcraft against some old mates (we haven't played that stuff in like 7 years or something).

I did however get some feedback on my JavaZone abstract. Turns out I've been a bit too fluffy in the abstract, and I have until thursday to elaborate on some key points. Just to let you know I'm busy enough :)