Friday, 22 October 2010

Metaprogramming Ruby

I explained here (in greek) a bit about metaprogramming and here about an application in a python/c++ finite element code but this book is everything you need about metaprogramming in Ruby. Written by Paolo Perrotta in a way that two colleagues discuss and solve every day problems. The book is full of example code and assumes some basic knowledge of the Ruby language. The first part of the book deals with general metaprogramming concepts in Ruby from objects and methods to blocks and classes to finally code that writes code. The second part dives in the metaprogramming techniques of Rails, with ActiveRecods being the most important part. The last chapter deals how to use metaprogramming safely. As Yukihiro "matz" Matsumoto says in the foreword "It's a bit like magic", but be ware because there is white magic and black magic.

Sunday, 17 October 2010

TeX code generation with perl

A couple of months ago I started to learn some basic perl, because perl is one of the programming languages that one should know. It can be used from text processing and web applications to system administration and many other applications. So I came with the idea to write something simple in order to automate some TeX code generation done by some other part of my program. So I wrote some basic perl functions that can be found here:

#!/usr/bin/env perl

sub initialize{
$text = '\documentclass{article}'."\n";
$text .= '% Created by '."\n";
$text .= '\begin{document}'."\n";
}

sub usepackage{
$text = '\usepackage{'.$_[0]."}\n";
}

sub finalize{
$text = '\end{document}'."\n";
}

sub itemize{
$text = '\begin{itemize}'."\n";
$text .= "\t\item"."\n";
$text .= '\end{itemize}'."\n";
}

sub enumerate{
$text = '\begin{enumerate}'."\n";
$text .= "\t\item"."\n";
$text .= '\end{enumerate}'."\n";
}

sub figure{
$text = '\begin{figure}'."\n";
$text .= "\t".'\includegraphics{}'."\n";
$text .= '\end{figure}'."\n";
}

sub table{
$text = '\begin{tabular}'."\n";
#$text = 'table';
$text .= '\end{tabular}'."\n";
}

sub tabbing{
$a = '\begin{tabbing}'."\n";
$a .= '\end{tabbing}'."\n";
}

sub section{
$a = '\section{'.$_[0]."}\n";
}

sub subsection{
$a = '\subsection{'.$_[0]."}\n";
}

sub equation{
$a = '\begin{equation}'."\n";
$a .= $_[0];
$a .= '\end{equation}'."\n";
}

And a simple example is given below:

print &initialize;
print &usepackage("graphicx");

print &itemize;
print &enumerate;
print &figure;
print &table;

print &finalize;

Friday, 8 October 2010

Book Review: Foundations of GTK+ Development

Foundations of GTK+ Development is a book about the development of GUI applications using the open source library GTK+. It assumes knowledge of the C language and explains first the structure of the GTK+ library, i.e. GLib, GObject, GDK, GdkPixbuf, Pango, and ATK. By building a simple "Hello World" application explains the basics of GTK+, the main loop function, signals and callbacks, events, and widgets. Then the author explains with many examples and code listings the use of container widgets, basic widgets, and dialogs.

The use of the GLib library, the text view widget, the tree view widget, and of course the generation of menus and toolbars are then described in detail again with examples and source code. Finally more advanced topics like dynamic user interfaces, creating custom widgets, and some additional widgets, like canvas, cairo, calendar among others, are discussed. The book concludes with a chapter with five full working applications and a lot of appendices.

Wednesday, 6 October 2010

xcf2pdf

xcf2pdf is a simple python script, that uses convert from ImageMagick to batch convert every xcf image inside a folder to a pdf


#!/usr/bin/python


from subprocess import *

import re


def convert(file):

p = Popen(['convert', file, file[:-3]+'pdf'], stdout=PIPE, stderr=PIPE)


p = Popen('ls', stdout=PIPE, stderr=PIPE)

ls, error = p.communicate()

files = re.split('\n', ls)

for i in files:

if i[-3:]=='xcf':

convert(i)


There are a few features missing and known bugs, e.g. it will convert every layer of the xcf file to a different page in the same pdf. (Beware of the python code formatting)

GGGears

In many engineering applications engineers have to calculate how gears are working under stress. GGGears is a free software that does exactly this by means of the finite element package GETFEM++ and the mesh generation package GMSH, both also free software. It supports both 2D and 3D mesh generation and solver. The user does not need to know anything about finite elements or mesh generation; he/she just need to insert the geometrical data of the gear systmem.

The installation of the software can be easily done in Ubuntu by first adding the repository

sudo add-apt-repository ppa:gggears/main
sudo apt-get update

and then installing gggears and its dependencies by
sudo apt-get install gggears

Metaprogramming and finite elements

The idea of metaprogramming is great; you write code that writes code that writes code... If I am not wrong the first language that introduced this concept was LISP (at the moment I am learning the Scheme dialect) So, the idea behind metaprogramming is to write a program in a high level language which will then create source code in a lower language (or even the same) in order to automate some procedure. From Lisp many languages have been influenced, such as Ruby and python, that also incorporate metaprogramming aspects.

One day someone said why don't we apply this concept to finite element code as well. Finite element code can be really annoying (as every code is) so by writing some code that writes finite element code would make our calculations easier. The result of this idea is the FEnics project. Thank you for the great job guys!!! Finite elements are usually used to solve partial differential equations. So find a PDE you like and just solve it.

The program can be easily installed in Ubuntu by writing
sudo apt-get install fenics
Of course there are many other packages for many distributions. Have fun!

Tuesday, 14 September 2010

Chaos economics

Δεν άντεξα. Ξεκίνησα ένα blog στην αγγλική γλώσσα για το χάος στη θεωρία της οικονομίας: chaos economics.

Wednesday, 1 September 2010

Adjoint

Τον τελευταίο καιρό ασχολούμαι συνέχεια με adjoint equations (εξισώσεις) και adjoint variables (μεταβλητές) αλλά μου λείπει η ελληνική μετάφραση. Υποψιάζομαι τη λέξη "συζηγής" αλλά δεν είμαι σίγουρος.

Αλλά ας πάρω τα πράγματα από την αρχή. Για πρώτη συνάντησα τους adjoint πίνακες στο πρώτο έτος στο πανεπιστήμιο (ή μήπως ήταν στη Γ' λυκείου;) Τώρα μιλάμε και για adjoint τελεστές. Στα προβλήματα αυτόματου ελέγχου (είτε κανονικών ή μερικών διαφορικών εξισώσεων) υπάρχει η αντικειμενική συνάρτηση και η εξίσωση ως περιορισμός. Αν πολλαπλασιαστεί ο περιορισμός με μία νέα (άγνωστη προς το παρόν) μεταβλητη και το γινόμενο προστεθεί στην αντικειμενική συνάρτηση τότε παίρνουμε την Lagrange-ιανή του συστήματος. Η μερική παράγωγος της Lagrang-ιανής ως πρός τη μεταβλητή κατάστασης (state variable) δίνει την adjoint εξίσωση, ενώ η μερική παράγωγος της Lagrang-ιανής ως πρός την adjoint μεταβλητη δίνει την αρχική εξίσωση.

Αναρωτιέμαι αν υπάρχει κανένα βιβλίο στα ελληνικά που να εξηγεί αυτά τα μαθηματικά. Και αν υπήρχε, θα έβρισκε αναγνωστικό κοινό; Θα άξιζε τον κόπο μια τέτοια προσπάθεια; Όπως και να έχει είναι κι αυτό ένα από τα μελλοντικά μου πλάνα.

Ενα βιβλίο (στα γερμανικά) που θα πρότεινα για βέλτιστο έλεγχο μερικών διαφορικών εξισώσεων είναι το Optimale Steuerung partieller Differentialgleichungen του Fredi Tröltzsch, εκδόσεις Vieweg.

Ελευθερία στο δημόσιο τομέα

Το ελεύθερο λογισμικό/ λογισμικού ανοιχτού κώδικα έχει δείξει δείγματα επιτυχίας και ωριμότητας σε διάφορους τομείς. Φανταστείτε τώρα οι αρχές του ελεύθερου λογισμικού να εφαρμοζόταν σε διάφορα επιπέδα του δημόσιου τομέα, όπως υγεία, εκπαίδευση, ασφαλιστικό, ακόμη και στον προϋπολογισμό του κράτους.

Για παράδειγμα, τα δεδομένα στην υγεία να ήταν ελεύθερα σε όλα τα ερευνητικά κέντρα ώστε να μπορούσαν οι μελέτες και οι στατιστικές να γίνονται σε μεγαλύτερο δείγμα. Φυσικά δε θα δημοσιεύονται προσωπικά δεδομένα. Επιπλέον, όλα τα αρχεια και δεδομένα να αποθηκεύονται σε κάποιο ελεύθερη μορφή και να έχει φυσικά κάποιο αντίγραφο και ο ασθενής. Έτσι, ο ασθενής θα μπορεί να πάει σε καινούριο γιατρό και να έχει το πλήρες ιστορικό ανα πάσα στιγμή.

Ο προϋπολογισμός του κράτος θα μπορούσε να ψηφίζεται απευθείας από τους πολίτες, ή έστω να ελέγχεται ανά πάση στιγμή. Ο έλεγχος των χρηματοδοτήσεων, των εξόδων και των εσόδων θα μπορούσε να επηρεάσει την ψήφο πολλών από εμάς.

ΥΓ. Η ιδέα αυτή προήλθε από το φίλο μου τον Κώστα.

Tuesday, 31 August 2010

Venture capital

Με μια σύντομη αναζήτηση στο διαδίκτυο βρήκα αρκετές ελληνικές εταιρίες που δραστηριοποιούνται στο χώρο των venture capitals, αλλά  και κάποιες εταιρίες που ιδρύθηκαν μέσα από χρηματοδότηση venture capitals. Αναρωτιέμαι γιατί δεν υπάρχει μια άνθηση νεοσύστατων εταιριών στην Ελλάδα. Φταίει η έλλειψη γνώσεων, η έλλειψη τόλμης ή μήπως ευθύνεται η υπάρχουσα ελληνική νοοτροπία του "ωχαδερφισμού", του "έλα-μωρέ" ή του "ε κάπως θα βολευτούμε κι εμείς". Αν είναι το πρώτο τότε φταίνε τα πανεπιστήμια, αν είναι το δεύτερο τότε ευθύνονται οι εταιρίες venture capitals που δεν ενημερώνουν τους νέους και δε διαφημίζουν την πραμάτεια τους. Τέλος, αν είναι το τρίτο---που υποψιάζομαι φέρει το μεγαλύτερο ποσοστό ευθύνης---φταίμε όλοι μας σαν κοινωνία. 


Εγώ πάντως ελπίζω πώς η κατάσταση τώρα ακριβώς λόγω της οικονομικής κρίσης θα βελτιωθεί. Ίσως να είμαι απλά ένας ονειροπόλος...

Open design σε μηχανήματα

Πώς θα μπορούσε να εφαρμοσθεί η ιδέα του ελεύθερου λογισμικού σε προϊόντα; Για παράδειγμα, μια εταιρία που κατεσκευάζει μηχανήματα θα μπορούσε να παρέχει τα σχέδια των μηχανημάτων της ελεύθερα και γύρω από αυτή να δημιουργούσε μια κοινότητα, η οποία θα την τροφοτούσε με ιδέες, με νέους πελάτες και φυσικά με διαφήμιση. Οποιοδήποτε "bug", σφάλμα στη λειτουργία της μηχανής, θα εμφανιζόταν και θα διορθωνόταν πολύ πιο γρήγορα απ'ότι σε ένα κλειστό σχεδιασμό.

Monday, 30 August 2010

Περί πιστωτικών καρτών και αεροπορικών εταιριών

Προσπάθησα για άλλη μια φορά σήμερα να χρησιμοποιήσω την πιστωτική κάρτα (της alpha bank) στις ιστοσελίδες της olympic airlines και aegean airlines με αποκαρδιωτικά αποτελέσματα. Το "επιπλέον" σύστημα ασφάλειας της πιστωτικής κάρτας δεν επιτρέπει ούτε τον κάτοχο της κάρτας να κάνει μία κράτηση. Για να μην σχολιάσω το γεγονός ότι οι ιστοσελίδες των αεροπορικών εταιριών είναι τόσο επιφορτισμένες με διαφημίσεις και flash που δε μπορώ να κάνω την κράτησή μου χωρίς να πρέπει να κλείσω άπειρα ενοχλητικά παράθυρα.

Thursday, 24 June 2010

Σκέψεις για το μέλλον του ελεύθερου λογισμικού

Το ελεύθερο λογισμικό τα έχει όλα: κώδικα, προγραμματιστές, αποθετήρια κώδικα. Αυτό όμως που πραγματικά λείπει από το ελεύθερο λογισμικό είναι η συνδυασμένη προσπάθεια. Βλέπουμε να υπάρχουν δεκάδες προγράμματα που κάνουν λίγο ή πολύ την ίδια δουλειά. Αντί ένας προγραμματιστής να αρχίσει να δουλεύει σε ένα υπάρχον πρόγραμμα και να διορθώσει τα τυχόν σφάλματα ή να προσθέσει καινούριες δυνατότητες ξεκινάει ένα δικό του με την ελπίδα να είναι καλύτερο από το προηγούμενο. Αυτό δεν είναι απαραίτητα αρνητικό, μιας και δημιουργούνται νέα προγράμματα, υπάρχει ανταγωνισμός και ο ανταγωνισμός οδηγεί στην πρόοδο. Αλλά πιστεύω ότι αν υπήρξε συνδυασμένη προσπάθεια και οργανωμένος σχεδιασμός θα αποφεύγαμε την πολλαπλή ανακάλυψη του τροχού.

Thursday, 11 March 2010

FORTRAN ξανά

FORTRAN ξανά
Ή "η νέα γλώσσα προγραμματισμού"

Ακούω γέλια; Ναι η FORTRAN είναι μια σύγχρονη γλώσσα προγραμματισμού που μαθαίνεται από πολλούς νέες και νέους στο forum μας, αλλά δυστυχώς δε διδάσκεται (τουλάχιστον σωστά). Και επειδή αυτοί που τη διδάσκουν δε ξέρουν από ελεύθερο λογισμικό, οπότε δε μπορούν να γράψουν έναν οδηγό και να τον διαθέσουν ελεύθερο, αποφάσισα να κάνω εγώ αυτή τη δουλειά. (Όχι ότι δε μου κάνει κέφι)

Πολλές από τις πληροφορίες που αναφέρω εδώ βρίσκονται ήδη στους οδηγούς της υπογραφής μου, αλλά τις επαναλαμβάνω για τους τεμπέληδες. Καταρχήν (επειδή έχω κουραστεί να ακούω το logari81 να τονίζει τη διαφορά μεταξύ compiler, IDE, κλπ κλπ) υπάρχει το IDE, Integrated Development Environment, με το οποίο δεν πρόκειται να ασχοληθώ καθόλου. Όπως λέει η λέξη είναι ένα ολοκληρωμένο περιβάλλον ανάπτυξης, τίποτε λιγότερο τίποτε παραπάνω. Δεν είναι compiler, δεν είναι linker. Παράδειγμα: geany.

Compiler: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που παίρνει τον πηγαίο κώδικα και το μετατρέπει σε δυαδικό εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Στον compiler ΔΕ γράφουμε κώδικα. Παραδείγμα: gfortran. Εγκατάσταση:
sudo apt-get install gfortran

Linker: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που "συνδέει" όλα τα δυαδικά αρχεία σε ένα εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Πολλές φορές ο compiler καλεί, ξανατονίζω καλεί, τον linker. Ο compiler ΔΕΝ κάνει linking. Kαλεί απλώς το linker. Παράδειγμα: ld. 

Τώρα που ξεκαθαρίσαμε τις βασικές έννοιες μπορούμε να προχωρήσουμε με τη FORTRAN. Όπως είπαμε FORTRAN είναι μια γλώσσα προγραμματισμού. Άλλα έχει πολλά πρότυπα, standards, όπως fortran 66, fortran 77, fortran 90/95, fortran 2003.Όταν γράφεις ένα πρόγραμμα αποφασίζεις σε ποιο πρότυπο θα το γράψεις, ή άλλοι το έχουν αποφασίσει πριν από σένα. Σε γενικές γραμμές είναι backwards compatible. Δε θα μπω σε λεπτομέρειες. Το fortran 66 είναι απαρχαιωμένο, μην το χρησιμοποιείτε. Το fortran 77 είναι μεν παλιό αλλά υπάρχει πολύ "legacy" κώδικας εκεί έξω που είναι γραμμένο σε αυτό. Αν ξεκινάτε κάτι καινούριο, τότε fortran 90/95. To fortran 2003 είναι ακόμη καινούριο, μη δοκιμασμένο και είναι πολύ πιθανό ο compiler gfortran να μην έχει όλες τις δυνατότητες που προδιαγράφονται από το πρότυπο. Ο gfortran υποστηρίζει τα πρότυπα 77 και 90/95 (για τα άλλα δεν είμαι σίγουρος). Ο g77 μόνο το 77 (όπως μαντεύετε και από το όνομα)

Αυτά και με τα πρότυπα. Μία άλλη σημαντική παρατήρηση είναι το format. Στο fortran 77 επειδή είχαν ακόμη κάρτες διάτριτες (τώρα μπορείτε να δείτε σε μουσεία τέτοιες) το πρότυπο προέβλεπε οι πρώτες 6 στήλες να είναι κενές και επιτρέπεται να γράφεις μέχρι την εβδομικοστή κάτι στήλη. Αυτό ονομάζεται fixed format, ενώ το ελεύθερο ονομάζεται free format. O compiler gfortran υποστηρίζει και τα δύο ανάλογα με την κατάληξη του αρχείου ή το command line argument: -ffree-form -ffixed-form και άλλα που μπορούν να βρεθούν εδώ http://linux.die.net/man/1/gfortran

Για να σκεφτούμε, τι άλλο χρειάζεται; Α ναι, ένα παράδειγμα. Γράφουμε στο αρχείο foo.f: 
print*, "hello world"
end

Ανοίγουμε το τερματικό και προσπαθούμε να το κάνουμε compile με:
gfortran foo.f
σφάλμα

ξαναπροσπαθούμε:
gfortran -ffree-form foo.f
οκ

το μετονομάζουμε το αρχείο σε foo.f90 και ξαναπροσπαθούμε:
gfortran foo.f90
οκ

Τώρα στο αρχείο foo.f προσθέτουμε 6 κενά σε κάθε γραμμή:
  print *, "hello, world"
  end
και ξαναπροσπαθούμε
gfortran foo.f
οκ

You got the point? Ωραία αλλάζουμε κεφάλαιο. (Με προσοχή τις σελίδες γιατί είναι παλιές και ευαίσθητες) 

Πριν αλλάξουμε κεφάλαιο (με προσοχή τις σελίδες είπαμε) ας δούμε τη διαφορά compiling και linking. Mέχρι στιγμής λέγαμε στον compiler να κάνει τη όλη δουλειά μόνος του, δηλαδή και το compile και να καλέσει το linker (αν έχετε ανοιχτό το top σε άλλο τερματικό θα δείτε που τρέχει στιγμιαίο η εντολή ld). Aν όμως εκτελέσουμε την εντολή
gfortran -c foo.f 
Εδώ γίνεται μόνο compile, δημιουργείται το *.ο αρχείο του πηγαίου κώδικα.

Τώρα με
gfortran -o a.out foo.o
λέμε στον compiler να συνδέσει το εκτελέσιμο a.out με το δυαδικό foo.o.

Αυτά. Happy crunching!