Sunday, March 11, 2012

Introduction to CV for application for a Master's degree program


As a professional software engineer with over 8 years of experience, I always demand cutting edge tools and the best software solutions design and implementation from myself.
I am a continuous learner and I love experimenting with everything new in software technology. I am also interested in human computer interaction, and in building hardware embedded systems.

I have designed and implemented multi-threaded communication protocol servers and graphic representation systems used in real world for medical and statistical purposes.
I was also involved in integration business projects, creating database management software systems with intuitive user interfaces and complex business logic rules.
I recently participated in a team developing an ambitious e-commerce site using cutting edge technologies in the domains of relational databases, document databases, message queues, data mining techniques and web services.

My dream project is an automated database persistence system that would adapt to any number of joined relational and document databases through a process of a few easy steps for an administrator. Later, the users would be able to define, design and change data views, create custom filters for data reports, and change data records. Also, users would be able to define data flows and business rules using the web application. Furthermore, the application would be able to notify the users when certain events are triggered, with reports containing the appropriate amount of information.

I am interested in extending my skills in the domains of robotics and artificial intelligence. I would like to develop a web management system with advanced monitoring features for robotic devices. I want to learn programming micro-controllers for real time throughput on robotic devices. Robotic devices may include advanced sensors like video cameras with pattern recognition technology and 3 dimensional moving parts. The final application would be an industrial automated expert system like a production line with minimum human intervention.

Data analysis is another challenging quality that I am interested in working at. Managing large data stores seeking for metrics and statistical analysis results may be interesting for business intelligence concerning decision support systems. Data is an asset for today's business, and information derived from them are valuable products. Data mining and combination of results can be very useful for strategic management and financial decisions.

Contemporary applications of any purpose are always supported with the appropriate mobile application. Working on the move is a growing trend, and mobile devices are now even replacing personal computers for some uses. Android, IOS, Blackberry and windows are very popular mobile platforms that can support web browsing, graphics display and interaction, and save time with their special minimal design.

Finally, I would like to state that I consider it a great challenge every opportunity to transform an old fashioned organization into a contemporary paperless working place, using the technologies of Internet communications, cloud computing, portable devices, expert systems and robotic automations. I greatly appreciate the environmental benefits of these transformations and the advances of quality of life and work for people working in these organizations. I really believe that information technology is a leading tool towards making right and better decisions in general.

Sunday, August 7, 2011

USB flash disk history

Back in year 2000 the best way (and the only way) to transfer large amount of data was the recordable cd-roms. The cd burner devices were very popular and fashionable and everything was burnt on a cool compact disc.
I managed to buy a yamaha cd burner and I was very happy because I could keep backups of my work. But the problem was that I couldn't pay for dial up calls or an ISDN line, and I needed a way get some documents home from the office. Burning a cd for this purpose was an overkill because:
1. only one pc, in the company, had a cd burner,
2. I wanted to trasnfer documents of 5-10 megabytes size, and 650MB of a cd was a waste of resources.

So, then, in 2002, I found the solution called usb flash disc. My first usb flash disk was a sexy designed curved device, with 32 megabytes capacity.


I was proud for my portable device, as it costed about 40 euros. Then I was able to transfer my documents with an efficient way and without the need of having access to the internet from home. With this disc I managed to maintain a collection of programming articles and resources, that I was able to read from home. I had great time with my ripped articles, and the collection was always growing.

After that great step of progress, the need of buying a new hard disk drive appeared. My old hard disk of 8.2 Gigabytes was very small for my new expectations. Then I baught a 40 GB hard disk about 118 euros cost, and it was then when I downloaded a new bios for my old pc in order to support hard disks over 32 GB.

The new hard disk seemed to be a black hole for dropped in data. Data seemed to get lost in the vast spaces of that hard disk. So, I needed a transportation unit that could give a bigger bite to the hard disk capacity. Then I baught my second usb flash disk, that I used to call it usb FLASK disc, which had a capacity of 2 GB and I don't remember its price back then in 2004 (or 2006).


At last, I could transfer videos and pictures home. I started a new collection of data, called "Cool pics" and "Cool videos" of course... And the "new" hard disk drive now seemed to be small. Then, I started to backup data in cds and purchased dvd burner for more efficient backups.

Wednesday, July 27, 2011

Concurrency issues in real life

"Non-determinism comes from parallel processing and mutability" (Martin Odersky)... true for information systems and real life also.
This was the tweet I posted on midnight of 27th July 2011 to my twitter followers, while watching this video: O'Reilly OSCON Java 2011, Martin Odersky, "Working Hard to Keep It Simple".
I immediately thought that this phrase is a compressed dose of a great portion of wisdom. The art of information systems architecture and real life seem to have many things in common.

Real life could be multithreaded:

Thread 1: Health
I consider health to be the most important thing in our lives. And health depends of course of the conditions in the environment where we live. We live in a city and we prefer to spend some weekends and some holidays at the country side. We get sweat in the summer and we get cold in the winter interchangeably. The quality of the air we breathe and the water we drink is changing. And of course we need more regular physical exercising.

Thread 2: Family
Being a man, you know that your wife's character is more floating than you would expect. Living with another person always takes some tries to keep the moods in sync. Problems begin when one person is equiped with happiness while the other is seized by sadness.

Thread 3: Job
As a dangerously enormous part of our timeline, job significantly qualifies our lives. We may feel productive or we may feel stressed from a deadline. We may be satisfied of the subject, the conditions and the colleagues, or we may need a change of workplace, or even a change in our career.

Thread 4: Friends
Friends bring a great balance to our lives. Like family persons, friends are also persons who need to get and who can give sadness and happiness interchangeably.

Thread 5: Money
Since everything in life ended up to be needed to be measured somehow, we got money, and we got selling, buying, lenting and renting transactions. Sometimes, for some months, your salary is not enough to pay the bills. Some other times, unfortunately fewer, you may be surprised of the balance of your account, because you managed to spend less in that month.

And there are more than 5 "threads" in real life, all manageing:
a. mutable qualitative data as emotional states and
b. mutable quantitative data as money.
Unfortunately our brain is one "physical processor" with several "logical cores" but all of them have to use the same "shared memory"... So, all people have to deal with mutable data while processing threads in parallel.

Apparently, real life is naturally non-deterministic because it has to deal with parallel processing of mutable data. But, a software engineer should design information systems in a completely different way. An information system should be deterministic, so, it has to build a shield against parallel processing and mutable data.

Concluding, a deterministic information system allows the software engineer to:
1. take more time to take care of his health,
2. spend more time with his wife,
3. prepare better deliverables in time,
4. drink beers with his friends,
5. produce more in less time.

Wednesday, July 13, 2011

A year full of passion

I just turned an exciting year on my current job at www.xe.gr. I feel that much happened during this year, and now it's time for an account of things done, and scheduling tasks to be done in the future.

During this year:
1. I contributed to an e-commerce application and its shopping cart.
2. I got introduced to the Restless services, and implemented a restless API.
3. I found out that there are JSP alternatives, that are better for front-end developers.
4. I discovered the power of dynamic languages. Perl, Python and Scala are now in my immediate interests.
5. I realised that Tomcat servlet container can do the job as an "application server". JBoss, Websphere and Weblogic are great application servers for those who don't care about the overhead (or configuration) of preinstalled frameworks.
6. I dropped my absolute belief to relational databases as Oracle and MySQL, as I discovered NoSQL databases as MongoDB and Cassandra.
7. Now I am aware of over a hundred open source projects that can be usefull and I must use during my career.
8. I studied many lines of bad written legacy code, and I supported it.
9. I was introduced to the agile development process, and especially to Extreme Programming.
10. I used 2 major bug tracking systems professionally: Bugzilla and JIRA.
11. I created an account to a social network for professionals: linkedin.com
12. I created my account on twitter and twitted about 50 times.
13. I dropped an eye out of the box and I saw Javascript can be a server side programming language.
14. I decided to regulary attend the meetings of 2 user groups: jhug (Java Hellenic User Group) and greecejs (greek javascript user group).
15. I first used Maven as the build tool of my projects.
16. I extensivelly used subversion for versioning.
17. I created my account at github, started 2 new open source projects and started learning git for versioning.
18. I recently acquired an android smartphone, so, I started using mobile internet and I read more using the kindle application.
19. Now I can see much more potential in the smart mobile devices, and as a result I care more about mobile software development.
20. I purchased about 15 ebooks and 5 printed books about software development.

Phew! Pretty awsome and fascinating year!
And there is more...
I met great people with great personalities, who communicated their invaluable experiences and their interestingly different point of view.
I made some friends, and I spent great time lunching and drinking beers.

At the personal level, I admit that the current and the next year will be the greatest years of my life because in a few months I will take the greatest responsibility of my life: being a father.

Monday, July 11, 2011

Importance of Testing

To all hard working programmers around the world, I should verify this principle:
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.
It wont work unless it passes extensive testing.

No, this is not a blog post full of unnecessary repetitive nonsense. It's a priceless truth that should be burnt in your mind as you decided to be a coder for a living.
Don't ever, EVER forget this.

Sunday, November 28, 2010

Multimedia introduction

As a child, along with computers I was trying to develop some more “artistic” talents like playing music. I always wanted to learn playing the guitar and rock till the end. Along with guitar and bass, keyboards was really exciting too, and seemed to be easier playing. My parents bought me a small keyboard and I immediately started practicing using study guides and books. Later, they got me a teacher who was coming at my home and helped me develop some basic techniques through playing well-known classic songs.
It was amazing! I could make music! I could write my own music themes, and I could perform. Soon I realized that my computer could be a performer of music too. I thought that it would be a “perfect performer” playing music exactly as it is written on the music book. It could play the music I was “translating” in GW BASIC commands. It would follow my program flow and execute my commands, whatever my program was about, even playing music through that old and odd standard internal speaker. I should admit that listening to the music from my programs seemed perfect to my ears, even through that speaker.
It was then, when I learned that the music notes represent a different frequency, and there is an international code naming system using the first seven letters of the Latin alphabet.
The below table shows the correspondence of the common name, the Latin character, the frequency and the wavelength. (Source: http://www.phy.mtu.edu/~suits/notefreqs.html)
common name Note Frequency (Hz)Wavelength (cm)
doC016.352100.
reD018.351870.
miE020.601670.
faF021.831580.
solG024.501400.
laA027.501250.
siB030.871110.


I tried to remember (but I couldn’t) the command I was using to represent music in my programs. I just remembered that I was using the Latin characters and in some manner, using some numbers, I could declare the duration of each note. I finally googled it and I recalled the command was simply:
PLAY "edcdeee2dfedc4"
(example found at: http://en.wikipedia.org/wiki/GW-BASIC)
Later, I discovered that I could declare new sounds, out of the frequency ranges of the notes, using another command: SOUND. Following this idea, I discovered that this command was responsible for the sound of an explosion when playing the game with the gorillas, or, the sound of that primitive speech in some games, and any other sound effects. Next, I tried my first steps in the algorithmic art of music. Using loops, I created some cool sound effects similar to the simple sound effects of the games of that time.
It is a great experience to expand the possibilities of a tool. It is great to discover that there is one new distance in the tool you already use for some time now. So, I happily realized that the computer could not only output some characters on the screen, but it could also produce some audiovisual data!
It was then, when I realized that the games I was playing, have been written by programmers, not by magicians. I realized that I wanted to become one of them. Behind the graphics, the music, and the sound effects is hidden some pages of beautiful code (or ugly code :-)). Anyway, some lines of code could give some magic audiovisual moments to some people.
Later, I needed an upgrade of my computer and I bought a new 8-bit sound card, and real external speakers. I thought that my already written programs would be executed automatically now using the new equipment. And I was wrong.
Then I started to search and read my books about interacting with hardware. As I had no idea about the existence of the Internet to search for a solution, I had to find a good book. My parents let me order whatever book I needed from my already favorite bookstore, and then I first learned about the DMA (direct memory access) and IRQs (interrupt requests). When I studied some pages of code listings and found many hexadecimal numbers, I quited. I decided that first I could study some more mathematics, and some more computer hardware, and some more operating systems theory.
I was also advised to learn C programming language for better playing with the computer hardware programming. I was warned that it is a difficult programming language, but it is also the best. I knew that soon I would be studying C programming language step-by-step (Waite and Prata).

Saturday, November 20, 2010

First attempts

It was back in 1991 when my first computer arrived at home. At the age of 10, I was really excited and proud for my new hard-earned 80386 microprocessor, at 8/16(turbo) MHz, with 1 MB of RAM, 40 MB hard disk drive and full-color VGA screen!

I still had not a clue about what was the potential of this great tool, but I surely knew well that I could play some fancy games.

I remember my first technical books were about MS-DOS and GW-BASIC.

I remember my first contact with the operating system shell. I managed to find out how to change directory and go straight to the games folder (cd games). The first disappointment came out when I couldn’t figure out how to change directory stepping out of the current directory. Then I always had to restart the whole computer using the reset button, so, it reloads the operating system. Then I could start over from the root directory, changing directories diving one-way deeper in the directory structure… And then restart again. The end of this series of psychological test sessions ended when I discovered “cd ..”, “cd /”, absolute and relative paths.

I remember myself trying to copy my first programming example, from my first programming book. It was a good reference guide to GW-BASIC. One of its first example code listings was an if-statement, a decision flow example, that would read a number from keyboard and then check if this number is negative or not. Finally, it would print-out jubilantly an appropriately happy message: “This number is positive/negative”. I was reading the book and I was excited by the fact that I could put some logic into a machine. Then this machine would execute my logic and it would react in some manner. I couldn’t wait to type it and put it in some serious testing… but when I started typing, this strange machine replied that this was a “Bad command or file name”. I was not sure about the “file name”, but I knew that the “commands” I was typing were absolutely identical with the commands on the book. The mystery was unveiled when I got the enlightenment of the GW-BASIC compiler and editor existence.


I remember my first computer game. It was something open source software, written in QuickBasic. It's the well known Gorilla. An old time classic. Two gorillas (two king-kongs actually) on the roofs of skyscrappers in a big city, throwing explosive bananas to each other. As a turn based, two player game we could also play against the computer. To run this game, I had to execute QuickBasic editor-compiler, load the source code file named gorilla.bas and then compile and run it from there. Sometimes I tried to read parts of code, but it was really disappointing.