diff --git a/content/wiki/books/2021.md b/content/wiki/books/2021.md index c8dfd74..16c961e 100644 --- a/content/wiki/books/2021.md +++ b/content/wiki/books/2021.md @@ -1,14 +1,17 @@ --- +id: "2021" +aliases: [] +tags: [] +description: The books I have read in 2021 +lang: FR title: "2021" -description: "The books I have read in 2021" -lang: "FR" --- -* La Zone du Dehors, *Alain Damasio* -* L'éthique, *Spinoza* -* Le sorceleur II, *Andrzej Sapkowski* -* Critique de la Raison Pure, *Emmanuel Kant* (ABORTED) -* Les couilles sur la table, *Victoire Tuaillon* -* Forteresse Digitale, *Dan Brown* +- La Zone du Dehors, _Alain Damasio_ +- L'éthique, _Spinoza_ +- Le sorceleur II, _Andrzej Sapkowski_ +- Critique de la Raison Pure, _Emmanuel Kant_ (Annulé, trop conséquent) +- Les couilles sur la table, _Victoire Tuaillon_ +- Forteresse Digitale, _Dan Brown_ diff --git a/content/wiki/books/2022.md b/content/wiki/books/2022.md index cbb4e6b..69bcbaa 100644 --- a/content/wiki/books/2022.md +++ b/content/wiki/books/2022.md @@ -1,43 +1,46 @@ --- +id: "2022" +aliases: [] +tags: [] +description: The books I have read in 2022 +lang: FR title: "2022" -description: "The books I have read in 2022" -lang: "FR" --- -* Janvier: - * Grimpow, l'élu des Templiers, *Rafael Abalos* - * Intuitio, *Laurent Gounelle* - * Le symbole perdu, *Dan Brown* - * Un bon écrivain est un écrivain mort, *Guillaume Chérel* - * Voyage extraordinaire au centre du cerveau, *Jean-Didier Vincent* - * Deception Point, *Dan Brown* - * Les âmes croisées, *Pierre Bottero* +- Janvier: + - Grimpow, l'élu des Templiers, _Rafael Abalos_ + - Intuitio, _Laurent Gounelle_ + - Le symbole perdu, _Dan Brown_ + - Un bon écrivain est un écrivain mort, _Guillaume Chérel_ + - Voyage extraordinaire au centre du cerveau, _Jean-Didier Vincent_ + - Deception Point, _Dan Brown_ + - Les âmes croisées, _Pierre Bottero_ -* Février: - * Comment j'ai arrêté de manger les animaux, *Hugo Clément* - * Les guerres nous attendent 2030-2060, *Red Team* +- Février: + - Comment j'ai arrêté de manger les animaux, _Hugo Clément_ + - Les guerres nous attendent 2030-2060, _Red Team_ -* Mars: - * Petit Manuel de Résistance Contemporaine, *Cyril Dion* - * L'art d'avoir toujours raison, *Arthur Schopenhauer* +- Mars: + - Petit Manuel de Résistance Contemporaine, _Cyril Dion_ + - L'art d'avoir toujours raison, _Arthur Schopenhauer_ -* Avril: - * Une histoire de l'écologie politique, *Arthur Nazaret* - * Défaire le discours sexiste dans les médias, *Rose Lamy* - * Le Sorceleur, Livre III, Le sang des Elfes, *Andrzej Sapkowski* - * Comme un empire dans un empire, *Alice Zeniter* +- Avril: + - Une histoire de l'écologie politique, _Arthur Nazaret_ + - Défaire le discours sexiste dans les médias, _Rose Lamy_ + - Le Sorceleur, Livre III, Le sang des Elfes, _Andrzej Sapkowski_ + - Comme un empire dans un empire, _Alice Zeniter_ -* Mai: - * La parole est un sport de combat, *Bertrand Périer* +- Mai: + - La parole est un sport de combat, _Bertrand Périer_ -* Juin: - * Un rien peut tout changer, *James Clear* +- Juin: + - Un rien peut tout changer, _James Clear_ -* Septembre: - * Permaculture, le livre pour bien debuter, *Annie Lagueyrie* +- Septembre: + - Permaculture, le livre pour bien debuter, _Annie Lagueyrie_ -* Novembre: - * The Manager Path, *Camille Fournier* +- Novembre: + - The Manager Path, _Camille Fournier_ -* Decembre: - * Permaculture : Le Guide Pour Bien Débuter, *Annie Lagueyrie* +- Decembre: + - Permaculture : Le Guide Pour Bien Débuter, _Annie Lagueyrie_ diff --git a/content/wiki/books/2023.md b/content/wiki/books/2023.md index e9fa7aa..09b3db8 100644 --- a/content/wiki/books/2023.md +++ b/content/wiki/books/2023.md @@ -1,15 +1,17 @@ --- +id: "2023" +aliases: [] +tags: [] +description: The books I have read in 2023 +lang: FR title: "2023" -description: "The books I have read in 2023" -lang: "FR" --- - Janvier: - - Le pendule de Foucault, *Umberto Eco* - + - Le pendule de Foucault, _Umberto Eco_ - Mars: - - La prophétie des abeilles, *Bernard - Werber* - + - La prophétie des abeilles, _Bernard Werber_ - Avril: - - Le Guide du Jeune Engagé pour la planète, *Ihab Bourara* + - Le Guide du Jeune Engagé pour la planète, _Ihab Bourara_ +- Décembre : + - La plus secrète mémoire des hommes, _Mohamed Mbougar Sarr_ diff --git a/content/wiki/books/2024.md b/content/wiki/books/2024.md new file mode 100644 index 0000000..109490a --- /dev/null +++ b/content/wiki/books/2024.md @@ -0,0 +1,17 @@ +--- +id: "2024" +aliases: [] +tags: [] +description: The books I have read in 2024 +lang: FR +title: "2024" +--- + +- Mars : + - La diagonale des reines, _Bernard Werber_ + - Apprendre vite et bien, _Barbara Oakley_ et _Olac Schewe_ +- Mai : + - La promesse de l'aube, _Romain Gary_ + - Les 5 blessures qui empêchent d'être soi-même, _Lise Bourbeau_ +- Août : + - Quand la peur gouverne tout, _Carine Azzopardi_ diff --git a/content/wiki/books/stack_list.md b/content/wiki/books/stack_list.md index a0c1f22..2520a66 100644 --- a/content/wiki/books/stack_list.md +++ b/content/wiki/books/stack_list.md @@ -1,27 +1,32 @@ --- -title: "Reading stack list" -description: "Books I'd like to read." -lang: "FR" +id: stack_list +aliases: [] +tags: [] +description: Books I'd like to read. +lang: FR +title: Reading stack list --- -General: -* ($) Où va l'argent des pauvres, *Denis Colombi* -* ($) La promesse de l'Aube, *Romain Gary* -* L'assassin royal, *Robin Hobbs* +- General: + - ($) Où va l'argent des pauvres, _Denis Colombi_ + - L'assassin royal, _Robin Hobbs_ + - Ainsi parlait Zarathoustra, _Nietzsche_ -Technical: -* Types and Programming Languages, *Benjamin C. Pierce* -* Remote: Office Not Required, *David Heinemeir & Jason Fried* -* ($:Tarides) Code, 2nd Edition, *Charles Petzold* +- Techniques : + - Types and Programming Languages, _Benjamin C. Pierce_ + - Remote: Office Not Required, _David Heinemeir & Jason Fried_ + - ($:Tarides) Code, 2nd Edition, _Charles Petzold_ -Friend suggestions - 2022: -* ($) La plus secrète mémoire des hommes, *Mohamed Mbougar Sarr* -* Asta, *Jon K. Stefansson* -* American Pastoral, *Philip Roth* -* L'amour au temps du Choléra, *G. Marquez* -* The catcher in the Rye, *Sallinger* -* Alexis et le traité du vain combat, *Youcenar* -* ($) L'art de perdre, *Alice Zeniter* -* Le diable et Sherlock Holmes, *David Grann* -* Axiomatic, *Greg Ega* -* Trilogie: Le Problème à trois corps, *Liu Cixin* +- Humains : + - S'estimer et s'oublier, _Christophe André_ + +- Suggestion d'ami.e.s - 2022: + - Asta, _Jon K. Stefansson_ + - American Pastoral, _Philip Roth_ + - L'amour au temps du Choléra, _G. Marquez_ + - The catcher in the Rye, _Sallinger_ + - Alexis et le traité du vain combat, _Youcenar_ + - ($) L'art de perdre, _Alice Zeniter_ + - Le diable et Sherlock Holmes, _David Grann_ + - Axiomatic, _Greg Ega_ + - Trilogie: Le Problème à trois corps, _Liu Cixin_ diff --git a/content/wiki/books/tech.md b/content/wiki/books/tech.md index feb51f0..5f55129 100644 --- a/content/wiki/books/tech.md +++ b/content/wiki/books/tech.md @@ -1,9 +1,12 @@ --- -title: "Technical books" -description: "The books about tech I want to remember." -lang: "ENG" +id: tech +aliases: [] +tags: [] +description: The books about tech I want to remember. +lang: ENG +title: Technical books --- # O'Reilly -* Fundamental of Software Architecture, *Richards and Ford* +- Fundamental of Software Architecture, _Richards and Ford_ diff --git a/content/wiki/computer_science/ack.md b/content/wiki/computer_science/dev/ack.md similarity index 87% rename from content/wiki/computer_science/ack.md rename to content/wiki/computer_science/dev/ack.md index 24ed4a0..2efa0ab 100644 --- a/content/wiki/computer_science/ack.md +++ b/content/wiki/computer_science/dev/ack.md @@ -1,6 +1,10 @@ --- -title: "Ack" -description: "Commandline tool ack" +id: ack +aliases: [] +tags: [] +description: Commandline tool ack +lang: ENG +title: Ack --- ## List files diff --git a/content/wiki/computer_science/flutter.md b/content/wiki/computer_science/dev/flutter.md similarity index 56% rename from content/wiki/computer_science/flutter.md rename to content/wiki/computer_science/dev/flutter.md index 4cb5e62..cd5b08f 100644 --- a/content/wiki/computer_science/flutter.md +++ b/content/wiki/computer_science/dev/flutter.md @@ -1,6 +1,10 @@ --- -title: "Flutter" -description: "How to use Flutter" +id: flutter +aliases: [] +tags: [] +description: How to use Flutter +lang: ENG +title: Flutter --- ## Resources diff --git a/content/wiki/computer_science/git.md b/content/wiki/computer_science/dev/git.md similarity index 87% rename from content/wiki/computer_science/git.md rename to content/wiki/computer_science/dev/git.md index 0eb8894..bf88b5d 100644 --- a/content/wiki/computer_science/git.md +++ b/content/wiki/computer_science/dev/git.md @@ -1,6 +1,10 @@ --- -title: "Git" -description: "How to use Git" +id: git +aliases: [] +tags: [] +description: How to use Git +lang: ENG +title: Git --- # Commits @@ -90,6 +94,44 @@ git switch -d
+# Tags + +There is two types of tags: +- Lightweight (~private tags) +- Annotated (more metadata, ~public tags) + +### Create an annotated tag + +```shell +git tag -a [tag] +``` +### Create an annotated tag + +```shell +git tag -a [tag] +``` + + +### Create a lightweight tag + +```shell +git tag [tag] +``` + +### Replace a tag (`--force`) + +```shell +git tag -f [tag] +``` + +### Delete a tag + +```shell +git tag -d [tag] +``` + +
+ # Rebase ## Rebase a branch @@ -139,21 +181,24 @@ from [codeinthehole](https://codeinthehole.com/guides/resolving-conflicts-during git rebase --show-current-patch # On git < 2.17 do # git am --show-current-patch - ``` + 2. Use the `REBASE_HEAD` pseudo ref to show various stuff: ```sh git show REBASE_HEAD # View the current commit git rev-parse REBASE_HEAD # Show the sha of the commit ``` + 3. Check the diff with the target branch: ```sh git diff REBASE_HEAD... -- ``` + 4. Check the log history: ```sh git log REBASE_HEAD.. -- ``` + 5. Resolve conflict directly between _master_ and _example_ ```diff <<<<<<<< HEAD @@ -164,10 +209,12 @@ I like apples I love apples >>>>>>> working-branch ``` + If you want to keep the change from the target branch (HEAD), you can use: ```sh git checkout --ours -- ``` + If you want to keep the one of the branch you are rebasing (working-branch), you can use ```sh git checkout --theirs -- diff --git a/content/wiki/computer_science/gpg.md b/content/wiki/computer_science/dev/gpg.md similarity index 93% rename from content/wiki/computer_science/gpg.md rename to content/wiki/computer_science/dev/gpg.md index c3aa0fc..250258f 100644 --- a/content/wiki/computer_science/gpg.md +++ b/content/wiki/computer_science/dev/gpg.md @@ -1,6 +1,10 @@ --- -title: "GPG" -description: "Safe data with encryption." +id: gpg +aliases: [] +tags: [] +description: Safe data with encryption. +lang: ENG +title: GPG --- ### List keys diff --git a/content/wiki/computer_science/dev/kube.md b/content/wiki/computer_science/dev/kube.md new file mode 100644 index 0000000..e028ddc --- /dev/null +++ b/content/wiki/computer_science/dev/kube.md @@ -0,0 +1,444 @@ +--- +id: kube +aliases: [] +tags: [] +description: Comment faire tourner un cluster kube +lang: FR +title: Kubernetes +--- + +### Concepts + +#### Terminologie + +- _Infrastructure As Code_: management et provisionnement d'infrastructures via du code. +- _APM_: Application Performant Manager: monitorer et manager les performances et la disponibilité d'un service. +- Containers: + - `Containers Runtime Low Level`: permettent l'execution de conteneur au format OCI + - `Container Runtime High Level`: transport d'image +- Pour _Kubernetes_, tout est __resources__: + - `Pod`: c'est la ressources minimale que l'on peut déployer dans _Kubernetes_. C'est un groupe d'un ou plusieurs containers qui partagent du stockage et un réseau. + - _ReplicaSet_: permet de gérer la replication des _Pods_ + - _Deployment_: _ReplicaSet_ mais avec la gestion du cycle de vie en plus. + - `Utilise la méthode du _RollingUpgrade_ pour migrer les pods vers une nouvelle version. + - _Namespace_: permet de séparer les ressources de Kubernetes + - _Node_: + - _Worker Node_: est équivalent à un serveur. Contient un un _kubelet_ qui intéragit avec le _container runtime_. + - `Master / Controller Node` s'occupe de gérer les `worker nodes`. + - `etcd`: la base de données kube. Permet de synchroniser les noeuds. + - `Controller manager` : s'occupe de discuter avec l'API + - `Scheduler`: organise les nodes + - `Kube Api`: discute avec le _kubelet_. +- Deux façons de faire: + - déclarative (méthode préférée): on explique l'état auquel on veut arriver. + - impérative: elle exécute ce qu'on lui demande. + +### ReplicaSet + +```yaml +kind: ReplicaSet +metadata: + name: unicorn-front-replicaset + labels: + app: unicorn-front +spec: + template: + metadata: + name: unicorn-front-pod + labels: + app: unicorn-front + spec: + containers: + - name: unicorn-front + image: registry.takima.io/school/proxy/nginx + replicas: 3 + selector: + matchLabels: + app: unicorn-front +``` + +- Le `selector.matchLabels` doit matcher le label de la `spec` pour pouvoir gérer les replicas. Le nom du pod dans `template.metadata.name` est override par `metadata.name`. +- Dans le cas où on delete un `ReplicaSet`, on delete tous ses pods. + +### Déploiement + +#### Control des ressources + +```yaml +resources: + requests: + memory: "64Mi" + cpu: "250m" + limits: + memory: "128Mi" + cpu: "500m" +``` +- Dans `spec.container`, cela permet de gérer les ressources pour le cluster. `requests` correspond aux ressources nécessaires pour setup le pod. Cela permet de ne pas le scheduler dans un pod qui n'a pas les ressoruces nécessaire. `limit` correspond à la ressource max que le container peut utiliser. +- En cas d'erreur de mémoire, on obtient : +```sh + Last State: Terminated + Reason: OOMKilled +``` +- Le controle CPU s'assure que la consommation ne dépasse pas. Il bloque en dessous de la limit. + +### Services + +Il agit comme un _load balancer_ en transmettant les requêtes aux pods auxquels il est rattaché. + +```yaml +apiVersion: v1 +kind: Service +metadata: + name: unicorn-front-service +spec: + selector: + app: unicorn-front + ports: + - protocol: TCP + port: 80 + targetPort: 80 +``` +- `spec.ports.port` est le port sur lequel le service écoute et `spec.ports.targetPort` est le port exposé par le container. On peut utiliser les noms définis dans `spec.template.spec.containers[].ports[].name`. +- Par défaut le service fonctionne en `ClusterIp`, ce qui fait qu'il est accessible que depuis l'intérieur du cluster. Pour pallier au problème d'exposition, on peut faire une _NodePort_ qui expose l'ensemble des services ou _LoadBalancer_ pour provisionner un load balancer +- On peut aussi faire un _Ingress_ qui agit comme un reverse proxy. + +### Ingress + +C'est un peu un load balancer pour le service. +```yaml +apiVersion: networking.k8s.io/v1 +kind: Ingress +metadata: + annotations: + kubernetes.io/ingress.class: nginx + name: unicorn-front-ingress +spec: + rules: + - host: replace-with-your-url + http: + paths: + - backend: + service: + name: unicorn-front-service + port: + number: 80 + path: / + pathType: Prefix +``` +- Le CertManager permet aux utilisateur de créer un Ingress en demandant l'utilisation d'un cluster-issuer de certificat. + +### CertManager + +Il faut rajouter les paramètres suivants et avoir un `cluster-issuer` à disposition dans le cluster. +```yaml +# metadata: +# annotations: +# kubernetes.io/ingress.class: nginx + cert-manager.io/cluster-issuer: letsencrypt-staging + kubernetes.io/tls-acme: 'true' + +# [...] +# spec: +# rules: + tls: + - hosts: + - replace-with-your-url + secretName: unicorn-front-tls +``` +- Si on a besoin d'un certificat `Wildcart`, il faut enlever `cert-manager.io/cluster-issuer` et `kubernetes.io/tls-acme` et utiliser le `secretName` pour avoir le bon certificat stocké dans les secrets. + +### Registry privé + +- Pour utiliser les registry privés, bien souvent, il faut setup les accès. Pour ce faire on crée un secret de type `docker-registry`. + +```yaml +# spec: +# template: +# spec: +imagePullSecrets: + - name: takima-school-registry +``` + +### Variable d'env + +On peut ajouter des variables d'environnement + +```yaml +# spec: +# template: +# spec: +# container: +# - name: +# env: +- name: K8S_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName +``` + +### ConfigMap + +Le _ConfigMap_ stocke les données non-confidentielles. On enregistre les données comme suit: +```yaml +apiVersion: v1 +kind: ConfigMap +metadata: + name: web-app +data: + # property-like keys; each key maps to a simple value + color: "#220" +``` +On récupère les données comme suit dans le _deployment_. +```yaml +env: + - name: CUSTOM_COLOR # Vrai key de la variable d'env. Peut être différent de la valeur dans le config map + valueFrom: + configMapKeyRef: + name: web-app # Nom du configmap + key: color # nom de la clef dans le config map +``` + +/!\ Il faut penser à restart ! + +### Secret + +Pour les données confidentielles, on utilise les secrets de deux façons: +1) `kubectl create secret generic my-secret --from-literal=username=user`: on peut mettre plusieur littérals à la suite +2) Via le `yaml`: +- On doit générer le hash nous même +```sh +echo -n 'user' | base64 +echo -n 'test123*' | base64 +``` +- Puis l'ajouter au yaml +```yaml +apiVersion: v1 +kind: Secret +metadata: + name: hello-secret +type: Opaque +data: + username: YWRtaW4= + password: MWYyZDFlMmU2N2Rm +``` + +On peut ensuite l'utiliser avec: +```yaml +# container.[].env +- name: CUSTOM_COLOR + valueFrom: + secretKeyRef: + name: secret-color + key: color # nom de la clef dans le config map +``` + +/!\ Dans lens, il est en __base64__, il faut penser à le __convertir__. + +### Checkhealth + + Permet d'appeler un endpoint réguliérement pour vérifier qu'il est sein. + +```yaml +# container.[] +livenessProbe: + httpGet: + path: /health + port: 3000 + # httpHeaders: + # - name: Custom-Header + # value: Awesome + initialDelaySeconds: 1 # Initial check + failureThreshold: 5 # Nombre de tentatives + periodSeconds: 3 # Timing pour les checks +``` + +### HorizontalPodAutoscaler: mise à l'échelle automatique + +Peut être créer en utilisant le `-o yaml` de `autoscale`. + +### NetworkPolicy + +Permet de contrôler les flux entre les pods. + +### Redirection interne + +Pour accèder à un service depuis un autre service, on peut utiliser le DNS interne. Pour un service `api` dans le namespace `test`, on peut appeler +`http://api.test`. S'ils sont dans le même namespace, on peut juste utiliser le nom du service: `http://api`. + +### Persistence Volume + +Cela correspond à l'abstraction du volume physique mappé sur les serveurs. Il s'agit d'une resources. Les _Persistence Volume Claims_ sont une demande de stockage par l'utilisateur. On peut définir différents types de stockages avec les _StorageClass_. Les volumes peuvent être statiques ou dynamiques. + +- On peut définir un système de stockage comme suit: +```yaml +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: pg-pvc +spec: + storageClassName: gp2 + accessModes: + - ReadWriteOnce + volumeMode: Filesystem + resources: + requests: + storage: 3Gi +``` +- Pour déclarer le bloc, il faut faire: +```yaml +# spec: +# template: +# spec: +volumes: +- name: pg-data + persistentVolumeClaim: + claimName: pg-pvc +``` +- Pour le monter sur un container: +```yaml +# spec: +# template: +# spec: +# container: +volumeMounts: +- mountPath: /var/lib/postgresql/data + name: pg-data +``` + +### StatefulSet + +Cela permet de scaler les ressources utilisées par un pod. Cependant, ça casse le fonctionnement du DNS. +```yaml +# kind: StatefulSet +# spec: + serviceName: pg-service + volumeClaimTemplates: + - metadata: + name: pg-data + spec: + accessModes: [ "ReadWriteOnce" ] + resources: + requests: + storage: 1Gi +``` + +Il faut modifier le lien d'accès car le load balancer ne fonctionne plus. On doit pointer vers `pod.service` au lieu de `service`. + +### CronJob + +Ressource qui permet de faire des jobs en fond à intervalle régulier. + +### Operators + +Cela correspond à une resource personalisée. On peut le faire grâce à une _Custom Resource Definition_. + +### Helm + +Helm est le "package manager" de Kubernetes. Il permet de faire des templates de toutes les ressources yaml d’une application donnée et les déployer sur Kubernetes. On peut déployer des stacks applicatives directement. + +La stack applicative s'appelle une __Chart Helm__. On utilise les _values_ pour faire des _templates_ helm. On peut utiliser un système de variables grâce à _templates/_helpers.tpl_ (il s'agit de templates Go). + +### Argo CD + +Permet de faire du _GitOps_ en faisant le lien entre l'_Infra-As-Code_ et l'_Infrastructure_. + +### Cheatsheet + +- `kubectl`: + - `config`: permet modifier et de visualiser la configuration. + - `view`: affiche la configuration + - `current-context`: affiche le contexte courant + - `get`: + - `pods`: + - ``: permet d'afficher un pod en particulier + - `-n `: afficher les pods gérés dans le contexte courant + - `replicasets`: affiche les replicaSet disponible + - `deployements`: affiche les deployements + - `secrets`: permet de récupérer les secrets + - `all`: affiche tout + - `apply`: appliquer une spécification yaml sur un cluster et mettre à jour les changements + - `-f `: utiliser une specification yaml + - `create`: créer une ressource + - `-f `: utiliser une specification + - `-o yaml`: permet d'export au format yaml + - `--dry-run=client`: peut être combiner avec `-o` pour produire les yaml en sortie. + - `secret`: permet de faire des secrets + - `docker-registry`: type de secret spécial pour les registry + - ``: + - `--docker-server=`: l'adresse du registry + - `--docker-username=`: le username du registry + - `--docker-password=`: le mot de passe du registry + - `generic`: + - `` + - `--from-literal=key=value`: créer un secret à partir du key/value + - `run`: start a container + - ``: the name of the pod + - `--image `: image à consommer + - `delete`: suppression d'un pod + - `pods` + - ``: nom du pod à supprimer + - `replicasets`: + - ``: nom du replicaSet à supprimer + - `deployements`: + - ``: nom du deployement + - `exec`: executer une commande sur un _pod_ + - ``: le nom du pod + - `-it `: executer une commande en particulier + - `logs`: afficher les logs d'un pod + - ``: le nom du pod + - `-f`: suivre les logs + - `set`: + - ``: ressource à modifier + - `image`: modification sur l'image + - `describe`: decrit la configuration + - `deployements`: pour les déployements + - `hpa`: horizontal scale + - `edit`: + - ``: the name of the deployement to edit + - `rollout`: + - `status`: + - `deployment/` + - `history`: affiche l'historique des versions + - `deployment/` + - `--revision=`: afficher une révision en particulier + - `pause: + - `deployement/`: met le déploiement en pause + - `resume`: + - `deployement/`: relance un déploiement mis en pause + - `undo`: + - `deployment/` + - `--to-revision=`: revient à une révision en particulier. Si non spécifié, revient à la version précédente. + - `restart`: restart something + - `scale`: + - ``: nom du deploiement + - `--replicas=`: changer le nombre de replica. + - `top`: affiche les ressources + - `pod`: + - ``: affiche les ressources du pod en question. + - `api-resources`: affiche toutes les resources utilisables par l'api + - `autoscale`: permettre d'autoscale + - `deployment`: type sur lequel ça s'applique + - ``: le nom + - `--cpu-percent=50`: condition pour laquelle le CPU spawn un nouveau + - `--min=1`: minimum pods + - `--max=10`: maximum pods + +- `helm`: + - `template`: genère le template + - `--values | -f`: le fichier _values_ utiliser. Ils sont lus dans l'ordre et s'il y a plusieurs fichiers, ils sont merged. + - `--output-dir `: export les templates vers un dossier spécifique. + - `install`: permet de créer le fichier et de déployer les resources. + - `--dry-run`: n'effectue pas les actions. + - `--debug`: affiche les actions effectuées. + - 1.``: spécifie le nom. + - 2.``: spécifie le dossier où il y a les templates. + +- `argocd`: + - `cluster`: work on the cluster + - `add`: ajouter + `service-account@cluster-host`: le cluster en question + - `proj`: + - `create`: + - ``: ensemble d'applicatif + - `create`: + - ``: lien entre `helm` et son `values`. diff --git a/content/wiki/computer_science/vim.md b/content/wiki/computer_science/dev/neovim.md similarity index 72% rename from content/wiki/computer_science/vim.md rename to content/wiki/computer_science/dev/neovim.md index 6f95677..3cba469 100644 --- a/content/wiki/computer_science/vim.md +++ b/content/wiki/computer_science/dev/neovim.md @@ -1,6 +1,10 @@ --- -title: "Vim" -description: "Stuffs about (Neo)Vim." +id: neovim +aliases: [] +tags: [] +description: Stuffs about (Neo)Vim. +lang: ENG +title: NeoVIM --- ## Shortcuts @@ -23,18 +27,18 @@ description: "Stuffs about (Neo)Vim." * Ctrl + e : Scroll up * Ctrl + y : Scroll down * Macros: - * q\\q => record - * \@\ => call + * q\\q => record + * \@\ => call ### Vim-surrounding - * cs\\ => Change surrounding - * ds => Delete surrounding - * ys => you surround - * ysiw\ => Surround word - * yss\ => Surround line + * cs\\ => Change surrounding + * ds\ => Delete surrounding + * ys => you surround + * ysiw\ => Surround word + * yss\ => Surround line * __VISUAL__: - * S\ => Surround selection + * S\ => Surround selection ### Nerdcommenter @@ -66,9 +70,10 @@ __TODO__ ### Mardown - * leader + wp => Show markdown - - +- leader + wp => Show markdown +- Format paragraphs: + - v (and selection) + gw: unify size for line (old version) + * v (and selection) + gq: unify size for line (old version of Neovim) ## Resources * [10 VIim shortcuts](https://catonmat.net/top-10-vim-shortcuts) (TO TRANSLATE) diff --git a/content/wiki/computer_science/ripgrep.md b/content/wiki/computer_science/dev/ripgrep.md similarity index 84% rename from content/wiki/computer_science/ripgrep.md rename to content/wiki/computer_science/dev/ripgrep.md index 69ff69d..d8dac84 100644 --- a/content/wiki/computer_science/ripgrep.md +++ b/content/wiki/computer_science/dev/ripgrep.md @@ -1,6 +1,10 @@ --- -title: "Ripgrep" -description: "Commandline tool rg" +id: ripgrep +aliases: [] +tags: [] +description: Commandline tool rg +lang: ENG +title: Ripgrep --- ## Find a pattern in files diff --git a/content/wiki/computer_science/zsh.md b/content/wiki/computer_science/dev/zsh.md similarity index 73% rename from content/wiki/computer_science/zsh.md rename to content/wiki/computer_science/dev/zsh.md index 2ac23e0..aa70617 100644 --- a/content/wiki/computer_science/zsh.md +++ b/content/wiki/computer_science/dev/zsh.md @@ -1,6 +1,10 @@ --- -title: "Zsh" -description: "Zsh utilities." +id: zsh +aliases: [] +tags: [] +description: Zsh utilities. +lang: ENG +title: Zsh --- ### Shortcuts diff --git a/content/wiki/computer_science/docker.md b/content/wiki/computer_science/devOps/docker.md similarity index 93% rename from content/wiki/computer_science/docker.md rename to content/wiki/computer_science/devOps/docker.md index 3a9d9b9..09fc64c 100644 --- a/content/wiki/computer_science/docker.md +++ b/content/wiki/computer_science/devOps/docker.md @@ -1,6 +1,10 @@ --- -title: "Docker" -description: "Containers with Docker." +id: docker +aliases: [] +tags: [] +description: Containers with Docker. +lang: ENG +title: Docker --- ## Connect to hub.docker.com diff --git a/content/wiki/computer_science/languages/SQL.md b/content/wiki/computer_science/languages/SQL.md new file mode 100644 index 0000000..5fa40b9 --- /dev/null +++ b/content/wiki/computer_science/languages/SQL.md @@ -0,0 +1,16 @@ +--- +id: SQL +aliases: +tags: +description: Notes about SQL Language & PosgreSQL +title: SQL +lang: ENG +--- + +### Optimize sequence + +- EXPLAIN ANALYSE _Request_: EXPLAIN give the way it is done (Seq Scan (slow) vs Index Scan (fast)), ANALYSE gives the time. + +### Change display + + - `\x` change l'affichage pour montrer les records en une fois. Utile pour les blocs qui dépassent. diff --git a/content/wiki/computer_science/css.md b/content/wiki/computer_science/languages/css.md similarity index 94% rename from content/wiki/computer_science/css.md rename to content/wiki/computer_science/languages/css.md index 23c8b06..6ad7f2f 100644 --- a/content/wiki/computer_science/css.md +++ b/content/wiki/computer_science/languages/css.md @@ -1,6 +1,10 @@ --- -title: "Css" -description: "About css." +id: css +aliases: [] +tags: [] +description: About css. +lang: ENG +title: CSS --- # Flexbox diff --git a/content/wiki/computer_science/languages/java.md b/content/wiki/computer_science/languages/java.md new file mode 100644 index 0000000..5983205 --- /dev/null +++ b/content/wiki/computer_science/languages/java.md @@ -0,0 +1,43 @@ +--- +id: java +aliases: +tags: +description: Java Programming Language +lang: FR +title: Java +--- + +## Extra + +### Reified type for function +- En Java, pour permettre au typeur d'avoir le type on doit normalement faire : +```java +public T function(Class valueType) { + // Content +} + +// Call +Truc t = function(Truc.class) + +``` +- Une méthode pour pourvoir rendre le typeur heureux sans avoir à passer la classe est d'utiliser les types réifiés qui fonctionnent en Java sur les tableaux (pas les génériques). + ```java + public T function(T... reified) { + // Content + } + // Call + Truc t = function() + ``` + +> Source : [ici](https://maciejwalkowiak.com/blog/java-reified-generics/) + + +## Spring + +### Json + +- Pour supporter le nommage en snake case : + +```java +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +``` diff --git a/content/wiki/computer_science/languages/kotlin.md b/content/wiki/computer_science/languages/kotlin.md new file mode 100644 index 0000000..b5a4f19 --- /dev/null +++ b/content/wiki/computer_science/languages/kotlin.md @@ -0,0 +1,223 @@ +--- +id: kotlin +aliases: +tags: +description: Kotlin Programming Language +lang: FR +title: Kotlin +--- + +## Overview + +- Équivalent de bibliotèques Java: + - `MockK`: Mocking + - `KtLint`: Linter + - `Koin`: injection de dépendances. + +## Variables + +- Possède l'inférence de types. +- Déclaration : + - `val` déclare une valeur immutable. + - `var` une valeur mutable. +- Pas de getter et de setter +- pas de mot clef `static`. +- On peut _override_ les _getters_ et les _setters_ (en utilisant le mot clef `field`): + ```kotlin + val truc : Int = 0 + get() = field + 1 + + var mutableInt =° + set(value) { + field = value + } + ``` +- On peut définir des constantes avec `const`. +- `lateinit var x : Truc` permet de choisir la valeur via une méthode. +- _Null safety_: + - Pas de `null` par défaut. + - On ajoute `?` pour autoriser le `null` avec: + ```kotlin + var null : String? = null + ``` + - `if (b != null) {}` pour checker sur les valeurs immutables. + - `x?.length` renvoie `null` ou la valeur. + - `val x = l ?: -1` renvoie l s'il n'est pas null, -1 sinon. + - `value!!.length` transfort la valeur de gauche en un non-`null`. + +## Méthodes + +- On définit une méthode comme suit: +```kotlin +fun (param : Type, param: Type = ) : Type { + +} +``` +- Le type de retour par défaut est `Unit` +- On peut utiliser les paramètres nommées. +- On peut définir des paramètres par défaut. +- On peut faire des méthodes expression et des méthodes infix: +```kotlin +// Expression +fun plusOne(param : Int) : Int = param + 1 + +// Infix +infix fun plusOne(param : Int) : Int = param + 1 +``` +- On peut étendre des classes avec des nouvelles méthodes : +```kptlin +fun .method() : String { + return "$This?" +} +``` +- `inline` copie le corps de la méthode où il est appelé. Bien pour les _getters_, les _setters_ et les petites _lambdas_. +- On peut overloader les opérateurs `+`, `-`, `*` et `/` avec: +```kotlin +operator fun plus(param : Type) : Type { + val newValue = param.value + 1 + return new Type(newValue) +} +``` +- Utilisation des lambdas : +```kotlin +val x : (t : Type) -> AutreType = { variables -> corps} +``` +- On peut faire une lambda sans variable avec `{ corps }` + +## Classe + +- Constructeur par défaut vide ou complet en fonction des paramètres. +- Possible d'ajouter des constructeurs avec : +```kotlin +class Truc(truc : Type) { + constructor(param : Int, param2 : Int) : this(Type(param + parm2)) +} +class Truc(var truc : Type) { + // truc est un class field ici. +} +``` +- Par défaut, classes et membres `final`. Il faut ajouter `open` pour permettre l'héritage et `open` sur les méthodes pour permettre l'héritage : +```kotlin +open class C { +open val myValue = 1 +} + +class D : C() { + override val myValue = 0 +} +``` +- On peut utiliser `init { }` comme bloc constructeur. +- On peut faire un bloc `static` en ajoutant soit la valeur au _top level_, soit un `object / companion object { }`. +- Le _nesting_ est autorisé. +- `data class` est un équivalent des records. +- Les enumérations sont déclarées avec le mot clef `enum class {}` +- `object` permet de faire des _singletons_. + +## Flot de contrôle + +### For + +- `for (i in start..end)` +- `for(i in start until end)` +- `for (i in start until end step inc)` +- `for (content in data)` +- `data.forEach()` + +### If + +- Fonctionne pour checker `null`, mais sur les `val` uniquement. +- `if'(truc) corps else corpsElse` est une expression. + +### When + +- Remplace le mot clef `switch`. +- Permet de faire du pattern matching : +```kotlin +when(i) { + is Int -> truc + is String -> truc + else -> default case ou {} +} +``` +- Plusieurs mot clefs : +```kotlin +when(i) { + 0 -> truc + 1 -> autre truc + in start..end -> truc + else -> default case +} +`` +- Il s'agit d'expression également donc on peut l'assigner. +``` + +## Scope functions + +- `data.let { }` permet d'accès à l'objet via le mot clef `it`. Renvoie le resultat de la lambda. +- `with(data) { }` fait la même chose que `let` mais référence l'objet avec `this` et n'est pas une méthode sur un objet. Renvoie le resultat de la lambda. +- `data.run { }` fonctionne pareil que `let` mais en important l'object comme `this` et non comme une variable. Renvoie le resultat de la lambda. +- `data.apply {}` prend l'objet et fait la même chose que `run` avec `this`. Il renvoie l'objet lui même cependant. + +## Interfaces + +- Permet de définir des valeurs par défaut et _getters_ et _setters_. +```kotlin +interface Truc { + var test : Int get() = 1 +} + +class Bidule : Truc, Truc2 { + // corps +} +``` + +## Abstract class + +- À faire. + +## Génériques + +- On peut déclarer des génériques de la même manière que Java +```kotlin +class Truc { + // Corps +} +``` +- Kotlin fournit `in` et `out` pour spécifier les types d'entrée et de sortie : +- `out T` ne peut qu'être utilisé en sortie. +```kotlin +interface Produce { + fun produce() : T +} +``` +- `in T` ne peut être utilisé qu'en entrée : +```kotlin +interface Consume { + fun consume(t :T) +} +``` +- On peut passer des contraintes comme Java avec `` +- Si on ne connait pas le type que l'on doit créer, on peut passer `*`. +- On peut utilise `reified` avec les méthodes `inline` pour vérifier le type de retour : +```kotlin +inline fun method(p : Any) { + return p as T +} +``` + +## Type alias + +- Ajoute du sucre syntaxique pour les types avec `typealias Truc = Int` + +## Modifiers + +- Par défaut ce qui est à top level est `public`. +- On peut ajouter le mot clefs `private` pour rendre privé à la classe. Attention ce n'est pas accessible depuis les classes mères. +- `internal` est privé au module. +- `protected` authorise aux sous classes aussi. + +## Coroutines + +- Threads légères. Une coroutine est coopérative à la différence d'une thread. +- On peut récupérer le resultat avec `Class.async`. +- On peut utiliser `await()` pour avoir le resultat et `cancel()` pour stopper. diff --git a/content/wiki/computer_science/latex.md b/content/wiki/computer_science/languages/latex.md similarity index 96% rename from content/wiki/computer_science/latex.md rename to content/wiki/computer_science/languages/latex.md index b6d28b6..26f88a3 100644 --- a/content/wiki/computer_science/latex.md +++ b/content/wiki/computer_science/languages/latex.md @@ -1,6 +1,10 @@ --- -title: "LaTex" -description: "About LaTex" +id: latex +aliases: [] +tags: [] +description: About LaTex +lang: ENG +title: LaTex --- ## Installation of latex and minted on Ubuntu diff --git a/content/wiki/computer_science/languages/ocaml-v2.md b/content/wiki/computer_science/languages/ocaml-v2.md new file mode 100644 index 0000000..d8f1e84 --- /dev/null +++ b/content/wiki/computer_science/languages/ocaml-v2.md @@ -0,0 +1,20 @@ +--- +id: ocaml-v2 +aliases: [] +tags: [] +description: Rewriting of the OCaml Documentation in the wiki. +lang: ENG +title: OCaml - Draft +--- + +## OCaml Files + +- `.ml`: implementation source files +- `*.mli`: interface source files +- `*.cmt` (implementation) / `*.cmti` (signatures): files for tool inspections +- `*.cmi`: compiled interface files +- `*.cmo`: compiled object bytecode files +- `*.cma`: compiled bytecode library (set of `cmo` files) +- `*.o`: compiled native code object +- `*.cmx`: metada about native object +- `*.cmxa`: library for native code diff --git a/content/wiki/computer_science/ocaml.md b/content/wiki/computer_science/languages/ocaml.md similarity index 96% rename from content/wiki/computer_science/ocaml.md rename to content/wiki/computer_science/languages/ocaml.md index 72d05c7..ba1ef97 100644 --- a/content/wiki/computer_science/ocaml.md +++ b/content/wiki/computer_science/languages/ocaml.md @@ -1,6 +1,10 @@ --- -title: "OCaml" -description: "About OCaml." +id: ocaml +aliases: [] +tags: [] +description: About OCaml. +lang: ENG +title: OCaml --- ## Opam @@ -97,3 +101,5 @@ let rec g x = * [Realworld OCaml](https://dev.realworldocaml.org/index.html): tutorial about OCaml * [OCaml Programming Guidelines](https://ocaml.org/docs/guidelines): OCaml guidelines for beter code * [Sherlocode](https://doc.sherlocode.com/): tool to search throught the OPAM codebase + + diff --git a/content/wiki/computer_science/languages/python.md b/content/wiki/computer_science/languages/python.md new file mode 100644 index 0000000..7dfcc29 --- /dev/null +++ b/content/wiki/computer_science/languages/python.md @@ -0,0 +1,31 @@ +--- +id: python +aliases: [] +tags: [] +description: The Python Programming Language +lang: ENG +title: Python +--- + +## Execute shell command + +```python +from subprocess import run, CalledProcessError + try: + run(["echo", ["..."]], capture_output=True, text=True, check=True, shell=True) + except CalledProcessError as error: + pass +``` + +- The first argument is a `list[str]` with argument separated. `shlex.split("my cmd")` can be used to get the array. If it's used with the `shell=True`, the argument __must__ be `["all you command in one place"]`. +- `capture_output=True` asks to get the output +- `text=True` requires the stdout & stderr to be `str` +- `shell=True` execute the command as a shell command. Use with __cautious__ and not when using external inputs! + +
+ +## Good libraries + +* Rich: library to create a format text into the terminal +* Mkdocs: create a documentation +* Xml2rfc: transform an xml document into an rfc format, see [docs](https://xml2rfc.tools.ietf.org/xml2rfc-doc.html) and [writting](https://xml2rfc.tools.ietf.org/authoring/draft-mrose-writing-rfcs.html) diff --git a/content/wiki/computer_science/languages/react.md b/content/wiki/computer_science/languages/react.md new file mode 100644 index 0000000..dd20126 --- /dev/null +++ b/content/wiki/computer_science/languages/react.md @@ -0,0 +1,252 @@ +--- +id: react +aliases: [] +tags: [] +description: Bibliotèque React JS +lang: FR +title: React +--- + +## Philosophie + +### Introduction + +- Dev par Facebook en 2013 +- JSX (aujourd'hui TSX) +- Approche composant avec une gestion du cycle de vie et des états locaux (states) + +### Version notables + +- `16.0` (2017) -> `Fragments`, changement dans le cycle de vie, Server Side Rendering +- `16.3` (2018) -> `Context API` +- `16.8` (2019) -> `Hooks` +- `18` (2022) -> `Concurrent` management + +### Architecture + +```ascii + ┌───────────────────┐ + │ │ + │ React Component │ + Props ──────────► │ │ ──────────► render + │ - State │ + │ │ + └───────────────────┘ +``` + +#### Props + +- C'est récupéré depuis le composant qui instancie. C'est une ressource immutable : +```tsx +class Cat extends React.Component { + render() { + return

{this.props.name} section

; + } +} + +class App extends React.Component { + render() { + return ( +
+ +
+ ); + } +} +``` + +#### States + +- C'est limité au composant, modifiable et asynchrone: +```tsx +class Cat extends React.Component { + + constructor(props) { + super(props); + this.state = { + name: “Jim” + }; + } + + render() { + return
{ this.state.name }
; + } +} +``` + +#### Nouvelle version + +- On est passé d'une approche `Class component` à une approche `Functional component`: +```tsx +class Cat extends React.Component { + render() { + return

Hello, {this.props.name}

; + } +} +``` +devient +```tsx +function Cat(props) { + return

Hello, {props.name}

; +} +``` + +### Cycle de Vie + +```ascii + + ┌─────────────────────────┐ ┌──────────────────────┐ ┌────────────────────────┐ + │ │ │ │ │ │ + │ Mounting │ │ Updating │ │ Unmounting │ + │ │ │ │ │ │ + │ │ │ │ │ │ │ + │ Constructor │ │ │ │ │ │ + │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ + │ ┌────▼───────────────┼────┼─────────────┐ │ │ │ │ + │ │ │ │ │ │ │ │ │ + │ │ render │ │ │ │ │ │ │ + │ │ │ │ │ │ │ │ │ + │ └────────┬───────────┼────┼────────┬────┘ │ │ │ │ + │ │ │ │ │ │ │ │ │ + │ │ │ │ │ │ │ ▼ │ + │ ▼ │ │ ▼ │ │ │ + │ │ │ │ │ │ + │ ComponentDidMount │ │ ComponentDidUpdate │ │ ComponentDidUnmount │ + │ │ │ │ │ │ + │ │ │ │ │ │ + └─────────────────────────┘ └──────────────────────┘ └────────────────────────┘ + +``` + +
+ +## Code + +### Fragments + +- Permet de rendre des composants HTML au même niveau sans avoir besoin de "nested": +```tsx +<> + /* Mon code */ + +``` +est équivalent à +```tsx + +/* Mon code */ + +``` + +### Keys + +- Penser à utiliser les _keys_ dans les composant pour permettre à `React` de faire le rendu dans le bon sens. + +### Get Started + +Pour créer une app `React` avec `npx`, on utilise _Create React App_ (CRA) : +```sh + npx create-react-app front --template typescript + cd front + npm start +``` + +
+ +## Router + +- Avec react on peut avoir un router qui manipule l'API `history` du DOM Html. Le package à installer est le suivant: `react-router-dom@6` + +
+ +## Context + +Les _Context_ permettent de partager des données en profondeur dans l'arbre sans avoir besoin de passer les éléments à travers les `props`. +Il possède deux éléments clefs: +- `Provider` qui déclare et fournit les données du contexte. +- `Consumer` qui conomme et récupère les données du contexte + +
+ +## Redux + +- Permet de faire ce que fait les _Context_ avant leur introduction. +- Il possède un état global appelé le __Store__. +- C'est une __conteneur à état prédictible_: en fonction des inputs, on peut prévoir l'état suivant. +- Les _actions_ sont déclenchées par les composants _React_ et modifie l'état du Store +- La réponse est produite et récupérée par un _reducer_ qui fabrique un nouvel état du store à partir de l'état __précédent__ et de la réponse de l'__action__. +- Pour l'action, utilisation de __fonctions pures__ : (pas de variations de sorties pour les mêmes arguments + pas d'effets de bord). +- Les _selectors_ permettent d'obtenir le resultat depuis le store. + +
+ +## Test + +### React Testing Library (RTL) + +- Permet d'interagir avec les composants _React_. + +### Smoke test + +- Permet de vérifier qu'un composant s'affiche sans crash. + +### Snapshot test + +- Vérifier si le rendu d'un html est bon. + +### Mock test + +- permet de vérifier que les composants s'affichent comme il le faut. + +
+ +## Formulaire + +### Uncontrolled vs controlled component + +- Les _Uncontrolled components_ sont des composants qui sont gérés par le `DOM` html. +- Les _Controlled components_ sont des composants dont l'état interne est géré par React. + +### Uncontrolled + +Pour faire un _uncontrolled_, on définit une référence que l'on donne en attribut : +```tsx +// Valeur de input est accessible via nameInputRef.current.value +// Nous devons utiliser defaultValue pour initialiser l'input +function NameFormUncontrolled({defaultValue}: {defaultValue: string}) { + const nameInputRef = useRef(null); + return ( +
+ +
+ ); + +``` + +### Controlled + +- On récupère l'état interne via un _State_ : +```tsx +function NameFormControlled() { + const [name, setName] = useState(""); + return ( +
+ setName(inputEvent.target.value)} + defaultValue={name} + /> +
+ ); +} +``` + +### React Hook Form + +Il s'agit d"une bibliotèque permettant de construire un formulaire sans avoir trop de code redondant. + +```sh +npm install react-hook-form +``` diff --git a/content/wiki/computer_science/languages/rust.md b/content/wiki/computer_science/languages/rust.md new file mode 100644 index 0000000..83c255f --- /dev/null +++ b/content/wiki/computer_science/languages/rust.md @@ -0,0 +1,207 @@ +--- +id: rust +aliases: +tags: +description: Rust Programming Language - Low level language +lang: ENG +title: Rust +--- + +## Basics + +- `std` is the standard `rust` library. +- Libraries brought into the scope by `rust` from the `std` library are called _the prelude_. +- _Statements_ are instructions that perform some action and do not return a value. +- _Expressions_ evaluate to a resultant value. They don't end with a _semicolon_. + +## Syntax + +### Comments + +- They are always the same: + ```rust +// Rust use only the one line comment +// so you don't have to worry about various +// styles! +``` + +### Main + +- This is how you start a rust program: + +```rust +fn main() { + // Program +} +``` + +### Imports + +- Bring some library into the scope: +```rust +use std::io; +``` + +### Constants and variables + +- Immutable variable: +```rust +let x = 5; +let x = 6; +// Forbidden: x = 6 +``` +- Mutable variable: +```rust +let mut x = 5; +x = 6; +``` +- Constants: +```rust +const I_AM_A_CONSTANT: u32 = 42; +``` + +### Tuples + +```rust +let tuple: (i32, f32, bool, char) = (500, 6.4, true, 'a'); +let (i,f,b,c) = tuple; // Deconstruction +let f = tuple.1; // Field access +``` + +### Arrays + +```rust +let x = [1,2,3,4,4]; +let x: [i32; 5] = [1,2,3,4,4]; +let x = [4; 5]; // = [4, 4, 4, 4, 4]; +let first = x[0]; +``` + +### Functions + +```rust +fn function_name(arg: i32) -> i32 { + return arg + 2; +} +``` + +### Printing + +- We can print value using `println!` placeholders: +```rust +let x = 1; +let y = 2; + +println!("x = {x}, y = {}", y); +``` + +### Pattern matching + +```rust +let x = match res { + Ok(num) => num, + Err(_) => continue, +} +``` + +### If-then-else + +- `if-then-else` acts like a variable and can be consume by a variable or as a return expression from a function. +```rust +if boolean_expression { + // Case one! +} else if another_expression { + // Another case! +} else { + // Final case! +} +``` + +### Loop + +- _Infinity loop_: +```rust +loop { + // Need a break; to leave this loop. +} +``` +- _Infinite loop_ with return result: +```rust +let mut counter = 0; +let result = loop { + counter += 1; + if counter == 10 { + break counter * 2; + } +}; +``` +- Loop _label_: +```rust +'label: loop { + break 'label; +} +``` +- _While_ loop: +```rust +let mut number = 10; +while number != 0 { + number -= 1; +} +``` +- _For_ loop: +```rust +for element in collection { + // Do something. +} +``` +```rust +for number in (0..4) { + // Do something too. +} +``` + +## Cmdline + +### Rustc + +- To compile a code, just run: +```sh +rustc file.rs +./file +``` + +### Cargo + +#### Create a new project + +```sh +cargo new +``` + +#### Build a project + +```sh +cargo build +``` + +#### Build and run a project + +```sh +cargo run +``` + +#### Check the code is correct + +```sh +cargo check +``` + +## Resources + +### Library docs + +- [Rust Prelude](https://doc.rust-lang.org/stable/std/prelude/index.html) + +### Learning + +- [Rust Book](https://doc.rust-lang.org/stable/book) diff --git a/content/wiki/computer_science/languages/svelte.md b/content/wiki/computer_science/languages/svelte.md new file mode 100644 index 0000000..1ac3be1 --- /dev/null +++ b/content/wiki/computer_science/languages/svelte.md @@ -0,0 +1,320 @@ +--- +id: svelte +aliases: [] +tags: [] +description: Frontend Javascript & Typescript +lang: FR +title: Svelte +--- + +## Syntaxe + +- Utilise les extensions `.svelte`. + +### Variables + +- On ajoute la partie scripting via les balises `script`. +- On peut appeler les variables en utilisant `{var_name}`. + +```html + + +

Tu es {name}

+``` + +- Dans le cas où l'attribut a le même nom que la variable on peut faire un raccourci synthaxique : +```html + + + + + +``` + +- On peut aussi permettre l'utilisation de code Html __non vérifié__: +```html + + +

{@html balise}

+``` + +### Style + +- On peut rajouter du style grâce à la balise ` +``` + +### Reactivité + +- Quand l'état du composant change, _Svelte_ met automatiquement l'état à jour. +- On peut synchroniser l'état de l'application avec l'état du DOM en réponse à des événements : +```html + +``` +- L'attribut `on:={}` permet de spécifier l'événement et la fonction à utiliser. +- On peut ajouter des _modifiers_ avec `on:||={}`. Ils peuvent être : + - `preventDefault` évite le comportement par défaut. + - `stopPropagation` ne propage pas aux autres éléments. + - `passive` améliore le _scroll_. + - `nonpassive`: _set_ `passive` à `false`. + - `capture` lance le handler pendant la phase de _capture_ plutôt que la phase _bubbling_. Dans les faits inverses le rapport de gestion des événements du haut vers le bas. + - `once` ne lance l'événement qu'une fois. + - `self` ne s'active que si la _target_ de l'_event_ est nous-même. + - `trusted` ne s'active que si les éléments est _trusted_ parce qu'il a été déclenché par un action utilisateur plutôt que du code _JavaScript_. +- On peut avoir des _events_ de composants : + - _Inner.svelte_: + ```html + + + + ``` + - _App.svelte_: + ```html + + + + ``` + - Dans le cas où l'on a des composants avec des événements (du DOM ou générer par l'utilisateur) que l'on veut forward, on peut le passer avec : + ```html + + ``` +- Pour dire à un composant enfant de mettre à jour la valeur parent, on peut utiliser `bind` : +```html + + + +``` +- `bind:group={variable}` permet de _binder_ plusieurs _inputs_ sur la même variable. +- Un `