Oreille

A small week end project: Oreille is a wrapper on OpenAPI Whisper API. It provides support for long audio files.

OpenAPI Whisper support only files that are less than 25 MB. Oreille will break the audio file into chunks of 25 MB’s or less. https://platform.openai.com/docs/guides/speech-to-text/longer-inputs

Oreille will also compute the correct timing of the subtitle when merging the output of Whisper. So once you export the subtitle the timestamp of the subtitle will be right.

You can open and save WAV files with pure python. For opening and saving non-wav files – like mp3 – you’ll need ffmpeg or libav.

View project on Github

How an HTTP/HTTPS proxy work

The goal of this article is to explain how a minimal HTTP/HTTPS proxy work.

HTTP

For an HTTP proxy the communication is simple the client etablish a TCP connection to the proxy and send the HTTP request. The proxy will parse the HTTP request and forward it to the server. The server will reply with the HTTP response and the proxy will forward it to the client.

The main difference is the method will be followed by the full URL of the target server.

GET http://www.example.org/index HTTP/1.1
Host: example.org:443

HTTPS

When the client open the connection to the proxy he will send the CONNECT HTTP method followed by the host and port of the target server.

It’s a classic HTTP request with headers. The proxy will stop to parse once it has read the double CRLF.

CONNECT example.org:443 HTTP/1.1
Host: example.org:443

The proxy will reply with the status 200:

HTTP/1.1 200 OK

Now we have a bidirectional tunnel between the client and the server. The proxy in the middle will just forward the data and is not going to be able to read it.

The client will now send the TLS handshake to the server and the server will reply with the TLS handshake. Once it’s done the communication is etablished and the client can send the HTTP request to the server.

JSONApiDoc

JSON Api Doc une petite bibliothèque Open Source que j’ai publiée.

En manipulant des API en JSON API une chose m’a beaucoup gêné. L’utilisation des included pour éviter de dupliquer les données rend la lecture très difficile par un humain.

Cette bibliothèque utilisable dans un programme Python ou en cli permet tout simplement de résoudre les included et de renvoyer un objet plus simple à lire et à manipuler par un humain.

Par exemple:

{
  "data": [{
    "type": "articles",
    "id": "1",
    "attributes": {
      "title": "JSON API paints my bikeshed!",
      "body": "The shortest article. Ever.",
      "created": "2015-05-22T14:56:29.000Z",
      "updated": "2015-05-22T14:56:28.000Z"
    },
    "relationships": {
      "author": {
        "data": {"id": "42", "type": "people"}
      }
    }
  }],
  "included": [
    {
      "type": "people",
      "id": "42",
      "attributes": {
        "name": "John",
        "age": 80,
        "gender": "male"
      }
    }
  ]
}

Donnera:

[
    {
        "type": "articles",
        "id": "1",
        "title": "JSON API paints my bikeshed!",
        "body": "The shortest article. Ever.",
        "created": "2015-05-22T14:56:29.000Z",
        "updated": "2015-05-22T14:56:28.000Z",
        "author": {
            "type": "people",
            "id": "42",
            "name": "John",
            "age": 80,
            "gender": "male"
        }
    }
]

Le code est disponible sur GitHub

Detect Python code duplicate

You can detect Python code duplicate with Pylint

pylint --disable=all --enable=duplicate-code src/

No config file found, using default configuration
************* Module gns3server.compute.dynamips.nodes.ethernet_switch
R:  1, 0: Similar lines in 2 files
==gns3server.compute.dynamips.nodes.ethernet_hub:101
==gns3server.compute.dynamips.nodes.ethernet_switch:136
    @property
    def mappings(self):
        """
        Returns port mappings

        :returns: mappings list
        """

        return self._mappings

    @asyncio.coroutine
    def delete(self):
        return (yield from self.close())

    @asyncio.coroutine
    def close(self):
        """
        Deletes this hub.
        """
 (duplicate-code)
R:  1, 0: Similar lines in 2 files
==gns3server.compute.dynamips.nodes.ethernet_hub:66
==gns3server.compute.dynamips.nodes.ethernet_switch:72
    @property
    def ports_mapping(self):
        """
        Ports on this hub

        :returns: ports info
        """

        return self._ports

    @ports_mapping.setter
    def ports_mapping(self, ports):
        """
        Set the ports on this hub

        :param ports: ports info
        """
        if ports != self._ports: (duplicate-code)

Report
======
231 statements analysed.

Statistics by type
------------------

+---------+-------+-----------+-----------+------------+---------+
|type     |number |old number |difference |%documented |%badname |
+=========+=======+===========+===========+============+=========+
|module   |2      |NC         |NC         |NC          |NC       |
+---------+-------+-----------+-----------+------------+---------+
|class    |2      |NC         |NC         |NC          |NC       |
+---------+-------+-----------+-----------+------------+---------+
|method   |0      |NC         |NC         |0           |0        |
+---------+-------+-----------+-----------+------------+---------+
|function |0      |NC         |NC         |0           |0        |
+---------+-------+-----------+-----------+------------+---------+



Raw metrics
-----------

+----------+-------+------+---------+-----------+
|type      |number |%     |previous |difference |
+==========+=======+======+=========+===========+
|code      |304    |48.95 |NC       |NC         |
+----------+-------+------+---------+-----------+
|docstring |167    |26.89 |NC       |NC         |
+----------+-------+------+---------+-----------+
|comment   |34     |5.48  |NC       |NC         |
+----------+-------+------+---------+-----------+
|empty     |116    |18.68 |NC       |NC         |
+----------+-------+------+---------+-----------+



Duplication
-----------

+-------------------------+-------+---------+-----------+
|                         |now    |previous |difference |
+=========================+=======+=========+===========+
|nb duplicated lines      |87     |NC       |NC         |
+-------------------------+-------+---------+-----------+
|percent duplicated lines |14.100 |NC       |NC         |
+-------------------------+-------+---------+-----------+



Messages by category
--------------------

+-----------+-------+---------+-----------+
|type       |number |previous |difference |
+===========+=======+=========+===========+
|convention |0      |NC       |NC         |
+-----------+-------+---------+-----------+
|refactor   |7      |NC       |NC         |
+-----------+-------+---------+-----------+
|warning    |0      |NC       |NC         |
+-----------+-------+---------+-----------+
|error      |0      |NC       |NC         |
+-----------+-------+---------+-----------+



% errors / warnings by module
-----------------------------

+--------------------------------------------------+------+--------+---------+-----------+
|module                                            |error |warning |refactor |convention |
+==================================================+======+========+=========+===========+
|gns3server.compute.dynamips.nodes.ethernet_switch |0.00  |0.00    |100.00   |0.00       |
+--------------------------------------------------+------+--------+---------+-----------+



Messages
--------

+---------------+------------+
|message id     |occurrences |
+===============+============+
|duplicate-code |7           |
+---------------+------------+



Global evaluation
-----------------
Your code has been rated at 9.70/10

Un système d'exploitation souverain mais pourquoi?

La discussion sur le système d’exploitation souverain est devenue une blague sur internet tellement cette proposition parait absurde. Mais ce qui n’était au début qu’un amendement a était adopté par les députés. La blague pourrait au final coûter au citoyen. Même si elle part probablement d’un bon sentiment.

C’est quoi un système d’exploitation?

Le système d’exploitation c’est grosso modo la couche logicielle entre le matériel et vos applications. C’est donc indispensable et incontournable. Les systèmes les plus connus sont Windows, MacOSX, Linux pour les PC de bureau et IOS et Android pour les téléphones portables.

On veut changer quoi?

L’amendement adopté au parlement:

Le Gouvernement remet au Parlement,dans les trois mois suivant la promulgation de la présente loi, un rapport sur la possibilité de créer un Commissariat à la souveraineté numérique rattaché aux services du Premier ministre dont les missions concourront à l’exercice, dans le cyberespace, de la souveraineté nationale et des droits et libertés individuels et collectifs que la République protège. Ce rapport précise les conditions de mise en place, sous l’égide de ce Commissariat, d’un système d’exploitation souverain et de protocoles de chiffrement des données, ainsi que les moyens et l’organisation nécessaires au fonctionnement de cet établissement public. ».

Mais le début de l’exposé sommaire nous renseigne plus:

La guerre contre le terrorisme, mais aussi l’urgente nécessité de protéger dans le cyberespace les droits et libertés des citoyens alors qu’une récente décision de la Cour de Justice de l’Union Européenne a prouvé que leurs données à caractère personnel étaient exploitées en toute illégalité, appellent de la part de la représentation nationale une prise de conscience nouvelle sur les enjeux liés à l’exercice de la souveraineté de la France dans le domaine du numérique.

On a ici deux choses:

  • La guerre contre le terrorisme
  • Les données à caractère personnel

Le détail complet est ici: http://www.assemblee-nationale.fr/14/amendements/3318/CION_LOIS/CL129.asp

La guerre contre le terrorisme

C’est le premier point de l’exposé sommaire. Puisqu’à priori Google, Apple ou Microsoft ne sont pas des entreprises terroristes quel risque court-on? Et bien il se trouve que ces sociétés aient tendance à trop bien protéger nos données avec des systèmes ou seul l’utilisateur à accès. Et que même si un ingénieur de Apple voulait lire le contenu chiffré de votre téléphone il ne pourrait pas. On pourrait donc voir cette tentative de système souverain comme une volonté d’accéder à nos données par l’État.

Pour être efficace, il faudrait donc que les terroristes acceptent de remplacer leurs ordinateurs par des versions françaises. Autant dire que cela n’arrivera pas. D’autant plus qu’ils disposent déjà de logiciels leur permettant de chiffrer les communications sans faire confiance au chiffrement mis en place par Apple, Google ou Microsoft.

Et quant à l’imposer, cela reviendrait à un désastre économique qui isolerait la France du reste du monde numérique. Imaginez vous être obligé d’acheter un téléphone français fait uniquement pour le marché français. Et le cauchemar pour les entreprises obligées d’utiliser un système différent en fonction du pays.

Les données à caractère personnel

Un certain nombre de ces systèmes sont fermés et pourrait contenir des portes dérobées pour le gouvernement américain. Par ailleurs, les entreprises qui les exploitent peuvent utiliser ces données sans l’accord des personnes.

Mais ce n’est pas le cas de Linux ou d’Android si l’on prend un dérivé. En effet le logiciel libre nous permet d’auditer le code source. On a donc déjà des solutions que l’on pourrait promouvoir.

Et les données personnelles doivent être protégées par la loi, quelle que soit la couche concernée. Il serait absurde que l’on empêche Google d’accéder aux données de votre téléphone via le système, mais que de toute façon il lise vos emails via Gmail. Cela passe donc par des lois et non des solutions techniques. D’ailleurs la loi discutée à l’Assemblée renforce très fortement les pouvoirs de sanction de la CNIL.

Qui fait cela?

Peu de pays ont essayé. L’exemple le plus connu est celui de la Corée du Nord avec Red Star OS: https://fr.wikipedia.org/wiki/Red_Star_OS

Pourquoi il ne faut pas essayer?

Après tout quel mal il y aurait a essayer de faire un système pour les gens qui veulent et nos administrations?

C’est un gouffre financier. La précédente tentative de cloud souverain s’est soldée par 150 millions d’euros d’argent public gaspillé. Et c’est sans compter le tort causé aux sociétés françaises qui était déjà sur ce marché.

Tout ce qui reste c’est cette publicité:

Le numérique en plus n’a pas besoin de grand projet pour créer de l’emploi, financer un projet ne participe pas à la relance de l’économie.

http://www.lesechos.fr/idees-debats/editos-analyses/0204173981400-cloud-souverain-un-gachis-a-la-francaise-1096130.php

Si le projet démarre de zéro Numerama à estimé le coût à 1 milliard d’euros. Ce qui me parait sous-estimé compte tenu de la complexité de l’opération.

http://www.numerama.com/business/139709-developper-un-os-souverain-combien-cela-coute.html

Même si à priori la volonté serait de se baser sur un Linux. Mais quel intérêt face à l’existant ?

Certains diront que pour le moment on engage peu de dépense vu que ce n’est qu’un rapport. Mais cela aura déjà un coût pour la société et le rapport pourrait déboucher sur un nouveau fiasco.

Mais alors on peut faire quoi?

A ma modeste échelle j’ai trois propositions.

Tout d’abord, on priorise le logiciel libre qui est une solution déjà existante et peu couteuse économiquement. Et l’on a la capacité de les auditer pour vérifier qu’il n’existe pas de portes dérobées au profit des USA.

Cela passe d’abord par l’administration, en effet comment parler de souveraineté quand l’éducation nationale signe des accords avec Microsoft pour utiliser ses services de clouds. http://www.education.gouv.fr/cid96030/numerique-a-l-ecole-partenariat-entre-le-ministere-de-l-education-nationale-et-microsoft.html

Ou l’assemblée nationale qui utilise Microsoft Exchange pour ses emails: http://www2.assemblee-nationale.fr/decouvrir-l-assemblee/role-et-pouvoirs-de-l-assemblee-nationale/l-administration-de-l-assemblee-nationale/l-informatique-a-l-assemblee-nationale

Mais cela l’assemblée l’a refusé malgré le fait que c’était la proposition la plus soutenue lors de la consultation publique. https://www.april.org/les-debats-ne-font-que-commencer-autour-de-la-priorite-au-logiciel-libre-dans-la-loi

Deuxièment la CNIL doit sanctionner ceux qui viole la vie privée et là-dessus la loi république numérique va dans le bon sens en augmentant le pouvoir de sanction de la CNIL.

Troisièment, on mène des actions d’abus de position dominante au niveau européen pour que les géants ne puissent plus imposer arbitrairement leurs règles. Le système des stores pose notamment des problèmes de libre concurrence.

Mais pourquoi perdre du temps à écrire là dessus?

Lors de la création du cloud souverain, on a rigolé, mais au final c’est passé et 150 millions d’euros se sont évaporés et les copains des dirigeants qui se sont enrichis. On doit être méfiant pour éviter un nouveau Cloud Watt.

Pour continuer

L’excellent article de monsieur Bortzmeyer http://www.bortzmeyer.org/os-souverain.html

Why SourceForge should not die today

With the recent downtime of SourceForge we can read comment like:

  • Sourceforge should die
  • Someone still use sourceforge?
  • Sourceforge is a place with only malware
  • All active projects are already on Github
  • Nobody will notice if Sourceforge disapear

It’s wrong. If sourceforge disapear the transition will be annoying.

Sourceforge exist since a long time and even if we don’t know a lot of project still use it especially for the download mirror service. Some are actively maintain and can move, but some are abandoned and will be lost forever even if they still have users.

You disagree with me?

Take a look on where Homebrew formula download their source code or patches.

  • We have 3157 formula
  • 527 formulas use downloads.sourceforge.net (grep ".*url.*downloads.sourceforge.net" * | cut -d":" -f1|sort|uniq|wc -l)
  • 888 use Github (grep ".*url.*https://github.com/" * | cut -d":" -f1|sort|uniq|wc -l)
  • 113 for google code (grep ".*url.*googlecode.com" * | cut -d":" -f1|sort|uniq|wc -l)

Even if it’s not the majority we can’t say we can just ignore it.

But it’s only dead and unused project.

If we have a quick look on the list of this minor/dead project. We can found some pretty common software:

  • avidemux
  • boost
  • clamav
  • gnuplot
  • lame
  • netcat
  • pngcrush
  • proguard
  • privoxy
  • pwgen
  • swig
  • w3m
  • wxpython
  • zsh

And homebrew contain only project working on OSX and where someone has taken the time to package it.

We can survive to a lost of sourceforge website for the downloads, thanks to large number a sourceforge mirror. But for source repository, mailling list archive all of this can be lost. If SourceForge die for financial issues a risk exists that the investors will try to sell this archives instead of transferring for free to a foundation like Apache or Mozilla.

Also if tomorrow sourceforge die, how can you be sure that the github repository of a sourceforge project is made by the same team?

We need to prepare a smooth transition from Sourceforge. Why the parent compagnie of Sourceforge should continue to put money on a dying website? They are a for profit organization. In my mind the best solution is transfering a read only version to a non profit organisation. And because the same issue could happen with GitHub we need to work to decentralize free software hosting. It’s critical for the Free Software world, but also for all compagnies using this technologies.

Photo: Mark Lobo Licence CC BY-NC-ND 2.0