PROJET AUTOBLOG


Tontof

Site original : Tontof

⇐ retour index

7 : KrISS turn

mardi 19 mars 2024 à 19:03
Quand dans le dernier article j'ai écrit que je ne pourrais pas garder le rythme des publications, je pensais que je reprendrais tranquillement à l'automne mais force est de constater que c'est avec le printemps qui arrive que je vais pouvoir reprendre la publication de code.

C'est plus ou moins vrai avec KrISS turn qui est un peu un entre 2. J'ai écrit plusieurs fois à blasten pour savoir si je pouvais publier mes modifications à son projet turn.js mais mes messages sont restés sans réponse. Sur github son projet semble abandonné à la version 4 mais sur son site, il y a une version 5 qui est bien plus aboutie même si la démo qui affiche des pages en html n'est pas forcément très convainquante : http://turnjs.com/catalog/

J'ai donc apporté quelques modifications afin de pouvoir faire un lecteur PDF en intégrant la bibliothèque Mozilla PDF.js. Je n'ai pas modifié la bibliothèque turn.js, juste quelques lignes de son script principal qui utilise sa bibliothèque.

Comme je n'ai pas eu de répons, je ne publie pas sur github mais en regardant le code source il est assez facile de récupérer ce qu'il faut pour pouvoir héberger votre propre lecteur PDF sous forme de magazine.

Voici quelques exemples :
- https://tontof.net/turn/
- https://tontof.net/turn/?pdf=assets/pdf/classes.pdf
- https://tontof.net/turn/?pdf=assets/pdf/turnjs4-api-docs.pdf

J'ai 1 mois pour publier les 4 derniers projets, j'espère que je vais tenir le rythme !

6 : KrISS lldc

dimanche 11 juin 2023 à 13:06
Nous voilà à la moitié des présentations des codes (06/11 coïncidence je ne crois pas) et si j'ai réussi à garder à peu près le rythme depuis mon retour en ligne, je sens qu'avec l'été qui arrive, cela va être plus compliqué et je ne pense pas que je pourrais garder ce rythme. Il me reste 1 ou 2 projets à peu près présentables mais il y a encore un peu de boulot pour les derniers. Donc, pas d'inquiétude si je suis plus discret les prochaines semaines !

Je vous ai déjà parlé avec KrISS tuto d'un petit cours sur la compression de données où je présente les algorithmes classiques de compression sans perte (Huffman, Huffman adaptatif, le codage arithmétique, rle, lz77, lz78, lzw).

Pour la partie pratique, j'ai eu du mal à trouver des algorithmes qui fonctionnaient bien et qui permettaient d'illustrer ce que je montrais en cours. J'ai utilisé un temps https://sourceforge.net/projects/compressions/ mais la compilation n'était pas toujours simple et j'ai donc cherché des versions python que j'ai regroupé dans KrIIS lldc. C'est vraiment à but pédagogique et je ne vous invite pas à utiliser ce code pour compresser de vrais fichiers ! Personnellement je ne le ferai pas.

J'ai uniformisé l'usage des algorithmes et ajouté un petit bout de code pour le codage binaire du résultat. Les ordinateurs stockent l'information avec des octets (8 bits) mais quand on a besoin de stocker un nombre de bits précis qui n'est pas multiple de 8 c'est un peu compliqué, il faut trouver une méthode pour arriver à relire le résultat. J'imagine qu'il y a une solution existante mais je n'ai pas vraiment cherché et je me suis dit qu'il suffisait d'utiliser les 3 derniers bits d'un octet pour savoir combien de bits sont à supprimer.

"0": "00000100"
"1": "10000100",
"01": "01000011",
"010": "01000010",
"0110": "01100001",
"01110": "01110000",
"011110": "0111100000000111",
"0111110": "0111110000000110",
"01111110": "0111111000000101",
"011111110": "0111111100000100"

Il suffit de prendre les 3 derniers bits par exemple pour "0111110000000110" on a "110" ce qui donne 6 en décimal. On supprime donc les 3+6 derniers bits et on retrouve "0111110" qu'on voulait stocker à l'origine.

6 : KrISS lldc

dimanche 11 juin 2023 à 13:06
Nous voilà à la moitié des présentations des codes (06/11 coïncidence je ne crois pas) et si j'ai réussi à garder à peu près le rythme depuis mon retour en ligne, je sens qu'avec l'été qui arrive, cela va être plus compliqué et je ne pense pas que je pourrais garder ce rythme. Il me reste 1 ou 2 projets à peu près présentables mais il y a encore un peu de boulot pour les derniers. Donc, pas d'inquiétude si je suis plus discret les prochaines semaines !

Je vous ai déjà parlé avec KrISS tuto d'un petit cours sur la compression de données où je présente les algorithmes classiques de compression sans perte (Huffman, Huffman adaptatif, le codage arithmétique, rle, lz77, lz78, lzw).

Pour la partie pratique, j'ai eu du mal à trouver des algorithmes qui fonctionnaient bien et qui permettaient d'illustrer ce que je montrais en cours. J'ai utilisé un temps https://sourceforge.net/projects/compressions/ mais la compilation n'était pas toujours simple et j'ai donc cherché des versions python que j'ai regroupé dans KrIIS lldc. C'est vraiment à but pédagogique et je ne vous invite pas à utiliser ce code pour compresser de vrais fichiers ! Personnellement je ne le ferai pas.

J'ai uniformisé l'usage des algorithmes et ajouté un petit bout de code pour le codage binaire du résultat. Les ordinateurs stockent l'information avec des octets (8 bits) mais quand on a besoin de stocker un nombre de bits précis qui n'est pas multiple de 8 c'est un peu compliqué, il faut trouver une méthode pour arriver à relire le résultat. J'imagine qu'il y a une solution existante mais je n'ai pas vraiment cherché et je me suis dit qu'il suffisait d'utiliser les 3 derniers bits d'un octet pour savoir combien de bits sont à supprimer.

"0": "00000100"
"1": "10000100",
"01": "01000011",
"010": "01000010",
"0110": "01100001",
"01110": "01110000",
"011110": "0111100000000111",
"0111110": "0111110000000110",
"01111110": "0111111000000101",
"011111110": "0111111100000100"

Il suffit de prendre les 3 derniers bits par exemple pour "0111110000000110" on a "110" ce qui donne 6 en décimal. On supprime donc les 3+6 derniers bits et on retrouve "0111110" qu'on voulait stocker à l'origine.

5 : KrISS json

vendredi 26 mai 2023 à 14:00
Je vous ai dit que j'avais exploré la programmation fonctionnelle avec KrISS aaaa : middleware et il y a quelques années j'ai voulu testé cette même approche pour l'utilisation de schémas json https://json-schema.org

Le résultat final est plutôt chouette :

tests suite: nb tests nb files
draft3: 520/520 35/35
draft4: 735/735 38/38
draft6: 995/995 48/48
draft7: 1286/1286 57/57
draft2019-09: 1571/1651 59/68
draft2020-12: 1579/1677 58/68
draft-next: 1623/1724 58/68

C'était il y a quelques temps et j'ai dû faire 2/3 modifications pour valider les mises à jours des tests fournis par https://github.com/json-schema-org/JSON-Schema-Test-Suite pour continuer à valider les premiers drafts comme à l'époque où j'avais codé ça.

S'il n'y a qu'un seul fichier à regarder c'est la validation des URI/IRI à partir de la RFC
https://github.com/tontof/kriss_json/blob/main/schema/core/inc/rfc.php

Les validations proposées par PHP ne fonctionnaient pas pour tous les tests, j'ai donc dû lire un peu les RFC pour arriver à la validation de tous les tests. C'est à faire au moins une fois dans sa vie...

Pour valider un schéma json, il suffit d'inclure le fichier "json.php" et d'appeler la fonction "json_schema"

<?php 
include_once(__DIR__ '/schema/json.php');

$json 'https://json-schema.org/learn/examples/address.schema.json';
$address file_get_contents($json);

$data '
{
  "locality":"locality",
  "region":"region"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name",
  "post-office-box":"post-office-box"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name",
  "post-office-box":"post-office-box",
  "street-address":"street-address"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));
 
?>

Ce qui donne comme attendu :

bool(false)
bool(true)
bool(false)
bool(true)

En pratique, je vous invite à utiliser une approche plus classique https://json-schema.org/implementations.html#validator-php mais KrISS json reste intéressant de par son approche fonctionnelle

5 : KrISS json

vendredi 26 mai 2023 à 14:00
Je vous ai dit que j'avais exploré la programmation fonctionnelle avec KrISS aaaa : middleware et il y a quelques années j'ai voulu testé cette même approche pour l'utilisation de schémas json https://json-schema.org

Le résultat final est plutôt chouette :

tests suite: nb tests nb files
draft3: 520/520 35/35
draft4: 735/735 38/38
draft6: 995/995 48/48
draft7: 1286/1286 57/57
draft2019-09: 1571/1651 59/68
draft2020-12: 1579/1677 58/68
draft-next: 1623/1724 58/68

C'était il y a quelques temps et j'ai dû faire 2/3 modifications pour valider les mises à jours des tests fournis par https://github.com/json-schema-org/JSON-Schema-Test-Suite pour continuer à valider les premiers drafts comme à l'époque où j'avais codé ça.

S'il n'y a qu'un seul fichier à regarder c'est la validation des URI/IRI à partir de la RFC
https://github.com/tontof/kriss_json/blob/main/schema/core/inc/rfc.php

Les validations proposées par PHP ne fonctionnaient pas pour tous les tests, j'ai donc dû lire un peu les RFC pour arriver à la validation de tous les tests. C'est à faire au moins une fois dans sa vie...

Pour valider un schéma json, il suffit d'inclure le fichier "json.php" et d'appeler la fonction "json_schema"

<?php 
include_once(__DIR__ '/schema/json.php');

$json 'https://json-schema.org/learn/examples/address.schema.json';
$address file_get_contents($json);

$data '
{
  "locality":"locality",
  "region":"region"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name",
  "post-office-box":"post-office-box"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));

$data '
{
  "locality":"locality",
  "region":"region",
  "country-name":"country-name",
  "post-office-box":"post-office-box",
  "street-address":"street-address"
}
'
;
var_dump(json_schema(json_decode($address), json_decode($data)));
 
?>

Ce qui donne comme attendu :

bool(false)
bool(true)
bool(false)
bool(true)

En pratique, je vous invite à utiliser une approche plus classique https://json-schema.org/implementations.html#validator-php mais KrISS json reste intéressant de par son approche fonctionnelle