Δημοσιογραφική ξεροκεφαλιά

Δεν είναι κακό να μην τα ξέρει όλα κανείς. Ακόμα και στον επαγγελματικό του χώρο. Κακό είναι να αντιμετωπίζει τις διορθώσεις που του γίνονται ως ακολούθως:

– Είναι άποψή σας πως ο Τοροσίδης δεν έκανε φάουλ. Άποψή μου είναι πως έκανε. Στη μικρή περιοχή ο τερματοφύλακας είναι απόλυτος άρχοντας και κάθε επαφή με αυτόν τιμωρείται με φάουλ.

Αυτός είναι ο ισχυρισμός που προέβαλαν χτες οι κ.κ. Καϊμάς και Παπαγεωργίου στη μεταμεσονύκτια εκπομπή της ΕΡΑ Σπορ “Πες το ελεύθερα“. Ευσταθεί όμως; Έκατσα χτες βράδυ και διάβασα τους κανονισμούς του παιχνιδιού και στα Αγγλικά (Ιούλιος 2007) και στην Ελληνική μετάφραση (Κανόνες παιχνιδιού 2007/2008). Για να δούμε τι βρήκα:

  • Πουθενά στους κανόνες δεν γίνεται ειδικός διαχωρισμός των επαφών του τερματοφύλακα με αντίπαλους παίκτες στη μικρή ή τη μεγάλη περιοχή. Υπάρχει μόνο περιοχή πέναλτυ.
  • Στη σελίδα 113 του κανονισμού αναφέρεται πως: “Ο αντικανονικός περιορισμός της κίνησης του τερματοφύλακα, αποτελεί παράβαση π.χ. κατά την εκτέλεση ενός γωνιακού λακτίσματος (κόρνερ)”.
  • Στη σελίδα 115 του κανονισμού αναφέρεται πως: “Όλοι οι παίκτες έχουν το δικαίωμα κατοχής της θέσης τους στον αγωνιστικό χώρο, το να βρίσκεται όμως κάποιος στην πορεία ενός αντιπάλου δεν είναι το ίδιο με το να μετακινείται επάνω στην πορεία ενός αντιπάλου”.

Με βάση λοιπόν τα παραπάνω και με δεδομένο πως ο Τοροσίδης ανοίγει τα χέρια του αφότου πέφτει πάνω του ο Μάλαρτζ (για τη θέση του οποίου δεν μπορούσε να έχει γνώση καθώς πριν πάρει θέση δεν κατευθύνεται προς το τέρμα, αλλά αριστερά του και με πλάτη προς τους υπόλοιπους παίκτες), ο Καλόπουλος ορθά -αν και από τύχη- αποφασίζει για τη φάση.

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

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

Υ.Γ: Φαντάζομαι την Τετάρτη δεν θα παίξουμε τόσο άσχημα.

Using Prolog in Windows NT Network Configuration

(Αυτό είναι στο όρια της ψηφιακής αρχαιολογίας)

Μίλαγα χτες με ένα φίλο που προσπαθούσε να λύσει ένα πρόβλημα με Prolog και έψαξα κανά δίωρο για να βρω μια καλή υλοποίηση που να ταιριάζει στο πρόβλημά του. Στην πορεία θυμήθηκα πως χρόνια πριν, είχα διαβάσει για τη Small Prolog η οποία είχε χρησιμοποιηθεί στον Windows NT kernel. Θυμόμουν πως είχα ξανακάνει αυτή την “άσκηση”, αλλά δε θυμόμουν περισσότερα @(%#*&$%^!

Mε λίγη τύχη, λίγη ώρα και χάρη στο Web Archive: Using Prolog in Windows NT Network Configuration του David Hovel.

Update: Περισσότερα μπορεί να δει κανείς στο “Is Prolog really used in Windows NT?

Yes.

For more information, see

  1. Dennis Merritt, “Extending C with Prolog“, Dr Dobb’s Journal, August 1994, pages 78-82 and 102, 104.
  2. D. Hovel, “Small Prolog and Windows NT Networking“, Dr Dobb’s Journal, August 1994, page 80.

Α Commentary on the Sixth Edition UNIX Operating System

Πρωτοάκουσα για το Lions’ Book από το Μάνο 10 και βάλε χρόνια πριν. Παρόλο που δεν το έψαξα ποτέ φανατικά, δεν ήξερα και κανένα που να είχε φωτοτυπίες από το the most famous suppressed book in computer history. Είχε υποσχεθεί και ο Μάνος πως εάν βρει κάποιον στην Αμερική που να το έχει σε φωτοαντίγραφο, θα …φροντίσει. Δεν πειράζει όμως, γιατί ήδη από το 1994 είχε γίνει post στο alt.folklore.computers.

Το βιβλίο το κατεβάζετε από εδώ. Ο κώδικας της 6ης έκδοσης είναι διαθέσιμος χάρη στo The Unix Heritage Society.

Έχω ξεκινήσει το ξεφύλλισμα.

/* You are not expected to understand this. */

[via]

vip – interactive editing in a pipeline

Τι μπορεί να θυμηθεί κανείς… Ο Σωτήρης έχει γράψει το cvi, ένα βολικό wrapper script για τον vi, ώστε να έχει version control στα αρχεία που επεξεργάζεται.

Διαβάζοντας τις λίγες γραμμές που έγραψε, θυμήθηκα αμέσως το vip, ένα άλλο bourne shell script -wrapper στον vi- χάρη στο οποίο μπορεί κανείς να κάνει interactive editing σε ένα Unix shell pipe. Περιγράφεται σε άρθρο στο ;login: του Οκτωβρίου του 1997.

on becoming a sysadmin

Πριν δύο μήνες έλαβα ένα email από ένα φοιτητή:

“Συγνώμη για την ενόχληση […] επειδή θα γίνω admin στο Πανεπιστήμιο μου θέλω μερικές συμβουλές, όπως toolbox, books, sites, live CDs, etc.”

Συμπτωματικά είναι ό ίδιος φοιτητής που ρώτησε τον κ. Σπινέλλη πως να γίνει hacker (με την old-school έννοια του όρου).

(Οι επόμενες παράγραφοι είναι αφιερωμένες στο ερώτημα, αλλά δεν είναι απαραίτητα τοποθετημένες σε μία λογική σειρά.)

Από την περιγραφή του SAGE, για το SAGE Level 1:

Required Skills
* Strong interpersonal and communication skills; capable of explaining simple procedures in writing or verbally; good phone skills.
* Familiar with an operating system and its commands/utilities at a user level; can edit files, issue commands, find users’ home directories, navigate through the file system, and use I/O redirection.
* Able to follow instructions well.

Required Background
* Two years of college or equivalent post-high school education or experience.

Desirable Background and Skills
* A degree or certificate in computer science or a related field.
* Previous experience in customer support, computer operations, system administration, or another related area.
* Motivated to advance in the profession.

Appropriate Responsibilities
* Performs routine tasks under the direct supervision of a more experienced administrator.
* Acts as a front-line interface to users, accepting trouble reports and dispatching them to appropriate system administrators.

Είναι δύσκολο να γράψει κανείς για το πως μπορεί να γίνει κάποιος άλλος system administrator. Η εκπαίδευση για το επάγγελμα δεν είναι συστηματοποιημένη. Η κατάσταση μοιάζει με αυτή που περιγράφεται στο Εκπαίδευση, Τεχνολογία και Βιομηχανικές Επιδόσεις στην Ευρώπη 1850-1939. Για να γίνει κάποιος Μηχανικός είχε (ιστορικά) τρεις επιλογές:

  1. Να μαθητεύσει άμισθα για μεγάλο χρονικό διάστημα δίπλα σε άλλους Μηχανικούς
  2. Να μαθητεύσει πληρώνοντας ένα μεγάλο χρηματικό ποσό σε σχολές μαθητείας κατασκευαστών Μηχανολογικού (και όχι μόνο) εξοπλισμού και λίγο αργότερα
  3. Να μαθητεύσει σε μια Πανεπιστημιακή σχολή πληρώνοντας ένα πολύ μικρότερο (αλλά όχι ευκαταφρόνητο) ποσό.

Σας θυμίζει τίποτε; Εμένα πολλά! Οι περισσότεροι System Administrators που ξέρω έχουν ακολουθήσει (more or less) την μέθοδο #1 (Always two there are; no more, no less: a master and an apprentice). Ή μήπως η χρηματική δαπάνη που απαιτείται για να αποκτήσει κανείς ένα καλό cisco, Sun, Microsoft, Oracle certifictation δεν θυμίζει το #2; Αυτό που σίγουρα δεν υπάρχει (ακόμα;) είναι το #3.

Παρόλο που δεν είχα επίσημα ένα master να με καθοδηγεί θεωρώ τον εαυτό μου προϊόν της διαδικασίας #1. Δεν ακολούθησα ποτέ την διαδικασία #2 και βρέθηκα ανάμεσα στα παιδιά του Εργαστηρίου Βάσεων Γνώσεων και Δεδομένων, το οποίο (τι καταπληκτικό!) είχε κοινή εσωτερική πόρτα με το NETMODE. Δεν νομίζω να είχα ποτέ ερώτηση στην οποία να μη βρήκα απάντηση.

Ο system administrator δεν καταθέτει τα όπλα. Εκεί που οι άλλοι βλέπουν τοίχο, αυτός βλέπει ένα ενδιαφέρον πρόβλημα ή και παιχνίδι ακόμα. Όπλα του είναι η διαίσθηση, η εμπιστοσύνη στον εαυτό του και τα manual. Και ποτέ δεν πιστεύει τον χρήστη όταν “δεν έκανε τίποτε”. Πάντα ρωτάει “δείξε μου το τίποτε που έκανες”.

Ένα πράγμα που έχει πάντα μεγάλη σημασία είναι να μη φοβάται κανείς να ρωτάει. Δεν υπάρχουν χαζές ερωτήσεις, μόνο χαζοί άνθρωποι. Και να έχει κανείς ανθρώπους να μοιράζεται τους προβληματισμούς του και τα ευρήματά του. Τα πρώτα χρόνια, εγώ ο Unique Fish και ο Πάνος ήμασταν διαχειριστές σε διαφορετικά εργαστήρια στο ΕΜΠ. Πολύ συχνά συζητάγαμε για τα ευρήματά μας, τα προβλήματα (τεχνικά ή με χρήστες) και τις λύσεις μας. Δεν υπήρξε ποτέ μία στιγμή που να φοβήθηκε κάποιος να μοιραστεί αυτό που “βρήκε” με τους άλλους.

Το ξενύχτι είναι μεγάλος σύμμαχος. Τη νύχτα υπάρχει περισσότερη ησυχία, μπορείς να συγκεντρωθείς στο διάβασμα (και όταν τελειώσεις να βγεις έξω κατευθείαν). Mailing lists σαν το decstation-managers, sun-managers, coderpunks και cypherpunks και newsgroups σαν το comp.unix.programmer και το comp.security.misc ήταν για χρόνια στην ημερήσια διάταξη.

Το 1991 στη διάρκεια ενός σεμιναριακού μαθήματος, ένας από τους τότε διαχειριστές του ΕΜΠ μας είχε πει πως ο system administrator θυμάται ανά πάσα στιγμή απ’έξω περί τις 300 εντολές και τα ορίσματα που δέχονται. Είχαμε μείνει με το στόμα ανοιχτό. Στην πραγματικότητα όμως είχε πέσει έξω: Είναι πολύ περισσότερες.

Ο ίδιος διαχειριστής μας είχε πει (και είχε δίκιο) πως ο καλός system administrator πρέπει να ξέρει καλή C. Μάθετε το K&R απέξω! Και μια και ο λόγος είναι για τις γλώσσες προγραμματισμού, δεν βλάπτουν λίγη awk και Perl (για αρχή). AWK έμαθα από τα manuals της DEC (nawk) και πρόλαβα την Perl 4 οπότε την αντιμετώπισα αρχικά σαν απλοποιημένη C (δεν δηλώνω μεταβλητές, όλες οι μεταβλητές έχουν μπροστά $, βάζω παντού ; και δεν γράφω the Perl way). Αργότερα είχα την τύχη να δουλεύω για χρόνια με ένα Perl guru. Σήμερα υποθέτω κάποιος θα ξεκίναγε από το βιβλίο του Robbins (υπάρχει online, αλλά αγοράστε το καλύτερα). Για την Perl ο O’Reilly έχει κάνει καλή δουλειά.

Λειτουργικά συστήματα δεν διαχειριζόμαστε; Τι στο %$#@%$@ κάνει ένα λειτουργικό σύστημα; The Magic Garden Explained.

Υπάρχουν άραγε πουθενά τα sources του learn;

Δεν υπάρχει άνθρωπος που δεν θα συστήσει ποτέ το Unix Network Programming του W.R. Stevens (το οποίο και μου είχαν δανείσει από το NETMODE, όπως και το Advanced Programming in the Unix Environment). Σήμερα στο σπίτι μου έχω τα volume 1 και volume 2. Το The Unix Programming Environment το είχε το dblab (όποιος το έχει πάρει να το επιστρέψει!).

“Ρε συ Γιώργο τι netmask έχουμε;” Internetworking with TCP/IP Vol.1.

Η έλλειψη μακροχρόνιου ενδιαφέροντος για ένα και μόνο πράγμα στην Πληροφορική επίσης με βοήθησε πολύ. Για τι ενδιαφερόμαι αυτό το μήνα; Για ότι κι αν ενδιαφερόμουν εκείνο το μήνα, φρόντιζα να το ψάξω καλά. Για τα περισσότερα άλλωστε είχα ανθρώπους γύρω μου που είτε ήξεραν να μου απαντήσουν, είτε ήξεραν κάποιον που ήξερε. Αλλά και για αυτά που δεν ενδιαφέρονταν με έμαθαν πως να ψάχνω. Π.χ. την περίοδο που με ενδιέφερε το reverse engineering, δέχτηκα μια από τις πιο σημαντικές συμβουλές. Ζήτησα από τον der Mouse να μου πει για τον decompiler που έχει φτιάξει: “Είναι ανάμεσα στα αυτιά μου”.

Κάνε το ίδιο install πολλές φορές. Οι φίλοι μου θα πρέπει να έχουν ξεκαρδιστεί από τα γέλια. Το ίδιο install του ίδιου OS το επαναλλαμβάνω πολλές φορές ακόμα και στο ίδιο μηχάνημα. Με τις ίδιες επιλογές ή και με διαφοροποιήσεις. Μπορεί να παίρνει ώρες (learn to multitask) αλλά σίγουρα βοηθάει. Θα βρεις γρήγορα μπροστά σου εκείνη την κουλή περίπτωση για την οποία θα πρέπει να είσαι προετοιμασμένος. Και μιλάμε για ένα system administrator τώρα, όχι για ένα developer, ούτε φυσικά για ένα casual user.

Θυμάμαι ήμουν κάτι μήνες μόνο system admnistrator όταν ο sv1xv με ρώτησε “και αυτό με το DNS πως το κάνεις;”. Τι είναι το DNS; Τι μου λέει τώρα; Θυμάμαι που με ντροπή τον ρώτησα “τι είναι DNS;” και έκατσε με όρεξη να μου εξηγήσει. Φαντάζομαι είναι πιο εύκολο να ξεκινήσει κανείς σήμερα από το DNS and BIND.

Και δεν έχω γράψει τίποτε για τα θέματα ασφάλειας υπολογιστικών συστημάτων. Το Thinking about firewalls είναι μόνο μια αρχή.

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

Σπάνια πια θα υπάρχει ένα σύστημα που θα διαχειρίζεται κάποιος το οποίο να μην τρέχει μία βάση δεδομένων. Η δικιά μου πρόταση για κάποιον που δεν ενδιαφέρεται να μάθει πολλά για βάσεις δεδομένων, αλλά που θέλει να ξέρει από βάσεις και να μην τις αντιμετωπίζει σαν μια συλλογή πινακοποιημένων δεδομένων είναι το Theory and Practice of Relational Databases. Φαντάζομαι πως κανείς θα περίμενε κάποιο βιβλίο για MySQL ή για PostgreSQL. Απεχθάνομαι αυτά τα βιβλία! Εάν κάποιος έχει κατανοήσει τα βασικά του Σχεσιακού Μοντέλου το online documentation είναι παραπάνω από αρκετό για να μπορέσει να τα βγάλει πέρα.

Να μην αναζητάς το “μπούσουλα”, αλλά το πως δουλεύουν τα πράγματα. Το να έχεις μια λίστα που να λέει “αν γίνει αυτό, τότε κάνε αυτό” δεν λέει τίποτε. Δεν θα σε βοηθήσει ποτέ να καταλάβεις γιατί η εφαρμογή που τρέχει στο server “πάει αργά” (αν πάει) ούτε θα σε βοηθήσει να βρεις τι φταίει, ούτε πως να λυθεί. Θέλεις να είσαι ο go-to guy ή όχι; Εάν ναι, πρέπει να ξέρεις πολλά από πολλά πράγματα. Εάν όχι, κάνε παρέα με τα checklists και μη βγαίνεις ποτέ έξω από αυτά.

Και πως θα μπορούσε να λείπει μια αναφορά στο bat book;

Μέχρι τώρα απέφυγα να γράψω οτιδήποτε για εργαλεία / toolbox. Στην πραγματικότητα διαβάζοντας και δουλεύοντας δημιουργείς το toolbox σου. Δεν έχει νόημα να ξεκινήσεις ανάποδα. Όμως δεν μπορώ να μην αναφερθώ στα ακόλουθα εργαλεία: netcat, traceroute και host. Ειδική μνεία θα ήθελα να κάνω στο tcpdump. Άλλωστε για να μπορέσει κανείς να εκμεταλλευτεί το δυναμικό τους θα πρέπει να έχει διαβάσει πολύ. Αν προσπαθήσει να διαβάσει και τον πηγαίο κώδικά τους, θα μάθει περισσότερα.

Δεν νομίζω πως υπάρχει βιβλίο που να έχει αποδώσει περισσότερο σε εμένα από το SICP. Σε μαθαίνει να σκέφτεσαι.

Όπως βλέπεις φίλε Νίκο, το μόνο που μπορώ να σου ευχηθώ είναι καλή χρονιά, καλή δύναμη και καλό διάβασμα. Το post αυτό βγήκε μεγάλο και με τη βοήθεια και άλλων ίσως να γίνει καλύτερο και διαφωτιστικότερο.

sudo αργά το βράδυ

Aντί για το:

$ sudo mount /dev/sd0i /mnt
$ sudo cp lala.txt /mnt

καταλλήγει κανείς να γράψει:

$ sudo cp /dev/sd0i /mnt

@!#$&^

Η κούραση είναι κάκιστος βοηθός.

More fun with message threading

When I try to write email-related code and the result fails my expectations, I use my plan B: Write it in c-client. I suppose the fact that I do not start with c-client from the beginning is a result of suffering from the Not Invented Here Syndrome.

The other day I was trying to decipher the semantics of Thread-Index: and Thread-Topic: since it seems that Microsoft has not placed any public information on them. Apostolos suggested that Thread-Index: takes BASE64 values, to which I replied negatively. After all, decoding

AcdyY+a08VX8xfobTsy61v9NHPZ7QA==

using perl -MMIME::Base64 -ne ‘print decode_base64($_);’ does not produce anything meaningful.

However I dug a little bit more, following this piece of advice from the imap-protocol list:

“Look at the evolution source code, it contains quite a bit of
information on this.”

camel-exchange-folder.c from the Evolution Exchange package reveals the following gem:

/* A new post to a folder gets a 27-byte-long thread index. (The value
 * is apparently unique but meaningless.) Each reply to a post gets a
 * 32-byte-long thread index whose first 27 bytes are the same as the
 * parent's thread index. Each reply to any of those gets a
 * 37-byte-long thread index, etc. The Thread-Index header contains a
 * base64 representation of this value.
 */

[ Update: Message Threading in Public Folders ]

Enough with trying to work with Thread-Index: then! JWZ has documented a very effective algorithm for message threading and c-client implements it (read docs/draft/sort.txt from the source code distribution):

SEARCHPGM *spg;
THREADNODE *thr;
:
spg = mail_newsearchpgm();
thr = mail_thread(ds, "REFERENCES", NIL, spg, 0);
walk_thread(thr, NIL);

(You are advised to read docs/internal.txt.)

The “REFERENCES” argument to mail_thread() instructs it to use jwz’s algorithm. The other option is to use “ORDEREDSUBJECT” (or as draft-ietf-imapext-sort-19.txt calls it: “poor man’s threading”). walk_thread() just prints the edges of the graph (actually it is a tree):

void
walk_thread(THREADNODE *thr, THREADNODE *prev)
{
        if (thr) {
                if (prev) {
                        printf("%d %d\n", prev->num, thr->num);
                }

                if (thr->next) {
                        walk_thread(thr->next, thr);
                } else {
                        printf("%d NIL\n", thr->num);
                }

                if (thr->branch) {
                        walk_thread(thr->branch, prev);
                }
        }

        return;
}

You may wish to use the output of the above routine (slightly modified) and feed it to dot, so that you can have an image display of the threads in the email collection that you study.

What is left to discuss a little bit more, is the THREADNODE structure: You can go from a THREADNODE to its first child via the next pointer (thr->next in the above example). If the THREADNODE has two children, then the second is a branch of the first (thr->next->branch). It if has three, the third is a branch of the second child (thr->next->branch->branch) and so on.