Finally on Vacations!!!

So, I'm finally on my vacations. I had to cite law articles to get some vacation time, but I'm finally at home, resting and recharging my batteries. I have some things to do, but things that are fun to do!!!

And it was the right time to go on vacations: my mood wasn't all that good, in fact, nobody could hear another one of my comments about how things are all wrong; my car needs to go to the garage (they are able to squeeze it this week); I need to by some clothes; I need to check out some swimming pools and I need to find a new house.

Many things to do while I'm on my vacations, but the one that I'm also doing is a Web Site for my family's company. It will be a simple Apache, PHP and MySQL site. What I really wanted was to make a full blow JEE5 Site, all Web 3.0 and so on. Facts are that they don't need all that bloat: they need a simple, clean and fast site. Taking into consideration the hosting costs and everything, PHP seems to be the way to go. I'll need to freshen-up my PHP skills, but that shouldn't be a problem...


Creative Commons!

Today I can't help to blog about something I stumbled upon in the Web.

I don't know if you haver heard about the Creative Commons initiative. If you didn't brace yourself for a trip to the world of freedom of expression and though!!!

Whenever you have an idea and implement it, the idea is automatically copyrighted. This is specifically true for Music, Pictures, Films, Books and son on. The problem nowadays is that this rights are being enforce to a level that is so extreme that our children are being forced in to pirates. They are being forced into believe that copyright should exist.

My humble opinion is that copyright does and should exist. But common sense should guide on what is breaking a copyright. If I'm copying a music without paying for it and redistributing it to the whole world, free of charge or not, I'm breaking a copyright. I don't think I'm breaking a copyright when I use a peace of a music, mix it with video and share it with my friends. This isn't breaking copyright, its expressing my creativity.

I won't write a lot more because this video from TED says it all. The speaker? Larry Lessig. Watch it: its 20 minutes well spent!!! And if you agree with this vision share it with the world!!!


Swing Tip: Heavy Paint Job...

Have you ever needed to make some heavy 2D rendering operation in Swing and you didn't want to block the Swing Thread? Well, I had to, several times and today I made a hack for a colleague that I would like to built upon here.

My first attempt to ensure that the Swing Thread wasn't blocked was to conduct all rendering on a background thread. This obviously violated all Swing and Java2D principles. If you don't know, just Google for it, but the fact is that all rendering should be done by the Event Dispatch Thread. So, all Swing activities should also be done in that same thread. What happens if the scene you are rendering is rather complex and you don't want to hog the Even Dispatch Thread?

A simple technique can be applied. The idea is to hold the context when the rendering is started. If the rendering has been going for quite some time, place an event in the Event Queue to resume it later. This allows the Event Dispatch Thread to process other events. When the rendering is resumed we can check if the context has changed. If it has we probably have to start the painting process all over. If it hasn't we can resume were we left of.

Here is a sample code for this. The rendering is completely stupid, but the idea is to emphasize that you can put any rendering code in it.

  1: import java.awt.BorderLayout;
2: import java.awt.Color;

3: import java.awt.Dimension;
4: import java.awt.Graphics;

6: import javax.swing.JComponent;
7: import javax.swing.JFrame;

8: import javax.swing.SwingUtilities;

10: /**
11: * Class that demonstrates out to avoid hogging the Event Dispatch Thread
12: * when a Heavy Paint Job needs to be performed.

13: *
14: * @author Nuno Sousa
15: * @version v0.1a(C) 2007 Nuno Sousa
16: */

17: public class HeavyPaintJob {

19: public static void main(String[] args) {
20: final JFrame frame = new JFrame("Heavy Paint Job");
21: frame.setSize(800, 600);

22: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

24: frame.setLayout(new BorderLayout());
25: frame.add(new HeavyPaintComponent(), BorderLayout.CENTER);

27: SwingUtilities.invokeLater(new Runnable() {
28: @Override

29: public void run() {
30: frame.setVisible(true);
31: }
32: });

33: }
34: }

36: class HeavyPaintComponent extends JComponent {

38: private Dimension fSize = null;
39: private int fCurrentRenderingStep = 0;

41: public HeavyPaintComponent() {
42: setOpaque(true);
43: setDoubleBuffered(true);
44: }

46: @Override
47: protected void paintComponent(Graphics g) {

49: // As context I'm using the components Size.
50: if ((fSize == null) || (fSize.width != getWidth()) || (fSize.height != getHeight())) {

51: fSize = getSize();
52: fCurrentRenderingStep = 0;

54: // Rendering initialisation goes here (for instance background filling)
55: super.paintComponent(g);

56: }

58: // Boolean that controls if rendering has ended or not
59: boolean renderingCompleted = false;

61: // Don't hold the Event Dispatch Thread for more than 250ms

62: long time = System.currentTimeMillis();
63: while ((System.currentTimeMillis() - time) <>= getWidth()) {
64: renderingCompleted = true;
65: break;

66: }

68: // Make sure that rendering is resumed at a later time
69: if (!renderingCompleted) {
70: repaint();

71: } else {
72: fSize = null;
73: }
74: }

75: }

The next goal is to make this a component and put it somewhere people can get it and reuse. But at least you get the general idea today and not when I have the time to make a component out of this.


Updating my Six Year Old Laptop

Today I finally finished the update on my six year old laptop. I know it sounds crazy, but I bough a laptop back in end of 2001 and I still haven't replaced it. I put linux into it and never looked back Started with Mandrake at the time, I then made the switch to Gentoo. Since then I have always updated my system without any format like you have to do on other operating systems.

I was unable to connect it to the internet for a while. This lead to a very outdated operating system. Luckily Gentoo is almost straight forward to update. The only problem is that my desktop environment is eating a little too much memory for my taste. I guess I'll need to tackle it later.

On my project list is an idea to make a 3D chart on top of Java 2D. Why? Well, I already made such a chart for the company I work for, but at that time I used Java 3D. Now, there is nothing seriously wrong with Java 3D itself. Let me make it clear that it is very nice API. But to do a chart in Java 3D is an overkill. Also I believe I can make a simple implementation using Java 2D alone. I'll post the progress of that work here, as it evolves.


WebBeans and others...

It has been some time since I blogged. I hope to do this more often. You see, I lost the internet connection in my Linux Laptop. Why? Well, my ISP decided to change its settings and didn't tell no one about it. It worked on Windows, but my laptop hasn't run Windows for over 4 years. I though it was a problem with the modem, or my configuration. I ended up buying a new modem/router. It still didn't work so I called technical support and then they told me the options that you have to use when you're not using their own modems. Why? Well, their modems have their hidden configuration options hardwired... but on to more interesting things.

I came across a series of articles about Web Beans. I don't know if you know about JEE (yes, since version 5 it is JEE - Java Enterprise Edition, not J2EE) but I had a training on this subject and I liked the way they used annotations and other techniques to turn a bloated platform into a clean and simple programming model. But their efforts haven't stopped. They are also specifying the concept of Web Bean. It's target? JEE6. Does it make your life simpler? Hell yes.

The injection model is simple and powerful. But instead of reading my opinion about it read the for part series on the subject by the Spec Lead: part 1, part 2, part 3 and part 4.

Now that my laptop has a connection to the web it is just a matter of update it to the latests Gentoo patches and I'll be posting more regularly.


I'm Still Alive!!!

No, I haven't disappeared from the face of the earth. At least no yet! What happened was a drastic change in my life that led me to stop blogging about anything. Today I decided to put this small entry just to say that I'm still alive. I'm finally having some time off work to recharge batteries and get my life back together. I also hope this extra time allows me to post more things here.

I have a couple of tutorials lined up. The first should be about WebServices in Java: how to call or build your one WebService following a predefined WSDL without using any libraries but the standard ones included in the Java Runtime Environment. So keep reading...


News Update...

It has been a long time since I last blogged. The reasons are many, but lets just say that things have been a little chaotic. It seems that everything has landed on top of my head: work, thesis, health, you name it...

Although it might seem that I'm just ranting for nothing, lets take a look at a few examples.

First I had to make a presentation to the President of the Republic. Yes, I live in a republic and we have a president. I was chosen by my former chief and the current chief to make this presentation. A 5 minute presentation that should pass the concept of the product, including a live demo of the software. In other words: you have 5 minutes to either excel at it, or be marked for the rest of your life for the worst reasons. Why do I say this? Well, all the public TV channels were there, including some private. Newspaper reports, radio reports, you name it. I even ended up with my face and my back in the public television!!! My parents were so proud ;-)

On that same week I had to travel to a city 300Km away (for those of you who think in miles I can tell you that it takes 3 hours by car to get there). The goal of the trip: try to save the same product I presented to the president. What do I mean with save? Well, there was a merge of the company with another company that had a similar tool. Similar... well, if you could say that it would be nice, but the fact is that the tool is ages behind us. It was a complete waste of time because upper management already decided for us. They just ignored more then 50 Mobile Phone Operators and more then 500 individual users, no big deal.

Just to finish this small list of things that happened a last thing: I was awarded a Laptop. No, it is not mine, it is of the company and everybody else is also getting one. It seems to be cheaper to give everybody laptops then to by an UPS. I also think they believe I should be working at home also, besides all the free extra hours I give them every single day.

As you can see things are moving along quite nicely... that's why I haven't been blogging much.


The Building, Life and the Laptop...

It is funny how things turn out some times. No matter how many plans you make, destiny will always throw a curve ball at you. You may plan it all out: what to do, when to do it, even how to do it. But the fact is that when you try to actually do it, things will blow up in your face.

The last entry I made in this blog was about the building I'm currently working on. Funny thing is that it has been over a month since I blogged and the building is still under constructions. But since someone very important, like the President, is coming for the official opening the work has suddenly switched into Warp 5 Speed. You have painters working side by side with welders; technicians configuring the elevator; technicians testing the air conditioning and more. The end result is that nobody can actually get any work done in the mist of all the noise and smell of paint.

On top of that the building still has no full electrical power. We didn't work for a whole morning so the power company could make whatever it needed to connect the building to the power grid without restrictions. It turns out that the power company only checked if the installation had been properly performed. Luckily last Monday was a working bridge for us so their plan was to use it to make the final connection. I will know if it all went well tomorrow, when I arrive their and push the power button on the PC. I won't have any communications or servers, but if the AC is working and pumping hot air I'll be a happy man. I say this because during the tests they were testing it for cold air, like if the building needed any cooling...

My life has took a couple of turns the last month. I have been feeling a little stressed out and tired. It is probably due to the new working location and everything that is happening, but it has gotten me thinking if I made a good decision when I signed the agreement to move. And lately the company has made a push in the direction of the "Not a Good Decision". They paid what was written in the agreement, but they either forgot to mention or didn't matter to tell me that my salary would suffer a 10% cut in the month the agreement was paid. This is on my agenda for tomorrow, but I'm getting a little tired of all this. I should learn not to expect anything good or to believe in what I am told when discussion working conditions. We changed for good to terrible and they are still hitting us on top of that.

Finally a note on my Laptop: I have a laptop that has more then 6 years of age. Even after I bought the laptop it wasn't the top notch of its time. I bought it because it seemed a good compromise and I'm glad I did it because it hasn't left me down ever since. It is true that I added more memory to it and that I changed the hard drive for a bigger and faster one, but even so it definitely was a good choice. I loaded it with Gentoo several years ago and I have been using Gentoo on it ever since. I though I would have changed to Ubuntu by now, but I'm afraid that Ubuntu won't be as fast as Gentoo so I'll stick to Gentoo. These days I have finally upgraded GCC to 4.1.1. This is something I had been delaying for over 6 moths because it requires a full rebuild of the system. Have a 6 years old laptop running non-stop for more then 3 days means that the laptop is definitely good. As a bonus the laptop will have XOrg 7.2 and maybe I'll try Beryl and see if it kicks-ass...


A Goodbye...

Today was my last day at my current working location. It is strange to leave a place where I have worked for 7 years and 15 days exactly. I'm not leaving the company, but the place, the friends from other departments that are staying.

I will miss specially the ladies, since in our new location there won't be a single lady in the floor I'll be working: just men. I usually say that if you put too many men engineers in the same place without a single women things fall apart. I say this because the conversation level degrades...

A women would make all the men automatically be more self-conscious and avoid having conversations in slang or anything worse. To all those that stay in the old location I wish the best of luck and happiness with their lives. For all those that like me will be pursuing a new adventure I wish also the best luck and happiness. For those that have left or will leave I want to say this: I understand and although I'll miss you, as friend I have to tell you to pursue your happiness.


Accepting an Offer...

This was a different week. The company I work for is moving locations and I considered their offer unacceptable. Well, they made another offer and I decided to accept it. Although I feel like I sold myself, I can't stop and think that I'm still taking a huge risk. Part of what was proposed to me still hasn't been confirmed and three years from know I'll probably be loosing money if I continue in the company. I'm still thinking if I should sign the agreement without having this confirmation. It makes the risk even greater.

But with that fact aside and if things go according to the plan I'll start working on the new location next Friday. I honestly believe that things won't go according to the plan because it involves changing 80 persons from 4 different locations to a new building that is from 4 to 250Km where those persons currently work. It involves changing people's machines, bindings, pencils, lab machines that are almost never turned off, the UPS, phones and so on. If things work smoothly it will be due to those that are involved in the change. I say this because the plans are still being written as I write this...

But all changes have a bitter side. There are already people that announced that they are leaving. There many reasons to leave, but the main one is the fact that the new location is too far away and they simply don't want to change because they would loose a lot of money every single month. There are those that will accept the proposal but will always be on the lookout for other opportunities. These are the ones that need the money and will be loosing money every single day, but they have loans to pay. This all leads to a break in the team spirit. A spirit that has been struggling to survive for a long time.

On top of that I honestly believe that it will be harder to find new workers in the new location. The location where I'm working today is is close to 3 Universities that pump out workers every year that meet our exact requirements. The new location has only 1 University close to it and doesn't seem to pump out any real worker, you know, the kind that actually writes source code. But it seems there is another University that is not so close to the new location that also pumps out workers that meet our requirements. Since those guys don't have almost anything in the region and end up moving to the major cities, the company will offer them a different alternative. The price is the traveling time. Maybe they will end up thinking like I'm thinking: if the traveling time starts to be a burden I'll simply move closer to work...


Making Life Changing Decisions...

I already ranted about this the last time I blogged and I don't want to rant any further, but it is affecting my life and I should blog about it. Facts are that I need to make a decision that will change the course of my life. I have to decide if I want to continue with my current employer or if a want to jump into the void and pursue another goal.

There are many alternatives. I can simply look for another job, maybe even launch myself as a freelancer. I can even go for a PhD, but I don't want to get Piled Higher and Deeper. Just kidding. Although I love these comic strips, I haven't run against anything similar to it during my Masters.

Why do I need to make a decision? Simple, I don't see my current employer step up to its responsibilities and pay for the relocation. Although it is in the Portuguese Law that the employer should pay for all the relocation costs I don't think they will. I'm saying this because they are using an option in the law to enter in agreement with the workers. But the agreement they are proposing pays only for part of the expenses and ensures that you stay in it for further 3 years without any king of salary increase - not even the normal inflation.

I have though a lot on this problem and my current view is simple: if they don't step up and assume their responsibilities I'll simply quit. I may have to involve a lawyer. I say this because that is just how the company is: a large institution with absolutely no respect for its workers. Not even the group of 50 out of 600 that is responsible for 25% of their sales.

What does this all mean? Well, if they don't step up I'll be looking for a job soon. I'll just take a few weeks to finish writing my Thesis and deliver it.


The Power of the Community

It isn't new, other have already said it, but today I found another demonstration of the Power of the Community. A Community of motivated people created many successful software projects, like the GNU/Linux project. When the idea for a new project appears and a community builds up around it, the project at such a pace that commercial companies would say it is impossible. In fact, when the community that is developing an application that they will use it, magic happens.

Today I was browsing through the web when I came across this set of videos on YouTube. It is about the Jokosher project. What is the Jokosher project? Well, I'll quote its home page:
Jokosher is a simple yet powerful multi-track studio. With it you can create and record music, podcasts and more, all from an integrated simple environment.
It may not sound that great, but this application was built like every application should. And is moving at a quick pace because of the community that surrounds it. But back, to how the application was built. First they laid down their requirements. They also chose the tools they wanted to use, because they were the developers. Next step was to male lots of GUI Mock-Ups. Incredibly enough, someone decided to code one of the mock-ups, but nothing actually worked underneath it. Well, the Community stepped in and Jokosher is being developed at an incredible pace. In fact, LugRadio is being recorded with Jokosher, since it was the driver for the project.

This project is a living proof of what a community, and humanity in general can achieve if people set their minds to something. Believe me, this is not something you can force upon a group of people. No, the software won't come out faster the more under-paid persons you throw at it. Actually, even with over-paid persons it simply won't work. You need motivated persons, a sense of community to drive a project. Building this community is hard, specially in commercial projects. In fact, I believe that for commercial projects things are even harder since a motivation is hard to build and easy to destroy, but that is a whole different story.


Finally a API for Date and Time Handling in Java

Have you ever had to do real work with Dates and Times in Java? Well, I had to and still have to. For Data and Time handling the Java API includes the Date and Calendar classes, but these classes leave a lot to desire. For instance: there is no class that represents a Date without Time information, or a class that represents Time without Date. Even worst, there is no class to support Durations. Until know what I did was to create the classes that I missed. For instance: I created a Duration class that represents Durations. It is weird to have to do these things, but it is a fact of life if you want to use Java Standard APIs.

But there is hope for the rest of us that really want a new and better API. JSR-310 Date and Time API is planed for Java 7 and should address these issues. They will finally create a simpler API, with all the missing parts like Durations, Date without Time and Time without Date, and so on...

The problem is we are still at least a year away from Java 7 and we need to develop applications now! What can we do? Well, when I found out about JSR-310, I also found out about Joda Time. This is an API that fills the gaps in the Standard Java API with a license that we can use even in our commercial applications. In fact, JSR-310 will take ideas from the Joda Time API, fill some gaps and address other issues: nothing more. It won't be a copy of the Joda Time API, but it should be a simpler version.

From what I saw in Joda Time API, I will definitely consider it whenever I do code that involves Dates and Times. The problem will be convincing management that we should adapt some of our existing code to use this API. But who knows: there might be some severe error in our code that using Joda Time would solve. Well... I'm wishing out loud. The facts are that we currently don't have time to breath, just time to write the simplest code that guest the job done, no matter if the code is the ugliest hack every written!

A Departure...

My grandfather has left this earth and went into the great adventure. He will always be in my heart and I'll never forget him. I know he is watching over us and he expects us to continue without his presence. I'll do my best to make him proud...


ARM, Symbian, Linux and the iPhone

I've been a little off-line lately due to some personal problems It involves the health and life of someone that is dear to me. This leaves me without any will our power to actually write anything. But at least I'll leave here a link to a series of articles on the story of the ARM processors, the Symbian and Linux use on Mobile Phones. And of course, the latest release from Apple the iPhone. Read on if you want to know a little about history, since my will to write is somewhere else...


Filling the Gaps in Swing...

I had this subject on my backlog for quite some time. You see, I started my days as a professional Java Developer doing Swing coding. At that time Swing was OK, a little slow, but OK. Today I believe Swing is as fast and any other GUI Toolkit for Java with the advantage of being extremely flexible. But I don't want to get into a GUI Toolkit debate here because I think there is nothing to debate: you weight the factors for the project, choose a toolkit and live with it.

In the last couple of days I stumbled upon two very interesting Java Specification Requests (JSR) related to Swing The first and oldest one is the JSR 295 - Beans Binding. The second one is the JSR 296 - Swing Application Framework. I already heard about the first one a year ago and I actually thought it was dead, but there has been some progress. These JSRs fill some of the Gaps I always believed Swing had. I'll give you some details.

The Beans Binding JSR finally turns Java Beans into something really useful. The idea is simple: you have two Java Beans and you want to bind their properties. You want that when property X of bean A is changed then the property X of bean B is also changed. Of course that you want this binding to work both ways. Simple in principle, but easy to do? Probably not, but look at the potential: you have a JTextField and its "text" property; you have your own bean, Person, with a "name" property; you simply bind the two properties together and voi lá: the name of the Person is displayed in the JTextField and when you update the JTextField the name of the Person is also updated.

JRS 295 - Beans Binding goes far beyond this simple Use Case I described, it even has an expression language for complex operations and artificial properties to help use the Swing components more effectively. For instance: the JTable class has an artificial "elements" property that represents the rows in the table - this way you can bind a list of objects to a JTable. If your curious check this blog entry and dig in.

Waht about JSR 296 - Swing Application Framework? How should I put it: if you didn't do something similar yourself when you developed your Swing interface that you're in real trouble!!! Let me explain: Action management is something that you must learn if you want to make a clean Swing Interface. Don't know what I'm talking about? Well, you're in real trouble. I'll help you: I'm talking about extending the AbstractAction class. It may seem strange but the idea is simple: you create an action and use it for your menus, buttons and pop-up menus. This way you have only one point on your code where you define the icon for the action, the text, the tool tip, the accelerator key and so on. When you add the action to a menu Swing will automatically take advantage of all the properties. When you select the action, be it in an application menu bar, pop-up menu or tool bar, the same actionPerformed method is used: the one of the action.

But believe me that you loose some time creating the structure to get your Actions well together, specially if you want to have ActionMaps and the standard Copy/Cut/Paste actions. And there comes JSR 296 to the request. With it you simply annotate the methods that are supposed to be actions and it takes care of the rest. Even the GUI builders like NetBeans Matisse will support this.

But the JSR 296 goes beyond this and it event provides support for background Task execution with the same @Action annotation. These background tasks can also provide a progress status and messages that can be displayed in a Status Bar. But another interesting thing is the support for Resource Management. The idea is that instead of setting all properties of a Swing component when it is created you simply set is Name property and then the resources define the rest. For instance, you set the name of a JLabel and in the resources you can define the value for its Text, Background Color, Icon, Orientation properties, or any other property for that matter. This keeps code clean of any string or resource that doesn't belong there.

For more details on JSR 296 - Swing Application Framework, check its development site, specially the introduction.

Now, if you're just on of those Eye Candy Lovers you can have a look on how the new Progress Dialog for the Java Plug-in will Look in the Java 6 Update 1 or Java 7. Now you have something decent to show your users when they are waiting for an Applet to load. In fact, you can even set the image you want to show.


Three Pages, Three Weeks, Three Radars...

Today I made some progress on my Thesis: I was able to write three more pages in just one hour. At this rate It will take me another sixty hours to finish it. Hmm.... that still seems a huge number...

On another note it seems that the number three has been pursuing me all day and will continue to. Let's have a look: I passed by three police Radars on my way to Work; the promise made by the high level management of providing us with full details on a sensitive subject within three weeks saw its deadline today (no, as usual they failed one more promise; why am I so stupid to think otherwise?); I found three major errors in the source code I was changing at work (don't worry, the errors are still there, since there is no time to correct them); I passed another three police radars on my way to the University; I have written three pages of my Thesis;... What will be next? Three Speeding Tickets when I get home?


Linux Kernel Internals...

Have you ever wanted to know the Linux Kernel Internals? Well, today, while browsing the web, I came across this article. It is an interview with Jens Axboe, the hacker that launched the development of the 2.5 branch of the Linux Kernel with his rewrite of the block layer.

If you ever wanted to understand a little more about how Linux works, just read the interview. It is well worth the time it takes to read it. In fact, I'm know installing the kernel 2.6.19 on my Laptop and I'm following some of his advices, specially the notes about I/O Schedulers. What do you want? My Laptop is a 6 years old machine: if I can squeeze a little more performance out of it, I will!


The Community

Today I was browsing through my usual RSS feeds and I ran into this one. It is a presentation about "How To Herd Cats and Influence People". Jono is right on the money: the community is the key to keep a project alive. In fact he is even righter when he mentions that the process should be defined, not a peace of bureaucracy that no one wants to follow, but a simply defined.

I'm saying this because I'm trying to contribute to Rhythmbox and I'm having difficulties on how should I make things. You see, when I involve myself in a project I like to respect the already made decisions. For instance: I don't want to start immediately by questioning the chosen architecture. The problem is that if I don't understand the architecture it will be difficult to contribute.

What's there left to do? Well, I'll choose one implementation, the one that is quicker and that doesn't seem to break the application's architecture and move ahead; submit the patch and wait for feedback. I hope that the feedback contains some sort of guidance if they don't like the solution I'll propose.


Thesis Progress... or lack of...

As you already know I'm writing my Thesis. Facts are that I haven't made any progress in it and I believe I should really channel all my energies to it. It is almost the end of January and I want to end it as soon as possible.

The problem is that it has been some weeks since I have written anything on the Thesis. It is not that the subject isn't interesting, but since I shot for the impossible for the given time frame I'm writing about what I wanted to achieve. Facts are that I didn't achieve my end goal and that makes me frustrated to a point that I can't write about it. I guess the rage needs to build up before I write a single line in the Thesis...


It is not the Language: It's the Library!!!

In my last post I said that it was time to brush up my C programming skills. Well, it turns out that my C programming skills are way OK. The problem is that I don't know GNome's APIs.

It's like when you have one of those enlightening moments when someone explains you how to do something without having to do a Marathon before. I'm always saying: "Developer, know thy tools!". It seems this sentence is now haunting me because I don't know GNome's APIs and I'm paying the price: I end up look, searching or even reinventing something that has already been done all over again.

I know most of Java SE APIs by hart, their patterns and how they should be used. I know them so well that I can even abuse of them to my benefit. In fact, it is not the first time I go to Java's source code to see how something is done so I know if I can use it in a given way. In fact, the last time I did this was just a couple of days ago when I wanted to see if the Preferences API in Java 6 used the Context Class Loader of a Thread when instantiating the Preferences Factory. This is how I feel in Java: like a fish in the water because I have been using it since its first version.

With C and C++ it is different. I'm using C++ in my Thesis to program a robot and I need to learn its API and the API of the framework I'm using. For the remote control and UI I'm using Java because I feel more comfortable with it.

But GNome has a whole set of APIs that I want to get to know. The main problem is that, like most open source projects, the documentation is not what it could be. Maybe I can contribute on this end, that is, as I'm learning the API I can document it, or at least write some articles about it. What I would really love is to have something like the Java's reference API for all GNome's library. I'm using DevHelp and I can see the classes that exist and their API, but most functions aren't documented and what I'm missing is an introductory path to an API. For instance, if you want to use GDK PixBuf library to load a JPEG how would you do it? I know how to do it, but after scavenging the API for fifteen minutes.


I need to brush up my C Programming Skills...

It looks like I have been Eating my own Dog Food for too long. I'm saying this because I usually make new code using code that I have already written down. This makes things easy: the principles behind the code are almost the same (if we don't factor in the natural evolution that comes with Age and Experience); the architecture is know; the flow is know and so on.

I'm trying to add a new feature to GNome's Rhythmbox application and I'm finding out that I'm a bit lost in their source code. It is a mix o C, with object oriented support built from scratch, and Python. Problems? Well, I don't understand their architecture and I have never written anything serious in Python. End result? I'm lost :-|

For me this means that I need to brush up on my C skills and also to learn Python. Maybe this was just the excuse I needed: a worthy challenge that would force me to dig into someone else's code.


Beating an RDBMS...

My latest assignment at work is to try to make a dedicated storage system that we can use to be the performance of a RDBMS when making statistics. I know it seems strange, but the first tests show that a dedicated storage system can be something like 5 times faster then a RDBMS, even without optimizing the storage.

It goes inline with a recent article from the MIT guys that indicates that for specific applications a dedicated storage system can be up to 10 or more times faster then a conventional RDBMS, even if it is a really expensive one. Well, I've known this all along: the RDBMS needs to be sufficiently generic and if you know the nature of the data and the operations that are going to be performed you can always make something faster.

The problem with attempting to make something faster is that you will have to solve some of the problems that an RDBMS already did. No, I'm not talking about Transaction Management, but concerning how data is store. You need to structure your storage in a way that enables you to update, read and delete effectively. And believe me: although this might seem simple, it is not!

Now my days are spend around managing files in blocks, splitting block in slots, making linked list in files, metadata, storage format, etc., etc. And I still have to think about defragmentation techniques...


Learning New Languages

I think it is about time to start learning a new programming language. I think it has come a time where you should really use the best tool for the job and not just reinvent the wheel just because your language doesn't do a certain thing.

There are many languages out there that I wanted to try, like Ruby and Python. But what I'm also pondering to try C#. I have always delayed this because C# first seemed like a clone of Java, it didn't ran on Linux and it wasn't truly multi-platform. Today I believe I should know its special constructs if I ever need to use it, because everything else looks very similar to Java and C++. Is like 15% is new, everything else comes from other languages. As with any new language the main step in the learning path is learning is API. Like Java, C# has many modules that address many things. Knowing at least some of them would be good. This is even more true for someone who has been working in the same place for 7 years and sees a dark future ahead.

Today I installed MonoDevelop on my laptop to give it a go. It is still unstable and has already crashed twice, but it should be sufficient to make a few experiments with the language. Ruby and Python are also on my sight, specially the JRuby and JPython flavors.



Do you know a tool called Blender? If you don't maybe it is about time that you do. If you are interested in Graphics, 3D, High Quality Rendering, Physics Engines, Game Engines, Ray Tracing and others of the same kind, then you are a Graphics Geek. Well, at least I think that is what geeks that are interested in Graphics should be called.

Am I a Graphics Geek? Well, probably not fully, but I've always found interesting the world of Graphics. It all started at the University when I had to develop a Z-Buffer Implementation, coupled a a 3D Modeling tool. You see, I went the extra mile. For a simple project where you shouldn't spend more then 40 hours I ended up spending something like 60 hours and ended up with a tool that even made objects by Revolution, that is, you draw a polygon and a line and the engine would warp the polygon around the line making quads as it went by.

What really amazed me at the time is that this is an area were you could always attempt old techniques and new techniques to squeeze a little more performance from the machine. At the time I did this I had a 486 PC at 66Mhz. At that time we had Pentium's 3 at 130Mhz at the University and even those weren't top of the line. The end result? Well, I had to make substantial optimizations to the engine to ensure that it had an "acceptable" performance in my PC. Actually it is a funny story.

When it first ran and produced a good result it took something like 5 to 10 minutes to render a scene. I added back-face culling and it dropped to 2 to 5 minutes. I then added an computational cache for the dots and it dropped to something like 20 to 40 seconds. It was acceptable, but it had a strange output. I was rendering a sphere and it seemed like a density map, like the engine was supposed to produce more colors but it didn't. It was the night before the presentation and I gave up at about 1a.m..

The next day I was attempting to see it running in the University's machines, just before the presentation, and I was already preparing myself to explain the teacher that I couldn't solve that bug. What happened? Well, it toked only 3 to 10 seconds to render a scene and the scenes were absolutely beautiful. Then I remembered that at home it was running with only 8 bit color depth (256 colors). At the University it was running at 16 bits. The teacher was amazed with the speed of the engine and I had to explain the techniques that I used that he didn't teach, some of which I invented - like the calculation cache. I got an A for that work ;-)

So, if you like this area, like I do, have a look at blender and you'll be amazed. But be warned: its engine is far more complex then the one I developed so don't expect fast rendering times. In fact, if you abuse and start adding things like fur to surfaces you're in for a good minutes of rendering time, before seeing the end result...


Maven and TestNG

Yesterday, while browsing through the World Wide Web, I read a couple of articles. The first one talked about Maven. The second one talked about The Top 12 Productivity Killers in Development Methodologies. I was captivated by Maven and intrigued by the second that I decided to blog about Maven and TestNG.

What is Maven? Well, I can quote what is written on its web site:
Maven is a software project management and comprehension tool. Based on the concept of a project object model (POM), Maven can manage a project's build, reporting and documentation from a central piece of information.
What does this mean? Well, it means that you declare your projects dependencies and Maven will take care of all the work, even if it involves downloading the dependencies from the Web.

Although this might seem a simple functionality, if you ever worked with huge projects, specially if they are component oriented projects, you can see the benefit. Imagine that you have a tool that automatically handles your dependencies, builds them, ensures that no dependency is built twice and has all the phases that you need, that is, compilation, testing, packaging, reporting and, for those that go the extra mile, source code generation, etc., etc.

Imagine Ant on steroids: you have a real tool that manages projects described as an XML file, unlike Ant where the goal is to have a build file that is an XML file. The potentialities are even greater then with Ant. I'm saying this and I had to develop a component building system on top of Ant that handled dependencies, ensure that components were built only once, ran unit tests, build test and coverage reports, etc., etc. This was hard, it even has some python scripts in it. With Maven this would be a lot easier.

But lets put Maven at the side for a moment and talk about the other article: the one about The 12 Productivity Killers in a Development Environment. Many of these killers hit the Development Environment in my company so there was nothing new for me on those issues, but there was one strategy that I wasn't aware of. Fact 6 on Page 2 of the article mentioned the idea of having several testing layers.

The idea is to have several defense strategies that warn you the soonest possible of any issue in your project. This can be way before anyone actually testing it for real. Here the TestNG software comes in. The TestNG is like an extended version of JUnit. Amongst many other features it allows you to define a category for your test. This way your unit tests may categories such as: consistency tests (that verify that the component works well on its on), integration tests (that checks that multiple components work well together), system tests (that verify that the system is working well with all components together), functional tests and so on. Or you can separate the tests in fast and slow tests, running the fast ones first to ensure that the production stops on a killer issue. You can even have a category called "Regression Tests" that are ran always as last to ensure that no bug is resurrected.

The problem with any new Methodology is the usual Aversion to Change you find when you propose it. It seems that everybody has been doing it the old way for too long and they don't want to learn a new way. Facts are that as a team grows its methodologies and the way work is carried out needs to be adjusted and sometimes new methodologies are in order.

For instance, where I work we used to be 3 programmers in the team. With a low number of programmers source code access isn't a problem. In fact, if the programmers have some sense you won't get into problems. Now we are almost 10 programmers. What happens? Well, if you are in a project that has multiple versions on the field that need to be supported and you need to make patches for, with also multiple new versions and customer dedicated projects with different features in development... Well, if you don't have a tight control over what gets into a release you are in serious trouble. What could happen? Well, you might need to release a patch on a certain branch, but someone has already checked in some changes in that branch that shouldn't go in the patch. At the same time the changes in the branch should continuously be merged to another branch where development of the future versions is taking place. This is hard to do, specially if you don't control the access to the source code!

I believe a better way is to have several branches for development of new features or bug corrections and a main branch to be used to build deliveries. The idea is that every time you make a delivery you create a branch that will be used to build patches of that version. Over that branch, other branches will be created for the developers to use when correcting bugs or adding features. Depending on the project's plan, when the time comes to make a new delivery, it is a matter of merging all the branches of the features and/or bug corrections to include into the branch that is being used for the new delivery, be it the branch to produce a patch or a new version of the product. This not only tightens the control of the source code but it also allows you to know what exactly changed between one version and another. This information is extremely important for the testing teem: it allows them to know what features or components changed and need to be tested in more detail.

This, I believe, should lead to more quality control in a Software Development Project. But to make it clearer I would probably do better in writing an article about it...


Programmers Block...

I have always been a programmer. I started programming in BASIC with the ZX Spectrum. Incredibly as it might sound I even wrote a game for that computer. Over the years things evolved and know I would like to say that I use the language that serves best the needs at hand, but facts are that I do most things in Java. That is the language that I use at work. At home, for my pet projects, I choose language and it goes from C to Java. Lately I've been looking a Python and Ruby, but I haven't really tried them out.

At work I have evolved to what I call a "Word Programmer". What is a "Word Programmer"? Well, it is someone that makes highly detailed specifications that others follow when programming. I call it "Word Programmer" because "Word" is the name of the Text Editor that the company I work for forces me to use. The idea is to develop software from very high-level languages: English and UML (Unified Modeling Language). It is an interesting work since you get to develop something that the University doesn't teach: Soft Skills. I say this because the compilers that actually turn the source code I write into an executable program are the programmers of the team. Each one with their own personality and experience.

One of the things I learned after all these years as a programmer is that sometimes you reach what I like to tall "Programmers Block". Like it happens with writers that are with Writer's Block, sometimes I simply can write a single line of code. No matter how long I stare at the editor no single line comes out. It seems that my "Over Engineering" neuron is firing all the time and everything seems to complicated. End result: no source code comes out. But then something clicks, the neuron stops firing and source code starts to poor out as usual. I just have to wait for a while.

Has this haver happened to you? Because I believe this is another proof that developing software is just another form of art. If only my bosses figured this out and stopped thinking that the programmer is like a factory worker that consistently delivers 15k lines of source code per day...


My Shared Links..

I don't know about you, but I read a lot of RSS Feeds on a daily basis. I use Google Reader for this but recently I found out that it allows me to create a list of shared items. I found the idea interesting so I'll start trying to use it. The idea is simple: if I find a post, news, article or whatever on the web that I find interesting or funny enough I'll add it to my shared items. These will be available in this page (you can also find a permanent link on the right side of the blog, under My Links and it is called "Interesting Links").

This way you can keep track of what I find interesting, but be warned that you will get a "Filtered" version of what I find in the RSS Feeds I read that is interesting. You may not like it, but you won't know until you give it a try!

Writing a Thesis... a Revelation!

Writing a Thesis is turning out to be a worthy challenge. It is like writing a book! You have to make it fluent and coherent from start to finish, it has to be well written and an enjoyable reading. On top of all this you have to be talking about things that are complex, new and hard to understand. Its like mixing water with oil: the two don't get along and even if try really hard to mix them they won't stay together for too long.

I haven't written a single sentence in my Thesis for a long time. You see, the only things I have to do to finish it are: write the Thesis, deliver it and defend it. It seems simple but I'm finding it hard to focus on the task at hand: writing it!

I always wanted to write some articles or even a book, but if I can't write the Thesis it is going to be hard. I also believe that writing articles or books can be a lot easier then writing the Thesis because I'm writing a text that should teach or help someone grasp a concept. In the Thesis I'm explaining new concepts to those that already understand the old ones.

Strange, now that I have written this it seems that I can write the Thesis like if it was a book that is introducing a new idea to someone who doesn't know anything about it. Strange: it seems that by writing about the problem a solution has presented itself. Its like when: your way to deep in code that you can't see the bug; you ask someone for their help and when you just started explaining what the code does you find the bug.


To Hack or not to Hack?

I 've been looking at existing bugs in GNome's Bugzilla. I was amazed to see that there are several bugs related to showing Album Covers in Rhythmbox. I'm starting to think: "Is it worth to make a patch to show the art embedded in MP3 Files?". A fact is that GStreamer supports it, but the latest version of Rhythmbox from SVN doesn't. It is also a fact that there are already bugs that are addressing the issue and even using a Metadata extension in Rhythmbox to show the Album Cover in the notification message. My efforts might be a little late, that is, if they show it in the tray icon then it is a lot easier to add support for embedded images.

My Conclusion: I went over my head in trying to make a patch for something that it seems others are working on, or at least on parts of. There is already a Bug that handles showing the Cover Art in the notification area. The changes proposed in this bug have been committed so I'll check what they have been doing. If I can find a way to plug in the cover art without having to change many things it would be great. Facts are that I will have to upgrade the GStreamer version on my stable machine to an unstable one to develop this patch...


Hacking Problems...

Today I started hacking Rhythmbox. Things aren't going so well. I expected to be able to quickly hack the new functionality into it but I ran into problems. You see, although Gentoo (my Linux distribution of choice) has GStreamer 0.10.8 marked as stable, which is the GStreamer version that includes the new GST_TAG_IMAGE that I need to show the pictures embedded within the MP3 files, it has the base plug-ins of GStreamer that still don't provide this tag when the ID3 tag on the MP3 file has an image.

I still have to think weather I attempt an upgrade, with all the risks it involves, or weather I simply give up on trying to make a patch for this. It seems to be rather simple after having GStreamer obtaining the image data: I'll use the GDK-Pixbuf library to turn it into something that can be used by the Album Cover plug-in of Rhythmbox to convince it to show the embedded picture. Guess it will take more hacking to get it done, but I don't want to give up just yet.


Hacking GNOME

Have you have contributed to an Open Source project? Well, I have and it was so long ago that I can't remember. Although I have been using GNU/Linux on my laptop since the day I bought it, I have never really used it to contribute anything. The last time I contributed was when I was in the University. I don't think it makes sense to use something that is really free and only give back to the community more "Requests for Improvements".

I use the GNOME Desktop. Why? Well, I like the way it looks, the way it feels and its User Interface philosophy. But I don't want to get drawn into one of those Desktop Environment discussions about the advantages or disadvantages of each Desktop Environment. That's not the goal.

What's the goal? Well, there is one functionality that I've really been missing in Rhythmbox. What is Rhythmbox? Well, a media player and organizer for the GNOME Desktop, that takes its inspiration from several tools. The functionality that I miss the most is the ability to use the Cover Art embedded in the MP3 files.

You see, MP3 files can be tagged using ID3. And in the latest versions of ID3 there is support to include the album art, among other images. Where is this used? Well, some MP3 players show it in their color screens and it makes them more appealing to the eyes.

Rhythmbox currently fetches the cover art from the web. I want to change it to use the art found in the file. If the file hasn't any image then the World Wide Web is consulted.

It turns out that there is already a feature request on GNOME's Bugzilla for this issue. I saw that it was stopped for a long time, looked at what it implied (yes, I actually checked the source code) and I decided to give it a try. Let's see what happens since it has been some time since I try to do anything in C. I've been working with Java like since I left from the University and I've also used some C++ for my Thesis. But this one will be in C, and Python??? I just checked out the SVN version, since the GNOME project just moved from CVS to Subversion recently, and the plug-in is written in Python... Things keep getting more interesting!


Time for Some Swimming

As I already mentioned, I'm a little overweighted. As part of the New Year's Resolution to live my life to its fullest I have decided to start Swimming. By this I mean to start doing some one hour sessions in a swimming pool. Although during the first sessions... well, probably the first month, I won't be able to swim for an entire our it should be a good way to: burn some calories; discharge some stress and get into shape.

Why Swimming? Well, I used to be in the pre-competition in in this area. What does this mean? I used to do something like 200 swimming pools in one hour in all sorts of styles and I would do it three times a week. Since I left it I have never been in shape like back then. At that time I could do whatever for no matter how long and I would feel tired - unless I really pushed to the limit for too long. Now I loose part of my breath one I walk up 5 flights of stairs. I think it is a sign that I need to get into shape.

Now I only have to choose a pool and a schedule in which I still have some time to sleep...


Wearing Glasses

Today is my first day as someone who has to use glasses to work. In fact, this is my first Computer Session in which I'm using glasses. How do they feel? Strange and distracting. I hope this feeling of something in the corner of my eyes goes ahead really fast.

On top of that my sister just scared me with some interesting questions. For instance: do you feel dizzy or with a need to throw up? That scares me. I though the goal of the glasses was to make one see better and thus feel better, not to make one dizzy!

It will be an interesting times, specially the getting used to put the glasses before starting to work.


Having Full-Text Search Working Properly on JavaHelp

Today I'm posting about technology.

This is a problem that I had to solve at work today. We are using JavaHelp for our On-Line help. Like many other have found issues with the Full Text Search so have we. What's the issue? Well, the selection on the help page is of by a few characters and continuously increases until the end of the page. Near the end of the page the selection of the searched word is completely off (see the issue on the Bug Database, a.k.a. Bug Parade).

This issue doesn't happen with JavaHelp 2.0.4 (fetch it from this page - here is the direct link). But for those of you that can't use it just yet, because of the wonderful tool you are using, there is a simple workaround:
  1. Unpack the HelpSet in trouble to a new folder. For instance, if the HelpSet is named help.jar extract it to the folder help);
  2. In that folder there will be a XXX_JavaHelpSearch folder that contains the full text search index. Delete that folder. In our example it will be called help_JavaHelpSearch, very intuitive...
  3. Standing in the extract folder (help in our example), run the jhindexer of the new JavaHelp on all html documents. For instance, if all documents are in the folder docs you just run "jhindexer docs/*.html".
  4. The jhindexer tool creates a JavaHelpSearch folder. Rename it to whatever you found in step 2. For instance, rename it to help_JavaHelpSearch.
  5. Add all the files to a new JAR file without any additional directories. You can do this by standing in the extract folder (help in the example provided) and issuing "jar cfv ../newjar.jar *". After this you have a new HelpSet in the newjar.jar file in which the Full Text Search selects the text properly.
And that is it for the first programming related entry of this blog. Any issue, send a comment.


Cleaning out the Closet...

This weekend has been out of the ordinary. It must have something to do with the fact that I want to do what my heart tells me to do.

I started with a trip to the ophthalmologist (I think that's the work in English for the vision doctor). I had been postponing this trip for a long time and I had been getting some headaches and other symptoms that there was something wrong with my eyesight. Well, it turns out that my left eye is twisted a little relatively to its original position. Reason: too many hours in front of a computer screen. Result: I will start using glasses when working. At least the problem can still be corrected.

My Saturday continue with a global closet cleaning. I'm not talking about cleaning the house, I'm total about a global closet cleaning: when of those cleanings in which you take out everything form your closet, choose the close that still fits you or that you still consider wearing and put out everything that you won't wear. It's amazing what you accumulate in several years: a lot of clothes and some of which I haven't dressed once!

Sunday started with church school. I'm Christian and I teach small children at the church. I don't know how to pronounce it in English, when I found out I'll tell it. But things aren't going so great because people are fleeing from the church. Why? Unfortunately one of the may reasons is the Preacher, but that is a story I don't want to get into for now.

But Sunday isn't going all that will also for other reasons. It is fact that I'm a little overweighted. I need to loose some weight. I really do. It would be great not only for my health but also for my ego. This has turned into a battle in which there is my weight and everyone in my family in one side and me on the other side, trying to keep my temper. I need to learn how to control my temper even if everybody has decided to make their top priority to bug me for whatever reason.

I don't know what is wrong with me but recently I burst whenever I'm pushed and for whatever reason. And didn't use to be like this and I need to find that piece of mind once again. Things are getting so critical that I'm even considering the chance of leaving my family and finding myself a new house away from all the pressure that my family is placing on me. Most times I just want to take my car and run away from all the problems, pressures, critiques and comments.

The point is that even if I run away from all this they won't get solved. I need to attack the problems head on and solve them. I have to do this in order to end my Thesis, to get into shape and to live a better life. If in this process there are others that, even if they believe they are helping, are simply just making matters worst, I simply have to put some distance between me and them. I'm not talking about physical distance, but about ignoring their remarks no matter how offending they are and avoid depending on them to make activities that I enjoy.

I believe they we all need some hours every day or every week to do what you like the most, or simply to feel good about doing something. During those hours we shouldn't have to put up with bosses, problems at work, problems at the university, problems at home or remarks from .... well, I won't go there.

The hard part about all this is that as I'm writing this I keep getting this feeling in the back of my head that I'm being selfish. As I grow older I'm starting to believe that although we are in this world to help others and to try to make a different we also have to be a little selfish if we want to accomplish some of our dreams. Unfortunately it seems that I have always put the wellbeing of others above my wellbeing, my life and my health. I won't do this anymore.


Making Life Changing Decisions

You probably noticed that this blog has been dead for quite some time. Too many things are happening at the same time that I'm have a hard time keeping track of them all. I don't want to make a full summary of all the items on my think list, but I'll give you a glimpse.


First things first: I need to get into shape. I have been postponing this item for way too long. I should I put this... Well, in my youth I was a true sports freak. I was involved in many sports some of which at the exact same time. I did swimming, water polo, tennis, biking and handball. Not to mention all the other smaller things. I even reached the pre-competition series in swimming, that is, the next step would be to train every single day and join competitions. In handball I was federated, that is, I actually participated in the Regional Championship. But I had to give all that up to study.

Please don't get me wrong! I don't regret making the decision of giving all that up. I'm happy with what I do. I have the possibility to do what I like every single day, although that is changing a little. But that is another topic.

So, what should I do? Well, I will start doing some sport and dancing. You're probably wondering "Why Dancing"? Well, it is like a sport and I get to learn something that I have always wanted to learn. At the same time I get to meet new people. For sports I'll go back to swimming. I think it is one of the most complete sports. I don't know if I'll go for a Gym like everyone goes, but I'll probably start swimming right away. For the dance part, I'll go with my sister as partner.


I'm making a Master Thesis. Well, I guess I am. I say this because it has been too long since I actually written a sentence in the Thesis. I need to end the Thesis. It will probably be a rage weekend but I'll get it out of my system.


We have a saying in Portugal when we want to emphasise when thing are getting really bad. It goes like this: "Vai de mal a Pior". In English it is something like "It goes from bad to worst". And believe me, that is how things are at work.

There many things that contribute for this. The first thing is that the division is moving to something like 100Km away from its current location. When your workplace moves this distance you start to make some operations in your head: how more will you spend to get to work it terms of time and money; if you are willing to move to somewhere nearer; if things will get any better there and so on.

With the change the company has decided to hire people that are willing to move to the new location or that already live in its surroundings. They have been doing this for over a year now. But this was a strategy that I didn't saw at first. Their goal is not to reduce the burden on the already overloaded workers that we are. Their goal is to get people in that will absorb the knowledge and tasks of those that don't see them moving to the new location. Recently this has gotten so visible that all the old people are seeing it.

Don't get me wrong, this is a viable strategy on their part. It is a strategy that I don't agree with, but it is a viable strategy. But they have a flaw in its implementation. The oldest people are the most experienced ones and the ones that know the core parts of the system. To replace them you need at least people with almost the same level of experience in the technologies involved. Their flaw is that they are hiring the cheapest resources, people without any experience or basic training or knowledge needed to perform the task.

What I see happening is that the projects won't meet the delivery dates. Why do I say this? Well, simple: the delivery dates are after the move. If the older workers leave the new ones will have to take care of business. The new ones will eventually get things done, but the time they will take to get things done will be greater and there goes the delivery date.

You are probably thinking: "hey, get a grip, everybody is replaceable". Well, I agree with that sentence. It is true that everybody is replaceable. But it is also true that everybody is different and that there are people who are more creative and more experienced than others. What will happen is that something that those creative and experienced people would do in 2 months and that the client would live ends up being developed in 6 or more months and the client will hate it. It is a simple fact that the longer you work on a project and if you are a open minded person, you will get a deeper understanding of the users and their expectations. This is particularly true if you have real contact with the users and you see them using the product and explaining what they want. This is a type of knowledge that can be taught: it must be learnt by trial and error.

On top off all this the group spirit that made me get out of the bed everyday is almost gone. We work to accomplish the dead-lines that are just around the corner, in a group were almost everybody is working without any motivation and some have their own personal agenda.

I still don't know how I will proceed on this issue. Part of me wants to get out before I loose my mind. Part of me wants to say and grab the compensation for being dismissed. Part of me just wants to forget all about these issues, be professional, get the work done and don't let this get into my system. There is also a part of me that would love to get to work and say: "Bye, bye, I'm out of here", in a more lyrical way and in the faces of the bosses.

For now it seems that I will simply train myself to get this out of my system. I'll try to live more my life so that work is just something I do to get paid and something that I'll always do to the best of my abilities.

Know What?

Well, with all these items on the back of my head I have to make some resolutions. I have to give priorities to things and try to enjoy life. I have wasted a lot of time thinking about this issues and just cruising through life like it was passing by me. So, I guess this is my New Year's Resolution: to live my life to its fullest.

What's your resolution?