Snippet: Fetching a regular expression

I'm including a small handy snippet to use regular expressions in your Java code.

Regular expressions allow to save time when in need of retrieving a very specific portion of text within a string. On this case, I've used to gather text from an HTML page.
/**
* Gets a string value from laptop characteristics based on a given pattern.
* A Matcher object is used internally.
*
* @param source string containing the text to be parsed
* @param reg regular expression pattern to use
* @param group index of one of the groups found by the pattern
* @return String containing the found pattern, or null otherwise
*/
private String findRegEx(String source, String reg, int group) {
String out = null;

Pattern p = Pattern.compile(reg); // Prepare the search pattern.
Matcher matcher = p.matcher(source); // Retrieve our items.

if (matcher.find()) {
try {
out = matcher.group(group);
} catch (Exception e) {}
}

return out;
}



You can use a regular expression simulator as the one available at http://gskinner.com/RegExr/ to test your regular expressions and also change the available templates over there.

:)

WinBuilder featured on C'T 2010

WinBuilder got featured (again) on the German C'T Computer magazine.
This was three months ago but only noticed it while looking on the visitor log at Boot Land.

The good guys from C'T are making available online a screenshot of the pages where the article is mentioned. You can see it in more detail at this link:

And below are two screenshots of the magazine pages:



Guess my goal for 2011 is learning German to properly read the article as intended.

:)

Using the URL shortner from google

Google has made available their own google shortner service at http://goo.gl

They require that you install the google toolbar to use the service or you can use the tool made available by Alexandre Gaigalas at http://gaigalas.net/lab/

Using their service gives some sense of stability, I was a fan of another service at http://tr.im but when it become inactive, so went inactive all my URL's from their site.

Hope you enjoy this tip.

:)

ipkr.net sold to game developer

Last week I've sold one of the domains on my portfolio - http://ipkr.net to a game developer from Ubisoft.

It was a good trade for both ends, he ended up with a good and short domain for his project and I wouldn't really give any proper use to this domain.

All that is left is wishing the new owner good luck and best wishes of success.

:)

HTTP servers for Java 5


At my project it is necessary to ensure that each client can also become a HTTP server on their own so that they can communicate with other clients.

One would think that this task would be easier using JMS or any other communication protocols like XMPP.

However, I'm assuming a worst case scenario where the proxy for a LAN only allows connections from port 80 to the outside world and even then, checks all packages to ensure that the content of each message is real HTTP content.

I'm also assuming that the users of the client have no administrative permissions and no power to allow ports to be open or controlled by applications with guest permissions.

So, port 80 is a nice way to communicate since LAN proxies often let this door open but we still can't move past the administrative permissions required to control port 80 so I'm using for the moment 8080 as an alternative.

I've considered several communication protocols over the past two weeks, I've lost so much time looking around that I became a bit disappointed at some time. Much of what you find in Java nowadays is targeted to enterprise applications and there are good reasons why whenever someone refers to "enterprise" it might just seems like another synonym for "slow", "fat" and "octopus" to come in mind.

Let's try to change this picture then.


As HTTP server, I've abandoned the option of JMS and went forward onto plain HTTP interpretation back and forth of HTML messages (possibly marshaled with XML instructions).

Looking for HTTP servers, I've discovered that Java 6 comes already built-in with an HTTP server (link), however, we can only use Java 5 as the minimum supported java so I went looking for other projects. Found quite many of them but my favorite was this one: nanoHTTPD.

It is self-contained inside a single Java file (sized in 24kb) and brings all the basic support for exchanging pages back and forth.


As a wishful thinking, it would be nice to use the servlet power since the application is intended to be flexible and allows plugins to be integrated but I'm running out of time and other priorities need to be meet on time.

Nevertheless, here is a list of other small sized web servers in plain java that you might be interested in taking a look:

Jibble - http://www.jibble.org/jibblewebserver.php (small sized)
WikiWebServer - http://www.wikiwebserver.org (user editable)
TJWs - http://tjws.sourceforge.net (requires 7beee dependency to build)
WinStone - http://winstone.sourceforge.net (Servlet, looks professional, multiple hosts, lite version is 170Kb)



I've stumbled at an interesting article about design in a distributed computing environment.

Looking at the past, it does help to prevent some (common) design errors in the future and it sure is good to keep them in mind (regardless of how many times you hear them..)

KISS. Keep it (the design) simple and stupid. Complex systems tend to fail. They are hard to tune. They tend not to scale as well. They require smarter people to keep the wheels on the road. In short, they are a pain in the you-know-what. Conversely, simple systems tend to be easy to tune and debug and tend to fail less and scale better and are usually easier to operate. This isn’t news. As I’ve argued before, spreadsheets and SQL and PHP all succeeded precisely because they are simple and stupid—and forgiving. Interestingly, standards bodies tend to keep working on standards long after they should have been frozen. They forget these lessons and add a million bells and whistles that would, if adopted, undoubtedly cause the systems to fail. Luckily this doesn’t happen because by then there is a large body of installed code (and even hardware) out there that assumes the simpler spec and cannot handle the new bells and whistles. Therefore, no one uses them and we are all protected.

Hope you enjoy the reading, you can grab the full article here:
http://queue.acm.org/detail.cfm?id=1103833

:)

Vacations!

And hence start the summer vacations!

I'm really happy that they have finally arrived. Was getting tired of this last semester and some time out will surely be well used to refill batteries before the final semester begins.

Just wish it had gone better. At least I'm proud to say that I've learned quite a lot of new things throughout these 12 weeks. Some were good, some were bad and all of them were important to my life in one way or another.

The most memorable detail is the fact that I no longer stay away from Java. I've always avoided it, don't like eclipse, it's slow as heck compared to native binaries building a user interface is a real shame when compared to compilers for Windows that have been available for almost a decade now.

However, it does bring some fancy new advantages available nowhere else. We can indeed code once and run everywhere if things are done right. The code that runs on a desktop can also run from a server on the command line.

And.. using Netbeans as an IDE was indeed a nice touch of fresh air to escape a bulky, buggy and slow code editor.

Another nice memory from this semester is the independent study. Not only I was able to do a project from a professional perspective as it was also fun and something that I'll continue working through the next months.

For the vacations, many other projects await. Time will pass really quickly and I also want to rest. From here up to December things will not get simpler.

Luckily, from a financial perspective I'm finally at ease. Not only have I managed to secure my full payment of the MSE degree and survive the final months, as I'm also increasing my current savings and doing investments for the future.

Things haven't been easy but they're moving forward.

Avoiding stackOverflow errors in Java


I have coded a method in Java that will recursively iterate through all folders and respective sub-folders on disk.

The code seemed to work as expected, but whenever reaching a certain folder it would simply thrown an exception error and complain about stackOverflow.

Now, what is this stack overflow all about? Googling around it seems to occur whenever you enter into an endless loop situation.

This occurred while crawling sub-folders, so even thought my hard drive is quite filled up, it's not exactly filed with folders up to infinity.

So, what is wrong on this picture?

It turns out that this method is vulnerable to badly formed dynamic links. Meaning that whenever a link is found that points to a folder on lower level - it would just re-bounce back to that lower sub-folder and then loop back again ad eternum.

I've lost plenty of time trying to avoid dynamic links from being crawled but to no avail. Also reached the point of calling the absolute path of dynamic links and indexing each path on a database to check one by one if they had already been called to avoid these annoying loops (losing a lot of performance in the process).

Fortunately, found the solution to this riddle on this website - http://leepoint.net/notes-java/io/10file/20recursivelist.html

Albeit being a simplistic code, it provides a very efficient way to deal with the "symbolic-link-limbo". All you need to is define a depth level. They mention 20 as the default value and I applied the same concept on my code.

The second piece of the puzzle is verifying that each new directory that you want to crawl matches in terms of absolute path and canonical path. I've used the code from the following page as inspiration: http://www.idiom.com/~zilla/Xfiles/javasymlinks.html

After applying these changes, the code WORKED LIKE A CHARM!

Now the same method is indexing all folders up to 20 levels of depth and working as expected without seeing any more stack overflow messages. Under a MacBookPro it can index over 600 000 files under 16 minutes using less than 10Mb of heap space in RAM.

:)

My first Google engine application


Yesterday I've created my first application using Google App Engine.

I've been thinking about the possibilities of using a cloud computing environment for quite some time now. Google brings the advantage that you can use their services for free up to a given threshold of resources.

When I first heard about google app engine, it was some years ago and it was only supported on Python. At the time, phyton didn't exactly rock my world so I just walked away and kept on doing other things.

A few months ago, Java support was announced. My wild guess is that Phyton was not exactly a popular choice amongst many developers but Java is a whole different case.

So, I went on with my trial of their (free) service.

The Java environment that is officially supported by Google is based on the Eclipse IDE, since my preferences on coding fall more on the NetBeans side of life, I've "googled" for this alternative.

It turns out to be a quite simple process of configuration.

The first step is downloading and unpacking the Google App Engine SDK to some folder inside your disk - http://code.google.com/intl/en/appengine/downloads.html

No fancy install involved, just unzip and place it somewhere nice.

-------------------

Then, we open NetBeans. Google support is added as a plugin for the NetBeans IDE. There is a very good page that details these steps: http://kenai.com/projects/nbappengine/pages/NBInstall

When configuring the google plugin, I didn't selected the Hibernate Support and didn't seemed to matter much in either case.

After all said and done, you're only missing to add google app engine as a server inside your environment and this is also a simple task.

Click on the "Services" tab (that is next to "Projects" and "Files" on the right side of the IDE) and right click on the "Servers" item.

All that is missing is add a new server - select the "Google App Engine".

---------------

You should now have everything set up.

To start a web project, create a new project and select "Java Web" --> "Web Application". It will create you a template project that will be saying "Hello world!"

When you're ready to publish the project on the cloud computing environment, just right click on the project and choose "Deploy to google app engine".


Don't forget that you need to have a project already configured on the side of the google app website. After this you should be able to visit your URL and try out the results.

You can also view a full video of all these steps at the following location: http://kenai.com/projects/nbappengine/pages/Home

---------

Hope you have fun with cloud computing, this is a really simple and interesting concept at a very affordable cost.

:)

Implementing a customized Hot folder tracking with Java 1.5

One of the features required for the new project is to track changes made on specific folders.

This is the commonly called "hot folder". In the newer java versions this feature already comes implemented using the OS API whenever available.

On my case, being stuck with Java 1.5 there is not other built-in option other than pooling a folder and check for changes.

However, just checking one folder and not going deeper is still kind of limited so we need to stretch this concept further and use the imagination to check other folders without draining away all of the memory available for the java application nor hogging the CPU resources.

This was a nice challenge, used some of the learnings from the Models of Software Systems class with Pedro Bizarro, guess he'd be proud to see a finite state machine diagram being used to describe this concept. It was indeed a good tool to work out the details before moving to the implementation.

I include a small screenshot of the sketch, some changes were made on the final implementation. It's working really fast and indexing all sub-folders at blazing speed with resort to a database to save the precious RAM memory.




Let's move onto the next challenge! :)

Surviving to java.lang.OutOfMemoryError: Java heap space

Memory leaks happen.

You might be a neat and tidy person that tries to ensure that no waste is made since the start of your project coding but leaks happen.

I fell into this trap.

Was feeling nice and comfortable believing that all my code was behaving nice and using a database was keeping the memory consumption low.

Everything was working perfectly when working with a few hundred files.

However, when dealing with little over 50 thousand files the picture turned out to be grey and the evil java.lang.OutOfMemoryError: Java heap space appears.

I tried my best to pinpoint the evil doers but I couldn't really point my finger at any guilty party since none seemed to blame.

Looking for solutions, most people recommend increasing the size of the virtual machine to support the stress. But as mentioned on the opcode website: http://blogs.opcodesolutions.com/roller/java/entry/solve_java_lang_outofmemoryerror_java, adding more memory only hides the problem, doesn't really bring a scalable solution.

That blog post in particular turned out to be very useful. A good approach is using profiling tools that "police" my application and see how it behaves and which parts are not behaving nicely.

NetBeans is remarkable in that sense.

It already comes with a profiling tool that is built-in and quite simple to use.

Just click on "Profile" --> "Main Project" and follow the directions.

It will launch your project and allow you to track what is really going on underneath the hood while the program is running.

Far better than following your program from the external task manager.

I'm attaching a screenshot so that you can see how it looks like:


My application was bursting at 100Mb, with profiling I was able to track down the reason of the leak: the log entries were consuming too many resources.

Disabling the log entries you can see on the screenshot how it goes well above the previous limit using less than 10Mb of memory to index 100 000 files.

Still a lot of things to improve on my code but this nifty tool sure helps to make it possible.

:)



Java: Getting the localized path to the user's Desktop under Windows


Getting the path to the user's desktop under Windows is tricky if you're not using Java 1.6 and above.

Looking for a solution around the web, I see many people recommending to use a wrap around the Win32 API using SHGetSpecialFolderPath or reading the value directly from the host registry system as suggested here: http://stackoverflow.com/questions/1080634/how-to-get-the-desktop-path-in-java

But I'm not very fond of these solutions and found one that is simple and seems to work fairly well although it doesn't seem to be documented (yet).

Just try this snippet under a Windows machine:

FileSystemView filesys = FileSystemView.getFileSystemView();
File[] roots = filesys.getRoots();
filesys.getHomeDirectory()


And you should be able to get the desktop folder as expected. Under my language, this folder is called "Ambiente de trabalho" so it worked like a charm.

This tip comes from Russ Bradberry: http://stackoverflow.com/questions/570401/in-java-under-windows-how-do-i-find-a-redirected-desktop-folder

:)

Reading the file version from Windows EXE and DLL files.



One of my goals for this week was reading the version of Windows executable files. The code should be implemented in Java and avoid resorting to any native calls.

So, a solution that seemed simple and straightforward would be reading directly the PE header from these files and read the version number for our use.

As many things in life, it's easier said than done.

The troubles started with the code required to handle binary files. I'm using Java and had none of my trustworthy code from previous projects to read files using specific x86 sizes for DWORD, WORD and Unicode strings with a limited size.

To my rescue, I've found the nifty binary file class from Jeff Heaton: http://www.heatonresearch.com/articles/22/page2.html

It's simple and perfect. Far better than the code I used in my previous projects. To handle Unicode strings I read each byte of the Unicode string onto a byte buffer and then use a Java command to convert it properly:

Grabbing the byte sequence of the string:

rgbData = new byte[Data];
for (int i = 0; i < rgbData.length; i++){
rgbData[i] = (byte) bin.readByte();
if ((rgbData[i]==0)&&(rgbData[i-1]==0))
break;
}


Converting to plain string:
String output = new String(rgbData, "UTF-8");

--------------------------

But my biggest trouble was the fact that the file version was not kept inside the PE header itself. The file version for DLL, EXE, OCX, DRV, SCR and similar files is kept inside a resource on the file. (Thanks to TheK on boot-land for helping me sort this detail: http://www.boot-land.net/forums/index.php?showtopic=11890)

So, besides implementing the PE header reading part, it was also necessary to implement all the logic to correctly interpret resources inside executables.

For my luck, this format is extensively documented around the Internet and even MS itself has released official documentation that explains (to some extent) how the structures should be read.

Nevertheless, it took me far longer than initially expected. I had planned for a full day of work and ended up working 3 days to achieve this goal. The code itself is not optimized for speed but for the moment it will suffice the needs of the prototype.

I've tested both with DLL's from the Windows kernel and custom executables from other compilers that had inclusively been modified with UPX - the exe compressor.

It was a good adventure. I've learned far more than what I originally knew about the binary format of windows executable files and this added knowledge might certainly open the "window" for other adventures in the future.

:)

Making Java apps look good in Mac OSX

Mac OS comes bundled with Java already installed by default and strives to make the user interface easy for users.

However, for those that like coding Java applications it might seem like a daunting task to make it look user friendly. If we were coding a platform specific application, we'd just select an icon to include at runtime and be done with it.

But in java - it's just too complicated and most pages about this topic that I stumbled upon were not really shedding much light on the matter.

Eventually, I discovered that Mac OS by default also includes some nifty tools to solve this matter.

There is a life-saver application called "Jar Bundler" and you can find it inside the /Developer/Applications/Utilities folder within the Mac OS. I've found it on this page: http://developer.apple.com/mac/library/documentation/Java/Conceptual/Jar_Bundler/Packaging/Packaging.html

--------------

Using this tool is a snap, open it up, select the Jar file that you intend to run and select an icon.

Before clicking on "Create application", you will need to choose a folder that will serve as base for your application. My advice is to pick an empty folder inside the desktop.

-------------

Other tweaks:
You can click on the "Set working directory to inside application package" to ensure that any files that your jar creates are kept inside the package (to keep it nice and tidy).

The icon format used by this tool is .icns but don't worry, you can use the online service at http://iconverticons.com/ to convert the file without any pain. If you want to make your image transparent, just open it on gimp, click on "Colors" --> "Colors to Alpha" and then "Ok". If you save the image as .png then it will be lossless and preserve transparency.

That's all. Hope this tip help others creating good looking apps with Java for OSX.

:)

http://msubuntu.com


Over the last years I've been a sort of doom's day prophet in claiming that MS will eventually acquire Ubuntu sooner or later.

The reason why I claim such statement is mostly because Ubuntu is really good at what they do and the desktop/server editions just get better and better at each 6 months.

Many people think that Microsoft is the all-time enemy of Linux but in reality Microsoft was once the biggest provider of Unix operative systems even before Linux was born.

This was at the time of Xenix, a licensed Unix version that was leased to other companies for deployment in organizations. In many ways, MS contributed to make Unix better and later went to write their own history with MS-DOS and Windows (all genres).


Now, Ubuntu seems to pick on the same characteristics that made windows a platform that everyone could use for their daily work along with any other enterprise tasks.

They're quite different from any of the other Linux flavors in the sense that the focus is given on making a pleasant desktop for users and instead of pleasant users to desktop.

I can't forget the endless times when I needed to edit a pesky xorg.conf to try getting my display to work correctly. In Ubuntu you see no such thing and that can only be a good thing for those who worked with older versions of linux.

Microsoft cannot compete against an operative system that is provided at free of charge for their users but it can certainly acquire the company and profit from a leading position on the linux platforms as Canonical does at the moment.

At the moment that a MS Ubuntu version appeared, in true fact I'd see many organizations adopting linux as their default server configuration just because of the MS label posted on the box.

Inside a big organization, MS knows how to provide outstanding tools but let's face it: many times we need a simple server and paying a costly license is not a good motivator to use MS software.

Maybe this would even become a good way to refresh MS's image from a monolithic empire that is falling down against other rivals such as Apple and Google to an open company that is embracing the future and human innovation.

--------------

So, I'm going one step further with my prophecy and acquired the domain http://msubuntu.com to post my thoughts and hopes for this future to occur one day.

Perhaps more people out there also think this might become a real scenario some day and join me there, would be nice to see this happen.

Crossing my fingers..

:)

yEd - a hidden gem for those who need a simple and free diagram editor

I've been a long time fan of Dia.

Both the Windows and Ubuntu version worked good enough to suffice my diagram needs.

I just turn it on and place all the diagrams into position to later paste them onto any document. Some people like Visio better and I'm sure it is, but my interest was in using a freeware tool that didn't required a license for something that I deemed as very simple.

Well.. there is no Dia for Mac. There is an expensive replacement for Visio on OSX but I'm still interested in good and free solutions.

Looking around the web I've stumbled on a very neat application: yEd.

This graph editor is simply perfect for my needs. Runs in Java and I could start right away for a try without installing it on my machine. The design is very intuitive and thought there are some things that might take one hour or two to get used - it is very easy to use without the need to read any sort of manual.

That's the type of program that I like, free and simple.

This editor can handle UML and a lot of goodies that someone in software development will surely enjoy.

If you're in need for a simple diagram editor, you find it here:
http://www.yworks.com/en/products_yed_about.html

:)

nuno vs the CVS plugin on eclipse


If you're an Eclipse user, you probably already noticed how CVS comes as a plugin already available on the default package.

This is nice and neat to set up a new install and grab your projects without further worries.

On my case, that was the nice type of experience that I had when installing eclipse for the first time on my work laptop, a mac.

Things went smoothly, I got online to grab the documents from the CVS and no worries whatsoever.

However, my nightmare started when after a few days I've started eclipse and the CVS would simply refuse to work for no apparent reason. I know that at this point someone would say: "there is no such thing as no apparent reason" - and in true honesty I agree but have no clues about what changed.

This issue started in last February.

I've tried to solve this annoyance in numerous ways, first by uninstalling eclipse and reinstalling, then I tried the cocoa version of eclipse to see if it work differently and finally resorted to the world wide web.. to no avail on this case.

Using eclipse started to become a real nuisance. Tried asking some opinions to experts but none would come to the rescue, the most common advice: use a PC.

It just seemed that I couldn't get eclipse back to factory defaults: darn mac.

Well.. I'd be happy in using an operative system that would make my life simple but I'm also too stubborn by nature to quit from my intent of solving this trouble.

From February to this part I've reached a stalemate in my quest. I managed to get CVS access from Eclipse but the downside was the fact that I was using a fork from the eclipse project called "EasyEclipse" (http://www.easyeclipse.org)

It was indeed "easy" to use but it was also seriously outdated from the current stable version of Eclipse. This week become problematic to use an older Eclipse version because my team will all be using the stable version to ensure that everyone has the same environment.

Wish I could complain but it was guy who wrote the default environment documentation and there was simply no other way around other than facing my issue with CVS once for good.


And today: rejoice!

I've discovered how to solve this CVS nuisance. A lot of people know how to install plugins from within Eclipse. But what few people probably know is how we can also uninstall them just as well.

And uninstall I did..

I'll share this little secret: Click "Help" -> "Install new software" -> "Already installed" -> select "Eclipse CVS client" -> click "Uninstall"


After this, just restart eclipse and install CVS again from the default eclipse repositories.

So simple to fix and so many headaches to find the solution...

:)



virusremoval.pro begins

Yesterday I've announced the virus removal community forum across the good people of boot land.

The feedback response was surprisingly good. The site had been started little over four weeks ago and counted with an average of 100 daily visitors, yesterday we've peaked at over 1200 unique visitors.


This kind of response is truly motivating. The quality level of the ongoing discussions is also very good, there is a lot to be learned and we do have the conditions to give malware authors a really bad headache.

:)

Email robustness


Ever since I've first got my own personal domain as http://nunobrito.eu some years ago it became possible to use my official email address as mail@nunobrito.eu

Instead of having several mailboxes I've decided to concentrate them all at my gmail account using email redirection.

It's simple, worked well.

However, the server where my domain is hosted would often become offline for several days in a row due to the sheer amount of people trying to access the other services hosted there.

This brought me for the first time to a fragile situation because I would no longer be receiving emails while the server remained offline.

I've devised a manner to provide email robustness at no extra costs and without requiring a server.

It's very simple.

- The first step is registering your domain with goddady. If you've already registered with their service then it's fine, otherwise I'd seriously recommend moving to this particular registrar.

- Then register for google apps standard edition: http://www.google.com/apps/intl/en/group/index.html
Input your domain as the domain that will host the apps, don't worry because this won't mix with your site in case you already have it developed.

- After registering your domain with google apps, look on this page regarding how to configure the mx records at godaddy: http://www.google.com/support/a/bin/answer.py?hl=en&answer=33353

But my favorite part is this automatic tool to do it quickly: https://www.godaddy.com/gdshop/google/gmail_login.asp

The above link will automatically configure your domain to use gmail as the mail service.

- At this point the email is handled by google apps, let's manage your site:
https://www.google.com/a/cpanel/example.com (change example.com with your domain)

- After login, click on "Email"

- Click on "Change URL" and select the URL that is hosted by google so that you don't need to use your own domain to log onto the webmail service.

- Click "Email addresses" and then add a user.

- Select a user listed there and add "nicknames" to the user. This means the possible email addresses that will be used to route the messages.

- Log onto the webmail service and set the routing of all messages onto anywhere you want, just like you would do with a normal gmail account.

- Done!

You are now routing all your messages sent to your official email address onto anywhere else you need.

Good luck.

--------------------

Now my official email is robust and no longer depending on any server.

:)

Back to my roots


This is my final week in Pittsburgh. I've completed the second semester just like all other students from the MSE program.

Pittsburgh was really nice but now it's time to return onto Portugal where the remaining two semesters will last until December.

I should be happy now. The most difficult times should have passed and things from here forward should actually be more fun: I'll be coding and creating the studio project that we have been planning for so such a long time now.

However, I'm not happy. Returning to Portugal means a direct confrontation with the army in my country. From my relatives I can only gather some whispers and rumors. Even my lawyer is mute as the stormy days approach the road ahead.

Upon the idea of returning to my roots I feel similar to a small kid returning home after doing something wrong and afraid of a reprimand from his father.

And in fact, the army is still like family to me. They helped me as a teenager when the future was not promising, providing the tools, resources and discipline necessary to survive.



Now it's time to discover the world outside my "adopted family" even if it means facing the anger or disappointment of those that expected me to continue in the same career.

But this path is not easy. Usually I don't get tired, I might get exhaust and need to sleep for a good night or even get a good coffee to start a fresh day, but right now I'm just getting tired of all these obstacles.

Guess I need to remind myself that we all have a purpose and I'm still defending what I believe to be correct.

I might not be happy about the future but I'm certainly happy to have reached this far in my goals for life.

Even if I could go back to the past and be faced with the same decisions, I'd still do them. Wouldn't trade the knowledge, people and memories for anything less than a chance of truly start living with freedom of choice.

And having a choice really makes me smile.

:)