J'utilise beaucoup de flux RSS, et j'aime bien que tout le contenu soit disponible, par exemple un article complet sans commentaires dans le cas d'un blog.
Le principe est de pouvoir l'utiliser offline, par exemple en chargeant la page. Ça permet aussi d'éviter quelques clics (dont les pubs et une mise en page non neutre) et d'avoir tout le contenu directement dans le lecteur RSS.
Bons Exemples
- Hackaday
- Linuxfr
- Blogotext
Mauvais Exemples
- EDN
- Feedburner
- La majorité des blogs Wordpress
EDN
Comme on peut remarquer, le flux : http://www.edn.com/rss/design/analog ne contient que des liens vers les pages des articles et une description un peu vide.
Une première étape est de changer le lien vers la version imprimable de l'article. Les deux URL ont l'identifiant de l'article en commun :
http://edn.com/design/analog/$ID_ARTICLE/TITRE_ARTICLE
http://www.edn.com/Home/PrintView?contentItemId=ID_ARTICLE
Une ligne de bash suffit à faire le travail de base :
wget -qO- http://www.edn.com/rss/design/analog |sed -e 's#<link><!\[CDATA\[http://edn.com/design/analog/#<link><!\[CDATA\[http://www.edn.com/Home/PrintView?contentItemId=#' |sed -e 's#/[^/]*\]\]></link>#\]\]></link>#'
L'étape suivant est d'utiliser ce lien pour remplir le flux.
Comme mon niveau en PHP tient plus du bricolage qu'autre chose, il est sûrement possible de faire beaucoup mieux et plus efficace.
On va utiliser un algo simple :
function do_process(temp_file) {
articles[0][] = get_article_ids(temp_file);
articles[1][] = get_article_titles(temp_file);
articles[2][] = get_articles_dates(temp_file);
rss = fopen("new_rss", 'w');
fputs(rss, header);
iter = 0;
foreach(articles[0] as id) {
article = download(article_url + "id");
fputs(rss, article);
fputs(rss, articles[1][iter]);
fputs(rss, articles[2][iter]);
iter++;
}
fputs(rss, footer);
fclose(rss);
}
oldsum = md5sum(temp_file);
if((date() - date(temp_file)) > timestep {
download(url, temp_file);
if(md5sum(temp_file) != oldsum) {
do_process(temp_file);
}
}
Le script commence par tester si le flux RSS a été mis à jour récemment et s'il a changé, pour économiser la bande passante et les ressources du site distant comme ceux de la machine executant le script.
Ensuite, le flux RSS est analysé, les identifiants, date et titre de chaque article sont stockés dans un tableau qui est utilisé pour construire le flux RSS final.
La librairie simple_html_dom permet de manipuler facilement les balises XML.
Bugs
La date est incorrecte dans certains articles du flux RSS d'EDN (Nov 01 2016 pour un article écrit le 11 Jan 2016), mais la majorité fonctionne.
Références
Tags de l'article : info, RSS, soft
Limitations
Le PC n'a qu'un seul disque dur (40Go à la place des 200Mo d'origine), un port parallèle, un seul port série (utilisé par une souris), et le lecteur de disquettes et le modem ne sont plus présents (HS). L'installation de programme va être difficile sans ruser.
On commence par brancher le disque sur un convertisseur USB-IDE pour formatter le disque, le tester et copier les fichiers de DOS, Windows et les drivers.
On peut aussi utiliser Laplink et kermit pour transférer des données avec un câble série ou parallèle.
Qemu
Qemu permet de créer les partitions, de formater le disque et de copier le système de DOS en vérifiant que tout va fonctionner.
Ici, on a une machine avec Linux, le disque que l'on va utiliser s'appelle /dev/sdc et l'image de disquette dos622_1.img.
qemu-system-i386 -m 8 -fda dos622_1.img -hda /dev/sdc -boot a
En quittant le programme d'installation (F3), FDISK
permet de créer une partition (attention à la taille visible par le BIOS de 512Mio ou 2Gio, et DOS 6.2 n'allouera jamais de partitions de plus de 2Gio).
Après un redémarrage pour prendre en compte la nouvelle table de partitions (il faudra encore quitter l'installation de DOS), on peut formater la partiton avec FORMAT C: /S
et redémarrer en enlevant la disquette, pour tester.
Normalement on doit obtenir quelques lignes avec un prompt :
Starting MS-DOS...
C:\>_
C'est que tout s'est bien passé et qu'on peut copier le contenu des disquettes dans un dossier du disque.
DOS
On peut remettre le disque dans le PC. Si tout ce passe bien, le pc renvoie le prompt de DOS, que l'on peut continuer à installer :
cd \DOSS
setup.exe
(les fichiers ont été installés dans le dossier C:\DOSS\)

Il ne reste plus qu'à se laisser guider et choisir les programmes de dos à installer.
On peut aussi installer des programmes supplémentaires (disquette 4) :
cd \DOSS
setup.bat
Quelques programmes sont spécifiques à ce PC et sont fournis par Compaq, mais seuls les SP1728 et SP1743 sont vraiment utiles.
Windows 3.1
cd \WIN31
setup.exe
L'installation est vraiment simple et rapide.

Windows 95
Windows 95 peut fonctionner avec 4 ou 8Mio de RAM, mais il est beaucoup plus lent que Windows 3.1, du coup je n'ai pas tenté son installation, même s'il avait été installé sur le disque dur d'origine. Windows 98 fonctionne assez mal avec moins de 32Mio de RAM, et refuse de s'installer avec moins de 16Mio.
SoftPaq
Ce sont des programmes fournis par Compaq, habituellement installés d'origine et fournis sur des disquettes :
- SP1454 : Installe une partition d'hibernation et de recovery, mais risque de casser la table de partition...
- SP1728 : Driver video pour DOS
- SP1743 : Programmes de base pour Compaq Contura
- SP2054 : Configuration du BIOS et diagnostic depuis DOS
Comme les disquettes ont disparu de la circulation, je les ai extraits.
Tags de l'article : laptop, soft, software, vieilleries, windows
En voyant une vidéo parlant des données présentes sur les divers codes barres des billets d'avion, j'ai regardé si les billets de train que j'avais en stock étaient pareil.
https://www.youtube.com/watch?v=jM4_iz3RqE8
J'ai trouvé 4 types de billets avec des codes-barres différents :
- Billets cartonnés (code PDF417)
- E-Billets TGV et IC (code PDF417 ou Aztec)
- E-Billets TER (code Aztec)
- Billets "Online-Ticket" ÖBB imprimés (code Aztec)
Billet cartonné
"Billet classique", commandé puis retiré a un guichet/borne, avec un code PDF-417 imprimé à gauche

A|B|CC|DDDDDD|EEEEEEEEE|F|G|HH|0000000000|II|JJ|KK|L|MMM|NNN|OOO|
PPPPP|QQQQQ|RRRRRR|SSSS|TTT|UUU|VVV|W|XXXX|YY|
| | | | | | |*| | |
- A : Type de format ('e' dans ce cas)
- B : Code d'imprimante (E pour les guichets)
- C : Code de ticket
- D : Numéro de dossier
- E : Numéro de billet
- F : Drapeau de spécimen (0 pour un faux ou 1 pour un vrai)
- G : Version de codage du billet (1)
- H : Ticket A de B
- 0 : Réservé (10 caractères)
- I : Type de carte de réduction (deux espaces en cas d'absence)
- J : Nombre de voyageurs adultes
- K : Nombre de voyageurs enfants
- L : Dernier digit de l'année du voyage
- M : Date d'impression (nombre de jours depuis le 01.01)
- N : date de début de validité, idem
- O : Date de fin de validité, idem
Premier segment :
- P : Gare de départ (code ISO3166-1 du pays puis code de la gare sur 3 digits)
- Q : Gare d'arrivée, idem
- R : Numéro de train (6 digits, ou 5 digits + '\0', ou '0' + 4 digits + '\0')
- S : Code antifraude
- T : Date de départ du train (nombre de jours depuis le 01.01)
- U : Numéro de voiture
- V : Numéro de place
- W : Classe du voyage
- X : Code du tarif
- Y : Conditions du services/payements
Le premier segment (de M à V) peut être complété par un second segment suivant la même syntaxe si le voyage a des correspondances. En cas d'absence, il y a 29 espaces, la classe est notée '*', puis 6 espaces.
A|B|CC|DDDDDD|EEEEEEEEE|F|G|HH|0000000000|II|JJ|KK|L|MMM|NNN|OOO|
PPPPP|QQQQQ|RRRRRR|SSSS|TTT|UUU|VVV|W|XXXX|YY|
| | | | | | |*| | |
e|E|DV|RUZNxx|58361xxxx|1|1|11|0000000000| |01|00|3|165|166|226|
FRLPD|CHGVA|96506 | |166| | |2|LJ25|B |
| | | | | | |*| | |
Ici on a un un billet au format "e" pour le numéro de dossier RUZNxx, un numéro de billet 58361xxxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage. Le billet n'est pas lié à une carte de réduction, il est pour un adulte sans enfant, est vallable pour l'année 2013, a été acheté le 14.06 et est vallable du 15.06 au 14.08.
Le premier segment est au départ de Lyon Part-Dieu (France, LPD) et à destination de Genève-Cornavin (Suisse, GVA), pour le train 96506, le code est illisible, le train circule le 15.06, n'a pas de place/voiture réservée, est en 2nde classe, pour un tarif "illico Jeunes -25%" et n'est pas échangeable après le départ.
Dans tous les cas, ces billets ne posent aucun risques une fois le voyage effectué dans sa totalité (par contre il est possible de l'annuler ou de le reproduire si il n'a pas encore été utilisé).
E-Billet TGV/IC
Les E-billets sont fournis par des agences de voyages (Voyages-SNCF, Capitaine-train, E-billet-SNCF) et ont un code Aztec pour ceux imprimés soi-même ou un code PDF-417 pour ceux imprimés sur les bornes de la SNCF. Dans les deux cas ils utilisent la même organisation.
A|B|CC|DDDDDD|EEEEEEEEE|F|G|HH|II/JJ/KKKK|
LLLLL|MMMMM|NNNNN|OO/PP|
QQQQQQQQQQQQQQQQQQQ|RRRRRRRRRRRRRRRRRRR|SSSSSSSSSSSSSSSSSSS|T|UU|VVVVV|
LLLLL|MMMMM|NNNNN|
- A : type de format (i)
- B : 1 pour un billet imprimé à une borne (code PDF-417), 0 pour un billet imprimé soi-même (code Aztec)
- C : Confirmation Voyage (CV)
- D : Numéro de Dossier
- E : Numéro d'E-Billet
- F : Drapeau de spécimen (0 pour un faux ou 1 pour un vrai)
- G : Version du codage du billet (2)
- H : Ticket A de B
- II/JJ/KKKK : date de naissance du voyageur
- L : Gare de départ (code ISO3166-1 du pays puis code de la gare sur 3 digits)
- M : Gare d'arrivée, idem
- N : Numéro de train
- OO/PP : date du trajet
- Q : Numéro de client
- R : Nom du voyageur (suivi ou précédé par des espaces, 19 caractères max)
- S : Prénom du voyageur (suivi ou précédé par des espaces, 19 caractères max)
- T : Classe
- U : inconnu, possiblement un caractère de contrôle ou un code antifraude
- V : Code du tarif
Le 2nd segment est facultatif et remplacé par des 0 et des espaces
- L : Gare de départ (code ISO3166-1 du pays puis code de la gare sur 3 digits)
- M : Gare d'arrivée, idem
- N : Numéro de train
A|B|CC|DDDDDD|EEEEEEEEE|F|G|HH|II/JJ/KKKK|
LLLLL|MMMMM|NNNNN|OO/PP|
QQQQQQQQQQQQQQQQQQQ|RRRRRRRRRRRRRRRRRRR|SSSSSSSSSSSSSSSSSSS|T|UU|VVVVV|
LLLLL|MMMMM|NNNNN|

i|1|CV|RIKNxx|248713xxx|1|2|11|01/01/1990|
FRCMF|FRPAZ|05706|13/05|
0029009166230xxxxxx|BOxxxxxx |XAVIER |2| 2|PR112|
FRPMO|FRDLY|16757|
Ici on a un billet au format "i", imprimé sur une borne SNCF, le billet est une "Confirmation de voyage" pour le dossier RIKNxx, un numéro de billet 248713xxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage.
Le billet est au départ de Chambéry-Challes-les-eaux (France, CMF), à destination de Paris-Austerlitz (France, PAZ), avec le train 05706 le 13/05.
Le numéro d'identifiant du trajet est 0029009166230xxxxxx, porté par "Xavier Bo", voyageant en seconde classe avec un tarif "preum's"
La seconde partie du trajet est au départ de Paris Montparnasse (France, PMO) vers La-Ferté-Bernard (France, DLY), avec le train 16757.
A|B|CC|DDDDDD|EEEEEEEEE|F|G|HH|II/JJ/KKKK|
LLLLL|MMMMM|NNNNN|OO/PP|
QQQQQQQQQQQQQQQQQQQ|RRRRRRRRRRRRRRRRRRR|SSSSSSSSSSSSSSSSSSS|T|UU|VVVVV|
LLLLL|MMMMM|NNNNN|
i|0|CV|QZWKx|482593xxx|1|2|11|01/01/1990|
CHGVA|FRLPD|09744|19/12|
00290290169300xxxxxx|BOxxxxxx |XAVIER |2| | 0|00000
Ici on a un billet au format "i", imprimé par ses propres moyens, le billet est une "Confirmation de voyage" pour le dossier QZWKxx, un numéro de billet 482593xxx, le billet est valide, et il n'y a qu'un seul billet pour ce voyage.
Le billet est au départ de Genève-Cornavin (Suisse, GVA), à destination de Lyon Part-Dieu (France, LPD), avec le train 09744 le 19/12.
Le numéro d'identifiant du trajet est 00290290169300xxxxxx, porté par "Xavier Bo", voyageant en seconde classe. Par contre les informations de tarif sont vides et le voyage n'a pas de correspondance (champs remplis par des espaces ou des '0').
Le ticket à plutôt l'air de servir à identifier le voyageur (I, J, K, Q, R) et à porter un numéro d'identifiant (Q) qui doit pointer dans une base de donnée mieux remplie (et non-modifiable).
Certains paramètres (O, P, T, V) ont l'air d'être présent en cas de base de donnée injoignable ou pas à jour pour au moins vérifier sommairement que personne ne tente de frauder.
E-Billet TER imprimé
Le billet a été commandé sur le site web des TER-Rhône-Alpes et a un code Aztec assez grand.
Le début contient des données encodées, puis la chaîne :
T00T100xx|0000738xx|FRLYL|FRHCZ|
S|28122015|2|NG02|INTERNET BILLET IL|BOUxxxxx XAVIER |01011990|ADULTE| |01| 00|28122015|28122015|000000000000|28122015|1313|0000000200
En interprêtant sommairement, on remarque plusieurs chaînes contenant la date du 28.12.2015 (date de commande, début et fin de validité du ticket).
La chaîne 1313 correspond à l'heure de la commande du billet, "NG02" semble être un tarif, et plusieurs champs peuvent correspondre à la classe.
Les champs FRLYL et FRHCZ sont au format des autres billets et indiquent les gares de départ et d'arrivée (France, Lyon Gorge-de-Loup et Fleurieux-sur-l'Arbresle).
Par contre je n'ai qu'un seul ticket de ce type pour l'instant, je pourrais compléter quand j'aurais comparé avec des tickets du même type pour des trajets.
Internet-Ticket ÖBB imprimé
Les tickets à imprimer soi-même sont les seuls à comporter un code-barres unique. Par contre le codage a l'air similaire et compatible avec celui utilisé par la DB (Allemagne) et les SBB (Suisse).
Pour l'instant le code comporte une en-tête dépendant du type de ticket/carte, du transporteur et de la longueur du message. Le reste est encodé en binaire mais semble décodable.
Références
- Format PDF417
- Code Aztec
- European Railway Agency - ERA/TD/2009-09/INT, structure des tickets cartonnés, page 151
- Codes barres et billets SNCF [FR], contenu des billets, E-billets et des cartes de réduction
- Confirmations, mémos, ... e-billet [FR], contenu des E-billets
- Titre de transports : billets papier [FR], lecture d'un billet papier
- Billets ÖBB [DE], contenu des billets et cartes ÖBB, pages 27 à 36
Tags de l'article : billets, info, reverse engineering, soft