Debian Debian-France Debian-Facile Debian-fr.org Debian-fr.xyz Debian ? Communautés

Debian-facile

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

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

#226 07-04-2019 02:13:07

Maximilien LIX
Membre
Distrib. : Archlinux
(G)UI : GNOME
Inscription : 17-12-2013
Site Web

Re : Vos réalisations de fonds d'écrans.

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..

Dernière modification par Maximilien LIX (08-04-2019 22:24:03)

Hors ligne

#227 07-04-2019 11:11:28

tophechris94
Membre
Lieu : val de marne ( 94)
Distrib. : debian unstable
Noyau : 5.10.0-8-686-pae
(G)UI : openbox
Inscription : 08-07-2016
Site Web

Re : Vos réalisations de fonds d'écrans.

Salut a tous , un fond d écran debian facile tongue
1554628235-debian-facile.png

sparkylinux-ver-fluxbox-icewm=> https://mega.nz/file/jJ8hiJBD#rhy5o3GzC … RFSeokkwFo
je viens en paix , pas taper sur la tete .

Hors ligne

#228 21-08-2021 18:11:06

Yal
Membre
Distrib. : Debian GNU/Linux 11
Noyau : 5.10.0-8
(G)UI : Xfce
Inscription : 16-07-2021
Site Web

Re : Vos réalisations de fonds d'écrans.

Hello,

Je n'ai pas trouvé de topic plus récent, mais je me dis que c'est pas plus mal de poster ça ici. Au cas où ça intéresserait quelqu'un(e), j'ai mis en ligne une poignée de wallpapers dédiés à Debian (et à Xfce),

Screenshot-2021-08-21-17-53-06.jpg

Si vous vous posez encore la question, naaaan je ne suis pas graphiste... tongue lol

Les images sont dispo sur mon Git, sur Codeberg. Le dossier SVG contient les originaux modifiables dans Inkscape (ou autre), le dossier PNG contient une version finale de chaque image en 2580x1440 qui s'affichera sans déformation sur les écrans 16:9, quoi (genre 1920x1080). Une des images est en mode portrait (vertical) et en 1920x1080 pour coller à mon second écran qui est orienté comme ça.

En dehors de ca j'ai d'autres wallpapers accumulés depuis des années et dont je ne suis pas l'auteur, je sais donc pas si j'ai le droit de les partager. N'hésitez pas à partager les vôtres: y a personne qui a fait de nouveaux wallapers Debian depuis le dernier post dans ce topic ? wink

Hors ligne

#229 21-08-2021 19:03:29

arpinux
CA Debian-Facile
Lieu : Montréal d'aude
Distrib. : nakeDeb
Noyau : 5.10-amd64
(G)UI : i3wm - fluxbox
Inscription : 30-06-2016
Site Web

Re : Vos réalisations de fonds d'écrans.

^^ merci beaucoup pour ces fonds d'écran !
trop classe pour XFCE !!
je me permets ... on pourrait te les piquer pour les coller dans la prochaine DFiso Bullseye ?? smile

nous sommes tous différents ... c'est notre point commun ...
Association Debian-Facile - Les cahiers du débutant - ISO Debian-Facile - 3hg - nakeDeb

Hors ligne

#230 21-08-2021 20:32:54

Yal
Membre
Distrib. : Debian GNU/Linux 11
Noyau : 5.10.0-8
(G)UI : Xfce
Inscription : 16-07-2021
Site Web

Re : Vos réalisations de fonds d'écrans.

arpinux a écrit :

^^ merci beaucoup pour ces fonds d'écran !
trop classe pour XFCE !!
je me permets ... on pourrait te les piquer pour les coller dans la prochaine DFiso Bullseye ?? smile



Bien entendu. J'en serais ravi smile

Edit: je ne sais pas si tu comptes utiliser les SVG pour cela, mais dans ce cas ils risquent de be pas être utilisables directement: y a plein de de choses qui "dépassent" des bords de la page... J'en suis encore à apprendre à utiliser Inkscape et, ben, j'avance doucement wink

Et si tu as besoin de plus de formats pour les PNG, fais-moi signe.

Dernière modification par Yal (21-08-2021 20:35:58)

Hors ligne

#231 25-08-2021 18:25:41

Yal
Membre
Distrib. : Debian GNU/Linux 11
Noyau : 5.10.0-8
(G)UI : Xfce
Inscription : 16-07-2021
Site Web

Re : Vos réalisations de fonds d'écrans.

Pour les amateurs/trices, j'ai ajouté quelques variations colorées:

preview.jpg

@arpinux: ils sont bien entendu tous à la disposition de DF si l'idée tient toujours, et de tout le monde qui le souhaite en fait wink

La majorité est proposée en version paysage et portrait (sauf les derniers dans l'aperçu), en PNG et en SVG (modifiables dans Inkscape). Il sont toujours hébégergé chez Codeberg, un Git pas prise de tête et sans Microsoft tongue

Dernière modification par Yal (25-08-2021 18:44:24)

Hors ligne

#232 25-08-2021 20:43:11

seb95
Membre
Distrib. : openSUSE Leap et Tumbleweed
(G)UI : GNOME, Xfce et KDE
Inscription : 19-02-2017
Site Web

Re : Vos réalisations de fonds d'écrans.

Magnifique!!!

Hors ligne

#233 25-08-2021 21:23:03

Yal
Membre
Distrib. : Debian GNU/Linux 11
Noyau : 5.10.0-8
(G)UI : Xfce
Inscription : 16-07-2021
Site Web

Re : Vos réalisations de fonds d'écrans.

Merci wink

Hors ligne

#234 25-08-2021 22:37:40

SuShY
CA Debian-Facile
Lieu : Chartres
Distrib. : Debian Sid x86_64
Noyau : Linux > 5.10.x-x-amd64
(G)UI : i3WM - 4.19.1-1
Inscription : 06-01-2018
Site Web

Re : Vos réalisations de fonds d'écrans.

Très sympa, merci !

Hors ligne

#235 27-08-2021 13:32:06

Herve33
Membre
Lieu : Mérignac 33
Distrib. : Debian 11 Xfce
Inscription : 21-09-2016

Re : Vos réalisations de fonds d'écrans.

Oui super beaux !!! merci.gif

Acer Aspire 5733 - Debian 11 Xfce

Hors ligne

#236 03-09-2021 02:17:43

arpinux
CA Debian-Facile
Lieu : Montréal d'aude
Distrib. : nakeDeb
Noyau : 5.10-amd64
(G)UI : i3wm - fluxbox
Inscription : 30-06-2016
Site Web

Re : Vos réalisations de fonds d'écrans.

et hop, merci Yal big_smile
fonds ajoutés dans DFiso-Bullseye. https://debian-facile.org/git/ProjetsDF … 8624ebcab9
j'ai juste renommé pour ajouter "*-par-Yal-CC-BY" et j'ai ajouté la licence dans le fichier général de DFiso https://debian-facile.org/git/ProjetsDF … abf3ed77c7

merci encore wink

nous sommes tous différents ... c'est notre point commun ...
Association Debian-Facile - Les cahiers du débutant - ISO Debian-Facile - 3hg - nakeDeb

Hors ligne

#237 03-09-2021 20:56:41

Yal
Membre
Distrib. : Debian GNU/Linux 11
Noyau : 5.10.0-8
(G)UI : Xfce
Inscription : 16-07-2021
Site Web

Re : Vos réalisations de fonds d'écrans.

Merci à toi! Je ne m'attendais pas à les voir apparaitre sur l'ISO (très content de trouver le PinkFlamingo dans ta sélection, btw) wink

En espérant que fournir les SVG (voir sur le repo git) encourage d'autres à en faire et à les partager : y a jamais assez de wallpapers tongue

@Herve33: merci wink

Dernière modification par Yal (03-09-2021 20:57:17)

Hors ligne

Pied de page des forums