Informatics and the world of electronic computers are my two main interests.

First Experiences

My first contact with an electronic computer was in 1993. Of course, this was an IBM PC which used the 8088 microprocessor and whose operating system was the MS-DOS. In the beginning, I was not interested much for the reason that my free time was taken up by the then popular game consoles.

If I remember correctly, from then until now I have been the proud owner of the following consoles: Game Boy, Sega Mega Drive, SNES, Sega Saturn, Nintendo 64, Sega Dreamcast, PlayStation, and PlayStation 2. Of course, the fact that I currently do not possess any of them is admirable. Some, certainly got ruined, others were sold and others were lost. However, my love for computer games is still there.

When I started to deal with electronic computers (starting with the IBM PC) a little more consciously, I began to wonder about the way they operate. Of course, my question was answered several years later. I must first say that I played for some time on the command line of MS-DOS with various internal or external commands to edit files or directories and manage different input / output devices.

Sometimes I ran games and loaded drivers for devices that I wished to support. Also, I created batch scripts to automate tasks and sometimes used the programming languages Pascal and Basic for educational purposes.

In 1995, when Microsoft released the operating system Windows 95, I started using it with much enthusiasm because it had an original graphic interface which had many differences from the well-known terminal MS-DOS and was more friendly.

For some relatively long time I worked on visual programming languages using Microsoft Visual Basic, Borland C++, but again for educational purposes.

Hardware Management & Troubleshooting

Along with programming in Visual Basic and Pascal, I started working on the technical management of computers hardware. So, having experimented 5/10 times with various PCs and, after I burned some microprocessors, I was able to manage their hardware. Then, I started working on the different hardware characteristics of the PCs, with the formatting of disks, disks partitioning, using the BIOS, setting a drive as Master or Slave, install / uninstall hardware (e.g. memory cards, microprocessors, expansion cards) onto the central processing unit, the from scratch assembly and disassembly of a PC, OS installation, proper management of the interior of the PC for better performance, addressing hardware problems, etc.

Installing & Managing Computer Networks

Along with the planning and management of the PC hardware, I was also involved with PC networks, mainly LANs. I have set up some simple LANs with the Windows family operating systems and GNU/Linux.

Also, I have in the past been involved with the implementation of: a) Samba File Server (Windows & GNU/Linux), b) Web Server: Windows (IIS), GNU/Linux (Apache). Interestingly enough, I had to use the filesystem NFS to enable communication between GNU/Linux OS.

Computer Science & Architecture

Until then, I did not know how PCs operated; I can say that while I was playing beautiful melodies with them as if they were musical instruments, I did not know their way of operation inside. So, I slowly began to grow my general knowledge about Informatics and more specifically around the architecture of PCs, with a view to understanding how they work.

Once I understood the Von Neumann architecture, which introduced the stored-program computer, I started gradually making it into the microcosm of the PCs. I had to know the binary numbering system, the binary logic, the Boolean algebra, the principles of digital circuits, the internal representation, storage and information management by the PC, how the various components of the PC function and the basic principles of structured programming.

So, once I understood how the PC works (if one wishes to understand how the PC works, he should start from older systems because they were simpler than today’s ones), more specifically how programs run and the internal management of information (especially the way the microprocessor and the memory works, and their cooperation in the execution of programs), I had for the first time a desire to write programs with a low-level programming language.

Low-Level Programming

And it so happened that after a very short time I was ready to write programs at a low level since most high level languages were of no use to me as I could talk to the PC directly in its own language.

I worked mostly with the Intel 8086 microprocessor and based on that I wrote some programs in its assembly language. Sometime later I was involved with the Intel 8088 in BGC-8088 development platform. I remember I wrote a program that played melodies using the internal speaker of the system, and one which operated on the light emitting diodes of the motherboard. It’s a nice thing to write programs at a low level. I wish all the computer scientists to experience it even for once.

Of course, then I found from my experience that the PC does not have any intelligence at all. You know, periodically, people appeared who reported that computers do have very little intelligence. But those who have seriously done some research on the PC, and are not fanciful enough, know well that computers have no conscious intelligence at all and are entirely driven by the developers.

Operating Systems Programming

Another branch of the Computer Science in which I was involved was the development and designing of operating systems.

So, after much study of the principles regarding OS design, I understood numerous issues regarding the OS, such as processes, threads, kernel and shell, file system, interrupts and signals, resource management, system calls, memory map, environment switching, system stack, system cache and virtual memory, users and authentication, rights and security, time-sharing, multitasking and multiprocessing, services and ports, scheduling and algorithms, interprocess communication, priorities, mutual exclusion, critical sections, semaphores and flags, exclusive locks, deadlocks, memory paging and segmentation, device drivers, sockets, data coding, and more.

Designing Programming Languages Compilers

It is worth mentioning that I’ve worked enough in the past with the development and design of compilers with Flex and GNU Bison. Specifically, I have dealt with the development of lexical analyzers, syntax analyzers, semantic analyzers and code generators.

Operating System Kernel Programming

Alongside these, it is worth mentioning that I was involved at programming level with the Linux kernel (which alongside the GNU system make up the GNU/Linux OS). The fact that the Linux kernel is Free Software and its source code is accessible by anyone gave me the opportunity to understand how the different parts of a kernel work.

Programming Embedded Systems

I have already seen most of these in practice, while I have analyzed some others only in theory. Of course, I had to deal with the programming language C as most of the OS programming is done primarily in it (it is the best language for systems programming). I must confess that this sector is the most exciting one. Of course, my love for the OS did not stop but was extended later as I worked on the theory and practice of embedded systems programming in C.

A platform on which I’ve worked a lot and I have developed code for various applications of embedded systems is the Arduino. The Arduino is an open software platform for the development of autonomous embedded systems. The programming language which is used for writing Arduino programs is C. You can browse the page of my works to locate the various applications I have developed in it.

User Applications Design & Development

Another branch in which I was involved and interested enough was to develop software applications. For this reason, I had to deal with C++, Python, C#, the theory of numerical methods (mainly with methods of finding roots of linear equations, solving linear systems of equations, numerical integration, LU analysis and applications thereof, polynomial interpolation, approximation points, method of least squares), data structures and algorithms, visual programming and other technologies that always need as auxiliary tools. But what plays a more important role is the technological knowledge that anyone involved in software development should hold.

For this reason, until now I have been dealing with software engineering all the while trying to get more and better knowledge on the issues of analysis and designing systems. In terms of software engineering, I have dealt with many interesting guidelines it proposes, i.e., programming standards, design patterns, prototypes, UML diagrams, documentation systems, development methodologies (UP, XP, Agile), etc.

It is worth mentioning that I also dealt with developing large-scale applications. Issues such as 3-tier architecture is now something familiar and understandable to me. I worked on the Presentation Layer (PHP, HTML5, CSS3, jQuery, jQuery UI, ASP.NET MVC 3), Application Layer (WCF Services, DTOs, Object-Object Mapping) and Data Layer (Models, DAOs, ORM).

More generally, for developing applications I often use: C (POSIX and ANSI), C++ (ANSI and ISO), Python, GCC (GNU Compiler Collection), GDB (GNU Project Debugger), GNU Emacs, sed, GNU AWK, CVS (Concurrent Versions System), SVN, Git, Indent, GNU Make, Doxygen, Regular Expressions, cflow, cproto, GNU gettext, grep, GNU Bash, Flex, GNU Bison, GNU Texinfo, Bash-Scripting, Log4Net, Automapper, Installshield, NUnit, Rhino Mocks, Firebug, Spring.NET, NHibernate, LINQ / HQL / Criteria, jQuery, C#, Resharper, RestSharp, JSON.NET, Sandcastle, TFS.

Software Quality Assurance

Another branch in which I worked is the Quality Assurance of various client applications (mobile and desktop applications) and server services, primarily at Functional Testing (Black-Box) as a QA Engineer, using tools like JMeter, SoapUI, and Unit Testing (White-Box) as a Software Engineer using tools like NUnit, Rhino Mocks. Also, I was involved in writing, running or correcting / optimizing various Test Cases using Microsoft Testing Manager and Visual Studio Team Foundation Server.

Dynamic Web Applications Development

Furthermore, my relationship with the Internet and web applications programming for it is also hot. I think my interest for programming web applications is firmly rooted. Initially, I started creating only static websites using HTML and then did some formatting of HTML documents with CSS. Later, I noticed how large applications require dynamic data management. So I had to deal with relational databases and dynamic web programming languages.

Towards this, I worked on the theory of relational databases and especially with the query language SQL, so I can design efficient and accurate databases. Initially, I was using the Microsoft Access for the database implementation and the programming language ASP for the website development, which is also a product of Microsoft.

But today I use MySQL to implement the database and PHP as a dynamic programming language. I must confess that after some experience in both environments, the development of web applications with MySQL and PHP is better, more efficient and safer.

Of course, my knowledge expanded and so I learned XHTML (either as Transitional or Strict) because it’s better to implement a web application. Also, it seemed very useful to use XML, which had to deal with for various reasons. It was also interesting learning the XSL to format XML documents.

More generally, for programming web applications I typically use the following languages / technologies: HTML5, CSS3, XML, XSL, PHP, SQL, AJAX, jQuery, jQuery UI, jqPlot, Javascript, Google Maps, Perl, Python, XQuery, XPath, ASP.NET MVC 3.

Until today, I develop web applications for either personal use or for others. I have been tried on several web applications, especially e-commerce and content management in general.

Also, apart from the from scratch personal developments, I have management skills on many well-known content management systems such as: Joomla, Drupal, WordPress, OScommerce, etc.

Philosophical & Ideological Views

Although for several years I used non-free software, at some point in my life, because of a philosophical change in the field of Informatics, I have stopped using proprietary software on a personal level and became a strong supporter of the Free Software Foundation and GNU project. So, I stopped using the OS Windows, the ASP, the MS-DOS, the Visual Basic, the Microsoft Office suite and generally any proprietary application.

So, since I was a supporter of the philosophy of Free Software Foundation and GNU project, I sacrificed many projects on which I had worked and tried to fill those gaps with similar technologies and applications that exist in Free Software. Initially, I found an OS complete, powerful and free from any proprietary evil strings attached. This was the GNU/Linux, which is the composition of the system GNU and the Linux kernel.

Also, the void of ASP and Microsoft Access were covered with two powerful tools, PHP and MySQL, which I have already mentioned above. With regard to visual programming, I replaced Microsoft Visual Basic and Borland C++ with Qt, and the Microsoft Office suite with LibreOffice.

It is worth mentioning that initially my switching to OS GNU/Linux was not made immediately. At first, I tried to get whatever Free Software there was available for the Microsoft OS. So, after I replaced all proprietary applications with those of the Free Software, the only thing left was to change the Microsoft OS. Of course, in a very short time I installed the GNU/Linux and I found there all those tools also in use in Windows, so I had no real problem.

Software Internationalization & Documentation

Also, as regards the development of applications I also dealt with languages for documenting systems and creating manuals. Both at the source code level (e.g. Doxygen, Sandcastle), but also at the user level (e.g. Texinfo, Man). Alongside this, I dealt with the internationalization support in applications which is implemented in the Free Software by the use of Locales. At the command line application level tools I use gettext, msgfmt, msginit, and at QT application level the tools QT Linquist and the appropriate framework of QT to support I18n.

Supporting Free Software Foundation

Until today, I have been working on translations into Greek of all the key parts of the server of the GNU project and develop portable free software. You can see the work of ‘www-el‘ (Hellenic GNU web translations), of which I am key member.

Electronic Games Design & Development

Finally, I have to mention that I have great interest in developing and programming computer games of two dimensions. This is the reason why I have dealt with SDL and Pygame libraries. So, I try, whenever I have the time, to participate in the development of the police adventure game ‘tct‘ (The Crime Tracer) which reminds me of Broken Sword and Monkey Island. Games I loved when I was a kid.

Current Interests

Software Engineering, Software Design Patterns, Enterprise Applications Development, Web Services, Embedded Systems, Operating Systems, Compiler Design, Game Development, Machine Learning.