Trying to make use of Outlook’s Thread-Index: header

tl;dr Finally the format of the Thread-Index: header is documented!

Recently I was in a situation where I had to reconstruct a thread of email messages using the Thread-Index: header which is used by Microsoft’s products, instead of the standard way of threading using Message-Id:, References: and In-Reply-To:

The truth is that I was really frustrated, thinking that Microsoft was breaking the standards using custom headers that do not begin with X- but as Dan Bernstein points out:

822 promised that the IETF would never define field names beginning with X-. It did not prohibit use of non-X names by other organizations.”

Which means that Microsoft is allowed to add Thread-Index: (and Thread-Topic:) without breaking any standards. On the other hand Microsoft does not document anywhere (at least anywhere I looked and I looked plenty) how Thread-Index: is calculated and how it can be decoded to be made useful by any other application, any other than Outlook that is.

After some experimenting and a little bit of reverse engineering I’ve reached to the following results:

  • Thread-Topic: preserves the original subject of the thread, that is the Subject: but stripped from any Fw: or Re: prefixes.
  • Thread-Index: is used in a way similar to In-Reply-To: and References: Assuming that the first message in a thread has a:
    Thread-Index: AcdyY+a08VX8xfobTsy61v9NHPZ7QA==

    and the next in thread:

    Thread-Index: AcdyY+a08VX8xfobTsy61v9NHPZ7QAAAiXbA

    while a third one:

    Thread-Index: AcdyY+a08VX8xfobTsy61v9NHPZ7QAAAiXbAAAXP5fw=

    and a fourth one:

    Thread-Index: AcdyY+a08VX8xfobTsy61v9NHPZ7QAAAiXbAAAXP5fwAABGXGw==

    the pattern that decides the threading seems obvious; I have not yet found out what the single or double equal sign suffix means.

If only Microsoft could make such simple information available! Think of all the lost work hours! Only after I had resolved my problem did I find out about these guys, who had arrived on similar conclusions about the usage of Thread-Index:

Update #1: You may be interested to read the next episode.

Update #2: Yes, I keep refusing the BASE64 explanation. This is because what the BASE64 value decodes to is something either meaningless, or without known semantics.

Update #3: From the GNOME documentation: The value is apparently unique but has no meaning we know of. That is why I refuse the BASE64 explanation. It looks like a BASE64 string and it can get decoded into a string of bytes that one can represent as a number. But the questions remain unanswered: How is the first 27-byte long value chosen? Why every “next” value in a thread 5 bytes longer than the previous one? How are these 5 bytes chosen? The decoded value of an undocumented BASE64 string remains undocumented, hence it may not even be a BASE64 string at all (and may only coincidentally look like one).


The example Thread-Index: headers are taken from the MediaDefender Defenders site

city

Τιμάμε τα στέκια μας: Σήμερα το City κλείνει 19 χρόνια λειτουργίας.

Να τα εκατοστήσετε παιδιά.

Having fun with the MNIST database

The MNIST database of handwritten digits, available from this page, has a training set of 60,000 examples, and a test set of 10,000 examples. It is a subset of a larger set available from NIST.

It consists of four files that store data in a simple file format (idx format) which is documented in the MNIST database homepage. I wrote this C program to be able to extract the descriptions of handwritten digits of a certain value separately (eg. only the 0s or only the 1s). The text output is pretty simple and closely resembles the format of a PGM file. It is describes the grayscale pixel values of the image in decimal ASCII. Pixel values range from 0 to 255.

As a bonus, there is the opportunity to extract the images in portable graymap file format (PGM) image files.

This program was written with these guys mostly in mind.

[download mnist.c]

Πειρατικό λογισμικό – Ελεύθερο λογισμικό

Η BSA “τρέχει” μια καμπάνια στον Τύπο (ή τουλάχιστον είναι η δεύτερη Κυριακή που τη βλέπω στην Καθημερινή), που πάει κάπως έτσι:

ΠΕΙΡΑΤΙΚΟ ΛΟΓΙΣΜΙΚΟ:
ΔΕΝ ΠΛΗΡΩΝΕΤΕ ΤΙΠΟΤΕ ΓΙΑ ΝΑ ΤΟ ΒΑΛΕΤΕ.

ΠΛΗΡΩΝΕΤΕ 1000 ΕΥΡΩ ΓΙΑ ΝΑ ΤΟ ΒΓΑΛΕΤΕ.

Είναι νομίζω μια καλή ευκαιρία για τους υποστηρικτές του ελεύθερου λογισμικού να κάνουν μια ανάλογη καμπάνια:

ΕΛΕΥΘΕΡΟ ΛΟΓΙΣΜΙΚΟ:
ΔΕΝ ΠΛΗΡΩΝΕΤΕ ΤΙΠΟΤΕ ΓΙΑ ΝΑ ΤΟ ΒΑΛΕΤΕ.

ΔΕΝ ΧΡΕΙΑΖΕΤΑΙ ΝΑ ΤΟ ΒΓΑΛΕΤΕ.

Φαντάζομαι όμως πως δεν υπάρχουν οικονομικοί πόροι τέτοιοι για αντίστοιχες καταχωρήσεις στον Κυριακάτικο Τύπο.

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

ΤΣΜΕΔΕ #3

Με δεδομένο πως η διοίκηση του ΤΣΜΕΔΕ αποτελείται κατά τα 3/5 από Μηχανικούς, δηλαδή από ανθρώπους που ξέρουν από συστήματα αναμονής, είναι απορίας άξιο πως κανείς δεν έχει ασχολήθεί με το workflow των ουρών στο Ταμείο. Και μη σκεφτεί κανείς κακή ή ελλειπή μηχανογράφηση. Η διαχείριση ουρών και το indexing εγγράφων είναι προβλήματα για τα οποία υπάρχουν λύσεις αίωνες τώρα.

(#2) (#4)

$#random – a local mailer that returns a random EX_*

I found myself in a situation where I needed a local mailer that was required to return random exit values0 for email directed to certain users. Luckily, most of the job can be done via your .mc file:

MAILER_DEFINITIONS
Mrandom,        P=/opt/bin/random,
                F=lsDFMqbE,
                S=ruleset_noop, R=ruleset_random,
                T=DNS/RFC822/X-Unix,
                A=random $u

LOCAL_CONFIG
C{Random} adamo yiorgos admin system operator
Kcomp arith

LOCAL_RULESETS
Sruleset_noop
# This ruleset does nothing

Sruleset_random
# EX__BASE == 64 and EX__MAX == 78. EX_OK == 0, so we mask it to 79.
R$*             $: $1 . $(comp r $@ 64 $@ 79 $)
R$* . 79        $@ $1 . 0

LOCAL_RULE_0
R$={Random}  < $=w . > $*        $#random $: $1

When $#random is called, ruleset_random is called with $1 (the username) as an argument and returns $1.number, where number is a random number between EX__BASE (64) and EX__MAX (78) or zero. Therefore, the $#random binary is executed with $1.number as an argument.

/opt/bin/random can be as simple as this shell script1:

#!/bin/sh
# This is an example (non) delivery agent and is not considered safe to run on a 
# production server.
status=`echo $1 | sed -e 's/.*\.\(.*\)$/\1/'`

while read x
do
        # noop
done

exit $status

A random EX_* value is returned to the sender of the email, assuming s/he has emailed a local user contained in class $={Random}.


[0] – Valid sendmail exit codes (EX_*) are defined in sysexits.h.
[1] – In my case I wrote the mail delivery agent in C, as I needed to do a few more stuff prior to calling exit().

The 5 minute effect

– Έλα μωρέ! Αυτό είναι 5 λεπτά για εσένα

Λάθος! Πέντε λεπτά είναι για εσάς που με ρωτάτε. Για εμένα είναι όλος εκείνος ο χρόνος που χρειάστηκε να ασχοληθώ, να διαβάσω και να πειραματιστώ μέχρι να ξέρω να απαντήσω σε πέντε λεπτά. Και όλος εκείνος ο χρόνος που θα χρειαστώ για να συγκεντρωθώ ξανά στη δουλειά μου.

Καιρός να κινητοποιηθούμε στην πράξη…

Από το ΙΝΒΟΧ μου, φρέσκο-φρέσκο:

Οργανώνουμε μαζί με ορισμένους ακόμα συναδέλφους μια πρωτοβουλία προκειμένου να προχωρήσουμε σε μια πρακτική αντιμετώπιση του προβλήματος της ειδικής προσαύξησης του ΤΣΜΕΔΕ.

Προς ενημέρωση συναδέλφων Μηχανικών. Ελπίζω αυτή η κινητοποίηση να είναι πιο πετυχημένη από το “Κίνημα ΤΣΜΕΔΕ”.

Update: Επίσης ενδιαφέρον blog για τα ίδια θέματα: http://reengineering.wordpress.com/

#include <std/disclaimer.h>

Guest Post: A blind call

Όσοι είναι πρώτοι στον τηλεφωνικό κατάλογο του κινητού φίλων και γνωστών τους έχουν υποφέρει από κλήσεις ή μηνύματα τις πιο άσχετες ώρες της μέρας (ή καλύτερα της νύχτας). Ο Giorgos σχολιάζει:

“Προχθές στις Βρυξέλλες είδα την τέλεια λύση για όλες αυτές τις περιπτώσεις λάθος κλίσεων στον πρώτο αριθμό του καταλόγου:

http://www.ablindcall.be/

Από τα λίγα γαλλικά και φλαμανδικά μου καταλαβαίνω ότι είναι το εξής:
Βάζεις στον κατάλογο το ονομα “A Blind Call” και φυσικά βγαίνει πρώτο στον κατάλογο (ακόμα και πριν το “adamo”). Το συνδέεις με αριθμό φιλανθρωπικής οργάνωσης για τυφλούς και κάθε φορά που κάνεις λάθος στις 6:37 ένα ποσό πάει αυτόματα στο λογαριασμό της οργάνωσης. Αν ξέρετε καλύτερα γαλλικά πείτε μου αν μετά τερματίζει και την κλίση για να μην έχει επιπλέον χρέωση.

BTW, μιλάμε για σοβαρή προσπάθεια, ήταν αναρτημένο ΠΑΝΤΟΥ στα δημόσια μέρη. Καμμια πρωτοβουλία να το κάνουμε και εδώ;”

Πράγματι, το babelfish μεταφράζοντας από τα Γαλλικά δίνει:

Help the blind men without you to give an account of it.

The keyboard of your GSM is not locked and you call quelqu’one without wanting it. This situation inevitably already had to arrive to you. Pour L’money of these lost calls to the League Braille. Record our special number in your GSM.

The principle is simple.

Encodez “A blind call” in the repertory of your GSM.
(contact = A blind call; number = 070 22 22 30)

If you again forget to lock the keyboard of your GSM, it will be the first number with being made up.

You will not thus disturb any more Alain or Alexia, but your accidental – call, thank you D’advances! – will be made with the profit blind people and malvoyantes *.

You can obviously always give a phone call to us voluntarily.

Μακάρι να το δούμε και εδώ.

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): Εάν κάποιος έχει διαβάσει το πρωτότυπο αγγλικό κείμενο και διαφωνεί με κάτι στη μετάφραση, θα εκτιμούσα τα σχόλιά του ώστε το αποτέλεσμα να γίνει καλύτερο.