Friday, 22 October 2010
Metaprogramming Ruby
Sunday, 17 October 2010
TeX code generation with perl
#!/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
Wednesday, 6 October 2010
xcf2pdf
#!/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
Metaprogramming and finite elements
Tuesday, 14 September 2010
Chaos economics
Wednesday, 1 September 2010
Adjoint
Αλλά ας πάρω τα πράγματα από την αρχή. Για πρώτη συνάντησα τους adjoint πίνακες στο πρώτο έτος στο πανεπιστήμιο (ή μήπως ήταν στη Γ' λυκείου;) Τώρα μιλάμε και για adjoint τελεστές. Στα προβλήματα αυτόματου ελέγχου (είτε κανονικών ή μερικών διαφορικών εξισώσεων) υπάρχει η αντικειμενική συνάρτηση και η εξίσωση ως περιορισμός. Αν πολλαπλασιαστεί ο περιορισμός με μία νέα (άγνωστη προς το παρόν) μεταβλητη και το γινόμενο προστεθεί στην αντικειμενική συνάρτηση τότε παίρνουμε την Lagrange-ιανή του συστήματος. Η μερική παράγωγος της Lagrang-ιανής ως πρός τη μεταβλητή κατάστασης (state variable) δίνει την adjoint εξίσωση, ενώ η μερική παράγωγος της Lagrang-ιανής ως πρός την adjoint μεταβλητη δίνει την αρχική εξίσωση.
Αναρωτιέμαι αν υπάρχει κανένα βιβλίο στα ελληνικά που να εξηγεί αυτά τα μαθηματικά. Και αν υπήρχε, θα έβρισκε αναγνωστικό κοινό; Θα άξιζε τον κόπο μια τέτοια προσπάθεια; Όπως και να έχει είναι κι αυτό ένα από τα μελλοντικά μου πλάνα.
Ενα βιβλίο (στα γερμανικά) που θα πρότεινα για βέλτιστο έλεγχο μερικών διαφορικών εξισώσεων είναι το Optimale Steuerung partieller Differentialgleichungen του Fredi Tröltzsch, εκδόσεις Vieweg.
Ελευθερία στο δημόσιο τομέα
Tuesday, 31 August 2010
Venture capital
Εγώ πάντως ελπίζω πώς η κατάσταση τώρα ακριβώς λόγω της οικονομικής κρίσης θα βελτιωθεί. Ίσως να είμαι απλά ένας ονειροπόλος...
Open design σε μηχανήματα
Πώς θα μπορούσε να εφαρμοσθεί η ιδέα του ελεύθερου λογισμικού σε προϊόντα; Για παράδειγμα, μια εταιρία που κατεσκευάζει μηχανήματα θα μπορούσε να παρέχει τα σχέδια των μηχανημάτων της ελεύθερα και γύρω από αυτή να δημιουργούσε μια κοινότητα, η οποία θα την τροφοτούσε με ιδέες, με νέους πελάτες και φυσικά με διαφήμιση. Οποιοδήποτε "bug", σφάλμα στη λειτουργία της μηχανής, θα εμφανιζόταν και θα διορθωνόταν πολύ πιο γρήγορα απ'ότι σε ένα κλειστό σχεδιασμό.
Monday, 30 August 2010
Περί πιστωτικών καρτών και αεροπορικών εταιριών
Thursday, 24 June 2010
Σκέψεις για το μέλλον του ελεύθερου λογισμικού
Το ελεύθερο λογισμικό τα έχει όλα: κώδικα, προγραμματιστές, αποθετήρια κώδικα. Αυτό όμως που πραγματικά λείπει από το ελεύθερο λογισμικό είναι η συνδυασμένη προσπάθεια. Βλέπουμε να υπάρχουν δεκάδες προγράμματα που κάνουν λίγο ή πολύ την ίδια δουλειά. Αντί ένας προγραμματιστής να αρχίσει να δουλεύει σε ένα υπάρχον πρόγραμμα και να διορθώσει τα τυχόν σφάλματα ή να προσθέσει καινούριες δυνατότητες ξεκινάει ένα δικό του με την ελπίδα να είναι καλύτερο από το προηγούμενο. Αυτό δεν είναι απαραίτητα αρνητικό, μιας και δημιουργούνται νέα προγράμματα, υπάρχει ανταγωνισμός και ο ανταγωνισμός οδηγεί στην πρόοδο. Αλλά πιστεύω ότι αν υπήρξε συνδυασμένη προσπάθεια και οργανωμένος σχεδιασμός θα αποφεύγαμε την πολλαπλή ανακάλυψη του τροχού.
Thursday, 11 March 2010
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!