Greboca  

Suport technique et veille technologique

Aujourd’hui, les grandes entreprises et administrations publiques hésitent entre continuer à utiliser des logiciels propriétaires ou basculer vers les Logiciels Libres. Pourtant, la plupart des logiciels libres sont capables de bien traiter les données issues des logiciels propriétaire, et parfois avec une meilleur compatibilité.

C’est alors la barrière de la prise en main qui fait peur, et pourtant...

Les logiciels libres

L’aspect « Logiciel Libre » permet une évolution rapide et une plus grande participation des utilisateurs. Les aides et tutoriels foisonnent sur Internet ou sont directement inclus dans le logiciel lui-même.

Enfin, les concepteurs sont plus proches des utilisateurs, ce qui rend les logiciels libres plus agréable à utiliser et conviviaux.

Grâce à la disponibilité des logiciels libres, vous trouverez facilement des services de support techniques et la licence n’est plus un frein à l’utilisation de ces logiciels par votre personnel.

Notre support technique concerne essentiellement les logiciels libres, que ce soit sous forme de services ponctuels ou de tutoriels.

LinuxFr.org : les journaux  -  Une 20-aine de lignes de code pour le defer de Go en C++

 -  Février 2022 - 

Bonjour Nal,

Si tu es comme moi, tu détestes Go malgré quelques fonctionnalités géniales et un écosystème vaste et grandissant, qui en font un choix à considérer malgré tes préférences personnelles.

Si tu es comme moi, tu préfères certainement le C++ surtout depuis le C++11. Tu fais d'ailleurs surement du C++20 histoire d'être moderne.

Parmi les fonctionnalités de Go que tu apprécies, il y a le mot clé defer :

func example() error {
  rsrc1, err := CreateResource()
  if err != nil {
    return err
  }
  defer rsrc1.Destroy()

  rsrc2, err := CreateResource()
  if err != nil {
    return err
  }
  defer rsrc2.Destroy()

  DoSomething(rsrc1, rsrc2)

  return nil
}

TL;DR : Il permet d'exécuter du code lorsque l'on quitte cette dernière.

Je veux la même chose en C++. Et en vrai, cela se fait assez simplement. On va juste profiter du concept de destructeur :

#include 
#include 
#include 

class defer_frame {
  public:
    using function = std::function<void(void)>;

  private:
    std::vector<function> m_funcs;

  public:
    ~defer_frame() {
      std::for_each(m_funcs.rbegin(), m_funcs.rend(), [](auto &f) {
        f();
      });
    }

    void defer(function fn) {
      m_funcs.push_back(fn);
    }
};

Mais que fait cette classe ? Elle stocke tout simplement un ensemble de fonctions, et lorsque l'instance de la classe est détruite, elle appelle ces fonctions dans l'ordre inverse de leur déclaration.

Quand est-ce qu'est appelé le destructeur d'une classe ? Lorsque l'on quitte la scope actuelle, c'est à dire dans l'un des cas suivants :

  • un a atteint la fin du scope avec }
  • on quitte la boucle avec break
  • on quitte la fonction avec return
  • on lève une exception avec throw

Ce qui donne :

void example() {
  defer_frame _;

  auto rsrc1 = create_resource(); // throws on failure
  _.defer([&]() { destroy_resource(rsrc1); });

  auto rsrc2 = create_resource();
  _.defer([&]() { destroy_resource(rsrc2); });

  do_something(rsrc1, rsrc2);
}

La gestion d'erreur est tout de suite un peu plus propre :)

Histoire de taper un peu moins de code, on peut se créer 2 petites macros :

#define new_defer_frame() defer_frame _
#define defer(code_block) _.defer([&]() code_block)

Un petit exemple avec la SDL pour la route :

#include 
#include 

void abort_sdl() {
  throw std::runtime_error(SDL_GetError());
}

void run_sdl_program() {
  new_defer_frame();

  if (SDL_Init(SDL_INIT_EVERYTHING) < 0) {
    abort_sdl();
  }
  defer({ SDL_Quit(); });

  auto win = SDL_CreateWindow(
    "example",
    SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED,
    800, 600,
    SDL_WINDOW_SHOWN
  );
  if (win == nullptr) {
    abort_sdl();
  }
  defer({ SDL_DestroyWindow(win); });

  auto renderer = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED);
  if (renderer == nullptr) {
    abort_sdl();
  }
  defer({ SDL_DestroyRenderer(renderer); });

  bool running = true;
  while (running) {
    SDL_Event evt;

    while (SDL_PollEvent(&evt)) {
      switch (evt.type) {
        case:
          running = false;
          break;

        default:
          break;
      }
    }
  }
}

Commentaires : voir le flux Atom ouvrir dans le navigateur

par David Delassus

LinuxFr.org : les journaux

LinuxFr.org : Journaux

La version 2.0 de WhosWho est sortie

 -  15 mai - 

Bonjour Nal,Je viens de publier la version 2.0 de WhosWho, mon logiciel pour faire des trombinoscopes, dont j'avais parlé il y a longtemps dans (...)


décrire une une image avec une iA locale

 -  8 mai - 

Aujourd'hui c'est fourien™, petit tuto sans prétention!Pour décrire des images en utilisant une iA localement j'utilise LLaVA qui fait partie de (...)


antistress adventure in Flatpak land

 -  30 avril - 

Hello nal, ça faisait un bail !Certain (il se reconnaîtra) m'a demandé de le tenir au courant lorsque j'aurai basculé sur un usage de Firefox (...)


Téléphone sous Linux ?

 -  25 avril - 

Aujourd'hui, avoir un téléphone avec un Android libéré, c'est possible, on pense en particulier à Murena.Avoir un téléphone sous GNU/Linux, c'est (...)


Quand votre voiture vous espionne… et vous le fait payer

 -  23 avril - 

Ceci se passe aux États-Unis, pour l’instant, aucune preuve qu’une telle fuite existe en Europe. Mais… si votre assurance augmente brutalement, (...)