logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 Vos sites et projets perso » Blog francophone sur le développement informatique » 30-05-2019 13:59:28

Maximilien LIX
Réponses : 0
Hello ! smile
Je vous présente mon site personnel sur lequel je publie de petits articles sur le dev en général ect.
Si jamais cela intéresse quelqu'un par ici, voici le lien https://www.protocod.dev/posts/

#2 Re : Le coin des artistes Debian-Facile » Vos réalisations de fonds d'écrans. » 07-04-2019 01:13:07

Maximilien LIX
Hello!

J'ai réécrit le script pour faire un trombi en Go
ça donne ça


package main

import (
  "fmt"
  "io"
  "io/ioutil"
  "log"
  "net/http"
  "os"
  "os/exec"
  "regexp"
)

var (
  url          = "https://debian-facile.org/img/avatars"
  outputFolder = "images-go"
)

func download(content []byte) (string, error) {
  nameByte, err := retriveImageName(content)
  imageName := string(nameByte)

  if err != nil {
    return "", fmt.Errorf("%s", err.Error())
  }

  file, err := os.Create(fmt.Sprintf("%s/%s", outputFolder, imageName))

  if err != nil {
    return "", fmt.Errorf("Unable to create file: %s", err.Error())
  }

  defer file.Close()

  endPoint := fmt.Sprintf("%s/%s", url, imageName)
  resp, err := http.Get(endPoint)

  if err != nil {
    return "", fmt.Errorf("Unable to get image: %s", err.Error())
  }

  defer resp.Body.Close()

  _, err = io.Copy(file, resp.Body)

  if err != nil {
    return "", fmt.Errorf("Unable to write downloaded content into filesystem: %s", err.Error())
  }

  return fmt.Sprintf("%s downloaded successfully from %s", imageName, endPoint), nil
}

func retriveImageName(b []byte) (string, error) {
  imgRegexp, err := regexp.Compile(`\"(.*?)\"`)

  if err != nil {
    return "", err
  }

  found := imgRegexp.Find(b)

  ok, err := regexp.Match(`.png|.gif|.jpg|jpeg`, found)

  if err != nil || !ok {
    return "", fmt.Errorf("%s is not a valid image source", string(found))
  }

  name := string(found)
  name = name[:len(name)-1]
  name = name[1:]

  return name, nil
}

func crawl(body []byte) {
  hrefRegexp, err := regexp.Compile(`href="(.*?)\"`)

  if err != nil {
    log.Printf("%s\n", err.Error())
  }

  hrefBytes := hrefRegexp.FindAll(body, -1)

  ch := make(chan string)

  defer close(ch)

  for _, href := range hrefBytes {
    go func(h []byte) {
      downloaded, err := download(h)

      if err != nil {
        ch <- err.Error()
      } else {
        ch <- downloaded
      }
    }(href)
  }

  for i := 0; i < len(hrefBytes); i++ {
    select {
    case image := <-ch:
      log.Println(image)
    }
  }
}

func main() {
  res, err := http.Get(url)

  if err != nil {
    panic(fmt.Sprintf("Unable to fetch debian facile page: %s", err.Error()))
  }

  defer res.Body.Close()

  bodyBytes, err := ioutil.ReadAll(res.Body)

  if err != nil {
    panic(fmt.Sprintf("Unable to read request body: %s", err.Error()))
  }

  crawl(bodyBytes)
  cmd := exec.Command("montage", outputFolder+"/*.jpg", outputFolder+"/*png", outputFolder+"/-title", "trombi", "trombi-go.png")
  err = cmd.Run()
  if err != nil {
    log.Fatal(err)
  }
}
 



Ça pourrait être mieux mais bon je considère ce code comme une première version.

Niveau benchmark, comparé au script bash ça donne ça:

./trombi  (go) 6,10s user 0,53s system 96% cpu 6,867 total
./trombi.sh (bash) 36,34s user 11,76s system 37% cpu 2:08,02 total



Bref, je vais améliorer certaines choses histoires de gagner un peu de temps

EDIT

Réécriture du code:

main.go


package main

import (
  "gitlab.com/df-trombi/crawler"
)

var (
  url          = "https://debian-facile.org/img/avatars"
  outputFolder = "images-go"
)

func main() {
  crawler := crawler.New().SetURL(url).SetOutputDirectory("images-go").SetFormats(".png", ".jpg", ".jpeg", ".gif")
  crawler.Crawl()
}
 



helper/helper.go


package helper

import (
  "io/ioutil"
  "net/http"
)

// GetResponseBody open, get and close request body
func GetResponseBody(response *http.Response) ([]byte, error) {
  bodyReader := response.Body

  defer response.Body.Close()

  bodyBytes, err := ioutil.ReadAll(bodyReader)

  if err != nil {
    return nil, err
  }

  return bodyBytes, nil
}
 



crawler/crawler.go


package crawler

import (
  "fmt"
  "io"
  "log"
  "net/http"
  "os"
  "os/exec"
  "regexp"

  "gitlab.com/df-trombi/helper"
)

func (c *Crawler) download(content []byte) (string, error) {
  nameByte, err := c.retriveImageName(content)
  imageName := string(nameByte)

  if err != nil {
    return "", fmt.Errorf("%s", err.Error())
  }

  file, err := os.Create(fmt.Sprintf("%s/%s", c.outputDirectory, imageName))

  if err != nil {
    return "", fmt.Errorf("Unable to create file: %s", err.Error())
  }

  defer file.Close()

  endPoint := fmt.Sprintf("%s/%s", c.url, imageName)
  resp, err := http.Get(endPoint)

  if err != nil {
    return "", fmt.Errorf("Unable to get image: %s", err.Error())
  }

  defer resp.Body.Close()

  _, err = io.Copy(file, resp.Body)

  if err != nil {
    return "", fmt.Errorf("Unable to write downloaded content into filesystem: %s", err.Error())
  }

  return fmt.Sprintf("%s downloaded successfully from %s", imageName, endPoint), nil
}

func (c *Crawler) retriveImageName(b []byte) (string, error) {
  imgRegexp, err := regexp.Compile(`\"(.*?)\"`)

  if err != nil {
    return "", err
  }

  found := imgRegexp.Find(b)

  ok, err := regexp.Match(`.png|.gif|.jpg|jpeg`, found)

  if err != nil || !ok {
    return "", fmt.Errorf("%s is not a valid image source", string(found))
  }

  name := string(found)
  name = name[:len(name)-1]
  name = name[1:]

  return name, nil
}

func (c *Crawler) crawl(body []byte) {
  hrefRegexp, err := regexp.Compile(`href="(.*?)\"`)

  if err != nil {
    log.Printf("%s\n", err.Error())
  }

  hrefBytes := hrefRegexp.FindAll(body, -1)

  ch := make(chan string)

  defer close(ch)

  for _, href := range hrefBytes {
    go func(h []byte) {
      downloaded, err := c.download(h)

      if err != nil {
        ch <- err.Error()
      } else {
        ch <- downloaded
      }
    }(href)
  }

  for i := 0; i < len(hrefBytes); i++ {
    select {
    case image := <-ch:
      log.Println(image)
    }
  }
}

// Crawler struct
type Crawler struct {
  url             string
  outputDirectory string
  formats         []string
}

// SetFormats fluent format setter for Crawler
func (c *Crawler) SetFormats(formats ...string) *Crawler {
  c.formats = formats
  return c
}

// GetFormats formats getter for Crawler
func (c *Crawler) GetFormats() []string {
  return c.formats
}

// SetURL fluent url setter for Crawler
func (c *Crawler) SetURL(url string) *Crawler {
  c.url = url
  return c
}

// SetOutputDirectory fluent outputDirectory setter for Crawler
func (c *Crawler) SetOutputDirectory(directory string) *Crawler {
  c.outputDirectory = directory
  return c
}

// GetOutputDirectory outputDirectory getter for Crawler
func (c *Crawler) GetOutputDirectory() string {
  return c.outputDirectory
}

// GetURL url getter for Crawler
func (c *Crawler) GetURL() string {
  return c.url
}

// New get new Crawler
func New() *Crawler {
  return &Crawler{}
}

func (c *Crawler) buildOutputFilePath() []string {
  var res []string
  for _, format := range c.formats {
    res = append(res, fmt.Sprintf("%s/*%s", c.outputDirectory, format))
  }
  return res
}

func (c *Crawler) buildCommand() *exec.Cmd {
  arg := c.buildOutputFilePath()
  arg = append(arg, "-title")
  arg = append(arg, "trombi")
  arg = append(arg, "trombi-go.png")
  return exec.Command("montage", arg...)
}

// Crawl url
func (c *Crawler) Crawl() {
  // get pointeur of Response object
  res, err := http.Get(c.url)

  if err != nil {
    panic(fmt.Sprintf("Unable to fetch debian facile page: %s", err.Error()))
  }

  // open, get and close response body
  bodyBytes, err := helper.GetResponseBody(res)

  if err != nil {
    panic(fmt.Sprintf("Unable to read request body: %s", err.Error()))
  }

  c.crawl(bodyBytes)

  cmd := c.buildCommand()
  err = cmd.Run()

  if err != nil {
    log.Fatal(err)
  }
}
 




C'est un peu plus propre smile

PS: ouais je sais que l'utilisation de getter/setter en go n'est pas vraiment une bonne pratique, on va dire que j'ai mes réflexes de dev java..

#3 Vos sites et projets perso » Itérateurs fonctionnels pour Go » 06-04-2019 14:57:08

Maximilien LIX
Réponses : 0
Hello!
Ce n'est pas grand chose mais au moins ça fourni des itérateurs fonctionnels génériques tels que Map, Filter et Réduce.
https://gitlab.com/protocod/stream

À noter qu'il existe une proposition pour introduire les types génériques dans Go en utilisant des "Contracts".
https://go.googlesource.com/proposal/+/ … ntracts.md

Si cela devait être implémenté dans le version 2 du langage, je reverrai certainement en profondeur la lib.

#4 Re : Les logiciels libres » Sexy icecat » 09-03-2019 22:05:36

Maximilien LIX
Je cite

Certains sites utilisent le langage JavaScript (dont le nom officiel est ECMAscript) pour des programmes non libres, le programme LibreJS, un module complémentaire d'IceCat (ainsi que de IceWeasel et Firefox), détecte le code JavaScript non libre dans les pages web que vous visitez et le bloque. Source : Gnu.org - le piège JavaScript.



Qu'entends t-on par "non libre", du JS minifié ? Si je demande à Icecat d'aller sur une single page app faite avec Vue.js, ce dernier va me gueuler dessus parce que Vue aura minifié le code avant de l'envoyer au client ?

Voyons voir...

https://www.gnu.org/philosophy/javascript-trap.fr.html
Actuellement, nous considérons un programme JavaScript comme non trivial s'il répond à l'une des conditions suivantes :

    il est appelé en tant que script externe (à partir d'une autre page) ;
    il déclare un tableau contenant plus de 50 éléments ;
    il définit une entité nommée (fonction ou méthode) qui appelle autre chose qu'une primitive ;
    il définit une entité nommée comprenant plus de trois éléments de construction conditionnels et une construction en boucle ;
    le code n'appartenant pas aux définitions nommées appelle autre chose que des primitives et des fonctions définies plus haut dans la page ;
    le code n'appartenant pas aux définitions nommées comprend, au total, plus de trois éléments de construction conditionnels et une construction en boucle ;
    il fait appel à eval ;
    il fait des requêtes Ajax ;
    Pour accéder de manière dynamique aux propriétés des objets, il utilise une notation crochet qui ressemble à objet[propriété].
    il modifie le DOM ;
    il utilise des constructions dynamiques JavaScript qui sont difficiles à analyser sans interpréter le programme, ou bien il est chargé en même temps que des scripts qui utilisent de telles constructions ; ces constructions sont :
        l'appel à des méthodes via la notation crochets,
        l'utilisation avec certaines méthodes (Obj.write, Obj.createElement, etc.) de tout élément de construction autre qu'une chaîne de caractères constante.



ah bah oui c'est donc cela...
Bon bah exit la minification, envoyons pleins d'octets inutiles sur le réseaux et évitons les frameworks frontend pour faire des SPA. Je suggère de faire des site web en HTML et CSS sans JS et sans aucun backend particulier. Pas de bases de données, pas de web services. Uniquement des sites statiques.

#5 Re : Autres » Problème à venir avec mon compte sur DF » 12-11-2018 00:34:35

Maximilien LIX
ah en fait je pensais que ça envoyait un mail de confirmation sur l'ancienne adresse lol
Ma faute, désolé pas taper ^^'

#6 Autres » Problème à venir avec mon compte sur DF » 10-11-2018 16:46:33

Maximilien LIX
Réponses : 2
Hello,
j'ai un petit soucis que je ne peux malheureusement pas régler moi-même.

Voyez vous, l'adresse de connexion de mon compte sur le forum DF utilise une adresse mail à laquelle je ne peux m'y connecter. (en fait j'ai un compte protonmail dont j'ai perdu à la fois le mot de passe et l'autentificateur en 2 étapes ^^')

C'est balo, si j'oublie mon mot de passe bah je perdrai mon compte. Ça fait 5 ans que je suis inscrit et ça serait bête de perdre mon compte ^^'

Si un admin veut bien se donner la peine de me contacter. J'aimerais beaucoup changer mon adresse mail ^^'

Merci bien big_smile

#7 Re : Scripts, programmes et robots » [Résolu] node JS qui s'installe sans npm... » 01-11-2018 15:30:05

Maximilien LIX
Bonjour, je te recommande d'utiliser nvm pour gérer tes différentes version de node js https://github.com/creationix/nvm

Je te recommande aussi (sauf besoin spécifique) de travaillé sur la version LTS de Node JS.

PS: installer node js sous linux, c'est quasi aussi simple que sous windows. Si tu n'arrives pas à installer Node JS sur linux, je te décourage fortement d'utiliser cette techno. Y compris sur windows.

#9 Re : Scripts, programmes et robots » Un langage proche de Python (facile) pour tout faire ? » 22-10-2018 16:06:35

Maximilien LIX
Ouais, tu peux très bien déclarer un pointeur dans une structure qui pointe sur une fonction assez facilement en Go (histoire de créer une "méthode"), mais la notion d'héritage sur les struct est pas vraiment intuitive je trouve smile

#10 Re : Scripts, programmes et robots » Un langage proche de Python (facile) pour tout faire ? » 21-10-2018 15:51:43

Maximilien LIX
go learning(user, channel) tongue

Je suis en train d'apprendre ce langage. Malheureusement au boulot je n'arrive pas à me détacher de Php et Java, mais j'avoue que le Go à un énorme potentiel. Même si dans mon cas la transition From Java To Go est terriblement frustrante. Les choses simples sont souvent les meilleures, mais j'ai l'impression de perdre en souplesse niveau conception en Go. Je suis beaucoup trop habitué à mes classes (abstraites ou non) et à mes interfaces, sans parler des designs patterns (Builder et Fluent, AbstractFactory, Singleton ect) kernal_panic.gif

#11 Re : Le coin des artistes Debian-Facile » Vos réalisations de fonds d'écrans. » 17-10-2018 21:06:25

Maximilien LIX
ah mais faut filtrer par rapport au format gif aussi alors, j'ai zappé désolé big_smile

#12 Re : Le coin des artistes Debian-Facile » Vos réalisations de fonds d'écrans. » 11-10-2018 09:55:05

Maximilien LIX
@lagrenouille m'a donné une idée..

Bon alors c'est pas parfait (et je pense refaire le truc en golang au passage) mais voici un script vous permettant de générer un trombi complet.


#!/usr/bin/env bash

output_folder="images"

if [ ! -d "$output_folder" ]; then
  mkdir $output_folder
fi

url="https://debian-facile.org/img/avatars/"
page=$(curl -X GET $url)
imgs=$(echo "$page" | grep 'href=' | cut -d "<" -f7 | sed -e 's/"*"/ /g' | cut -d " " -f3 | grep -E '.jpg|.png')

for img in $imgs ; do
  complete_url="${url}${img}";
  curl -s -X GET "${complete_url}" -o "${output_folder}/${img}"
done

cd "$output_folder"
montage *.jpg *png -title "trombi" trombi.png
 



1539246597.png

Chez moi ça donne ça
1539248051.png

#14 Re : Vos sites et projets perso » Blog anglophone de qualité variable » 24-09-2018 20:40:06

Maximilien LIX
En voilà une idée qui est bonne yikes
Je n'y avais pas pensé

#15 Vos sites et projets perso » Blog anglophone de qualité variable » 23-09-2018 21:17:12

Maximilien LIX
Réponses : 2
Hello world!

Bon bah en fait j'ai pas grand chose à présenter au grand jour mais ça fait quelques temps que j'ai un blog sur la plateforme Medium. (rien à voir avec le spiritisme!)

Bearded coder’s blog

C'est un ptit blog pépère que j'alimente au gré de mes envies et qui a pour thème la programmation. Ça peut être tout. En ce moment je suis amené à travaillé sur Symfony, il risque d'y avoir des trucs sur Symfony 4. Mais j'aimerais aussi parler du langage Go et continuer de parler de Vertx avec notamment, une bonne et grosse partie sur la façon de gérer des contrats pour une API REST (notamment via le standard OpenAPI) et aussi la façon de gérer les WebSockets. (Le tout en Java, Vertx est polyglotte mais je préfère me baser sur du Java)

Bon alors, je sais ce qu'on va me dire...

T'as pas fait le site toi-même ?


Non, j'avais pas la motivation, je faisais assez de code en stage à ce moment là

Mais c'est pas une plateforme libre ?


Pas vraiment mais les articles qu'on y trouve sont souvent intéressants, c'est simple et la communauté me plait.
Mais je néglige pas la possibilité de faire des torchons sur un truc francophone genre framablog

Ton anglais est approximatif


Oui, c'est pourquoi je rédige en anglais. Cela me pousse à m'améliorer, c'est du learning by doing.

Voilà tout. smile

edit du 16/12/2018

Bon j'ai changé le nom et la devise ainsi que l'url vers le torchon, c'est ici que ça se passe -> stupid dev blog
J'ai pas beaucoup de temps, dur d'écrire et de publier quoi que ce soit. Je vais essayer de m'imposer un petit rythme mais c'est pas gagné...

#16 Matériel » Matériels d'occasion pour bidouilleurs et bidouilleuses » 20-09-2018 12:37:51

Maximilien LIX
Réponses : 1
ou professionnel, qu'importe...

Hello world !
Je vous présente un site qui m'a été recommandé par un enseignant https://www.mabox.fr/

On y trouve du matériel d'occasion pas trop cher et j'admets que j'ai bien envie de me prendre un ptit thinkpad pour bosser. smile
Si vous connaissez des sites de ventes de PC reconditionnés sympathiques, cela pourrait être intéressant des les partager. Je suis preneur en tout cas. (en fait je pense que nous sommes tous preneur)

Voili voilou.

Désolé si un post sur le sujet existe déjà au passage big_smile

#18 Re : Les logiciels libres » star-up Cosy Cloud » 05-03-2018 00:42:25

Maximilien LIX
<troll id="humour">ovh, c'est bien quand les serv ne sont pas en pannes.</troll>

#19 Re : Autres News » Faille de sécurité gravissime sur les CPU Intel » 09-01-2018 09:04:54

Maximilien LIX
Ça serait intéressant de voir un exploit en javascript. ^^'
Dire qu'on peut se faite avoir un chargeant une simple page web qui aura accès à des infos confidentielles. Certes, le programme n'aura un accès qu'en lecture, mais c'est suffisant pour récupérer des informations confidentielles.

#20 Re : Le coin des artistes Debian-Facile » Vos réalisations de fonds d'écrans. » 18-07-2017 14:04:22

Maximilien LIX
https://i.goopics.net/7Xo9r.png

Bon c'est pas tellement un fond d'écran mais un essaie personnel sur ma tablette graphique avec krita...

#21 Re : Les logiciels libres » Quel terminal utiliser ? » 17-07-2017 23:03:57

Maximilien LIX
Tilix est aussi intéressant si tu aimes jonglet entre plein de terminaux. Fun fact c'est fait en langage D tongue

#22 Re : Améliorations et Suggestions » Mot de passe oublié » 01-05-2017 10:55:48

Maximilien LIX
Dans mon université il  y a une licence en cyber sécurité et j'avais entendu qu'ils arrivaient plus ou moins à contourner le principe des 3 essaies en changeant l'adresse IP de l'attaquant pour tromper le serveur.
Cela dit, je ne sais pas si c'est efficace.

Merci, je ne connaissais pas keepassX smile

#23 Améliorations et Suggestions » Mot de passe oublié » 30-04-2017 15:55:24

Maximilien LIX
Réponses : 3
Hello world!
Je me posait une petite question. Il m'arrive parfois de changer le mot de passe de mon compte via le lien "mot de passe oublié" et j'ai remarqué que les mots de passe générés aléatoirement ne contiennent pas de caractères spéciaux type @ ; \ ~ # ! ect

Est-ce que cela ne rendrait pas une attaque par brute force plus envisageable ?

Juste pour savoir smile

#25 Scripts, programmes et robots » Ressources pour faire de l'assembleur » 02-03-2017 21:26:40

Maximilien LIX
Réponses : 2
Hello world!
En cours d'architecture système notre professeur nous a présenté la page d'un certain Paul Carter.
http://pacman128.github.io/pcasm/

On peut y trouver des ressources (aussi bien en anglais qu'en français) sur l'assembleur. Bref, si ça intéresse quelqu'un. big_smile

Pied de page des forums

Propulsé par FluxBB