Paper Prototyping my Wedding

October 18th, 2008

I am getting married soon and for that I had to design a proper settings arrangement.

I started by writing names down on a paper. But after a short time I only had a sub optimal solution, so I started to erase names. Very shortly after I had a big mess but no seating arrangement. I then thought hey when I have software probem that is hard to grasp I get paper, pen and scisors and make a paper prototype or CRC cards. So I put the names of the guests on pices of paper and aranged them aound paper tables on the floor. The advantage was that you could swap and move guests around easyly.  I finally got a seeting arragement in under 10 minutes…

On think I learned was: paper prototypes are also good for real life problems.

Compiling GtkGlExt on Windows

September 21st, 2008

I was developing a 3D sample application wit Gtkmm and GtkGlExtmm. I needed to provide Windows binaries and that literally yesterday.

The developers of Gtkmm provide a all inclusive SDK and runtime installer, so that was not an issue. They actually took over maintenance for the installer and updated it to 2.12. It used to be a third party product that used in parts the glade for windows installer for Gtk+ and was always a version old. The problem was that GtkGlExt and GtkGlExtmm is not bundled with that installer, unlike other things like libxml++ are bundled with it.

On the side of GtkGlExt, there was no real help, since the binaries provided for Windows are outdated and only for GtkGlExt and not GtkGlExtmm. So I had to install the two libraries from source.

The last time I seriously developed under Windows I used Cygwin and cross built to mingw32 (native Windows) target. The reason was that Cygwin provides all necessary tools in a sufficiently recent version to bootstrap any Automake/Autoconf project and proceeded replacements for POSIX only features.

So after installing the Cygwin with the bare bones development tools, I started to build GtkGlExt. Of course it failed to build the test program in configure. I disabled the test and got it almost to compile. I fixed on odd rule in a Makefile and it finally worked fine. The same was for GtkGlExtmm. Bot took forever to complete and needed a bit of touching up. Finally I got onto my actual program. It compiled fine and then crashed with a segmentation fault. At that point my hart skipped a beat.

The reason for the test to fail, seemed to have something to do with my general setup. The first odd thing was that I needed the cygwin.dll, though I had cross built to mingw32. Although this is a common problem with C++ programs, it normally is not an issue. So I installed gdb and painfully stepped through the program, only to find out that I crashed in some trivial code in Glib::RefPtr, Glibmm’s smart pointer class. This smelled of version and compiler settings mismatch; actually It stank. At that point confused and irritated, I did not know how to really fix the problem.

I looked at the Gtk and co. binaries and found out that they where perfectly mingw32 and had zero cygwin. I then looked at my program and it needed cygwin. Since I did not have any POSIX code, the need should not have been. I figured out that It must have not used mingw32 for everything.

Since I only wanted to compile GtkGlExt and my program, I figured I did not need anything that MinGW and MSys did not provide. So I decided to install MinGW with MSys.

Configuring GtkGlExt went fine, even the test programs worked. This spurred some hope that I would get it done before this universe ends. The compile of GtkGlExt failed because some code generation scripts used from Glib needed perl. So I installed perl and cyrpt from the MSys packages and finally all went fine.

At first GtkGlExtmm did not work that fine. The reason was that there was a stray character in all CXXFLAGS within the Makefiles. Suddenly I remembered the other reason why I used cygwin last time. Well I found the stray SOH (Start of Heading) character and replaced it with a space. Now all worked fine.

I finally got my program to compile and run. Boy was I relived as this workd. The best part is I now have a sane build envirnement on my Windows PC for Gtk, something I pushed off for a relative long while.

HOWTO Compile GtkGlExt on Windows

You need:

  1. Install MinGW. This should be stright forward, but check that g++ and make are installed.
  2. Install MSys. Again simple installer.
  3. Copy the perl and crypt package to a place you find again, like C:\msys\1.0\home\username.
  4. Open a MSys shell and type cd /
  5. Untar perl: tar -xjf /home/usename/perl-5.6.1-MSYS-1.0.11-1.tar.bz2
  6. Untar crypt: tar -xjf /home/usename/crypt-1.1-1-MSYS-1.0.11-1.tar.bz2
  7. Copy GtkGlExt and GtkGlExtmm source to a place find again. C:\msys\1.0\home\username.
  8. In the MSys shell go the place with your sources: cd /home/username
  9. Set the environement variable PKG_CONFIG_PATH to msys local path: export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
  10. Untar GtkGlExt: tar -xzf gtkglext-1.2.0.tar.gz
  11. Enter the GtkGlExt source tree: cd gtkglext-1.2.0
  12. Configure, build and install GtkGlExt: ./configure && make && make install
  13. Exit GtkGlExt source tree: cd ..
  14. Untar GtkGlExtmm: tar -xzf gtkglextmm-1.2.0.tar.gz
  15. Enter the GtkGlExtmm source tree: cd gtkglextmm-1.2.0
  16. Configure, build and install GtkGlExtmm: ./configure && make && make install

Now you are done. You can find the binaries in C:\msys\1.0\local\bin, along with all other stuff required to build your application.

Binary GtkGlExt

Alternativly you can use my build result and downlaod gtkglextmm-120-win32.tar.gz.

Cyclic Dependencies: Clean the Up!

September 14th, 2008

Cyclic dependencies are a challenge for any build system and code to handle. But I you look closely at cyclic dependencies, in most if not all cases they are a structural problem and not a technical problem. Cyclic dependencies indicate in most cases either that two modules belong together or one module implements two tasks.

Let’s take a projcect I am currently working on. There are two modules, the Interpester and the Object Manager, both are cyclic dependent. The Interpreter implements a virtual machine. The Object Manager implementes object serialisation and low level buissness logic. The basic contollflow is as follows: Object Manager calls Interpreter to evaluate some value and to do this the Interpreter calls back into the Object Manager get values to a given object.

If you read the above paragraph cloasly you will notice that the Object Manager implements “object serialisation and low level buissness logic”. Well as you can see there are two tasks that can and should be split in two seperate modules. If they are split in three modules there are no cyclic denendencies.

Hosted Apps on SourceForge

September 13th, 2008

I just got a e-mail from SourceForge about a new feature: Hosted Apps.

Its actually not much, you get a softwate like MediaWiki installed on your webspace and they mantain and update it.

This is one of the most usefull featues, they developed, since setup and maintingin the web software can be quite time consuming and the website is what most people look at a open source project.

Cleaning up for libqgl-0.1.0

September 6th, 2008

Development on libQGL is going into the final stretch for the libqgl-0.1.0 release, which is scheduled for end of September. To hold the release date I had to scale down the feature set. As a result I will only put 2D graphic, mouse and keyboard input and the logic framework into the release. I want rather a few solid good features than many half cooked ones.

I moved the code from the experimental branch to the main trunk and stated removing all bits and pieces that are not a feature. The code starts really to look quite clean. I will spend the next two weeks cleaning an compleating the code.

Back to Worpress

September 5th, 2008

After (ab)using DokuWiki as blog and CMS software for about two years, I have migrated back to Wordpress.

My move away from Worpress was based on the fact that a number of limitations in the software was inhibiting its use. The latest release is quite usable and as a result the abuse of DokuWiki, which is a WIki software not a blog software is not that appealing. DokuWiki is still the best Wiki software I have seen, but you got to use the right tools for the right job.

While I am migrating the posts onto the new site, here is the old one: http://old.rioki.org

We Need to Send our Kids to University

July 18th, 2008

Lately in Germany there is a debate about immigration of highly skilled people. The issue arises from the fact that, in contrast to other countries, Germany does not really have a immigration policy biased towards qualified people.

This is all good and fine. A industry nation needs qualified workers to sustain itself. But what I don’t get is the fact that there are so many children with such a bad education.

I believe that a industry nation needs to send at least 3/4 of its children to complete a university degree or else it will perish in the long run.

Immigration of qualified workers will help in the short run but this can not be a long term solution. If we just rely on immigration other nations will become technological leaders, such as India.

I am not patriotic in a general term, I would like to see the whole world in a state of prosperity. I believe it is possible to achieve it by automating all simple manual labor, thus removing low wage jobs and the need of modern slavery. But the consequence is that the biggest part of the population, if not all must do “thinking” jobs.

I can not understand why no real effort is done to educate the masses. There is only one way forward and that is education. We are in a technological state where most simple manual labor is not necessary and only keep most of it around so that low educated people have a job. This status quo can not be held for long and only on the back of people and nations that are exploited. The only reason why most products are cheap is because they are made in china.

All leaders of the world should work for a common goal: high education for the biggest part of humanity. There is much to lose.

CMS in 10 Minutes with Django

July 16th, 2008

Install Django

Fist you need to install Django. I will not repeat the documentation on Django. So you should read the Django’s Installation Guide.

There is to note that I am using the bleeding edge version from their subversion repository. This is done in anticipation of their 1.0 release, which is scheduled for beginning of September. You can use the 0.95 version, but It lacks some juicy bits.

Create a Project

All Django project (website) starts the same way:

django-admin.py startproject rioki

This will create a template, but usable website.

Embedded Web Server

On of the nifty features is that Django comes with a embedded web server that can (and only should) be used for development. This feature really cuts down development time.

To use it launch the server (in the project directory):

./manage.py runserver

You will now find your website under http://127.0.0.1:8000/.

Well it actually is only a page that tells you have not “configured any urls”. We will get to that soon.

Configuration

Well the first step is to configure your site. This is a simple process, open settings.py in your favorite text editor and edit the file as appropriate.

Mine looks about so:

from os.path import join, dirname

DEBUG = True
TEMPLATE_DEBUG = DEBUG

ADMINS = (
    ('Sean "Rioki" Farrell', 'i.dont.think@so.com'),
)

MANAGERS = ADMINS

DATABASE_ENGINE = 'sqlite3'
DATABASE_NAME = join(dirname(__file__), 'database')

TIME_ZONE = 'Europe/Berlin'

LANGUAGE_CODE = 'en-us'

SITE_ID = 1

USE_I18N = False

MEDIA_ROOT = join(dirname(__file__), 'media')

MEDIA_URL = '/media/'

ADMIN_MEDIA_PREFIX = '/admin_media/'

SECRET_KEY = 'Mine, not yours...'

TEMPLATE_LOADERS = (
    'django.template.loaders.filesystem.load_template_source',
    'django.template.loaders.app_directories.load_template_source',
)

MIDDLEWARE_CLASSES = (
    'django.middleware.common.CommonMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.middleware.doc.XViewMiddleware',
)

ROOT_URLCONF = 'rioki.urls'

TEMPLATE_DIRS = (
    join(dirname(__file__), 'templates')
)

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
)

I used a nifty trick for the different paths. For security and stability reasons, you are to give absolute paths for the values such as MEDIA_ROOT. Well I use join(dirname(file), ‘media’), which makes it relative to the settings.py file. As a result I can move the entire package around and always be right and an absolute path.

Create The Database

Now is a good time to create the initial database:

./manage.py syncdb

Well this will load the initial tables and ask you if you want to create a super user.

The Admin Backend

One of the most powerful features is the admin backend. You might not see that in this post.

To use the admin you need to add 'django.contrib.admin‘ to the INSTALLED_APPS. You need to rerun syncdb, wich you must almost always do after you add something to INSTALLED_APPS.

./manage.py syncdb

In addition uncomment lines for the admin in urls.py. You urls.py should about look like that:

from django.conf.urls.defaults import *

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
)

You can see the admin interface under http://127.0.0.1:8000/admin/

Here you can see one of the nice features of Django: Instant pretty URLs. This comes from the fact that all incoming requests are matched against a table of regular expressions.

You might want to change the Sites entry from example.com to your website, but that’s all for now.

Static Content: Flatpages

Django comes with a module for static content, that is django.contrib.flatpages.

To use it add 'django.contrib.flatpages‘ to INSTALLED_APPS and 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware‘ to MIDDLEWARE_CLASSES.

Rerun syncdb:

./manage.py syncdb

Now you can add some pages via the admin. I added ”/” for the portal page and ”/imprint/” for the imprint. You can find the pages you created at http://127.0.0.1:8000/ and http://127.0.0.1:8000/imprint/.

Well actually, you can’t. It is still complaining about a missing template. Let’s create that.

Create the file templates/flatpages/default.html:

<html>
    <head>
        <title>{{ flatpage.title }}</title>
    </head>
    <body>
        <h1>{{ flatpage.title }}</h1>
        {{ flatpage.content }}
    </body>
</html>

As you can see the content is copied verbatim. You got two solutions you either write the content HTML or use one of the built-in markup languages.

Markup

Django comes bundled with 3 markup languages, that is Textile, Markdown and ReST. To enable those you need to add 'django.contrib.markup‘ to your INSTALLED_APPS. And change the template to look like this:

{% load markup %}
<html>
    <head>
        <title>{{ flatpage.title }}</title>
    </head>
    <body>
        <h1>{{ flatpage.title }}</h1>
        {{ flatpage.content|textile }}
    </body>
</html>

As you can see we are using textile.

Serving Media Files

During debug we are using the builtin server. That has the consequence that media files are not explicitly served. To fix this we we extend urls.py file:

from django.conf.urls.defaults import *
from django.conf import settings

urlpatterns = patterns('',
    (r'^admin/', include('django.contrib.admin.urls')),
)

if settings.DEBUG:
    urlpatterns += patterns('',
        (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT})
    )

As you can see, the media files are only server through Django when in debug mode. In production mode, on the production website media is server through apache. This is a obvious performance issue.

Design

Well so far we are “done”, except that the site looks really crappy. I took the design from this site, as it will replace it and just adapted it to Django.

I created the site rump templates/default.html:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
    <head>
        <title>{% block title %}Rioki{% endblock %}</title>
        <link rel="stylesheet" type="text/css" href="/media/design/default.css" />
    </head>
    <body>
        <div class="page">
            <div class="header">
                {% block header %}
                    <a href="/">Start</a> |
                    <a href="/blog/">Blog</a> |
                    <a href="/about/">About</a> |
                    <a href="/proejcts/">Projects</a>
                {% endblock %}
            </div>
            <div class="sidebar">
                {% block sidebar %}
                    <h3>Sidebar:</h3>
                    <ul>
                        <li><a href="http://www.libqgl.org">libQGL</a></li>
                        <li><a href="http://www.sf.net/projects/lunar-exodus">Lunar Exodus</a></li>
                        <li><a href="/stl_algorithm_shortcuts">STL Algorithm Shortcuts</a></li>
                        <li><a href="/tstring">std::tstring</a></li>
                        <li><a href="/blog:itx_rock_my_web_app">ITX Rock my Web App</a></li>
                        <li><a href="http://www.motivator-generator.com">Motivator Generator</a></li>
                    </ul>
                {% endblock %}
            </div>
            <div class="content">
                {% block content %}No content here.{% endblock %}
            </div>
            <div class="footer">
                {% block footer %}
                    © 2006-2008 Sean Farrell<br/>
                    <a href="/about/">Imprint</a> |
                    <a href="/contact/">Contact</a>
                {% endblock %}
            </div>
        </div>
    </body>
</html>

I also put CSS style sheet and the images into /media/design.

This is nice, but the flatpages need the design. To do this I altered the template for the flatpages to be the following:

{% extends 'default.html' %}
{% load markup %}

{% block title %}{{ flatpage.title }}{% endblock %}

{% block content %}
    <h1>{{ flatpage.title }}</h1>
    {{ flatpage.content|textile }}
{%endblock %}

And viola, the beauty of reuse.

Done?

As far as it comes to static content, we are done. To be honest for many sites this is enough; but not for mine.

Firs of all we need the blog. This site is 90% blog, so it will really miss. I could realize it via flatpages, but that is slightly awkward.

An other issue is that media files need to be uploaded to the server via some file transfer process, I want to be able to do that via the admin, since I may not have access to the server directly.

As you can see the menus are hardwired to the template, this is Ok if they don’t change often. (Which might be the case here…) But I want to be able to change them at any time via the admin.

Finally textile is okish, but I don’t like it too much. The other markup languages are worse. I have once tried to implement the dokuwiki syntax in python, let’s see if that works out as template tag.

What needs to be done:

  • blog
  • handling of media files via admin
  • handling of menu via admin
  • integrate dokuml

Tools of the Trade - Know Them

July 16th, 2008

In my dally work I am astounded as how little your average programmer or rather software engineer knows about the common tools of the trade.

Under some of the books I own is:

  • Pragmatic Programmer - Andrew Hunt and David Thomas
  • Mythical Man Month - Fred Brooks
  • Design Patterns - Erich Gama et al.
  • Test Driven Design - Kent Beck

And thew discuss a number of issues and tools every programmer should know1).

Can you imagine that, as far as I have seen, at least 50% did not know about unit testing or design patterns?! I am not saying that you need to use them all the time, which is absolute folly. But not even knowing that they exist is a sin.

What is even more depressing is that the younger generation should and probably had these subjects mentioned during their university courses. How can people not take their job seriously and thus make their job herder and more turblesome.

Changing Packeting Strategy for libQGL

June 26th, 2008

As I was playing with the height maps I needed Vectors and Quaternions. So I shamelessly copy and pasted the implementation from libQGL. After a while I suddenly realized that I had something useful on its own and decided to release only the math stuff from libQGL as libqgl-math.

After thinking for a while I noticed that the packeting strategy I have for libQGL is crap. I have a bunch of stuff that is useful on its own, but together is incomplete. As a result I decided to split libQGL up in relative little clearly contained packages.