predefined symbols in gcc

I keep forgetting this, so although it is a note to self, I post it here too. The easiest way to find out what symbols are predefined by gcc in your platform; follow these steps:

$ touch p.c
$ gcc -E -dM p.c

#define __DBL_MIN_EXP__ (-1021)
#define __FLT_MIN__ 1.17549435e-38F
#define __CHAR_BIT__ 8
#define __OpenBSD__ 1
#define __WCHAR_MAX__ 2147483647
#define __DBL_DENORM_MIN__ 4.9406564584124654e-324
#define __FLT_EVAL_METHOD__ 2
#define __unix__ 1
#define __i386__ 1
#define __SIZE_TYPE__ long unsigned int
#define __ELF__ 1
#define __DBL_MIN_10_EXP__ (-307)
#define __FINITE_MATH_ONLY__ 0
#define __GNUC_PATCHLEVEL__ 5
#define __FLT_RADIX__ 2
#define __LDBL_EPSILON__ 1.08420217248550443401e-19L
#define __SHRT_MAX__ 32767
#define __LDBL_MAX__ 1.18973149535723176502e+4932L
#define __LDBL_MAX_EXP__ 16384
#define __LONG_MAX__ 2147483647L
#define __SCHAR_MAX__ 127
#define __DBL_DIG__ 15
#define __USER_LABEL_PREFIX__ 
#define __STDC_HOSTED__ 1
#define __LDBL_MANT_DIG__ 64
#define __FLT_EPSILON__ 1.19209290e-7F
#define __LDBL_MIN__ 3.36210314311209350626e-4932L
#define __WCHAR_TYPE__ int
#define __FLT_DIG__ 6
#define __FLT_MAX_10_EXP__ 38
#define __INT_MAX__ 2147483647
#define __FLT_MAX_EXP__ 128
#define __DECIMAL_DIG__ 21
#define __DBL_MANT_DIG__ 53
#define __WINT_TYPE__ unsigned int
#define __GNUC__ 3
#define __LDBL_MIN_EXP__ (-16381)
#define __LDBL_MAX_10_EXP__ 4932
#define __DBL_EPSILON__ 2.2204460492503131e-16
#define __DBL_MAX__ 1.7976931348623157e+308
#define __DBL_MAX_EXP__ 1024
#define __ANSI_COMPAT 1
#define __FLT_DENORM_MIN__ 1.40129846e-45F
#define __LONG_LONG_MAX__ 9223372036854775807LL
#define __FLT_MAX__ 3.40282347e+38F
#define __GXX_ABI_VERSION 102
#define __FLT_MIN_10_EXP__ (-37)
#define __FLT_MIN_EXP__ (-125)
#define i386 1
#define __GNUC_MINOR__ 3
#define __DBL_MAX_10_EXP__ 308
#define __LDBL_DENORM_MIN__ 3.64519953188247460253e-4951L
#define __DBL_MIN__ 2.2250738585072014e-308
#define __PTRDIFF_TYPE__ long int
#define __tune_i386__ 1
#define __LDBL_MIN_10_EXP__ (-4931)
#define __REGISTER_PREFIX__ 
#define __LDBL_DIG__ 18
#define __NO_INLINE__ 1
#define __i386 1
#define __FLT_MANT_DIG__ 24
#define __VERSION__ "3.3.5 (propolice)"

$ rm p.c
$

The output in this example is from a PIII machine running OpenBSD-4.2.

compiling the ns2 network simulator under ubuntu 6.06

Although the ns-allinone source distribution of the ns-2 network simulator is supposed to compile out of the box for most current architectures, this is not always the case. At least not for ns-2.31* and Ubuntu 6.06.

[ ./configure && make && make install (or ./install in this case) makes one lazy. Most of the time there is no real difference between this and double clicking SETUP.EXE on a Windows box. That is why I like these problems: They take you back to the good old days, long before autoconf took over the world; when you had to edit files by hand and make changes that varied from changing a line to writing a whole wrapper function in order to compile the damn thing for your system. ]

First:

sudo apt-get install gcc g++ make libc6-dev libx11-dev libxmu-dev

Then change the ./install script inside the ns-allinone-2.31/ directory:

$ diff install install-
483c483
<         ./configure --x-includes=/usr/include || die "otcl-$OTCLVER configuration failed! Exiting ...";
---
>         ./configure || die "otcl-$OTCLVER configuration failed! Exiting ...";
508c508
<         ./configure --x-includes=/usr/include --with-otcl=../otcl-$OTCLVER
|| die "tclcl-$TCLCLVER configuration failed! Exiting ..."
---
>         ./configure --with-otcl=../otcl-$OTCLVER || die "tclcl-$TCLCLVER configuration failed! Exiting ..."
537c537
<         ./configure --x-includes=/usr/include --with-otcl=../otcl-$OTCLVER
--with-tclcl=../tclcl-$TCLCLVER || die "Ns configuration failed! Exiting ...";
---
>         ./configure --with-otcl=../otcl-$OTCLVER --with-tclcl=../tclcl-$TCLCLVER || die "Ns configuration failed! Exiting ...";
570c570
<         ./configure --x-includes=/usr/include --with-otcl=../otcl-$OTCLVER
--with-tclcl=../tclcl-$TCLCLVER || die "Nam configuration failed! Exiting ...";
---
>         ./configure --with-otcl=../otcl-$OTCLVER --with-tclcl=../tclcl-$TCLCLVER || die "Nam configuration failed! Exiting ...";

In a few words, the above diff shows that the ./configure scripts cannot locate the X11 #include files in an Ubuntu system (although they reside under /usr/include) hence the need for –x-includes=/usr/include .

Read also: How to install ns-2.34 on Ubuntu 9.10 Karmic Koala (Ubuntu 9.10).


[*] – ns-2.33 does not require the above hack.

Χτίζουμε με απλά υλικά

“What may seem at first sight to be a disadvantage, namely that a large number of bits is required to represent a significant amount of information, is in fact only the other side of the coin of versatility; a bit is like a brick, in that it takes a lot of them to make anything interesting, but a very wide range of things can be made out of them, exactly because they have so little built-in structure.”

Είναι μια τόσο καλή, απλή και καθαρή τοποθέτηση που δεν μπορούσα να μην την αντιγράψω.

[via Elementary Theory of Numbers, 1962]

just write some code

Ο Peter Viscarola γράφει στο NT Insider τη στήλη “Peter Pontificates”. Στη στήλη αυτή και με τίτλο “Just Write Some Code” (NT Insider, Volume 14, Issue 1) παρέθεσε εξαιρετικά ενδιαφέρουσες απόψεις σχετικά με το driver software development. Ο Peter (που γνωρίζει και λίγα Ελληνικά!) είχε την ευγενή καλοσύνη να μου επιτρέψει να αποπειραθώ να το μεταφράσω και να το δημοσιεύσω εδώ:

—begin-Peter-here—

Λες και χρειάζεται να εκνευρίζομαι περισσότερο. Παρατηρώ μια ενοχλητική νέα τάση στη βιομηχανία: Πρέπει το software να έχει γραφτεί χτες. Σας ακούω ήδη να λέτε, “Μα που ζεις; Πάντα ήταν έτσι, πάντα υπήρχε το πρόβλημα time-to-market. Δεν πρόκειται για το ποιος κάνει τη δουλειά καλύτερα, αλλά για το ποιος την κάνει πρώτος. Μπλα, μπλα, μπλα.” Για ακούστε: Είμαι καιρό στο κουρμπέτι, OK; Βεβαίως και καταλαβαίνω πως το time-to-market είναι σημαντικό. Αλλά αυτό που βλέπω τελευταία είναι διαφορετικό. Είναι πολύ, μα πολύ, χειρότερο από ότι έχω δει στο παρελθόν. Είναι σαν οι άνθρωποι να θέλουν το software να υλοποιείται στιγμιαία από τις κακοδουλεμένες ιδέες και τα ακαθόριστα οράματά τους.

Ήξερα πως εάν κάποιος θέλει ένα πολύπλοκο software, ξεκινάει με ένα σύνολο απαιτήσεων. Μερικές φορές μάλλιστα σκέφτεται αυτές τις απαιτήσεις λίγο παραπάνω και τις γράφει κάπου – ας πούμε στο Word. Μετά ένας μηχανικός τις διαβάζει, μερικές φορές κάνει και λίγο παραπάνω ψάξιμο, και προτείνει ένα σχέδιο που θα ικανοποιεί (ή καλύτερα, θα ικανοποιεί στο περίπου) αυτές τις απαιτήσεις. Αυτοί οι δυο το συζητάνε για λίγο καιρό και είτε οι απαιτήσεις, είτε ο προτεινόμενος σχεδιασμός, ακόμα συχνότερα και τα δύο, αναθεωρείται και μετά οι άνθρωποι αρχίζουν και γράφουν το software.

Αυτή η διαδικασία μου φαίνεται λογική. Εσείς τι λέτε;

Εάν είστε ένας από τους πολλούς πιθανούς πελάτες που έχω μιλήσει τελευταία, η απάντηση στην παραπάνω ερώτηση είναι ένα μεγαλοπρεπές “ΟΧΙ”. Προφανώς τα βήματα του καθορισμού των απαιτήσεων και του σχεδιασμού υλοποίησης θεωρούνται πολυτέλειες και δεν έχουν χρόνο και χρήματα για χάσιμο σε τέτοιες λεπτομέρειες. Και έτσι προτείνουν, κατά τα λόγια ενός τέτοιου πελάτη, πως είναι καλύτερα να “just write some code” και να τελειώνουμε με το όλο πράμα. Αν κανείς από εσάς τους consultants εκεί έξω διαβάζει τη σκέψη και ταυτόχρονα γράφει και drivers για τα Windows, έχω κανά δυο πελάτες που ακόμα ψάχνουν για κάποιον να τους βοηθήσει. Στείλτε στον Dan ένα email. Είμαι σίγουρος πως θα σας φέρει σε επαφή.

Προφανώς, εάν ακολουθήσει κανείς το μονοπάτι του “just write some code” υπάρχουν αναρίθμητοι κίνδυνοι. Ο πιο φανερός είναι πως, εφόσον δεν ξεκινάμε με ένα σύνολο ξεκάθαρων απαιτήσεων τις οποίες αποτυπώνουμε σε ένα σχεδιασμό για να εξετάσει ο πελάτης, υπάρχει ο κίνδυνος να φτιάξουμε άλλα αντί άλλων. Ή χειρότερα, φτιάχνουμε περίπου αυτό που θέλει ο πελάτης, αλλά συμπεριλαμβάνουμε κάποιο side-effect ή περιορισμό που ο πελάτης δεν θέλει να υπάρχει (“Φυσικά και δεν τρέχει σε Win2K. Το θέλετε και σε Win2K;”). Δεν χρειάζεται να υπενθυμίσω πως ακόμα και ο καλύτερος δυνατός προγραμματισμός και απρόσκοπτη επικοινωνία δεν μπορούν να αποτρέψουν κάθε πρόβλημα. Όμως το να ξεκινάς με ένα σύνολο προσυμφωνημένων σημείων αυξάνει την πιθανότητα και τα δύο μέρη – ο πελάτης και ο developer – να έχουν αμοιβαία κατανόηση για τους σημαντικούς στόχους και τους περιορισμούς του project.

Αυτό που βρίσκω ακόμα περισσότερο τρομακτικό είναι πως όταν επισημαίνω σε πιθανούς πελάτες την αξία της ύπαρξης μιας φάσης απαιτήσεων και σχεδιασμού στο project, πάντα συμφωνούν πως είναι καλό, λογικό ακόμα και σημαντικής αξίας για το έργο. “Φυσικά και είναι λογικό. Σε καταλαβαίνω και συμφωνώ μαζί σου πλήρως,” λένε. Κι όμως μετά εξακολουθούν να μην είναι πρόθυμοι να επενδύσουν τον απαιτούμενο χρόνο για αυτά που χρειάζεται το project. “Είναι που σε αυτή την ειδική περίπτωση πιεζόμαστε από το χρόνο, γι αυτό αν μπορείτε just write some code, είμαστε σίγουροι πως θα είναι καλός και θα το εκτιμήσουμε, πραγματικά.”

Ααααργκ!!!!

Φυσικά εάν όντως “we just write some code” και παραδώσουμε ένα driver που δεν ικανοποιεί τις μη δηλωθείσες ανάγκες του πελάτη, οι οποίες είναι εντελώς προφανείς σε αυτόν αλλά όχι και σε εμάς, το αποτέλεσμα θα είναι ακόμα περισσότερη καθυστέρηση από το να είχαμε κάνει τη δουλειά στην αρχή ώστε να είχε σχεδιαστεί σωστά η εκτέλεση του έργου. Δεν έχω καταφέρει να πείσω αρκετούς πιθανούς πελάτες για την αναγκαιότητα να εκτελείται ένα έργο σωστά από την αρχή. Πάντοτε σκέφτονται πως το δικό τους project θα είναι διαφορετικό. Φυσικά – ο καθένας έχει δικαίωμα να ονειρεύεται.

Με απασχολεί πολύ αυτή η νέα τάση και αναρωτιέμαι εάν σχετίζεται και με άλλα θέματα της βιομηχανίας μας και ειδικότερα με:

Χαμηλές Προσδοκίες

Έχετε παρατηρήσει πως οι περισσότεροι drivers που βγαίνουν είναι για τα μπάζα; Φαίνεται πως ένας driver πρέπει να είναι “good enough” για βγει στην κυκλοφορία μαζί με το προϊόν. Και αφού είναι έτσι τα πράγματα, γιατί να σπαταλήσεις παραπάνω χρόνο για specifications, σχεδιασμό ή ακόμα και για δοκιμές; Just write some code και πακετάρισε. Έχω ξαναγράψει για αυτό, αλλά οι χρήστες φαίνεται πως πλέον είναι συνηθισμένοι σε προβλήματα διαχείρισης του συστήματος, προβλήματα εγκατάστασης στους drivers και σε τυχαία crash του λειτουργικού συστήματος. Ανάλογα δε με την πολιτική ή τη θρησκευτική τους τοποθέτηση, οι χρήστες κατηγορούν το spyware, τη Microsoft ή ακόμα και την Al Qaeda. Πιστεύω όμως πως τις πιο πολλές φορές το πρόβλημα είναι ένας driver που είναι για τα μπάζα.

Commodity Pricing

Είναι αξίωμα στις επιχειρήσεις πως εάν πουλάς ένα κοινό προϊόν, τα περιθώρια κέρδους είναι μικρά. Και τι άλλο εκτός από κοινό προϊόν μπορεί να είναι το computer hardware στις μέρες μας; Είδα τις προάλλες μια κάρτα Ethernet προς πώληση για λιγότερο από το κόστος ενός βερύκοκου (βασικά λιγότερο από το κόστος ενός βιολογικής καλλιέργειας, fair traded, που δεν έχει δοκιμαστεί ποτέ σε ζώα, βερύκοκου. Αλλά νομίζω καταλαβαίνετε τι θέλω να πω). Όταν φτιάχνεις τέτοια προϊόντα, πολύ λίγος χώρος υπάρχει στο budget (σε χρόνο ή χρήμα) για συζητήσεις για features και σχεδιασμό. Just write some code και κάνε το γαργαλημένο το πράμα να δουλεύει, ώστε να βγάλουμε τη συσκευή στην αγορά πρώτοι και να πουλήσουμε έξι δισεκατομμύρια κομμάτια περισσότερα από τους ανταγωνιστές μας. Αν ο driver είναι για τα μπάζα, δεν πειράζει, για τα μπάζα είναι και ο driver του ανταγωνιστή. Δεν χάνουν και κάτι οι πελάτες.

Vista

Μη ξεχάσουμε να συμπεριλάβουμε και αυτή την αιτία, σωστά; Βασικά κατηγορώ για οτιδήποτε μπορώ να σκεφτώ τα Vista, γιατί είναι εύκολο, είναι της μόδας και – ας το παραδεχτούμε – ποιος δεν αρέσκεται να “βαράει” την τελευταία έκδοση ενός λειτουργικού συστήματος; Το αμάξι μου δεν ξεκίναγε τις προάλλες και είπα στη γυναίκα μου πως φταίει που αναβαθμίσαμε τα συστήματα του σπιτιού μας σε Vista. Βεβαίως εάν τα είχαμε αναβαθμίσει σε Vista Ultimate αντί για Vista Ghetto (ή όπως αλλιώς λέγονται) το να κάνεις τη δουλειά σου θα ήταν ήδη πιο διασκεδαστικό. Αλλά ξεφεύγω. Με την πρόσφατη έκδοση των Windows Vista, υπάρχει τρομακτική πίεση στους OEMs / IHVs / ODMs / ISVs να βγάλουν καινούργιο software “έξω”. Σοβαρά έχω δει γνήσιο πανικό σε μερικούς πραγματικά νηφάλιους και ήρεμους τύπους. Ελπίζω τα Vista να είναι το πρόβλημα. Γιατί εάν είναι, μόλις τα πράγματα ησυχάσουν λίγο, θα μπορέσουμε να επιστρέψουμε σε μια πιο ορθολογική διαδικασία παραγωγής software.

Όποιος κι αν είναι ο λόγος, αυτή η νέα τάση να ξεπερνιούνται οι “ανάγκες” των μηχανικών και ο κόσμος να “just write some code” είναι φοβιστική. Είτε είστε consultant, είτε in-house developer, βλέπετε κι εσείς την ίδια τάση; Αν ναι, τι νομίζετε πως την προκαλεί στο χώρο σας; Όποια κι αν είναι η αιτία, ελπίζω να τελειώνει σύντομα.


Peter Pontificates είναι η τακτική στήλη του σύμβουλου και συνεργάτη της OSR, Peter Viscarola. Ο Peter δεν ενδιαφέρεται εάν συμφωνείτε ή διαφωνείτε μαζί του, αλλά έχετε τουλάχιστον τη δυνατότητα να δείτε τα σχόλιά σας στη στήλη “Letters” ενός επόμενου τεύχους. Στείλτε σχόλια, φωνές ή διαστροφές της αλήθειας στο: PeterPont@ όου ες αρ τελεία κομ.

—end-Peter-here—

Υ.Γ. (adamo): Εάν κάποιος έχει διαβάσει το πρωτότυπο αγγλικό κείμενο και διαφωνεί με κάτι στη μετάφραση, θα εκτιμούσα τα σχόλιά του ώστε το αποτέλεσμα να γίνει καλύτερο.

Ζηλεύω

Διαβάζω στο “Weblocks – A Common Lisp web framework“:

“A few months ago I quit my job to do things I always wanted to do. One of them is writing a web application framework in Common Lisp.”

Ζηλεύω.

“I didn’t use UCW because of a serious attack of a Not Invented Here syndrome.”

Μερικές φορές σκέφτομαι πόσες εργατώρες έχουν χαθεί άραγε από την εγωιστική(;) αυτή συμπεριφορά που δείχνουμε σαν προγραμματιστές, το “εγώ μπορώ να το κάνω καλύτερα” (και σε λιγότερο χρόνο).

Από την άλλη αυτό το πράγμα (η τριβή με τον κώδικα) δεν είναι που μας κάνει καλύτερους; Το να ξεπεράσουμε το κατασκεύασμα κάποιου άλλου και να το αντικαταστήσουμε στην εφαρμογή μας με κάτι δικό μας; Έτσι τελικά δεν καταλήγουμε και στα εργαλεία και τις βιβλιοθήκες που χρησιμοποιούμε για software development; Αναγνωρίζοντας τη μαγκιά^Wικανότητα και το χρόνο που δαπάνησε κάποιος πριν από εμάς για να κάνει κάτι που χρειαζόμαστε και δεν έχουμε το χρόνο (ή ακόμα και τα skills) να αναπτύξουμε μόνοι μας;

Και το ποιο σημαντικό:

“Why? I suppose the same reason why George Leigh Mallory wanted to climb Mount Everest – because it’s there.”

%$#!^$@

Ζηλεύω.

Database Design

Χτες το πρωί στο γραφείο μου βρήκα το βιβλίο “Database Design“ του Gio Wiederhold. Μου το άφησε ένας συνάδελφος που του είχα εξηγήσει ένα pet project που έχω στο μυαλό μου. Το βιβλίο είναι out of print και ο συνάδελφος το είχε βρει στα μεταχειρισμένα. Fear not! Η ACM έχει φροντίσει:

Gio Wiederhold: Database Design, 2nd Edition:

“Relevance

Although the first edition of this book appeared in 1977, and the second edition in 1983, there is still much relevant material here which does not appear in subsequent works. A small number of copies are still being sold every year by McGraw-Hill. Specifically, this book follows a bottom-up approach, starting with hardware and file parameters. These parameters are utilized throughout. It hence allows the reader to predict the performance of alternative designs for new databases and database systems with good — engineering precision — accuracy. The need for such analyses has diminished since most databases are now built on commercial database system software. Use of large packages allows few alternatives, little insight, but easier experimentation. This book has continued to serve the small market where performance is a concern, novel methods or large scale operations are envisaged, full-scale experiments are difficult, and simplistic assumptions will fail.”

Ευχαριστώ ΠΞ!

SuperFastHash

Πρόσφατα σαν side project ενός προγράμματος που γράφω μου προέκυψε μια βιβλιοθήκη για hash tables0. Για την ακρίβεια ξεκίνησε σαν αντίγραφο αυτής που συνοδεύει το dnstop, αλλά κατέλληξε να είναι ένα reimplementation μια και διαβάζοντας τον κώδικα υπήρχαν ένα δύο σημεία που “εγώ θα τα έγραφα διαφορετικά” – και το έκανα. Μόλις βελτιώσω και το error handling θα την κάνω και διαθέσιμη1.

Έτσι κι αλλιώς αυτό που έχει σημασία δεν είναι τόσο η βιβλιοθήκη χειρισμού των hash tables, όσο η hash function2 που χρησιμοποιεί κάποιος. Και μετά από αρκετό ψάξιμο και διάβασμα πείστηκα κι εγώ3 πως η SuperFastHash4 είναι η καλύτερη από αυτές που είναι ελεύθερα διαθέσιμες.

Περισσότερο διάβασμα
Dictionary of Algorithms
and Data Structures
:
Hash function
Hash table
Hash table delete5

Update: Ένα ενδιαφέρον thread από το comp.compilers archive.


[0] – Τι τραβάει κανείς επειδή η C δεν έχει associative arrays.
[1] – Όχι πως έχει ιδιαίτερη σημασία, οποιοσδήποτε δευτεροετής πρέπει να μπορεί να γράψει τη δικιά του (βιβλιοθήκη χειρισμού hash tables, όχι hash function).
[2] – Δεν μιλάμε για κρυπτογραφικό hash function.
[3] – Όπως και αυτοί που γράφουν το dnstop.
[4] – SuperFastHash implementation.
[5] – Ναι κάνω chaining.