Initial commit

This commit is contained in:
2026-02-19 22:23:31 +01:00
commit 6e2a6be55f
14 changed files with 530 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
/.obsidian/

7
Android.md Normal file
View File

@@ -0,0 +1,7 @@
---
tags:
- android
title: Android
type: accueil
---
![[view-articles-android.base]]

View File

@@ -0,0 +1,37 @@
---
title: Informatique et Technologie
type: accueil
tags:
- accueil
---
![[dummy.png]]
Un wiki personnel consacré à la documentation technique autour de Linux, des technologies Open Source, de la domotique et des systèmes numériques.
Il regroupe des notes pratiques, des guides, des procédures et des références techniques.
---
## 📚 Explorer les notes
Lensemble des connaissances et documentations techniques.
![[view-themes.base]]
## ✍️ Journal et veille
Billets, retours dexpérience et actualités.
- [varlog](https://varlog.abonnel.fr/) - billets et retour d'expérience
- [Podcast — Sinformer sur la tech](https://mindcast.fr/@sinformersurlatech)
- [Vidéos — Sinformer sur la tech](https://www.youtube.com/@SInformerSurLaTech)
---
## Informations
- [[legal-notices|Informations légales]]
- [[contact.html|Contact]]
---
> [!important]
> **11 décembre 2025**
> mindcast.fr est actuellement hors ligne suite à une panne matérielle.
> Reconstruction prévue sur une nouvelle infrastructure.

10
Outils.md Normal file
View File

@@ -0,0 +1,10 @@
---
tags:
- DevOPS
- workflow
- outils
title: Outils
type: accueil
theme: outils
---
![[view-articles-tools.base]]

48
contact.html Normal file
View File

@@ -0,0 +1,48 @@
<div id="contact-area">
<div id="step1">
<input type="email" id="email" placeholder="Votre email" required><br>
<textarea id="message" placeholder="Votre message (10 caractères min.)"></textarea><br>
<button onclick="sendCode()">Recevoir un code de validation</button>
</div>
<div id="step2" style="display:none;">
<p>Un code a été envoyé à votre adresse. Entrez-le ci-dessous :</p>
<input type="text" id="verify_code" placeholder="Code à 6 chiffres">
<button onclick="verifyAndSend()">Valider l'envoi définitif</button>
</div>
</div>
<script>
let currentToken = "";
async function sendCode() {
const fd = new FormData();
fd.append('step', 'send_code');
fd.append('email', document.getElementById('email').value);
fd.append('message', document.getElementById('message').value);
const res = await fetch('/contact-verify.php', { method: 'POST', body: fd });
const data = await res.json();
if (data.status === 'success') {
currentToken = data.token;
document.getElementById('step1').style.display = 'none';
document.getElementById('step2').style.display = 'block';
} else {
alert(data.message);
}
}
async function verifyAndSend() {
const fd = new FormData();
fd.append('step', 'verify_code');
fd.append('token', currentToken);
fd.append('code', document.getElementById('verify_code').value);
const res = await fetch('/contact-verify.php', { method: 'POST', body: fd });
const data = await res.json();
alert(data.message);
if (data.status === 'success') location.reload();
}
</script>

50
legal-notices.md Normal file
View File

@@ -0,0 +1,50 @@
## Mentions légales
### Éditeur du site
Ce site est un blog personnel publié à titre non professionnel.
Conformément à larticle 6 III-2 de la loi n°2004-575 du 21 juin 2004 pour la confiance dans léconomie numérique (LCEN), léditeur a choisi de ne pas rendre publiques ses informations personnelles.
Les informations didentification complètes peuvent être communiquées aux autorités compétentes sur réquisition judiciaire.
### Responsable de la publication
Responsable de la publication : léditeur du site
### Hébergement
Le site est auto-hébergé par l'éditeur. Les moyens de contact pour toute notification de contenu illicite sont disponibles via le formulaire de contact du site.
### Propriété intellectuelle — Licence CC BY 4.0
Sauf mention contraire, les contenus originaux publiés sur ce site (textes, images, illustrations, code, etc.) sont mis à disposition selon les termes de la licence **Creative Commons Attribution 4.0 International (CC BY 4.0)**.
Vous êtes autorisé à :
- partager, copier et redistribuer le contenu sur tout support ;
- adapter, transformer et exploiter le contenu, y compris à des fins commerciales ;
à condition de créditer lauteur, dindiquer si des modifications ont été effectuées et de mentionner la licence.
Le texte complet de la licence est disponible à ladresse :
[https://creativecommons.org/licenses/by/4.0/](https://creativecommons.org/licenses/by/4.0/)
Les contenus tiers éventuellement présents sur le site restent la propriété de leurs auteurs respectifs et ne sont pas couverts par cette licence, sauf indication contraire.
### Responsabilité
Les informations publiées sur ce blog sont fournies à titre informatif.
Léditeur ne saurait être tenu responsable des dommages directs ou indirects résultant de lutilisation du site ou des informations qui y sont présentées.
### Données personnelles
Ce site peut collecter des données strictement nécessaires à son fonctionnement (formulaire de contact, journaux techniques, commentaires).
Conformément au RGPD et à la loi Informatique et Libertés, vous disposez dun droit daccès, de rectification et de suppression des données vous concernant.
Toute demande peut être effectuée via le formulaire de contact du site.
### Cookies
Le site utilise uniquement des cookies techniques nécessaires à son fonctionnement.
Aucun cookie publicitaire ou de suivi nest utilisé sans consentement préalable.

View File

@@ -0,0 +1,84 @@
---
tags:
- android
title: Android, où sont stockés les fichiers
type: article
theme: android
---
## Un labyrinthe nommé "Scoped Storage"
Depuis l'époque d'Ice Cream Sandwich, Android a bien changé. À l'origine, une application pouvait virtuellement "voir" tout ce qui se trouvait sur votre mémoire une fois l'autorisation accordée. Aujourd'hui, pour protéger votre vie privée, Google a instauré le **Scoped Storage** (stockage partitionné).
Pour comprendre pourquoi on ne trouve jamais rien, il faut d'abord séparer le téléphone en deux mondes qui ne se mélangent presque jamais : **le système** et **l'utilisateur**.
Voici ce que j'ai compris et constaté.
### 1. La Partition Système (Le "Cerveau" verrouillé)
Imaginez une zone protégée par une vitre blindée. C'est ici que vit Android lui-même ainsi que les applications préinstallées par votre constructeur (le "bloatware").
* **Pourquoi vous ne la voyez pas :** Pour éviter qu'une fausse manipulation ne transforme votre smartphone en presse-papier.
* **L'évolution :** Depuis Android 10, cette partition est en "lecture seule". Même si vous vouliez y supprimer une application d'usine, le système vous en empêcherait.
### 2. Le stockage interne (L'espace privé)
Chaque application possède son propre bac à sable. Elle y stocke ses bases de données, vos identifiants et ses fichiers temporaires. C'est ce qui gonfle quand vous voyez qu'une application de réseau social pèse 2 Go alors qu'elle n'en faisait que 150 Mo à l'installation.
- **Emplacement :** `/data/user/0/[nom.de.l.application]/`
- **Particularité :** Ces fichiers sont invisibles pour les autres apps et pour vous-même (sauf si votre téléphone est "rooté"). Si vous désinstallez l'application, ces données disparaissent avec elle.
### 2. Le stockage partagé / public (Le dossier "Media")
C'est ici que se trouvent vos photos, téléchargements et musiques. C'est le seul endroit où vous avez réellement la main. Elle est la partie accessible via un câble USB sur votre ordinateur ou un explorateur de fichiers. Il apparaît souvent sous le nom trompeur de `0` ou `emulated/0`.
- **Dossiers standards :** * `DCIM/Camera` : Vos photos et vidéos.
- `Download` : Tout ce que vous récupérez via le web.
- `Documents` : Vos PDF et fichiers de travail.
Si vous explorez votre mémoire interne, vous verrez un dossier nommé `Android`. À l'intérieur, le sous-dossier `data` contient des dossiers nommés `com.instagram.android` ou `com.whatsapp`.
* **Avant :** N'importe quel explorateur de fichiers pouvait fouiller dedans.
* **Aujourd'hui :** Google a verrouillé cet accès. Même si vous voyez le dossier, il apparaît souvent "vide" sur les versions récentes d'Android. C'est une mesure de sécurité : une application de lampe torche n'a aucune raison d'aller lire les fichiers temporaires de votre application bancaire.
Certaines applications créent encore leur propre dossier à la racine, mais cette pratique tend à disparaître au profit du dossier `Android/media/`.
### 3. La carte SD : l'invitée imprévisible
La carte mémoire n'est plus traitée comme une extension directe de la mémoire interne, mais comme un **stockage amovible**.
- **Le problème :** Pour écrire sur la carte SD, une application doit vous demander une autorisation spécifique pour un dossier précis.
- **Le stockage adopté :** Android permet parfois de "fusionner" la carte SD avec la mémoire interne (Adoptable Storage), mais attention : la carte devient alors illisible si vous la retirez pour la mettre dans un PC. Android formate la carte pour qu'elle devienne une extension invisible de la mémoire interne.
* Si la carte SD est de mauvaise qualité (classe de vitesse lente), c'est tout votre téléphone qui se met à ramer, car le système traite la carte lente comme s'il s'agissait de sa propre puce mémoire ultra-rapide.
---
## Comment s'y retrouver concrètement ?
Pour naviguer dans ce chaos, ne comptez pas uniquement sur la galerie photo native. Utilisez un **gestionnaire de fichiers** (File Manager).
Liste des outils propriétaires :
| **Outil** | **Utilité** |
| ---------------------- | ------------------------------------------------------------------ |
| **Files by Google** | Le plus simple pour nettoyer et trouver ses téléchargements. |
| **Gestionnaire natif** | Souvent nommé "Mes Fichiers" (Samsung) ou "Gestionnaire" (Xiaomi). |
Liste des outils Open Source disponible sur le store alternatif **F-Droid** :
| **Outil** | **Philosophie / Utilité** | **Pourquoi le choisir ?** |
| ------------------------ | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| **Material Files** | Le "successeur spirituel" de l'interface Google. | **Open Source & Ultra-propre.** Respecte les codes design d'Android tout en étant léger. Excellent pour la navigation FTP/SFTP. |
| **Amaze File Manager** | L'alternative communautaire historique. | **Complet.** Gère très bien le "root", permet de sauvegarder ses APK et d'analyser le stockage pour trouver les gros fichiers. |
| **Fossify File Manager** | La simplicité avant tout (Fork de Simple Mobile Tools). | **Minimaliste.** Pas de fioritures, pas de publicités, juste l'essentiel pour ceux qui veulent un dossier "Téléchargements" lisible. |
| **Ghost Commander** | Pour les nostalgiques de Total Commander. | **Double panneau.** Idéal pour déplacer des fichiers d'un dossier à un autre par simple glisser-déposer (mode paysage recommandé). |
> **Le conseil d'ami :** Si vous ne trouvez pas un fichier que vous venez de télécharger, regardez toujours en priorité dans `/storage/emulated/0/Download`. C'est le "port d'attache" universel sur Android.
Cédrix

View File

@@ -0,0 +1,44 @@
---
tags:
- git
title: GIT - Corriger un dossier un suivi par erreur
description: Vous avez oublié de configurer votre .gitignore et des dossiers sensibles (ou inutiles) se retrouvent sur votre dépôt distant ? Découvrez comment retirer un dossier de l'index Git sans le supprimer de votre ordinateur.
type: article
theme: outils
---
C'est l'erreur classique du "trop tard" : une fois qu'un fichier est suivi par Git, l'ajouter au `.gitignore` ne suffit plus, car Git continue de surveiller ce qu'il connaît déjà.
Pas de panique, la manipulation est simple et se fait en trois étapes rapides.
### La procédure de correction
L'objectif est de dire à Git : "Oublie ce dossier, mais ne le supprime pas de mon ordinateur".
1. **Mettez à jour votre fichier `.gitignore`**
Assurez-vous que le nom du dossier est bien inscrit dedans (ex: `nom_du_dossier/`).
2. **Retirez le dossier de l'index de Git**
Utilisez la commande suivante dans votre terminal :
`git rm -r --cached nom_du_dossier/`
- `-r` : permet de supprimer récursivement tout le contenu du dossier.
- `--cached` : **Indispensable**. Cela retire le dossier de Git tout en le conservant physiquement sur votre disque dur.
3. **Validez le changement**
Il ne vous reste plus qu'à committer cette action :
`git add .`
`git commit -m "Suppression du dossier suivi par erreur et mise à jour du gitignore"`
### Et après ?
Si vous voulez vérifier ce que Git ignore réellement, vous pouvez lancer cette commande :
`git status --ignored`

View File

@@ -0,0 +1,119 @@
---
tags:
- "#draft"
- webmaster
title: HUGO - Générateur de sites statiques
description: Hugo est un générateur de sites statiques (SSG) à partir de fichiers Markdown. Des modèles ou templates peuvent être définis.
type: article
theme: outils
---
Hugo est un **générateur de sites statiques (SSG)** propulsé par le langage **Go**. Là où un CMS traditionnel comme WordPress génère chaque page à la volée via une base de données, Hugo adopte une approche radicale : il pré-compile lintégralité de votre site.
Le résultat ? Une performance brute traduite par des fichiers HTML, CSS et JS légers, prêts à être déployés partout. Reconnu comme le SSG le plus rapide au monde, il traite des milliers de pages en une fraction de seconde. En éliminant le PHP et les bases de données, il neutralise les failles de sécurité classiques. Côté rédaction, tout se passe en **Markdown** : vous écrivez, Hugo s'occupe du reste, sans dépendances logicielles complexes.
## 1. Installer Hugo sur Debian
Bien que Hugo soit disponible dans les dépôts officiels de Debian (`sudo apt install hugo`), la version y est souvent ancienne. Pour bénéficier des dernières fonctionnalités (et du support de thèmes récents), il est préférable d'utiliser le binaire officiel.
1. Allez sur la page [Releases de Hugo](https://github.com/gohugoio/hugo/releases).
2. Téléchargez le pack `.deb` correspondant à votre architecture (généralement `hugo_extended_X.X.X_linux-amd64.deb`).
3. Installez-le avec `dpkg` :
```bash
sudo dpkg -i hugo_extended_*.deb
```
4. Vérifiez l'installation : `hugo version`.
---
## 2. Générer votre site
Placez-vous dans votre dossier de travail et créez votre projet :
```bash
hugo new site mon-super-site
cd mon-super-site
# Ajoutez un thème (exemple avec Ananke)
git init
git submodule add https://github.com/theNewDynamic/gohugo-theme-ananke.git themes/ananke
echo "theme = 'ananke'" >> hugo.toml
```
Une fois que votre contenu est prêt (dans le dossier `content/`), générez le site final :
```bash
hugo
```
Cela crée un dossier **`public/`** à la racine de votre projet. C'est **ce dossier seul** qu'Apache doit servir.
---
## 3. Configurer Apache
Apache va simplement servir les fichiers statiques générés par Hugo.
### Déplacer les fichiers
Le plus propre est de copier le contenu de votre dossier `public/` vers le répertoire web standard :
```bash
sudo cp -r public/* /var/www/mon-site/
sudo chown -R www-data:www-data /var/www/mon-site/
```
### Créer le VirtualHost
Créez un fichier de configuration pour votre site :
`sudo nano /etc/apache2/sites-available/mon-site.conf`
Collez-y cette configuration minimale :
Apache
```
<VirtualHost *:80>
ServerName www.votre-domaine.com
DocumentRoot /var/www/mon-site
<Directory /var/www/mon-site>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
```
### Activer le site
Bash
```
sudo a2ensite mon-site.conf
sudo systemctl reload apache2
```
---
## Le flux de travail idéal (Workflow)
Pour que ce soit efficace, vous ne devriez pas travailler directement dans `/var/www/`. Voici comment font les pros :
1. **Local :** Vous rédigez vos articles sur votre PC et testez avec `hugo server`.
2. **Génération :** Une fois prêt, vous lancez la commande `hugo`.
3. **Déploiement :** Vous envoyez le dossier `public/` vers votre serveur Debian (via `rsync`, `scp` ou un simple `git pull`).
---
**Un petit conseil :** Comme votre site est statique, n'oubliez pas d'activer le module **`mod_expires`** d'Apache. Cela permettra aux navigateurs de vos visiteurs de mettre en cache les images et le CSS, rendant votre site encore plus instantané.

79
send-mail.php Normal file
View File

@@ -0,0 +1,79 @@
<?php
session_start();
$log_dir = "/tmp/contact_auth/";
if (!is_dir($log_dir)) mkdir($log_dir, 0700);
header('Content-Type: application/json');
// --- CONFIGURATION ---
$to_admin = "votre-email@abonnel.fr";
$from_server = "webmaster@abonnel.fr";
$step = $_POST['step'] ?? '';
// --- ACTION 1 : GÉNÉRATION ET ENVOI DU CODE ---
if ($step === 'send_code') {
$email = filter_var($_POST['email'] ?? '', FILTER_VALIDATE_EMAIL);
$message = trim($_POST['message'] ?? '');
if (!$email || strlen($message) < 10) {
echo json_encode(["status" => "error", "message" => "Données invalides."]);
exit;
}
// Génération du code
$code = rand(100000, 999999);
$token = md5($email . time());
// Stockage temporaire (Valide 1h)
$auth_data = [
'code' => $code,
'email' => $email,
'message' => $message,
'expires' => time() + 3600
];
file_put_contents($log_dir . $token, json_encode($auth_data));
// Envoi du code à l'utilisateur
$subject = "Votre code de vérification - abonnel.fr";
$body = "Votre code de validation est : $code\nCe code expire dans 1 heure.";
if (mail($email, $subject, $body, "From: $from_server")) {
echo json_encode(["status" => "success", "token" => $token]);
} else {
echo json_encode(["status" => "error", "message" => "Erreur d'envoi du code."]);
}
}
// --- ACTION 2 : VÉRIFICATION ET ENVOI FINAL ---
if ($step === 'verify_code') {
$token = $_POST['token'] ?? '';
$user_code = $_POST['code'] ?? '';
$file = $log_dir . $token;
if (!file_exists($file)) {
echo json_encode(["status" => "error", "message" => "Session expirée."]);
exit;
}
$data = json_decode(file_get_contents($file), true);
if (time() > $data['expires']) {
unlink($file);
echo json_encode(["status" => "error", "message" => "Code expiré."]);
exit;
}
if ($user_code == $data['code']) {
// Envoi final à VOUS
$final_subject = "[Validé] Contact de " . $data['email'];
$final_body = "Message de : " . $data['email'] . "\n\n" . $data['message'];
mail($to_admin, $final_subject, $final_body, "From: $from_server\r\nReply-To: " . $data['email']);
unlink($file); // Supprime le ticket après succès
echo json_encode(["status" => "success", "message" => "Message envoyé avec succès !"]);
} else {
echo json_encode(["status" => "error", "message" => "Code incorrect."]);
}
}

BIN
static/dummy.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -0,0 +1,18 @@
views:
- type: cards
name: "View : Les thèmes"
filters:
and:
- '!file.hasTag("#draft")'
- "!title.isEmpty()"
- file.folder.contains("notes")
- type == "article"
- theme == "android"
order:
- title
- description
sort:
- property: file.mtime
direction: DESC
imageAspectRatio: 1
cardSize: 800

18
view-articles-tools.base Normal file
View File

@@ -0,0 +1,18 @@
views:
- type: cards
name: "View : Les thèmes"
filters:
and:
- '!file.hasTag("#draft")'
- "!title.isEmpty()"
- file.folder.contains("notes")
- type == "article"
- theme == "outils"
order:
- title
- description
sort:
- property: file.mtime
direction: DESC
imageAspectRatio: 1
cardSize: 800

15
view-themes.base Normal file
View File

@@ -0,0 +1,15 @@
views:
- type: cards
name: "View : Les thèmes"
filters:
and:
- '!file.hasTag("#draft")'
- "!title.isEmpty()"
- type.contains("accueil")
order:
- title
sort:
- property: file.mtime
direction: DESC
imageAspectRatio: 1
cardSize: 480