MOOC, entraides, tutoriels…

Ce poste n’a pas le plus beau titre du monde car je ne savais pas trop quoi mettre.

Pour autant c’est de ça que ça va parler, de mooc, de tutoriels et d’entraide. Peut être un peu de pédagogie, et encore, suis pas un spécialiste, si j’ai pas un tableau pour écire ^^.

Ces derniers temps ont été riches en expériences et en bonne nouvelles pour moi. Entre une association qui me donne un petit boulot, des particuliers qui veulent passer de XP à Linux, mon stage chez Thalès qui va commencer et l’Imagine cup, je dois dire que j’étais comblé.

Mais voilà, “pour le fun” et aussi parce que j’aime pas critiquer des choses que je connais pas, j’ai tenté le MOOC PHP/MYSQL de Openclassrooms.

Continue reading

Les causes de la richesse de DateTime

Il y a peu, je digressais sur les forces de types complexes tels que DateTime en php sur le Timestamp unix. Une des raisons souvent invoquée (et que j’avais présentée comme pourtant peu importante) est que le timestamp est limité à 2038 en limite haute et à 1900 en limite basse (je rappelle : le timestamp est signé).

En php, DateTime est un type plus complexe et donc plus puissant. Mais certains me disaient “c’est inutile, DateTime ne fait qu’encapsuler un timestamp donc c’est plus lourd, plus lent pour juste des cas d’utilisation que les débutants n’utilisent pas”.

Premièrement c’est faux : mon expérience sur le site du zéro m’a montré que les débutants adoraient faire tout ce qui relève aujourd’hui des objet DatePeriod et DateInterval de manière assez crade. Par exemple, j’en trouve un la foi dernière qui veut retirer un mois à une date. Je lui répond : [cci lang=”php”]$taDate->add(new DateInterval(‘P1D’));[/cci]. Et de me faire allumer par un type qui dit qu’il suffit simplement de faire quelque chose type : [cci lang=”php”]strtotime(date("Y-",$time).(date(‘m’,$time)-1).date(‘-d’,$time));[/cci]. Heureusement que I.Jafrezic aka Zazou est venu à ma rescousse et a évangélisé pour DateTime.

Ensuite, d’un point de vue technique, DateTime n’est pas une simple encapsulation. Eh non, c’est bien plus complexe :

  • Le timestamp qu’elle contient est de type int64_t, c’est à dire que peu importe que votre architecture soit 32 ou 64 bits, vous stockez un entier sur 64 bits
  • D’autres champs tels que le jour, mois, année… sont aussi stockés. Le choix a été fait d’utiliser une nouvelle fois un int64_t, je ne sais pas pourquoi, mais sûrement pour éviter les pertes de temps en conversion.
  • Le support du fuseau horaire est ajouté

Voici, pour preuve de ce que j’avance, le code C de la structure à la base de dateTime :

[cc lang=”c”]struct timelib_time {
timelib_sll y, m, d; /* Year, Month, Day */
timelib_sll h, i, s; /* Hour, mInute, Second */
double f; /* Fraction */
int z; /* GMT offset in minutes */
char *tz_abbr; /* Timezone abbreviation (display only) */
timelib_tzinfo *tz_info; /* Timezone structure */
signed int dst; /* Flag if we were parsing a DST zone */
timelib_rel_time relative;

timelib_sll sse; /* Seconds since epoch */

unsigned int have_time, have_date, have_zone, have_relative, have_weeknr_day;

unsigned int sse_uptodate; /* !0 if the sse member is up to date with the date/time members */
unsigned int tim_uptodate; /* !0 if the date/time members are up to date with the sse member */
unsigned int is_localtime; /* 1 if the current struct represents localtime, 0 if it is in GMT */
unsigned int zone_type; /* 1 time offset,
* 3 TimeZone identifier,
* 2 TimeZone abbreviation */
}[/cc]