Compare commits

..

10 Commits

Author SHA1 Message Date
gltron
4d1eb2a944 Animated background everywhere & fixed links 2022-08-23 13:40:20 +02:00
gltron
a01f5a31fd Updated registry url 2022-08-21 13:52:05 +02:00
gltron
6913851839 Updated registry url 2022-08-21 13:50:37 +02:00
gltron
76888b1660 New & improved style, removed blog 2022-08-21 13:44:15 +02:00
gltron
5df89aad65 Added posts & fixed pages 2022-04-19 19:35:33 +02:00
gltron
3d6e616d1a Converted everything to webp & added projects 2022-02-20 18:49:48 +01:00
gltron
8a3348ae59 Fixed models path 2021-12-11 16:40:25 +01:00
gltron
1115a37340 Basic single post rendering 2021-12-11 16:22:35 +01:00
gltron
3e66fca0be Added 3D background, updated langing & artworks 2021-12-11 16:09:55 +01:00
gltron
13ec138c1f Added artworks & converted img to webp 2021-09-25 19:03:57 +02:00
114 changed files with 436 additions and 534 deletions

View File

@@ -10,8 +10,8 @@ steps:
from_secret: reg_user
password:
from_secret: reg_password
registry: dockerreg.gltronic.ovh
repo: dockerreg.gltronic.ovh/nexusv7
registry: registry.glt.sx
repo: registry.glt.sx/nexusv7
- name: deploy
image: appleboy/drone-ssh

1
convertToWebp.sh Normal file
View File

@@ -0,0 +1 @@
find . -name "*.png" -exec sh -c 'cwebp $1 -q 90 -o ${1%.*}.webp' sh {} \;

View File

@@ -6,14 +6,12 @@ yearonly: true
url: 2020.html
---
Ordre de création décroissant
![crown](/img/artworks/crown.jpg)
![full2](/img/artworks/full2.jpg)
![full1](/img/artworks/full1.jpg)
![face14](/img/artworks/face14.jpg)
![face14full](/img/artworks/face14full.jpg)
![face13](/img/artworks/face13.jpg)
![face12](/img/artworks/face12.jpg)
![face11](/img/artworks/face11.jpg)
![face10](/img/artworks/face10.jpg)
![crown](/img/artworks/2020/crown.webp)
![full2](/img/artworks/2020/full2.webp)
![full1](/img/artworks/2020/full1.webp)
![face14](/img/artworks/2020/face14.webp)
![face14full](/img/artworks/2020/face14full.webp)
![face13](/img/artworks/2020/face13.webp)
![face12](/img/artworks/2020/face12.webp)
![face11](/img/artworks/2020/face11.webp)
![face10](/img/artworks/2020/face10.webp)

View File

@@ -6,8 +6,9 @@ yearonly: true
url: 2021.html
---
Ordre de création décroissant
![roomOrangeChair](/img/artworks/roomOrangeChair2.jpg)
![roomBlackChair](/img/artworks/roomBlackChair.jpg)
![roomWhiteChair](/img/artworks/roomWhiteChair.jpg)
![LP_planet](/img/artworks/2021/LP_planet.webp)
![LP_island](/img/artworks/2021/LP_island.webp)
![LP_barrels](/img/artworks/2021/LP_barrels.webp)
![roomOrangeChair](/img/artworks/2021/roomOrangeChair2.webp)
![roomBlackChair](/img/artworks/2021/roomBlackChair.webp)
![roomWhiteChair](/img/artworks/2021/roomWhiteChair.webp)

11
raws/artworks/2022.md Normal file
View File

@@ -0,0 +1,11 @@
---
title: Blender 2022
tags: 2022 blender artworks
date: 2022-01-01
yearonly: true
url: 2022.html
---
![the_end_r2b](/img/artworks/2022/the_end_r2b.webp)
![LP_airship](/img/artworks/2022/LP_airship.webp)

View File

@@ -1,19 +0,0 @@
---
title: Les sites web perso
tags: blog sites perso
date: 2020-01-04
yearonly: false
url: les-sites-web-perso.html
---
Le web est construit sur le principe de la décentralisation. Lextinction dune machine ne réduit pas à néant le réseau. Pourtant, la navigation de la plupart des gens repose sur quelques sites majeurs. Je pourrais en dire autant. YouTube, Twitter, reddit et par extension imgur composent lentièreté de ma consommation de média régulier. Et il est le problème. Si un de ces sites sarrête, des millions de personnes se retrouvent démunies de leur expérience dInternet.
Pourtant japprécie tout particulièrement les sites web personnels. Ils ont une personnalité, parfois un petit air naïf. On est loin de ces sites sans vie optimisée pour la consommation de contenu et de pub. Toujours pensé pour le mobile, adaptable à tous et pour tous. Mais ils sont bien pratiques ces sites. Ils centralisent à eux seul la grande majorité du contenu. On cherche une vidéo ? YouTube a sans doute quelque chose. PeerTube est une réponse au problème de YouTube. Mais il y a quelques problèmes sur la forme pour que cela décolle vraiment. La gestion des comptes est confuse et lutilisation tout autant. Pour Twitter, Mastodon existe. Et il marche excellemment bien. Mais il y a à peu près le même problème que PeerTube. Enfin Reddit est manquant à lappel de la décentralisation.
Mais le cas de Reddit est particulier. Jusquà récemment, Reddit nhébergeaient que du texte. Il était donc facile de déplacer une petite communauté. En soi Reddit nest quun imageboard avec un système de vote. Mais le site est pratique. Sur une même plateforme, on rassemble toutes sortes de communautés. Il y en a pour tous les goûts, elles sont chacune autogérés par leurs propres modérateurs.
Les sites personnels ont toujours été présents et le seront toujours. Avec plus ou moins de visibilités. Le problème cest la découvrabilité. On peut difficilement tomber sur un site personnel par un total hasard. Le site Medium tente, dune certaine manière, de répondre a ce problème. Aujourdhui beaucoup de sites de presse utilisent des rédacteurs indépendants pour remplir leur site dun contenu divers et constant. Mais il y a une sélection. Donc exit les sites étranges et les sous-cultures.
Viens ensuite laccès à la création. Tout le monde na pas la capacité de créer de toutes pièces son site et de lhéberger. Dans mon monde idéal tout le monde a un petit serveur simple chez soi pour ses données personnelles. Il y a certain temp, les Skyblogs étaient un outil simple, gratuit, utilisable par tout le monde. Il y avait de tout. Des blogs étranges de partout. Tumblr fait ça aujourdhui. Facebook mais sans la personnalité. Mais le souci, cest encore la centralisation. Tout dépend du bon vouloir et des envies de lentreprise derrière. Lorsque Tumblr fut racheté par Verizon, une violente politique de censure fut mise en place pour rendre le site le plus compatible avec les annonceurs.
Alors pour lutter contre tout ça et perpétué lesprit décentralisé dInternet, ce site existe. Il nest quune goutte deau dans un océan, et lexpression nest presque pas assez, mais cest déjà quelque chose.

View File

@@ -1,17 +0,0 @@
---
title: La grande virtualization
tags: docker virtualization
date: 2020-01-12
yearonly: false
url: la-grande-virtualization.html
---
Jai deux serveurs chez moi. Un très vieux (dual core, 1Go ram !) que jai récupéré dune destruction certaine. Et un autre, plus récent, doccasion aussi, aussi récupéré. Cest sur ce dernier que tournent la plupart de mes services. Il y a ce site, un git, plex, urbackup et le truc du moment que je teste.
Sur ces deux machines, la recette est la même : Fedora Server et tout est installé depuis les sources. Cest souvent difficile à maintenir à jour et facile de casser quelque chose. Alors bien souvent, il y a eu des week-ends de frustration. Une fois que ça tenait vaguement je ny touchais plus pendant quelques mois et puis je me dis que je vais refaire mais en mieux. Et tout recommence. Avec le temps, jai appris mais ça restait long et fastidieux.
Un peu partout, tout le monde parlait de la nouvelle technique a la mode pour les serveurs : tout virtualisé. Tout mettre dans des conteneurs. Je me suis longtemps dit que cétait un peu exagéré pour mon cas. Et puis jai fini par installer Docker, Docker-compose et Portainer.
Le week-end dernier jai déplacé tous mes services dans des conteneurs Docker. Les images de LinuxServer.io sont une bénédiction. Avec un minimum de connaissances sur Docker, jai pu tout mettre en place en une petite après-midi. Mettre en jours nimporte lequel de ces conteneurs nest quune histoire dexécuter le docker-compose.yml lui correspondant. En installer un nouveau prends quelques minutes. Cest très « plug & play » une fois quon a compris la logique pour les gérer. Le site est dans son propre conteneur maison. Dockeriser un programme Node.js est très simple.
Couplé avec urbackup pour sauvegarder les configurations des conteneurs sur un disque annexe, je peux aisément changer de distribution, avoir du matériel en panne ou même le changer.

View File

@@ -1,51 +0,0 @@
---
title: Migration gitea vers docker
tags: gitea docker
date: 2020-03-03
yearonly: false
url: migration-gitea-docker.html
---
# Introduction
Lors de la grande migration vers Docker, une étape majeure était linstance gitea. Javais déja une installation faite du 'binary' gitea et dun service Linux.
Gitea fourni une explication 'Backup and Restore' dans la documentation officielle.
# La marche à suivre
## Première étape : Exporter linstallation actuelle.
> su git
> ./gitea dump -c /etc/gitea/app.ini
Il faut prendre soin de fournir une copie du binary 'gitea' a lutilisateur git. En le copiant dans son dossier home avec un chown par exemple.
Quitter lutilisateur avec 'exit', récupérer larchive obtenue et lextraire.
## Seconde étape : Docker
Créé et lancer son conteneur gitea. Je le fais à partir dun docker-compose.yml que lon trouve dans la documentation officielle, dans la section 'installation With Docker'.
Ne pas oublier darrêter le service existant de gitea pour éviter les conflits de ports.
Une fois le conteneur lancé, il faut configurer linstance et terminer linstallation pour obtenir la configuration nécessaire. En particulier la base de données et les repositories.
## Troisième étape : Migration
Depuis le dossier de larchive extraite, copier les repositories.
> mv gitea-repositories/* /data/gitea_data/git/repositories/
La destination '/data/gitea_data/' dépend de la configuration des volumes du conteneur.
Ne pas oublier dattribuer les bons droits aux dossiers copiés.
> chown -R user:user repositories/
'user' étant lutilisateur attribuer a Docker.
Ensuite faire la migration de la base de données :
> sqlite3 /data/gitea_data/gitea/gitea.db < gitea-db.sql
La commande dépend de la base de données utilisée.
Et cest tout. Si tout sest bien passé, on peut se connecter a son instance gitea comme dhabitude et retrouver tous ses repo abandonnés.

View File

@@ -1,100 +0,0 @@
---
title: Faire une PWA avec VueJS
tags: docker vuejs buefy
date: 2020-03-07
yearonly: false
url: pwavuejs.html
---
Récemment, jai voulu reprendre des applications mobiles que javais créés avec Flutter il y a quelques mois.
À ma grande surprise, aucune ne marchait. Google était passé par là et avait changé lAPI dAndroid une fois de plus.
Le plus simple pour récupérer mon code cétait de recréer des nouveaux projets, malheureusement la plupart des plugins aussi étaient devenus obsolète.
Alors plutôt que de tout refaire, je me suis penché sur une alternative pour créer des applications cross-platform : les applications web progressives. Alias PWA.
Une PWA, basiquement cest un site web capable de plus ou moins fonctionner sans serveur. Tout le rendu est sur le client, on embarque un maximum dans le client. Cependant il y a des règles à respecter, par exemple : https obligatoire.
Alors comment on fait ? En soit, on peut écrire lapplication en HTML/CSS/Javascript natif. Mais le code devient vite brouillon, difficile à maintenir. Si les pages sont un minimum dynamiques, on retrouve avec du HTML dans les scripts. Cest pourquoi il existe des frameworks Javascript.
# VueJS
Il existe plusieurs frameworks, notamment Angular, React et VueJS. VueJS est, pour moi, le plus abordable. La structure de ses fichiers .vue est simple, on comprend vite lintérêt de faire des composants. Alors allons-y.
## Installation
Premièrement, on a besoin de npm. On commence par installer VueJS :
npm install -g @vue/cli
Puis on crée le projet. Le preset 'SimplePWA' ferra l'affaire :
vue create todo_app
Optionnel mais Buefy est une bibliothèque qui facilite grandement la création d'interfaces responsives.
cd todo_app
npm install buefy
## La to-do list
On va écrire une application rapide : une to-do liste.
Dans 'src/main.js' :
import Vue from 'vue'
import App from './App.vue'
import './registerServiceWorker'
import Buefy from 'buefy'
import 'buefy/dist/buefy.css'
vue.config.productionTip = false
Vue.use(Buefy)
new Vue({
render: h => h(App)
}).$mount('#app')
Dans 'src/App.vue', on a trois grandes parties: Le template qui décrivent les éléments de la page, le script qui contient la logique applicative de la page et le css.
Dans 'src/App.vue' :
Missing code here
## Configuration vers PWA
Pour configurer la partie PWA, il y a deux principaux fichiers : vue.config.js et registerServiceWorker.js.
Le premier n'existe pas pour le moment, c'est a nous de le créé.
vue.config.js, placé a la racine du projet:
module.exports = {
pwa: {
name: 'Todo',
themeColor: '#2c3e50',
msTileColor: '#2c3e50',
appleMobileWebAppCapable: 'yes',
appleMobileWebAppStatusBarStyle: 'black',
workboxOptions: {
skipWaiting: true
}
}
}
registerServiceWorker.js contient plusieurs callback permetant d'adapter le comportement de l'application a son environnement.
Une immédiate est 'updated()', pour mettre a jour l'application locale lorsque la source change.
updated () {
console.log('New content is available; please refresh.')
window.location.reload(true)
},
Enfin pour avoir une PWA valide, il faut des généré une séries d'icone pour notre application. Il existe bon nombre de sites et petits logiciels qui permettent
de générer tout ça automatiquement. De mon coté, je fais un mix de [RealFavIconGenerator](https://realfavicongenerator.net/) et d'ajustements a la main.
## Outils
Un bon outil pour vérifié la validité de l'application en tant que PWA, c'est Google Lighthouse. Sous forme d'une extension Chromium, il fournit pas mal d'informations utile
pour notre PWA mais aussi pour n'importe quel autre site.
Aussi il existe une extension très utile au développement de Vue: Vue.js devtools sous forme d'extension Firefox ou Chromium.

View File

@@ -1,40 +0,0 @@
---
title: Sculpter avec Blender
tags: sculpt blender 3D
date: 2020-04-19
yearonly: false
url: sculptblender.html
---
Depuis quelque temps déjà, je voulais apprendre à utiliser Blender correctement. Je lavais déjà utilisé au travers dun cours mais lobjectif était de programmer des outils avec Blender. Pas tellement de lutiliser pour créer quelque chose.
Jai souvent voulu créer des personnages, auparavant cétait sur papier avec un crayon. Mais je ne suis pas très doué et malgré plusieurs tentatives, jai beaucoup de mal travailler ma pratique du dessin.
Alors jai regardé la sculpture sous Blender. Dans un sens jétais déjà familier avec de genre doutils. Jai pas mal fouillé, regarder beaucoup de tutoriels. La chaîne de YanSculpts en produit énormément, mais pour un débutant, je trouvais pas ça très clair. Cest plus une suite de conseil quand on connaît déjà la base.
Puis jai trouvé la chaîne de Grant Abbitt, ses vidéo sont plus posés et très bien guidée. À partir de la, jai fait mes premiers pas.
## Un premier jet
![sculpture1](/img/posts/sculpt1.jpg)
Cest un début, jai aussi exploré lapplication de texture avec le UV mapping. La bouche restait un défi particulier. Évidement pour un premier jet, il y a plein de défaut.
## Un second essai
Ensuite jai fait un second essai, cétait surtout pour retravailler les bases sans suivre dinstructions.
![sculpture2](/img/posts/sculpt2.jpg)
Je lai abandonné, puis jai en est commencé un autre.
## L'expérience
![sculpture3f](/img/posts/sculpt3f.jpg)
![sculpture3b](/img/posts/sculpt3b.jpg)
Celui-ci, cest mon plus avancé. Jai travaillé divers détails et finitions ainsi que les cheveux. Je suis pas fan des émetteurs pour les cheveux, donc je les ai faits en bloc. Mais ça donne un effet plastique et le détail est pas évident. Là ou il y a eu un problème, cest que bien trop tard dans le processus, jai voulu retravailler la forme du visage. À ce moment-là, le niveau de détail était trop élevé et la forme global de la tête est devenu pour le moins étrange. Aussi même si la bouche na pas été un franc succès, jai compris la forme et la technique pour la faire.
En somme, jai beaucoup appris en une semaine. Évidement, il va falloir du temps et plus dessais avant darriver a quelque chose qui ne fasse pas immédiatement peur.
Mais cest sur toutes ces erreurs que lon apprend et la progression est satisfaisante.

View File

@@ -1,22 +0,0 @@
---
title: Les frameworks Javascript
tags: javascript framework
date: 2020-04-23
yearonly: false
url: vanillajs.html
---
Le mois dernier je vantais les mérites de Vue sur tous les toits. Aujourdhui j'ai nouveau point de vue.
## Létat des lieux
Cétait peut-être dû a leffet de nouveauté pour moi. Moi qui venais du monde du C et du Java EE, les applications web semblaient si déstructurées.
Lajout dun framework a permis dajouter un contexte & des règles sur le style du code ainsi que son architecture. Cétait bien.
Mais il faut remonter a pourquoi ces outils. Certains diraient que cest pour créer une fausse complexité de la part des développeurs web, dautre que cest seulement par mode. Mais le web reste très jeune, chaque mois il y a une nouvelle manière de faire, pas forcément mieux mais différente de lancienne. Et puis le web évolue plus vite que ses normes. Ça devient vite compliqué de faire du web proprement.
Les frameworks comme Vue apporte une stabilité dans tout ça. Mais ça inclue aussi de la complexité. En regardant plusieurs conférences sur le Javascript, jai compris que les frameworks ne sont pas nécessaire. Ils ne sont pas loutil absolu dont on est obligé pour faire quoi que ce soit. Moi-même je suis tombé dans un cas ou le framework me limitait dans ce que je voulais faire. Cétait plus simple décrire lapplication sans framework.
## Au bûcher
En réalité, cest au cas par cas. Il faut savoir quand un framework est vraiment utile. Souvent, du Javascript ou Typescript, cest selon les préférences, accompagné de quelques bibliothèques simple dont on a vraiment besoin est plus stable, simple à utiliser et maintenir quun framework comportant plus de 1000 dépendances.
Il y a ce sentiment dusine à gaz qui apparaît souvent dans ce genre de cas. Alors quest-ce quon fait ? On met tout ça a la poubelle ? On brûle npm avec tous ses défauts, convertit tous les sites des plus grands au Javascript pur ? Bien sûr que non. Comme dit plus haut, le web avec tous ses sites dynamiques et ses applications comparables au Desktop est très jeune. On est dans une période dexpérimentation. Personne na trouvé la formule magique, elle change tous les mois après tout.

View File

@@ -1,37 +0,0 @@
---
title: Sculpter avec Blender 2
tags: sculpt blender 3D
date: 2020-06-06
yearonly: false
url: sculptblender2.html
---
Je reviens après presque deux mois de progrès. Jai été beaucoup occupé ce dernier mois, je nai pas pu autant avancer que ce que j'imaginais.
Au début, jai essayé de faire une sculpture tous les jours. Chaque jour, a 18 h après le travail, une session dune voir deux heures.
Ça a tenu vaguement deux semaines. Puis la motivation a oscillé, je ne savais plus dans quelle direction aller. Youtube est outil précieux pour
Blender. Jai continué à suivre les tutoriels de Grant Abbitt et ces derniers jours, Yan Sculpt aussi. Javais du mal avec ce dernier au début. Mais
il a des conseils et techniques très utiles quand on sait déja à peu près ce quon fait.
Alors voilà tout ce que jai sculpté depuis :
Tout est fait a la souris, je maide de plusieurs références, tous les personnages sont imaginés “sur le coup”.
![sculpture6](/img/posts/sculpt6.jpg)
![sculpture7](/img/posts/sculpt7.jpg)
![sculpture8](/img/posts/sculpt8.jpg)
![sculpture10](/img/posts/sculpt10.jpg)
Cest sur celle ce que jai passé le plus de temps. Mais pas forcément pour sculpter le visage.
## Le rendu
Sur ma dernière sculpture jai compris que la présentation finale était importante. Un modèle a beau être très bien, sil est mal éclairé avec un rendu bidon, il serra perçu comme tout pourri.
Alors je me suis mis à faire les matériaux de la peau et des yeux. La peau cest quelque chose de subtile, il y a plein de manières et de style. Jai essayé de rajouter du détail en peignant des rougeurs sur le visage (nez, joues, bouche) mais je fais tout a la souris pour le moment. Difficile déviter les gros points alors ça reste très discret. À grand ranfort de tuto Youtube, jai obtenu ça pour la peau :
![sculpture10_skin_nodes](/img/posts/sculpt10_nodes.png)
Et le rendu final après mêtre battu avec les lumières et les réglages de rendu. Je ne les ai pas encore tous compris et je suis pas encore parfaitement satisfait. Limage fait un effet “flou” et les couleurs manque de contraste.
![sculpture10_render](/img/posts/sculpt10_render.jpg)

View File

@@ -1,167 +0,0 @@
---
title: Setup Gitea / Drone / Docker
tags: gitea drone cicd docker
date: 2021-01-15
yearonly: false
url: giteadronedocker.html
---
Je suis un grand fan du selfhosted. J'essais d'avoir un maximum de services directement dans mon chez moi. Le but n'est pas de s'isoler d'internet mais de
reprendre le contrôle sur ce qui peut l'être.
# Gitea, Drone, Docker & You
Le plan est simple: avoir tout le pipeline d'intégration en local. Exit les coûts du ci/cd et de l'hébergement.
## Docker
Tout repose sur Docker pour simplifier un maximum la gestion / installation de l'ensemble de nos composants.
Les commandes sont pour un système basé sur Debian, tout se base sur la [documentation officielle de Docker](https://docs.docker.com/engine/install/debian/).
On commence par ajouter le repo de Docker avec ses dépendances:
apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg | apt-key add -
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/debian $(lsb_release -cs) stable"
On install Docker lui même:
apt-get update
apt-get install docker-ce docker-ce-cli containerd.io
systemctl enable docker
Puis Docker-compose:
curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
Enfin, on créé un registre docker local qui nous servira de cible pour drone.
Dans un fichier docker-compose.yml:
---
version: "2"
networks:
gitea:
external: false
services:
registry:
image: registry:2
container_name: registry
environment:
- REGISTRY_HTTP_RELATIVEURLS=true
volumes:
- /docker_data/registry:/var/lib/registry
ports:
- 5000:5000
restart: unless-stopped
## Gitea
C'est ici que le fun commence. On ajoute dans notre docker-compose sous services:
services:
...
gitea:
image: gitea/gitea:latest
container_name: gitea
environment:
- USER_UID=1000
- USER_GID=1000
restart: always
networks:
- gitea
volumes:
- /docker_data/gitea:/data
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
ports:
- 3000:3000
- 222:22
restart: unless-stopped
Sous volumes, /docker_data/gitea, est une préférence personnel pour ranger les fichiers de config des conteneurs Docker.
On lance le tout avec 'docker-compose up -d', et on va sur 'serveurIP:3000' pour configurer Gitea.
## Drone
Même combat qu'avec Gitea, on ajoute Drone et un runner de base a notre docker-compose:
services:
...
drone:
image: drone/drone
container_name: drone
depends_on:
- gitea
volumes:
- /docker_data/drone:/var/lib/drone/
environment:
- DRONE_GITEA_SERVER=git.monsite
- DRONE_GITEA_CLIENT_ID=...
- DRONE_GITEA_CLIENT_SECRET=...
- DRONE_RPC_SECRET=...
- DRONE_SERVER_HOST=...
- DRONE_SERVER_PROTO=http
ports:
- 8383:80
- 8484:443
restart: unless-stopped
drone-runner-docker:
image: drone/drone-runner-docker
container_name: drone-runner-docker
depends_on:
- drone
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- DRONE_RPC_PROTO=http
- DRONE_RPC_HOST=...
- DRONE_RPC_SECRET=...
- DRONE_RUNNER_CAPACITY=2
- DRONE_RUNNER_NAME=DefaultDockerRunner
ports:
- 8585:3000
restart: unless-stopped
La on a plus de choses a configurer avant de lancer. Depuis Gitea, ajoutez une application et récupéré toutes les clé nécessaire a Drone. Avoir la [documentation de Drone](https://docs.drone.io/server/provider/gitea/#install-runners) avec soit ne fait pas de mal.
## Utilisation du tout
Sur votre projet git favorit, par exemple superProjet, ajoutez un '.drone.yml':
kind: pipeline
type: docker
name: default
steps:
- name: build
image: plugins/docker
settings:
registry: dockerreg.monsite
repo: dockerreg.monsite/superProjet
- name: deploy
image: appleboy/drone-ssh
settings:
host:
from_secret: deploy_host
username:
from_secret: deploy_user
password:
from_secret: deploy_password
port: 22
script:
- docker-compose pull superProjet
- docker-compose up -d superProjet
Depuis l'interface de Drone, on active le repo de superProjet et on ajoute les secrets nécessaire.
Et maintenant on profite et abuse de notre super pipeline qui nous fait gagner du temps.

View File

@@ -6,7 +6,7 @@ yearonly: true
url: initial2D.html
---
![Logo of Initial2D](/img/projets/initial2D_logo.png)
![Logo of Initial2D](/img/projets/initial2D_logo.webp)
git: [github.com/GLTron3000/Initial2D](https://github.com/GLTron3000/Initial2D.git)

View File

@@ -6,9 +6,9 @@ yearonly: true
url: oozik.html
---
![Logo of Oozik](/img/projets/oozik_logo.png)
![Logo of Oozik](/img/projets/oozik_logo.webp)
git: [git.gltronic.ovh/gltron/OozikApp](https://git.gltronic.ovh/gltron/OozikApp)
git: [git.glt.sx/gltron/OozikApp](https://git.glt.sx/gltron/OozikApp)
Oozik est un lecteur de musique collaboratif conçu avec Flutter.
Il se décline en une version avec serveur et une version en peer-to-peer.

View File

@@ -6,9 +6,9 @@ yearonly: true
url: nexusv6.html
---
git: [git.gltronic.ovh/gltron/NexusV6](https://git.gltronic.ovh/gltron/NexusV6)
git: [git.glt.sx/gltron/NexusV6](https://git.glt.sx/gltron/NexusV6)
app: [gltronic.ovh](https://gltronic.ovh)
app: [glt.sx](https://glt.sx)
NexusV6 est un générateur de site statique écrit Typescript tournant sous Node.

View File

@@ -6,10 +6,10 @@ yearonly: true
url: etienneremote.html
---
![Logo of EtienneRemote](/img/projets/etienne_logo.png)
![Logo of EtienneRemote](/img/projets/etienne_logo.webp)
git: [git.gltronic.ovh/gltron/EtienneRemote](https://git.gltronic.ovh/gltron/EtienneRemote)
git: [git.glt.sx/gltron/EtienneRemote](https://git.glt.sx/gltron/EtienneRemote)
app: [etienneremote.gltronic.ovh](https://etienneremote.gltronic.ovh)
app: [etienneremote.glt.sx](https://etienneremote.glt.sx)
Etienne's Remote est une application web (PWA) créé avec Vue. Son but est de commander un bot Discord s'apparantant a une soundboard au travers d'une API Rest.

View File

@@ -6,10 +6,10 @@ yearonly: true
url: cloud32.html
---
![Logo of C32](/img/projets/c32b_logo.png)
![Logo of C32](/img/projets/c32b_logo.webp)
git: [git.gltronic.ovh/gltron/Cloud32](https://git.gltronic.ovh/gltron/Cloud32)
git: [git.glt.sx/gltron/Cloud32](https://git.glt.sx/gltron/Cloud32)
app: [cloud.gltronic.ovh](https://cloud.gltronic.ovh)
app: [cloud.glt.sx](https://cloud.glt.sx)
Cloud32 est un cloud personnel simple. Sert de 'to do list project' pour essayer des tech stack.

View File

@@ -6,10 +6,10 @@ yearonly: true
url: lilstreamy.html
---
![Logo of LilStreamy](/img/projets/lilstreamy_logo.png)
![Logo of LilStreamy](/img/projets/lilstreamy_logo.webp)
git: [git.gltronic.ovh/gltron/LilStreamy](https://git.gltronic.ovh/gltron/LilStreamy)
git: [git.glt.sx/gltron/LilStreamy](https://git.glt.sx/gltron/LilStreamy)
app: [lilstreamy.gltronic.ovh](https://lilstreamy.gltronic.ovh)
app: [lilstreamy.glt.sx](https://lilstreamy.glt.sx)
LilStreamy est une application web permettant de regarder une vidéo a plusieurs en peer-to-peer.

View File

@@ -6,10 +6,10 @@ yearonly: true
url: mozen.html
---
![Logo of Mozen](/img/projets/mozen_logo.png)
![Logo of Mozen](/img/projets/mozen_logo.webp)
git: [git.gltronic.ovh/gltron/Mozen](https://git.gltronic.ovh/gltron/Mozen)
git: [git.glt.sx/gltron/Mozen](https://git.glt.sx/gltron/Mozen)
app: [mozen.gltronic.ovh](https://mozen.gltronic.ovh)
app: [mozen.glt.sx](https://mozen.glt.sx)
Mozen est une plateforme de partage de modèle de machine learning.

View File

@@ -6,11 +6,11 @@ yearonly: true
url: voozik.html
---
![Logo of Voozik](/img/projets/voozik_logo.png)
![Logo of Voozik](/img/projets/voozik_logo.webp)
git: [git.gltronic.ovh/gltron/oozik](https://git.gltronic.ovh/gltron/oozik)
git: [git.glt.sx/gltron/oozik](https://git.glt.sx/gltron/oozik)
app: [voozik.gltronic.ovh](https://voozik.gltronic.ovh)
app: [voozik.glt.sx](https://voozik.glt.sx)
Voozik est une évolution de la version p2p de oozik.
C'est une application web (PWA) permettant de partager une playlist youtube (musique/vidéo)

View File

@@ -6,10 +6,10 @@ yearonly: true
url: tronio.html
---
![Logo of TronIo](/img/projets/tronio_logo.png)
![Logo of TronIo](/img/projets/tronio_logo.webp)
git: [git.gltronic.ovh/gltron/Tron.io](https://git.gltronic.ovh/gltron/Tron.io)
git: [git.glt.sx/gltron/Tron.io](https://git.glt.sx/gltron/Tron.io)
app: [tronio.gltronic.ovh](https://tronio.gltronic.ovh)
app: [tronio.glt.sx](https://tronio.glt.sx)
Tron.io est un jeu web multijoueurs

View File

@@ -6,9 +6,9 @@ yearonly: true
url: nexusv7.html
---
git: [git.gltronic.ovh/gltron/NexusV7](https://git.gltronic.ovh/gltron/NexusV7)
git: [git.glt.sx/gltron/NexusV7](https://git.glt.sx/gltron/NexusV7)
app: [gltronic.ovh](https://gltronic.ovh)
app: [glt.sx](https://glt.sx)
NexusV7 est un générateur de site statique écrit en Rust.

View File

@@ -0,0 +1,15 @@
---
title: Out Of Quiz
tags: rust vanillaJS jeu
date: 2022-01-01
yearonly: true
url: quiz.html
---
![Logo of Out Of Quiz](/img/projets/quiz_logo.webp)
git: [git.glt.sx/gltron/OutOfQuiz](https://git.glt.sx/gltron/OutOfQuiz)
app: [quiz.glt.sx](https://quiz.glt.sx/)
Out Of Quiz est un jeu multijoueur de type quiz de vitesse, basé sur le Out Of Context d'un serveur Discord

View File

@@ -0,0 +1,15 @@
---
title: Deep Impact
tags: vanillaJS jeu
date: 2022-02-01
yearonly: true
url: impact.html
---
![Logo of Deep Impact](/img/projets/impact_logo.webp)
git: [git.glt.sx/gltron/DeepImpact](https://git.glt.sx/gltron/DeepImpact)
app: [impact.glt.sx](https://impact.glt.sx/)
Deep Impact est un missile command musical

View File

@@ -3,12 +3,11 @@ html, body {
font-size: 17px;
font-family: sans-serif;
color:#444;
background-color: #EEEEEE;
height: 100%;
width: 100%;
margin: 0;
padding: 0;
background-image: url(/img/background.jpg);
background-color: #465e5e;
}
/** custom landing **/
@@ -40,6 +39,14 @@ html, body {
height: 100%;
}
.background {
position: fixed;
top: 0;
width: 100%;
height: 100%;
z-index: 1;
}
/** website **/
.avatar {
@@ -66,6 +73,7 @@ html, body {
flex-wrap: wrap;
justify-content: flex-start;
align-items: stretch;
z-index: 2;
}
footer {
@@ -90,8 +98,11 @@ footer {
flex-grow: 1;
width: 120px;
max-width: 120px;
height: 100%;
margin: 15px;
margin-right: 0px;
border-radius: 10px;
background-color: rgb(34, 34, 34);
z-index: 2;
}
.menuContainer ul {
@@ -126,9 +137,14 @@ footer {
flex-grow: 1;
width: 400px;
max-width: 400px;
height: 100%;
margin: 30px;
margin-left: 0px;
border-radius: 10px;
border-top-left-radius: 0px;
border-bottom-left-radius: 0px;
overflow-y: scroll;
background-color: rgb(219, 219, 219);
z-index: 2;
}
.submenuContainer h1 {
@@ -184,17 +200,22 @@ footer {
overflow-y: scroll;
transition: 0.5s;
text-align: justify;
background-color: rgba(57, 57, 57, 0.649);
z-index: 2;
}
.contentContainer article{
.contentContainer article {
overflow-y: auto;
margin-left: auto;
margin-right: auto;
box-sizing: border-box;
max-width: 900px;
min-height: calc(100% - 20px);
padding: 20px;
background-color: rgb(219, 219, 219);
border-radius: 10px;
margin-top: 10px;
margin-bottom: 10px;
z-index: 3;
}
.contentContainer article h5 {
@@ -240,8 +261,8 @@ footer {
@media only screen and (max-width: 1000px) {
.menuContainer { width:100%; height: auto; max-width: 100%; }
.submenuContainer { width:100%; height: auto; max-width: 100%; max-height: 500px; }
.contentContainer { width:100%; height: auto; max-width: 100%; max-height: auto; overflow-y: visible; }
.contentContainer article { width:100%; height: auto; max-width: 100%; overflow-y: visible; }
.submenuContainer { width:100%; height: auto; max-width: 100%; max-height: 500px; border-radius: 10px; margin: 5px; }
.contentContainer { width:100%; height: auto; max-width: 100%; max-height: auto; overflow-y: visible; border-radius: 10px; margin: 5px; }
.contentContainer article { width:100%; height: auto; max-width: 100%; overflow-y: visible; border-radius: 10px; margin: 5px; }
.sidebarnav a { font-size: 30px; }
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 560 KiB

BIN
resources/img/avatar.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 794 KiB

BIN
resources/img/avatar2.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.0 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 518 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 120 KiB

BIN
resources/img/icon.webp Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 132 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 105 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

85
resources/js/matrix.js Normal file
View File

@@ -0,0 +1,85 @@
// Canvas Matrix
const hex = "0123456789ABCDEF".split("");
const jap = "阪熊奈岡鹿梨阜埼茨栃媛".split("");
const matrix = document.getElementById("matrix");
matrix.height = window.innerHeight;
matrix.width = window.innerWidth;
const ctx = matrix.getContext("2d", { alpha: false });
const font_size = 15;
let columns = 0;
let drops = [];
const color = '#FFFFFF';
let lastFrame = performance.now();
const gradient = ctx.createLinearGradient(0, 0, matrix.width, 0);
gradient.addColorStop(0, '#ff0000');
gradient.addColorStop(1 / 7, '#ff8000');
gradient.addColorStop(2 / 7, '#ffff00');
gradient.addColorStop(3 / 7, '#00ff00');
gradient.addColorStop(4 / 7, '#00ffff');
gradient.addColorStop(5 / 7, '#0000ff');
gradient.addColorStop(6 / 7, '#ff00ff');
gradient.addColorStop(1, '#ff0040');
function initDrop(pos) {
return { pos, speed: Math.random() * 3 + 0.2, text: jap[Math.floor(Math.random()*jap.length)], red: Math.random() > 0.99 };
}
function init() {
columns = matrix.width / font_size;
drops = [];
for(let x=0; x < columns; x++) drops[x] = initDrop(matrix.height);
}
function render() {
// ctx.clearRect(0, 0, matrix.width, matrix.height);
ctx.fillStyle = "#465e5e";
ctx.globalAlpha = 0.1;
ctx.fillRect(0, 0, matrix.width, matrix.height);
ctx.globalAlpha = 1.0;
ctx.font = font_size + "px arial";
for(let i=0; i < drops.length; i++){
const drop = drops[i];
if (drop.red) {
ctx.fillStyle = "red";
} else {
ctx.fillStyle = color;
}
ctx.fillText(jap[Math.floor(Math.random()*jap.length)], i*font_size, drop.pos*(font_size/2));
if(drop.pos*(font_size/2) > matrix.height && Math.random() > 0.98) {
drops[i] = initDrop(0);
} else {
drop.pos += drop.speed;
}
}
}
function renderLoop() {
const now = performance.now();
if ((now - lastFrame) > (1000 / 60)) {
render();
lastFrame = now;
}
requestAnimationFrame(renderLoop);
}
window.addEventListener('resize', () => {
init();
});
document.addEventListener('DOMContentLoaded', () => {
init();
requestAnimationFrame(renderLoop);
});

133
resources/js/planet.js Normal file
View File

@@ -0,0 +1,133 @@
import * as THREE from 'https://cdn.skypack.dev/three@0.135.0';
import { GLTFLoader } from 'https://cdn.skypack.dev/three@0.135.0/examples/jsm/loaders/GLTFLoader.js';
// Global vars
const container = document.getElementById("background");
let scene;
let camera;
let renderer;
let modelMoon;
let modelPlanet;
// Animations global vars
let incrementer = 0.01;
let reverse = false;
const rotationSpeed = 0.001;
const orbitRadius = 1;
let lastRender = 0
// Helper
function setupContainer (container) {
const width = container.offsetWidth;
const height = container.offsetHeight;
const aspect = width / height;
camera.aspect = aspect;
camera.updateProjectionMatrix();
renderer.setSize(width, height);
};
async function loadModel(path) {
return new Promise((resolve) => new GLTFLoader().load(path, resolve));
}
// Init
function initScene() {
// Scene
renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.shadowMap.enabled = true;
container.appendChild(renderer.domElement);
scene = new THREE.Scene();
scene.background = new THREE.Color(0xdfc465);
scene.fog = new THREE.Fog(0x56bac9, 5, 25);
// Camera
camera = new THREE.PerspectiveCamera(40, 1, 1, 100);
camera.position.set(1, 1, 11);
// Listeners
setupContainer(container);
window.addEventListener("resize", () => setupContainer(container), false);
}
function initLights() {
// Global Light
const hemiLight = new THREE.HemisphereLight(0xeab044, 0x444444);
hemiLight.position.set(4, 0, 2);
scene.add(hemiLight);
const dirLight = new THREE.DirectionalLight(0xffffff);
dirLight.position.set(3, 10, 10);
dirLight.castShadow = true;
dirLight.shadow.camera.top = 2;
dirLight.shadow.camera.bottom = -2;
dirLight.shadow.camera.left = -2;
dirLight.shadow.camera.right = 2;
dirLight.shadow.camera.near = 0.1;
dirLight.shadow.camera.far = 40;
scene.add(dirLight);
}
async function initModels() {
// Load Models
modelPlanet = (await loadModel('models/LP_planet_only.glb')).scene;
modelMoon = (await loadModel('models/LP_planet_moon.glb')).scene;
modelPlanet.position.set(1, 1, 0);
modelPlanet.castShadow = true;
modelPlanet.receiveShadow = true;
scene.add(modelPlanet);
modelMoon.position.set(1, 1, 0);
modelMoon.castShadow = true;
modelMoon.receiveShadow = true;
scene.add(modelMoon);
}
// Animation
function easeInOut() {
if (reverse) {
incrementer -= 0.005;
} else {
incrementer += 0.005;
}
if (incrementer >= 1 || incrementer <= 0) {
reverse = !reverse;
}
return incrementer < 0.5
? 2 * incrementer * incrementer
: 1 - Math.pow(-2 * incrementer + 2, 2) / 2;
};
function animateScene() {
if ((performance.now() - lastRender) > (1000 / 60)) {
modelPlanet.position.set(1, easeInOut() / 4 + 0.5, 0);
modelPlanet.rotation.y += rotationSpeed;
// const x = Math.cos(incrementer) * orbitRadius;
// const z = Math.sin(incrementer) * orbitRadius;
modelMoon.position.set(0, 1 - easeInOut() - 2, 0);
modelMoon.rotation.y -= rotationSpeed + 0.01;
renderer.render(scene, camera);
}
requestAnimationFrame(animateScene);
}
// Main
export async function init() {
initScene();
initLights();
await initModels();
animateScene();
}
init();

Some files were not shown because too many files have changed in this diff Show More