13 tips pour Python
Une série de 6 articles présentant les outils à mettre en place pour le dev Python en 2020. Au programme:
- pyenv et Poetry pour la version python et les dépendances
- click pour la cli
- requests pour les calls HTTP
- pytest, coverage et nox pour les tests units
- black, flake8 et pre-commit pour le code linting
- mypy pour le static typing (pas utilisé encore)
- sphinx et readthedocs pour la doc
- github actions pour le ci/cd
Beaucoup de bonnes pratiques et de plugins flake8 pour automatiser un max de checks...
La série d'article est aussi accompagnée d'un repo qui met tout en pratique: https://github.com/cjolowicz/hypermodern-python
Si Spotify se retrouve bloqué en plein écran sous linux, éditer le fichier ~/.config/spotify/prefs
ou (~/snap/spotify/current/.config/spotify/prefs
) et supprimer les lignes app.window.position.height
et app.window.position.width
.
Quelques tips pour debugger du code python avec print()
, notamment:
- Debug variables with f-strings and
=
:print(f"{myvar=}")
- Use
locals()
to debug all local variables:print(locals())
- Use
vars()
to debug all of an object’s attributes:print(vars(myobject))
Un script shell interactif pour créer facilement une VM VirtualBox MacOS.
Lors du provisioning d'une image Packer Ubuntu, l'installation de packages échoue parfois avec l'erreur Package 'XXX' has no installation candidate
car le setup cloud-init n'est pas terminé.
La doc Packer recommande d'ajouter la step suivante:
{
"type": "shell",
"inline": [
"while [ ! -f /var/lib/cloud/instance/boot-finished ]; do echo 'Waiting for cloud-init...'; sleep 1; done"
]
}
Il est aussi possible d'utiliser /usr/bin/cloud-init status --wait
(hashicorp/packer#2639).
Un tuto très complet pour apprendre à interagir avec des APIs externes en Python.
Un site qui permet de connaître le pourcentage de PRs mergées pour un repo GitHub donné.
La quasi totalité des livres dont vous êtes le héros disponible en PDF!
When deleting a namespace is stuck in Terminating
state, you can find all resources in this namespace with kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
To write bash one-liner functions, don't forget to add a semi-column at the end of the commands:
$ grep_file() { grep "$@" file; }
Les calendriers partagés Google Calendar ne sont pas synchronisés par défaut sur MacOS/IOS. Pour y accéder, il faut sélectionner explicitement les calendriers ici: https://www.google.com/calendar/syncselect
Une description détaillée des nouveautés de Python 3.9
asdf est un gestionnaire de version universel qui peut remplacer pyenv, rbenv, rvm, sdkman pour gérer les versions de python, ruby, java et bien d'autres languages, mais aussi les versions d'outils comme terrafrom, packer, kubectl...
Pratique pour compresser les PDF lorsqu'on doit envoyer des documents par mail aux administrations mais que celles-ci ont des limites à 10Mb
To save storage space, you can compress a PDF in Preview.
Note: When compressed, the PDF may be of lower quality than the original.
In the Preview app on your Mac, open the PDF, then choose File > Export.
Click the Quartz Filter pop-up menu, then choose Reduce File Size.
Un super tuto pour déployer et utiliser Elasticsearch, Kibana et Metricbeat sur Kubernetes à l'aide des Helm charts Elastic officiels.
Attention, contrairement a ce qui était mentionné à l'origine dans cet article, les Helm charts Elastic be sont pas encore officiellement supporté avec Helm v3. L'utilisation de Helm v2 est donc recommandée.
This article provides a summary of the object storage services of the three biggest cloud providers: AWS, Azure and GCP.
Une bonne explication des différences entre les Helm charts et les opérateurs Kubernetes.
Quelques conseils pour faire des reviews constructives:
- Rephrase your objection as a question
- Avoid hyperbole
- Keep snide comments to yourself
- Engage positively
- Remember that not everybody’s experience is identical to yours
- Don’t diminish the complexity of something that’s not obvious
- Be respectful
- Manage expectations (and your time)
- Say please
- Start a conversation
Une application mobile pour gérer ses clusters k8s depuis son smartphone
InSpec-Iggy permet de générer des règles de compliances InSpec pour les cloud AWS, Azure et GCP à partir de tfstate
Terraform.
Il est possible de générer des règles de compliances incluant le tfstate
Terraform ou l'excluant. Ce derniers cas est intéressant pour vérifier que rien n'est provisionné dans le cloud en dehors de Terraform.
Un ensemble de CRD qui permettent de créer des ressources GCP via des templates kubernetes.
exemple:
apiVersion: sql.cnrm.cloud.google.com/v1beta1
kind: SQLInstance
metadata:
name: my-sql-instance
labels:
cost-center: "cc9"
spec:
databaseVersion: MYSQL_5_7
region: us-central1
settings:
tier: db-f1-micro
Un Space Invaders like pour killer des pods Kubernetes
Procedure pour installer differentes versions d'un logiciel avec brew:
$ git clone git@github.com:Homebrew/homebrew-core.git
$ cd homebrew-core
$ git log master -- Formula/terraform.rb
# retrouver le commit de la version qu'on souhaite installer
$ git checkout <commitid>
$ cd Formula
$ brew unpin terraform
$ brew unlink terraform
$ brew install terraform.rb
$ brew pin terraform
$ brew switch terraform <version>
Pour gérer les versions de Terraform, je préfère utiliser tfenv, mais la procédure est valable pour n'importe quel logiciel installable avec brew.
Comment utiliser git commit --fixup
, git commit --amend
et git rebase -i --autosquash
pour avoir un historique de commits clean avant de soumettre une PR.
Attention, contrairement a l'exemple de l'article, il est fortement déconseillé d'utiliser ces commandes sur la branche master
ou sur une branche sur laquelle on est pas le seul a travailler si l'on a déjà "pushé" les commits. Par ailleurs , Il vaut mieux utiliser git push --force-with-lease
.
Keybase peut gérer les authentifications SSH par Certificate Authorities. Une fois la clé publique de la CA déployée sur un serveur, la commande kssh
permet de se connecter en SSH a un serveur en générant dynamiquement une clé SSH temporaire signée par la CA.
La gestion des accès de fait en fonction des teams keybase de l'utilisateur.
git worktree
permet de travailler sur une branche d'un repo dans un répertoire de travail dédié.
C'est super utile pour éviter de jongler avec les git stash
quand on travaille sur plusieurs branches en //.
Particulièrement quand on a lancé un build local super long en local et qu'on aimerait bien travailler sur une autre branche en attendant que le build termine.
git log --all --grep "pattern"
pour chercher dans les messages de commit git.
Une bonne explication du fonctionnement interne de git et de l'arborescence du répertoire .git
. A noter que la 2ème partie de l'article sur les rebases est également très intéressante.
Dans mon équipe (infra @ elastic), on utilise Logstash pour indexer les évènements de notre organisation GitHub dans Elasticsearch et générer des alertes et dashboards.
Ce post décrit rapidement notre process.
En bonus, il est possible d'utiliser le nouveau chart officiel Logstash développé par mes soins pour déployer Logstash sur K8S (attention ce chart est toujours en bêta).
J'utilise ce lecteur DVD portable pour occuper les enfants pendant les longs trajets en voiture.
Les codecs et formats qu'il peut lire sont assez limités.
Pour convertir des vidéos afin qu'elles soient lisible sur ce lecteur:
ffmpeg -i existing_file.mp4 -vcodec mpeg4 -vtag DX50 -acodec mp3 -s vga new_file.avi
Script jenkins pour supprimer des builds d'un job, quand on a besoin de le faire on est contant de ne pas devoir se taper tout ça à la main :)
Jenkins.instance.getItemByFullName('JobName').builds.findAll { it.number > 10 && it.number < 1717 }.each { it.delete() }
vault -autocomplete-install
pour avoir l'autocompletion de la command line Vault
J'avais loupé cette news mais il est désormais possible de lancer des VM ARM64 sur la Freebox Delta.
Pas encore testé mais c'est super interressant pour qui veut s'autohéberger sans s'équiper d'un serveur @home et dispose d'une connexion suffisante (pas mon cas malheureusement, j'attend avec impatience le jour ou la fibre sera disponible chez moi...).
Quelques limitations connus:
- ARM64 uniquement
- 2 VM maximum
- 2 CPU et 1GB dispo pour les VM
Quel est l'intérêt par rapport à un Raspberry Pi pour une utilisation de type server @home?
- Pas d'hardware supplémentaire
- Pas de problème d'alimentation tatillone
- Pas de problème de corruption de carte SD pour le stockage
- Meilleures perfs disque
- Meilleures perfs CPU (entre 30% et 80% d'après l'article)
- Meilleures perfs réseau
Les commandes pour générer un kubeconfig à partir d'un Service Account K8S.
J'ai créé 2 scripts à partir de ces instructions:
- create-serviceaccount.sh pour générer le serviceaccount
- create-kubeconfig.sh pour générer le kubeconfig
Super utile pour coller des gros logs dans un commentaire GitHub par exemple:
## collapsible markdown?
<details><summary>CLICK ME</summary>
<p>
hidden blocks!
</p>
</details>
AWS EKS gère désormais les node groups de workers en tant que ressources managées (avant il fallait gérer soit même les ASG de workers nodes).
En plus c'est déjà géré par la nouvelle version du provider terraform-aws
Le Getting Started pour utiliser Hammerspoon sur MacOS
What is Hammerspoon?
Hammerspoon is a desktop automation tool for OS X. It bridges various system level APIs into a Lua scripting engine, allowing you to have powerful effects on your system by writing Lua scripts.
C'est super puissant pour controller MacOS.
Quelques examples:
- Déplacer la fenêtre actuelle sur la moitié gauche de l'écran en pressant les touches
Cmd
,alt
,ctrl
et gauche
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Left", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
- Déplacer la fenêtre actuelle sur la moitié droite de l'écran en pressant les touches
Cmd
,alt
,ctrl
et droite
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "Right", function()
local win = hs.window.focusedWindow()
local f = win:frame()
local screen = win:screen()
local max = screen:frame()
f.x = max.x + (max.w / 2)
f.y = max.y
f.w = max.w / 2
f.h = max.h
win:setFrame(f)
end)
- Afficher le titre en écoute sur Spotify en pressant les touches
Cmd
,alt
,ctrl
etS
hs.hotkey.bind({"cmd", "alt", "ctrl"}, "S", function()
hs.spotify.displayCurrentTrack()
end)
MacOS inclut /usr/libexec/java_home
pour configurer JAVA_HOME
:
export JAVA_HOME=$(/usr/libexec/java_home)
Un générateur de "CV" basé sur l'activité publique Github.
Présentation de ClusterAPI qui permet de provisionner depuis un cluster k8s existant (management cluster) d'autres clusters k8s (target clusters) dans le cloud grâce a des CRDs (ex: AWSCluster, MachineDeployment). C'est encore en alpha mais ça a l'air très prometteur.
Un testeur de template Ansible en ligne
Des bonnes pratiques pour optimiser l'utilisation de repos git volumineux avec jenkins (reference repos, shallow clone, sparse checkout...)
Comment troubleshooter un cluster elasticsearch en utilisant l'api _cat
.
Ce post a été écrit il y a 5 ans mais la méthode et les commandes sont toujours d'actualité.
Pour utiliser gcloud
(cli GCP) avec Python3 (>=3.4) au lieu de Python2:
# Use the python3 interpreter on your path
$ export CLOUDSDK_PYTHON=python3
Un générateur de launchd.plist
pour executer des tâches schedulées sur MacOS.
Un plugin Helm qui permet de déclencher un rollback automatique suite à l'upgrade d'une release Helm en fonction d'une query Elasticsearch ou Prometheus
Un simple outils Python en ligne de commande qui reste la taille d'une image Docker et retourne une erreur si celle ci dépasse une taille donnée. A intégrer dans les CI pour s'assurer que les images Docker ne grossissent pas exponentiellement au fil du temps.
Un petit script groovy à lancer sur une instance Jenkins pour trouver l'arbre de dépendences des plugins installés:
def plugins = jenkins.model.Jenkins.instance.getPluginManager().getPlugins()
plugins.each {
println "${it.getShortName()} (${it.getVersion()}) - ${it.getDependencies()}"
}