Compare commits
7 Commits
7fab51a2f6
...
deb9a422b2
Author | SHA1 | Date |
---|---|---|
Julien Palard | deb9a422b2 | |
Julien Palard | c4db791044 | |
Julien Palard | b8824774ce | |
Julien Palard | 8e886174c1 | |
Julien Palard | 007b693bc1 | |
Julien Palard | b20ceb9036 | |
Julien Palard | f3d720ede6 |
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: How I use bash
|
||||
Date: 2021-06-04 06:20:00
|
||||
Summary: This is how I use bash, as I presented it at « En attendant la PyCon Fr ».
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: How to install any distrib on a Gandi VPS
|
||||
Date: 2021-11-18 08:51:00
|
||||
Summary: I needed to install BBB, which requires Ubuntu 18.0.4, but they only had Ubuntu 20.0.4...
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: HackInScience hits 10k solved exercices per month!
|
||||
Date: 2021-06-04 18:16:00
|
||||
Summary: HackInScience is my litlle side-project to teach Python at scale. Last month, ~1000 persons solved ~10k exercices on it.
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: Finding a lost iPhone owner, the hard way
|
||||
Date: 2022-06-07 11:39:00
|
||||
Summary: My parents found an iPhone, couldn't locate its owner. What I tried next.
|
||||
---
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: Releasing pipe v2.0
|
||||
Date: 2022-05-23 09:31:00
|
||||
Summary: Introducing partially parametrized pipes!
|
||||
---
|
||||
|
||||
|
|
|
@ -0,0 +1,89 @@
|
|||
Lang: en
|
||||
Slug: black-screen-at-boot-on-my-pinephone
|
||||
Summary: My phone was no longer booting…
|
||||
Title: Black screen at boot on my PinePhone
|
||||
|
||||
OK so today my [PinePhone](https://fr.wikipedia.org/wiki/PinePhone)
|
||||
does no longer boot, it goes like this:
|
||||
|
||||
- Press power button to boot it,
|
||||
- type rootfs passphrase (I use full disk encryption),
|
||||
- Mobian "spash screen" for a short time,
|
||||
- black screen, and that's it.
|
||||
|
||||
My first bet was a graphical issue due to a recent upgrade ("sweet"
|
||||
memories of Ubuntu failing to start its X server after almost any
|
||||
upgrade...) so I try to ssh to it first... "no route to host", damned!
|
||||
It don't have its IP yet so it failed before network setup.
|
||||
|
||||
But it's a PinePhone, and it runs
|
||||
[Mobian](https://mobian-project.org/), a Debian for mobiles, so I'm
|
||||
not in the dark, let's read the boot logs first before going down the
|
||||
rabbit hole of connecting a UART on the jack port to debug it over
|
||||
serial:
|
||||
|
||||
- Press power button,
|
||||
- type rootfs passphrase again,
|
||||
- press a volume button to get rid of the Mobian splash to see logs
|
||||
|
||||
```text
|
||||
The root filesystem on /dev/mapper/calamares_crypt requires a manual fsck
|
||||
```
|
||||
|
||||
OK!
|
||||
|
||||
Looks easy, but without a keyboard? Let's mount the
|
||||
[eMMC](https://en.wikipedia.org/wiki/MultiMediaCard#eMMC) over USB!
|
||||
|
||||
As my phone boots using [Tow-Boot](https://tow-boot.org/) it's easy:
|
||||
|
||||
- Shut it down (~8s on the power button).
|
||||
- Plug it to laptop with a USB-C cable.
|
||||
- Make it enter "USB Mass Storage mode" (by holding the
|
||||
volume up button at startup before and during the second
|
||||
vibration).
|
||||
- Instantly my laptop sees it and udisks auto mounts it, gnome asks
|
||||
for main partition passphrase to mount it too, nice!
|
||||
- Boom, it disappears... and on `journalctl -e` I see `usb 1-5: device
|
||||
descriptor read/64, error -71` ... `I/O error, dev sda` ...
|
||||
|
||||
At this point I think there's just two options: either my USB-C cable
|
||||
was badly plugged, or my eMMC is dead. I vote for the USB-C cable
|
||||
issue and try again.
|
||||
|
||||
- Rebooting phone in USB mass storage mode again, but this time
|
||||
without giving my passphrase to avoid automount: it
|
||||
needs an fsck anyway.
|
||||
- I can browse `/media/mdk/boot` and see no read error in `sudo journalctl -f`.
|
||||
- `sudo fdisk -l /dev/sda` sees ~30GiB and both partitions.
|
||||
|
||||
|
||||
I use encryption so to fsck the root partition, I have to use `cryptsetup` first:
|
||||
|
||||
```bash
|
||||
$ sudo cryptsetup open /dev/sda2 mobian # it asks for my passphrase
|
||||
$ file /dev/mapper/mobian # That's the unencrypted view of my partition
|
||||
/dev/mapper/mobian: symbolic link to ../dm-0
|
||||
$ sudo fdisk -l /dev/mapper/mobian # Just out of curiosity
|
||||
Disk /dev/mapper/mobian : 28.47 GiB, 30574379008 octets, 59715584 secteurs
|
||||
$ sudo fsck /dev/mapper/mobian # Running fsck manually!
|
||||
fsck from util-linux 2.38.1
|
||||
e2fsck 1.46.6-rc1 (12-Sep-2022)
|
||||
root contains a file system with errors, check forced.
|
||||
[many many errors]
|
||||
$ sudo mount /dev/mapper/mobian /mnt # To check if it works
|
||||
$ ls /mnt # Yeah!
|
||||
bin boot dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var
|
||||
$ sudo umount /mnt
|
||||
$ sudo cryptsetup close mobian
|
||||
```
|
||||
|
||||
It looks OK, let's reboot the phone...
|
||||
|
||||
It works!!!
|
||||
|
||||
I know, your grandma would not be able to do fix it that way (mine
|
||||
neither), but I'm still very happy to be able to fix my phone myself
|
||||
when it has issues.
|
||||
|
||||
What would people do when a phone does no longer boot? Buy another?
|
|
@ -1,90 +1,91 @@
|
|||
---
|
||||
Title: Black screen at boot on my PinePhone
|
||||
Date: 2023-01-13 09:33:00
|
||||
Summary: My phone was no longer booting…
|
||||
---
|
||||
Lang: fr
|
||||
Slug: black-screen-at-boot-on-my-pinephone
|
||||
Summary: OK, aujourd’hui mon [PinePhone](https://fr.wikipedia.org/wiki/PinePhone) ne boot plus.
|
||||
Title: Écran noir au démarrage de mon PinePhone
|
||||
|
||||
OK so today my [PinePhone](https://fr.wikipedia.org/wiki/PinePhone)
|
||||
does no longer boot, it goes like this:
|
||||
OK, aujourd’hui mon [PinePhone](https://fr.wikipedia.org/wiki/PinePhone)
|
||||
ne boot plus. Ça me fait ça :
|
||||
|
||||
- Press power button to boot it,
|
||||
- type rootfs passphrase (I use full disk encryption),
|
||||
- Mobian "spash screen" for a short time,
|
||||
- black screen, and that's it.
|
||||
- J’appuie sur le bouton pour le démarrer,
|
||||
- je lui donne la passephrase pour déchiffrer la partition,
|
||||
- J’ai le joli logo « Mobian » pendant quelques instants,
|
||||
- Et boom, écran noir, terminé.
|
||||
|
||||
My first bet was a graphical issue due to a recent upgrade ("sweet"
|
||||
memories of Ubuntu failing to start its X server after almost any
|
||||
upgrade...) so I try to ssh to it first... "no route to host", damned!
|
||||
It don't have its IP yet so it failed before network setup.
|
||||
Je parie d’abord que c’est un problème graphique dû à une mise à jour
|
||||
récente. Ça me rappelle l’époque où j’ai cru bon de mettre une Ubuntu
|
||||
sur la machine de ma maman : à chaque mise à jour le serveur X ne
|
||||
démarrait plus. Vous vous souvenez de la blague « C’est quoi un Ubuntu
|
||||
Server ? C’est un Ubuntu Desktop avec le serveur X qui ne démarre
|
||||
pas ! » ?
|
||||
|
||||
But it's a PinePhone, and it runs
|
||||
[Mobian](https://mobian-project.org/), a Debian for mobiles, so I'm
|
||||
not in the dark, let's read the boot logs first before going down the
|
||||
rabbit hole of connecting a UART on the jack port to debug it over
|
||||
serial:
|
||||
Si mon pari est bon, j’ai juste à me `ssh`… « `no route to host` », damned !
|
||||
|
||||
- Press power button,
|
||||
- type rootfs passphrase again,
|
||||
- press a volume button to get rid of the Mobian splash to see logs
|
||||
Donc il plante **avant** d’avoir configuré son interface réseau.
|
||||
|
||||
Mais c’est un PinePhone, avec [Mobian](https://mobian-project.org/)
|
||||
(une Debian avec deux-trois patch pour mobiles), donc je sais que je
|
||||
vais m’en sortir, commencons simplement par lire les logs avant de
|
||||
suivre le lapin blanc et de plonger au fond du terrier de
|
||||
l’UART-over-jack…
|
||||
|
||||
- J’appuie sur le bouton « power » pour le démarrer,
|
||||
- je lui donne sa passephrase à nouveau,
|
||||
- et j’appuie sur un bouton de « volume » : comme sur une Debian, l’appui d’une touche chasse le « splash screen » et laisse lire les logs :
|
||||
|
||||
```text
|
||||
The root filesystem on /dev/mapper/calamares_crypt requires a manual fsck
|
||||
```
|
||||
|
||||
OK!
|
||||
OK ! Facile. Mais sans clavier ?
|
||||
|
||||
Looks easy, but without a keyboard? Let's mount the
|
||||
[eMMC](https://en.wikipedia.org/wiki/MultiMediaCard#eMMC) over USB!
|
||||
C’est le moment de monter l’[eMMC](https://en.wikipedia.org/wiki/MultiMediaCard#eMMC) via USB !
|
||||
|
||||
As my phone boots using [Tow-Boot](https://tow-boot.org/) it's easy:
|
||||
Mon téléphone démarre avec [Tow-Boot](https://tow-boot.org/), exposer la MMC via USB c’est facile :
|
||||
|
||||
- Shut it down (~8s on the power button).
|
||||
- Plug it to laptop with a USB-C cable.
|
||||
- Make it enter "USB Mass Storage mode" (by holding the
|
||||
volume up button at startup before and during the second
|
||||
vibration).
|
||||
- Instantly my laptop sees it and udisks auto mounts it, gnome asks
|
||||
for main partition passphrase to mount it too, nice!
|
||||
- Boom, it disappears... and on `journalctl -e` I see `usb 1-5: device
|
||||
descriptor read/64, error -71` ... `I/O error, dev sda` ...
|
||||
- Je l’éteins (~8s sur le bouton power).
|
||||
- Je le branche à mon ordinateur portable avec un câble USB-C.
|
||||
- Je le démarre en mode « USB Mass Storage » (en maintenant « volume up » enfoncé au démarrage jusqu’à la 2 vibration).
|
||||
- Instantanément mon ordinateur portable détecte un nouveau périphérique USB, `udisks` veut le monter, `Gnome` me demande la passephrase, `udisks` monte les deux partitions : que j’aime quand tout roule !
|
||||
- Boom, tout disparaît. Un coup d’œil à `journalctl -e` : `usb 1-5: device
|
||||
descriptor read/64, error -71` ... `I/O error, dev sda`…
|
||||
|
||||
At this point I think there's just two options: either my USB-C cable
|
||||
was badly plugged, or my eMMC is dead. I vote for the USB-C cable
|
||||
issue and try again.
|
||||
Donc là soit mon câble USB-C est mal branché ou mal en point, soit ma
|
||||
MMC est morte. Je vais parier pour le câble (c’est plus facile à résoudre).
|
||||
|
||||
- Rebooting phone in USB mass storage mode again, but this time
|
||||
without giving my passphrase to avoid automount: it
|
||||
needs an fsck anyway.
|
||||
- I can browse `/media/mdk/boot` and see no read error in `sudo journalctl -f`.
|
||||
- `sudo fdisk -l /dev/sda` sees ~30GiB and both partitions.
|
||||
- Redémarrage du téléphonne en mode « USB Mass Storage »
|
||||
- Je ne donne pas la passephrase à Gnome cette fois, de toutes façons on a besoin de lui passer un `fsck`, pas de le monter.
|
||||
- Un petit `ls` dans `/media/mdk/boot`, pas de `read error` dans `sudo journalctl -f`, rassurant.
|
||||
- `sudo fdisk -l /dev/sda` m’annonce ~30GiB et les deux paritions, rassurant.
|
||||
|
||||
|
||||
I use encryption so to fsck the root partition, I have to use `cryptsetup` first:
|
||||
Vu que la partition est chiffrée j’ai besoin de la déchiffrer (sans la
|
||||
monter) **avant** de passer le **fsck**, à coup de `cryptsetup` :
|
||||
|
||||
```bash
|
||||
$ sudo cryptsetup open /dev/sda2 mobian # it asks for my passphrase
|
||||
$ file /dev/mapper/mobian # That's the unencrypted view of my partition
|
||||
$ sudo cryptsetup open /dev/sda2 mobian # ça me demande ma passphrase
|
||||
$ file /dev/mapper/mobian # Ça c’est la « vue » déchiffrée de la partition
|
||||
/dev/mapper/mobian: symbolic link to ../dm-0
|
||||
$ sudo fdisk -l /dev/mapper/mobian # Just out of curiosity
|
||||
$ sudo fdisk -l /dev/mapper/mobian # Je suis curieux, et j’ai besoin d’être rassuré
|
||||
Disk /dev/mapper/mobian : 28.47 GiB, 30574379008 octets, 59715584 secteurs
|
||||
$ sudo fsck /dev/mapper/mobian # Running fsck manually!
|
||||
$ sudo fsck /dev/mapper/mobian # On m’a dit d’exécuter `fsck` manuellement, je le fais.
|
||||
fsck from util-linux 2.38.1
|
||||
e2fsck 1.46.6-rc1 (12-Sep-2022)
|
||||
root contains a file system with errors, check forced.
|
||||
[many many errors]
|
||||
$ sudo mount /dev/mapper/mobian /mnt # To check if it works
|
||||
$ ls /mnt # Yeah!
|
||||
[plein plein plein d’erreurs]
|
||||
$ sudo mount /dev/mapper/mobian /mnt # Juste pour me rassurer
|
||||
$ ls /mnt # Youpi !
|
||||
bin boot dev etc home lib lost+found media mnt opt proc root run sbin srv sys tmp usr var
|
||||
$ sudo umount /mnt
|
||||
$ sudo cryptsetup close mobian
|
||||
```
|
||||
|
||||
It looks OK, let's reboot the phone...
|
||||
Ça me semble bon, je reboot le téléphone…
|
||||
|
||||
It works!!!
|
||||
Ça marche !!!
|
||||
|
||||
I know, your grandma would not be able to do fix it that way (mine
|
||||
neither), but I'm still very happy to be able to fix my phone myself
|
||||
when it has issues.
|
||||
Je sais, je sais, ta grand-mère n’aurait pas sû réparer le sien (ma
|
||||
grand-mère non plus), mais je reste très satisfait d’être capable de
|
||||
réparer le mien moi-même : c’est une bonne première étape.
|
||||
|
||||
What would people do when a phone does no longer boot? Buy another?
|
||||
Si j’avais eu un téléphonne d’un GAFA, quelles auraient été mes
|
||||
solutions ? En acheter un autre.
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: A JustInTime class
|
||||
Date: 2008-08-30 00:10:55
|
||||
---
|
||||
|
||||
I discovered in my code a redundant pattern :
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: ashttp: vt100 screen scraping exported over HTTP
|
||||
Date: 2011-08-27 15:08:21
|
||||
---
|
||||
|
||||
Originally written for
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
Lang: en
|
||||
Title: Python coroutines with async and await
|
||||
Date: 2016-06-05
|
||||
|
||||
This is a short introduction of the basic vocabulary and knowledge
|
||||
needed to start with `async` and `await`, we'll go from "scratch", but
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Atelier de traduction de la doc de Python
|
||||
Date: 2017-12-09
|
||||
|
||||
C'est parti, j'ai le GO de la [PSF](https://www.python.org/psf/) et de
|
||||
[NUMA Paris](https://paris.numa.co/), le `9 janvier 2018` on va faire
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Automating GNU screen startup
|
||||
Date: 2011-11-18 00:13:58
|
||||
|
||||
At work I use GNU screen with one window per server (ssh connection),
|
||||
and when I loose my screen, it takes minutes to rebuild the naming and
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: [Bashism] How to generate random number without $RANDOM ?
|
||||
Date: 2011-04-07 14:00:55
|
||||
|
||||
There is a common bashism, that is to use `$RANDOM`. Typically you'll
|
||||
have to remove bashism while rewriting your scripts for dash or sh.
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: C# Using alias directives
|
||||
Date: 2009-03-25 11:49:50
|
||||
|
||||
Just found in section 9.4.1 of the C# language specification: The
|
||||
`using` keyword can be used to alias a namespace or a type name:
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: How to check if a string is valid utf-8
|
||||
Date: 2012-05-17 15:09:44
|
||||
|
||||
Every day (at least) I'm facing a problem: how to check if a string is
|
||||
valid in utf-8 ? So I wrote [a little C program, that I put on my
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Cisco CheatSheet
|
||||
Date: 2008-04-03
|
||||
|
||||
# Misc
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Combinatory logic from scratch
|
||||
Date: 2008-11-28 01:56:32
|
||||
|
||||
Cause it's sooooo sexy, let's speak about Combinatory Logic!
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Compose Key vs Dead Key
|
||||
Date: 2017-07-12
|
||||
|
||||
L'AFNOR à lancé autour de juin 2017 un appel à commentaires à propos
|
||||
de [la normalisation du clavier
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Covariance and Contravariance in C#3
|
||||
Date: 2009-03-09 21:19:51
|
||||
|
||||
A short introduction to Covariance and Contravariance in *C# 3* preparing
|
||||
you to an article about that in *C# 4*. So what is covariance?
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: echo and backslash-escaped caracters / new lines: how to write portable scripts ?
|
||||
Date: 2011-04-08 13:59:45
|
||||
|
||||
While writing shell scripts you are using a lot of `echo` but did you
|
||||
think about portability of this simple statement? Can you say what will
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Emacs: replace tabs with spaces
|
||||
Date: 2011-05-06 18:27:59
|
||||
|
||||
When you want to replace tab with spaces or vice versa don't use `M-%`
|
||||
*(query-replace)* but `M-x tabify` or `M-x untabify`. They work on the
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: emacs: standard input is not a TTY
|
||||
Date: 2011-12-11 13:54:02
|
||||
|
||||
Did you ever tried something like :
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: emacs: Highlighting errors for c, python, and other languages
|
||||
Date: 2011-06-11 13:54:12
|
||||
|
||||
|
||||
**This is a deprecated article about flymake, you should check for
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Numeric arguments in emacs
|
||||
Date: 2011-05-02 15:47:31
|
||||
|
||||
I'm starting an 'emacs trick of the day' sequence with:
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Searching and replacing in emacs
|
||||
Date: 2011-05-03 19:16:16
|
||||
|
||||
Day two of my serie about emacs, about searching and replacing.
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Exclude directories from recursive grep
|
||||
Date: 2008-11-16 16:20:13
|
||||
|
||||
How often are you using grep in subversionned folders like that:
|
||||
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: How APT does its fancy progress bar
|
||||
Date: 2021-10-13 10:12:00
|
||||
Summary: It uses good old VT100 instructions.
|
||||
---
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Howto invoke an event via reflection
|
||||
Date: 2008-08-29 23:14:53
|
||||
|
||||
|
||||
Why this article ? Because of this note found on the MSDN's `EventInfo`
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Integrating google bookmarks in google chrome
|
||||
Date: 2009-04-16 17:56:18
|
||||
|
||||
|
||||
As every developer, you have 42 computers, 8 browsers, and spend a lot
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Javascript Foncteur
|
||||
Date: 2008-05-08 12:43:30
|
||||
|
||||
|
||||
I just discovered, this morning, how to create a Visitor in Javascript:
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Lazy Loading in php with spl_autload
|
||||
Date: 2008-11-16 20:40:44
|
||||
|
||||
Today, a very short post about the lazy loading in PHP: `spl_autoload`.
|
||||
I'll not expose everything about it here, cause it's already done here:
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: nfsmount: rpc failed: 2
|
||||
Date: 2011-04-18 14:45:03
|
||||
|
||||
|
||||
For those, here on the internet, asking themselves what is this fscking
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Pipe: Infix syntax for Python
|
||||
Date: 2011-03-28 20:18:24
|
||||
|
||||
Pipe is a Python module enabling infix syntax in Python. For those
|
||||
asking "Why ?" let's take an example: Compare the readability of the
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Post data lost on 301 Moved Permanently
|
||||
Date: 2009-05-15 12:50:05
|
||||
|
||||
What the hell with 301 Moved Permanently HTTP header!? I'll take an
|
||||
exemple to explain my ugly problem, take, a (very ugly cause it's PHP)
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: La PyCon Fr 2018 approche !
|
||||
Date: 2018-06-10
|
||||
|
||||
La [PyCON Fr 2018](https://www.pycon.fr/2018/) c'est dans 4 mois, mine
|
||||
de rien c'est pas si loin, c'est le moment de l'ajouter sur son
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Python Documentation Translation
|
||||
Date: 2017-05-29
|
||||
|
||||
This is an overview of what is done, what we're doing, and what's
|
||||
needs work about the translation of Python documentation.
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Python: Introducing ppipe : Parallel Pipe
|
||||
Date: 2011-04-15 14:07:47
|
||||
|
||||
> /!\ this was highly experimental code written in 2011.
|
||||
> Today you should _NOT_ use it, just look at it if the subject amuses you.
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Python Translation Workshop 3
|
||||
Date: 2018-09-12
|
||||
|
||||
I'm organizing a 3rd workshop to translate the Python Documentation on 2018-09-20!!!
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Python: Consulting PEPs from command line, while being offline
|
||||
Date: 2011-04-13 14:20:11
|
||||
|
||||
One day I wished I could read PEPs in the tube on my laptop... so I
|
||||
searched for a convenient way to do so, and I didn't found ... So I
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: Reversing a coffee machine key
|
||||
Date: 2021-05-07 12:12:55
|
||||
Summary: At $DAYJOB, a long time ago, we had big a coffee machine allowing us to store money in NFC keys…
|
||||
---
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: squid: (101) Network is unreachable when DNS returns IPv6
|
||||
Date: 2011-06-24 17:32:38
|
||||
|
||||
If you have a Squid proxy configured on a machine that have no IPv6
|
||||
connectivity, and try to reach an IPv6 compatible site, you squid will
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: The art of Events
|
||||
Date: 2008-08-29 23:32:55
|
||||
|
||||
The art of using events to build more independent classes. /\* Found a
|
||||
better example \*/ Imagine you have a class A and a class B. A builds B,
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: The ?? operator aka the Null Coalescing Operator
|
||||
Date: 2008-11-23 18:01:40
|
||||
---
|
||||
|
||||
If are familiar to the use of ternary operators, you must have
|
||||
|
|
|
@ -1,6 +1,5 @@
|
|||
---
|
||||
Title: YAUIB : Yet another useless IRC Bot !
|
||||
Date: 2011-03-27 23:40:58
|
||||
---
|
||||
|
||||
After 2 years of... non blogging... I'm back! This time I stopped C\#
|
||||
|
|
|
@ -1,5 +0,0 @@
|
|||
Title: About Julien
|
||||
Date: 2008-08-14 19:25:52
|
||||
status: hidden
|
||||
|
||||
Just check out [mdk.fr](mdk.fr)!
|
|
@ -1,5 +1,4 @@
|
|||
Title: Bookmarks
|
||||
Date: 2021-05-05 15:21:00
|
||||
|
||||
|
||||
# Internet & HTTP
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
Title: Trainings
|
||||
Slug: formations
|
||||
Lang: en
|
||||
|
||||
Python developer since 2009, Python trainer since 2015, I teach the following trainings:
|
||||
|
||||
- [Python introduction]({filename}/pages/python-initiation.md)
|
||||
- [Advanced Python]({filename}/pages/python-avancé.md)
|
||||
|
||||
Interested? Shoot me an email: [julien@palard.fr](mailto:julien@palard.fr).
|
|
@ -1,5 +1,6 @@
|
|||
Title: Formations
|
||||
Date: 2023-01-17 15:41:00
|
||||
Slug: formations
|
||||
Lang: fr
|
||||
|
||||
Développeur Python depuis 2009, formateur Python depuis 2015, je
|
||||
propose ces formations :
|
||||
|
@ -7,4 +8,4 @@ propose ces formations :
|
|||
- [Python initiation]({filename}/pages/python-initiation.md)
|
||||
- [Python avancé]({filename}/pages/python-avancé.md)
|
||||
|
||||
Intéressés ? Contactez-moi par email : julien at palard.fr.
|
||||
Intéressés ? Contactez-moi par email : [julien@palard.fr](mailto:julien@palard.fr).
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: GPG
|
||||
Date: 2021-04-27 21:26:00
|
||||
|
||||
# My GPG keys
|
||||
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Julien Palard
|
||||
Date: 2016-05-28
|
||||
description: Julien Palard - mdk.fr
|
||||
status: hidden
|
||||
lang: en
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
Title: Julien Palard
|
||||
Date: 2016-05-28
|
||||
description: Julien Palard - mdk.fr
|
||||
status: hidden
|
||||
lang: fr
|
||||
|
|
|
@ -0,0 +1,57 @@
|
|||
Lang: en
|
||||
Slug: python-avance
|
||||
Title: Advanced Python
|
||||
|
||||
That's the last of my two Python trainings. While the [introduction
|
||||
training]({filename}/pages/python-initiation.md) covers using classes
|
||||
and libraries to create simple programs, this training focuses on the
|
||||
art of creating classes and libraries to build reusable chunks in
|
||||
arbitrary complex software.
|
||||
|
||||
|
||||
## Goals
|
||||
|
||||
At the end of this training, one is able to produce *readable*,
|
||||
*maintainable*, and *tested* code on any kind of project.
|
||||
|
||||
Focus is set on sharing and reusing code:
|
||||
|
||||
- Creating libraries (modules, packages).
|
||||
- Packaging and distributing libraries.
|
||||
- Managing dependencies in libraries and in projects.
|
||||
- Tests and documentation.
|
||||
|
||||
|
||||
## Prerequisites
|
||||
|
||||
The pre-requisite to follow this training is either to have followed
|
||||
the [Python Introduction]({filename}/pages/python-initiation.md) one,
|
||||
or have an equivalent level, that is: be able to read and modify
|
||||
Python code, be able to write Python code to solve a given problem
|
||||
from scratch.
|
||||
|
||||
## Content
|
||||
|
||||
- Python protocols (iteration protocol, any "dunder", …).
|
||||
- Classes and their instances (where we speak about the MRO and `super()`).
|
||||
- The descriptor protocol.
|
||||
- The *garbage collector*.
|
||||
- IEEE 754 *floats*, knowing their limits.
|
||||
- Create, raise, and handle exception. `try`'s `else` and `finally`.
|
||||
- Context managers.
|
||||
- Decorators.
|
||||
- List comprehensions.
|
||||
- The Walrus Operator (`:=`).
|
||||
- String encodings.
|
||||
- Packaging using `pyproject.toml`, `python -m build`, `twine`, …
|
||||
- Asynchronous Python with `async` and `await`.
|
||||
|
||||
|
||||
## Duration
|
||||
|
||||
This training best spam over five days, but I'm acustomed to give a 3 day version of it too.
|
||||
|
||||
|
||||
## Contact
|
||||
|
||||
To know more, please shoot me an email at [julien@palard.fr](mailto:julien@palard.fr).
|
|
@ -1,5 +1,6 @@
|
|||
Lang: fr
|
||||
Slug: python-avance
|
||||
Title: Python avancé
|
||||
Date: 2023-01-17 15:41:00
|
||||
|
||||
C’est la seconde de mes deux formations Python. Alors que la
|
||||
[formation *initiation*]({filename}/pages/python-initiation.md)
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
Lang: en
|
||||
Slug: python-initiation
|
||||
Title: Python introduction
|
||||
|
||||
This is the first one of my two Python trainings, it has no prerequisites.
|
||||
|
||||
|
||||
## Goals
|
||||
|
||||
At the end for this trainings, trainees are know the Python basics and
|
||||
are able to write simple software, maintain it, and modify existing
|
||||
software.
|
||||
|
||||
- Implement a simple program resolving a well defined task.
|
||||
- Read, understand, and modify Python code written by someone else.
|
||||
- Redact tests.
|
||||
|
||||
|
||||
## Content
|
||||
|
||||
- Builtin types (`bool`, `int`, `float`, `str`, …)
|
||||
- Operators
|
||||
- Variables
|
||||
- Functions
|
||||
- Instructions (`for`, `if`, `while`, …)
|
||||
- Methods
|
||||
- List comprehensions
|
||||
- Slices
|
||||
- Classes
|
||||
- `pip` and `venvs`
|
||||
- Packaging Python
|
||||
- Good habits
|
||||
|
||||
|
||||
## Duration
|
||||
|
||||
This training spans on three days, ideally.
|
||||
|
||||
|
||||
## Contact
|
||||
|
||||
To know more, please shoot me an email at [julien@palard.fr](mailto:julien@palard.fr).
|
|
@ -1,5 +1,6 @@
|
|||
Title: Python initiation
|
||||
Date: 2023-01-17 15:41:00
|
||||
Slug: python-initiation
|
||||
Lang: fr
|
||||
|
||||
C’est la première des deux formations Python que je propose,
|
||||
accessible sans prérequis.
|
||||
|
|
|
@ -0,0 +1,55 @@
|
|||
Title: Talks
|
||||
Slug: talks
|
||||
Lang: en
|
||||
|
||||
- 2022-11-26:
|
||||
[Campus du Libre](https://www.campus-du-libre.org/): HackInScience demo
|
||||
[video (fr)](https://bbb.afpy.org/playback/presentation/2.3/62dfb87e2dfcc5d2947bceb86a2324d10dfdd55b-1669457837244),
|
||||
[slides (fr)](https://mdk.fr/hkis-au-campus-du-libre).
|
||||
|
||||
- 2021-04-15:
|
||||
[AFPy](https://discuss.afpy.org/t/en-attendant-la-pyconfr-du-15-avril-2021/222/3): Bash — tips and tricks
|
||||
[video (fr)](https://bbb.afpy.org/playback/presentation/2.0/playback.html?meetingId=fb67608c847ace007f60e5b9fa6917ff7040b495-1618502029253).
|
||||
|
||||
- 2021-01-13:
|
||||
[AFPy](https://discuss.afpy.org/t/calendrier-de-lafpy/64/12): Packaging without setup.py
|
||||
[slides (fr)](https://julienpalard.frama.io/atelier-packaging/).
|
||||
|
||||
- 2020-12-09:
|
||||
[AFPy](https://discuss.afpy.org/t/calendrier-de-lafpy/64/12): Python Performance Workshop
|
||||
[slides (fr)](https://julienpalard.frama.io/atelier-perf/perf.html),
|
||||
[video (fr)](https://pyvideo.org/en-attendant-la-pyconfr-2020-2021/performances-de-python.html).
|
||||
|
||||
- 2019-06-13:
|
||||
[Write The Docs Paris](https://www.meetup.com/Write-the-Docs-Paris/): Translating the Python documentation
|
||||
[slides](https://julienpalard.frama.io/write-the-docs-paris-19/),
|
||||
[video (fr)](https://mzl.la/write-the-docs-2019-06-13).
|
||||
|
||||
- 2019-05-22:
|
||||
[Paris.py #19](https://www.meetup.com/Paris-py-Python-Django-friends/events/260875730/):
|
||||
Feedback about 2019 US PyCon
|
||||
[slides (fr)](https://julienpalard.frama.io/paris.py-19/).
|
||||
|
||||
- 2018-12-18:
|
||||
[Paris.py #16](https://www.meetup.com/Paris-py-Python-Django-friends/events/250063967/):
|
||||
hackinscience.org: How we use Python to teach Python.
|
||||
[slides](https://hackinscience.frama.io/paris.py-16/).
|
||||
|
||||
- 2018-10-06:
|
||||
[PyCon FR 2018](https://www.pycon.fr/2018/):
|
||||
The emergence of consensus in the Python community.
|
||||
[video](https://www.youtube.com/watch?v=Zb-LhOLEPg8)
|
||||
|
||||
- 2018-01-14:
|
||||
[Paris.py #14](https://www.meetup.com/Paris-py-Python-Django-friends/events/245495073/):
|
||||
`async` et `await` sans asyncio.
|
||||
[slides](https://mdk.fr/asyncio/), [video (fr)](https://www.youtube.com/watch?v=_LpJ7X8hY-Y).
|
||||
|
||||
- 2017-04-06:
|
||||
[Paris.py #13](https://www.meetup.com/Paris-py-Python-Django-friends/events/238318089/):
|
||||
Traduction de la documentation de Python en français.
|
||||
|
||||
- 2016-10-16:
|
||||
[PyCon FR 2016](https://www.pycon.fr/2016/pages/programme.html#Traduction%20de%20la%20doc%20de%20Python%20et%20l'internationalisation):
|
||||
La traduction de la documentation de Python et l'internationalisation.
|
||||
[video (fr)](https://www.pycon.fr/2016/videos/traduction-de-la-doc-de-python-et-linternationalisation.html).
|
|
@ -1,8 +1,6 @@
|
|||
Title: Talks
|
||||
Date: 2008-08-14 19:25:52
|
||||
status: hidden
|
||||
|
||||
## Past
|
||||
Title: Conférences
|
||||
Slug: talks
|
||||
Lang: fr
|
||||
|
||||
- 2022-11-26:
|
||||
[Campus du Libre](https://www.campus-du-libre.org/): Démo d'HackInScience
|
||||
|
@ -25,7 +23,7 @@ status: hidden
|
|||
- 2019-06-13:
|
||||
[Write The Docs Paris](https://www.meetup.com/Write-the-Docs-Paris/): La traduction de la
|
||||
documentation de Python.
|
||||
[slides](https://julienpalard.frama.io/write-the-docs-paris-19/),
|
||||
[slides (en)](https://julienpalard.frama.io/write-the-docs-paris-19/),
|
||||
[video](https://mzl.la/write-the-docs-2019-06-13).
|
||||
|
||||
- 2019-05-22:
|
||||
|
@ -35,18 +33,18 @@ status: hidden
|
|||
|
||||
- 2018-12-18:
|
||||
[Paris.py #16](https://www.meetup.com/Paris-py-Python-Django-friends/events/250063967/):
|
||||
hackinscience.org: Comment on utilise Python pour enseigner Python.
|
||||
[slides](https://hackinscience.frama.io/paris.py-16/).
|
||||
hackinscience.org: Comment enseigner Python avec Python ?
|
||||
[slides (en)](https://hackinscience.frama.io/paris.py-16/).
|
||||
|
||||
- 2018-10-06:
|
||||
[PyCon FR 2018](https://www.pycon.fr/2018/):
|
||||
The emergence of consensus in the Python community.
|
||||
[video](https://www.youtube.com/watch?v=Zb-LhOLEPg8)
|
||||
[video (en)](https://www.youtube.com/watch?v=Zb-LhOLEPg8)
|
||||
|
||||
- 2018-01-14:
|
||||
[Paris.py #14](https://www.meetup.com/Paris-py-Python-Django-friends/events/245495073/):
|
||||
`async` et `await` sans asyncio.
|
||||
[slides](https://mdk.fr/asyncio/), [video](https://www.youtube.com/watch?v=_LpJ7X8hY-Y).
|
||||
[slides (en)](https://mdk.fr/asyncio/), [video](https://www.youtube.com/watch?v=_LpJ7X8hY-Y).
|
||||
|
||||
- 2017-04-06:
|
||||
[Paris.py #13](https://www.meetup.com/Paris-py-Python-Django-friends/events/238318089/):
|
||||
|
|
|
@ -4,7 +4,7 @@ from datetime import date
|
|||
AUTHOR = "Julien Palard"
|
||||
SITENAME = "mdk.fr"
|
||||
SITETITLE = "Julien Palard"
|
||||
SITESUBTITLE = "Formateur et mentor Python"
|
||||
SITESUBTITLE = "Développeur et formateur Python"
|
||||
SITEURL = ""
|
||||
SITELOGO = "/images/julien.jpg"
|
||||
SITEDESCRIPTION = "Julien Palard, formateur Python"
|
||||
|
@ -38,7 +38,7 @@ SOCIAL = (
|
|||
# Path to Plugins
|
||||
PLUGIN_PATHS = ['pelican-plugins']
|
||||
# Enable i18n plugin, probably you already have some others here.
|
||||
PLUGINS = ['i18n_subsites']
|
||||
PLUGINS = ['i18n_subsites', 'filetime_from_git']
|
||||
# Enable Jinja2 i18n extension used to parse translations.
|
||||
JINJA_ENVIRONMENT = {'extensions': ['jinja2.ext.i18n']}
|
||||
I18N_TEMPLATES_LANG = "en"
|
||||
|
@ -52,11 +52,16 @@ DEFAULT_LANG = "fr_FR"
|
|||
|
||||
I18N_SUBSITES = {
|
||||
'en': {
|
||||
'SITENAME': 'English Julien Palard',
|
||||
'LOCALE': 'en_US',
|
||||
'THEME_STATIC_DIR': '../theme'
|
||||
}
|
||||
'THEME_STATIC_DIR': '../theme',
|
||||
'SITESUBTITLE': "Freelance Python Programmer and Trainer",
|
||||
'MENUITEMS': (
|
||||
("Trainings", "/en/pages/formations.html"),
|
||||
("Talks", "/en/pages/talks.html"),
|
||||
("Articles", "/en/blog/"),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
PATH = "content"
|
||||
|
||||
|
|
|
@ -1,2 +1,3 @@
|
|||
pelican
|
||||
markdown
|
||||
gitpython
|
||||
|
|
Loading…
Reference in New Issue