tag:linuxfr.org,2005:/users/llumeaoLinuxFr.org : les contenus de Guillaume Savaton2022-04-16T16:29:26+02:00/favicon.pngtag:linuxfr.org,2005:Diary/402322022-04-14T23:02:42+02:002022-04-14T23:02:42+02:00Hydromel : mon langage de description de matériel idéal ?Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-un-aper%C3%A7u-du-langage-clash">Un aperçu du langage Clash</a></li>
<li>
<a href="#toc-je-cr%C3%A9e-mon-langage-de-description-de-mat%C3%A9riel">Je crée mon langage de description de matériel</a><ul>
<li><a href="#toc-o%C3%B9-en-sommes-nous">Où en sommes-nous ?</a></li>
</ul>
</li>
<li>
<a href="#toc-hydromel-par-lexemple">Hydromel par l'exemple</a><ul>
<li><a href="#toc-une-fifo-%C3%A0-un-%C3%A9l%C3%A9ment">Une FIFO à un élément</a></li>
<li><a href="#toc-linterface-producer">L'interface <code>producer</code></a></li>
<li><a href="#toc-linterface-conducer">L'interface <code>conducer</code></a></li>
<li><a href="#toc-une-fifo-%C3%A0-deux-%C3%A9l%C3%A9ments">Une FIFO à deux éléments</a></li>
<li><a href="#toc-une-fifo-%C3%A0-n-%C3%A9l%C3%A9ments">Une FIFO à N éléments</a></li>
</ul>
</li>
<li><a href="#toc-conclusion">Conclusion</a></li>
</ul>
<p>Sur LinuxFr, on me connaît (ou pas) comme le développeur du logiciel de présentation <a href="https://sozi.baierouge.fr/">Sozi</a> mais ce n'est pas ma principale activité. Loin du JavaScript et du SVG, mon travail quotidien relève en fait du domaine des systèmes embarqués et des FPGA. Dans ce cadre, je pratique et j'enseigne le langage VHDL. J'anime également des TP d'initiation au langage Verilog, un peu par obligation.</p>
<p>VHDL et Verilog appartiennent à la famille des <em>langages de description de matériel</em>, ou HDL pour <em>Hardware Description Languages</em>. Pourtant, pour des débutants, il est souvent difficile de comprendre le rapport entre le code que l'on écrit et le circuit que l'on devrait obtenir. VHDL, par exemple, ressemble à une sorte de langage de programmation concurrent avec des concepts et une terminologie très éloignés du domaine de l'électronique numérique : entité, architecture, instruction concurrente, instanciation, processus, liste de sensibilité, fonction de résolution, etc.</p>
<p>Pour utiliser correctement les outils de synthèse automatique de circuits, il faut comprendre comment ils traduisent les constructions du langage en composants, et pourquoi ce n'est pas toujours possible. On apprend alors à sélectionner un sous-ensemble <em>synthétisable</em> du langage et à appliquer des bonnes pratiques de codage pour décrire des circuits combinatoires, des registres, des compteurs, des machines à états. VHDL peut alors paraître inutilement riche et verbeux pour l'utilisation que l'on en fait.</p>
<p>Quelles sont les alternatives ? Ces dernières années, sont apparus de nouveaux langages qui prétendent <em>moderniser</em> le domaine de la modélisation de circuits ou de systèmes numériques. Beaucoup d'entre eux sont implémentés comme des <em>extensions</em> de langages de programmation (on utilise également le terme <em>Embedded Domain-Specific Language</em>). De manière peut-être simpliste, je dirais que ce sont des bibliothèques offrant des API pour la modélisation, la simulation et la synthèse de circuits. En voici quelques exemples :</p>
<ul>
<li>En C++ : <a href="https://systemc.org/">SystemC</a>
</li>
<li>En Python : <a href="https://www.myhdl.org/">MyHDL</a>, <a href="https://pymtl.github.io/">PyMTL</a>, <a href="https://m-labs.hk/gateware/migen/">Migen/FHDL</a>
</li>
<li>En Scala : <a href="https://www.chisel-lang.org/">Chisel</a>, <a href="https://spinalhdl.github.io/SpinalDoc-RTD/master/index.html">SpinalHDL</a>
</li>
<li>En Haskell : <a href="https://clash-lang.org/">Clash</a>.</li>
</ul>
<p>Je ne les pas tous essayés, et je ne saurais pas donner un avis éclairé sur la plupart d'entre eux. Aucun ne m'a totalement convaincu mais j'en ai retiré quelques idées pour imaginer Hydromel, mon langage de description de matériel idéal. Clash a été la principale source d'inspiration, et c'est pourquoi il mérite un petit paragraphe dans ce journal.</p>
<h2 id="toc-un-aperçu-du-langage-clash">Un aperçu du langage Clash</h2>
<p>Clash est un langage de description de matériel fonctionnel qui s'appuie sur Haskell. Il permet de décrire des circuits combinatoires et des circuits synchrones avec un ou plusieurs domaines d'horloge.</p>
<p>De manière très naturelle, un circuit combinatoire peut être représenté par une simple fonction :</p>
<pre><code class="haskell"><span class="nf">mac</span> <span class="n">a</span> <span class="n">b</span> <span class="n">c</span> <span class="ow">=</span>
<span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="o">*</span> <span class="n">c</span></code></pre>
<p>Un circuit séquentiel est représenté par une fonction qui transforme une séquence de valeurs en une autre séquence de valeurs. Cette notion de séquence est réalisée par le type <code>Signal</code> qui s'apparente à une liste infinie. Dans l'exemple ci-dessous, la fonction prédéfinie <code>register</code> est utilisée pour produire un signal <code>s</code> dont la valeur initiale est 0 et les valeurs suivantes sont calculés à l'aide de l'expression <code>s + 1</code>. Le signal d'horloge est implicite.</p>
<pre><code class="haskell"><span class="nf">counter</span> <span class="ow">=</span> <span class="n">s</span>
<span class="kr">where</span>
<span class="n">s</span> <span class="ow">=</span> <span class="n">register</span> <span class="mi">0</span> <span class="p">(</span><span class="n">s</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span></code></pre>
<p>Clash propose également des fonctions pour faciliter la création de circuits selon les modèles de Moore et de Mealy. L'exemple ci-dessous implémente le calcul du plus grand diviseur commun de deux nombres par soustractions successives à l'aide de l'algorithme d'Euclide. La fonction <code>gcdStep</code> calcule l'état suivant du circuit en fonction de l'état courant et des entrées. La fonction <code>gcdResult</code> calcule les sorties en fonction de l'état courant :</p>
<pre><code class="haskell"><span class="nf">gcdStep</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="p">(</span><span class="n">a0</span><span class="p">,</span> <span class="n">b0</span><span class="p">,</span> <span class="n">start</span><span class="p">)</span> <span class="ow">=</span>
<span class="kr">if</span> <span class="n">start</span> <span class="kr">then</span>
<span class="p">(</span><span class="n">a0</span><span class="p">,</span> <span class="n">b0</span><span class="p">)</span>
<span class="kr">else</span> <span class="kr">if</span> <span class="n">a</span> <span class="o">></span> <span class="n">b</span> <span class="kr">then</span>
<span class="p">(</span><span class="n">a</span> <span class="o">-</span> <span class="n">b</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="kr">else</span> <span class="kr">if</span> <span class="n">a</span> <span class="o"><</span> <span class="n">b</span> <span class="kr">then</span>
<span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">-</span> <span class="n">a</span><span class="p">)</span>
<span class="kr">else</span>
<span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
<span class="nf">gcdResult</span> <span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="ow">=</span>
<span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">)</span>
<span class="nf">gcd'</span> <span class="ow">::</span> <span class="kt">HiddenClockResetEnable</span> <span class="n">dom</span>
<span class="ow">=></span> <span class="kt">Signal</span> <span class="n">dom</span> <span class="p">(</span><span class="kt">Int</span><span class="p">,</span> <span class="kt">Int</span><span class="p">,</span> <span class="kt">Bool</span><span class="p">)</span>
<span class="ow">-></span> <span class="kt">Signal</span> <span class="n">dom</span> <span class="p">(</span><span class="kt">Int</span><span class="p">,</span> <span class="kt">Bool</span><span class="p">)</span>
<span class="nf">gcd'</span> <span class="ow">=</span> <span class="n">moore</span> <span class="n">gcdStep</span> <span class="n">gcdResult</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span></code></pre>
<p>Dans ces exemples, Clash est clairement plus concis que VHDL, et il semble plus facile de comprendre à quoi ressemble le circuit que l'on décrit. En revanche, en s'appuyant sur Haskell, Clash apporte aussi sa propre complexité :</p>
<ul>
<li>Comme en VHDL ou Verilog, certaines constructions du langage Haskell, et une partie de sa bibliothèque standard, ne sont pas utilisables pour générer du code synthétisable. On le découvre souvent à ses dépens.</li>
<li>Clash s'appuie sur le système de types d'Haskell mais subit également ses limites. Par exemple, si je veux appliquer une fonction <code>f</code> sur les valeurs d'un signal <code>s</code>, je ne peux pas simplement écrire <code>f s</code>. Je dois comprendre que le type <code>Signal</code> implémente la classe <code>Functor</code> et écrire : <code>fmap f s</code>.</li>
<li>Enfin, même si l'idée de décrire chaque composant par une fonction est séduisante, je trouve la notion d'entité VHDL plus lisible pour décrire leurs interfaces.</li>
</ul>
<h2 id="toc-je-crée-mon-langage-de-description-de-matériel">Je crée mon langage de description de matériel</h2>
<p>Pour implémenter Hydromel, j'ai choisi d'utiliser le langage <a href="https://racket-lang.org/">Racket</a> et de mettre à l'épreuve ses qualités de <em>Language-Oriented Programming Language</em>. J'ai procédé par étapes et j'ai relaté mes premières expérience dans deux séries d'articles de blog (en anglais) :</p>
<ul>
<li>Dans la série <a href="http://guillaume.baierouge.fr/2020/11/08/my-first-domain-specific-language-with-racket/index.html">My first domain-specific language with Racket</a>, je me pose la question de la méthodologie à suivre pour développer un langage avec Racket. J'y détaille un exemple un peu plus sophistiqué que ceux habituellement traités dans les tutoriels. J'explique quels obstacles j'ai rencontrés et comment je les ai surmontés.</li>
<li>Dans la série <a href="http://guillaume.baierouge.fr/2021/03/14/simulating-digital-circuits-in-racket/index.html">Simulating digital circuits in Racket</a>, je m'intéresse au modèle de calcul du langage Clash et j'en propose une implémentation en Racket. La série culmine avec un exemple complet : <a href="http://guillaume.baierouge.fr/2021/04/23/simulating-digital-circuits-in-racket/a-risc-v-core-in-racket/index.html">un processeur inspiré de l'architecture RISC-V</a>.</li>
</ul>
<p>Pour dissiper tout malentendu, je tiens à préciser deux choses. Contrairement aux langages mentionnés en introduction, Hydromel est un langage autonome ; ce n'est pas un <em>extension</em> de Racket. La syntaxe d'Hydromel n'est pas basée sur des S-expressions ; elle contient un nombre raisonnable de parenthèses et ressemble plus à VHDL qu'à Lisp.</p>
<h3 id="toc-où-en-sommes-nous">Où en sommes-nous ?</h3>
<p>À l'heure actuelle, la définition du langage Hydromel est suffisamment aboutie pour répondre aux besoins les plus courants. Pour m'en convaincre, j'ai réécrit mon exemple de processeur RISC-V en Hydromel. Son code source est à votre disposition <a href="https://github.com/aumouvantsillage/Virgule-CPU">dans ce dépôt</a>.</p>
<p>À ce jour, l'implémentation de référence réalise les opérations suivantes :</p>
<ol>
<li>L'analyse syntaxique.</li>
<li>L'analyse sémantique.</li>
<li>La vérification des types.</li>
<li>La simulation.</li>
</ol>
<p>L'étape suivante consistera à développer un convertisseur d'Hydromel vers VHDL ou Verilog pour cibler les outils de synthèse.</p>
<h2 id="toc-hydromel-par-lexemple">Hydromel par l'exemple</h2>
<p>Nous allons utiliser Hydromel pour décrire un circuit <em>file d'attente</em> (FIFO) utilisant le <a href="http://www.cjdrake.com/readyvalid-protocol-primer.html">protocole de synchronisation <em>ready/valid</em></a>. Dans un premier temps, nous proposerons plusieurs variantes d'un composant <code>fifo1</code> capable de mémoriser une valeur. Ensuite, nous en mettrons plusieurs instances en cascade pour réaliser des files d'attente plus longues.</p>
<h3 id="toc-une-fifo-à-un-élément">Une FIFO à un élément</h3>
<p>Pour commencer, précisons que les fichiers sources Hydromel devront toujours commencer par la ligne :</p>
<pre><code>#lang hydromel
</code></pre>
<p>Cette ligne est utilisée par Racket pour charger la définition du langage qui servira à traiter le reste du fichier.</p>
<p>Commençons par déclarer les ports du composant <code>fifo1</code>. En Hydromel, un composant est équivalent à un couple entité-architecture VHDL, ou à un module Verilog. Le composant <code>fifo1</code> possède un paramètre <code>T</code> qui correspond au type des données que la FIFO transportera.</p>
<pre><code>#lang hydromel
component fifo1(T : type)
# Les ports du côté "consommateur" de la FIFO.
port c_valid : in bit
port c_ready : out bit
port c_data : in T
# Les ports du côté "producteur" de la FIFO.
port p_valid : out bit
port p_ready : in bit
port p_data : out T
...
end
</code></pre>
<p>Son comportement respectera ce graphe d'états :</p>
<p><img src="//img.linuxfr.org/img/687474703a2f2f7777772e706c616e74756d6c2e636f6d2f706c616e74756d6c2f706e672f536f576b49496d6741537444754f684d59624e4772524c4a5343716a414164617557394a4f30367471666d5331496b357646596f6e39704335384e346c3149356c466d49584f4275656a4a34623465355f505979796742436162493833663132593049534e6d334c513069703061616339523461344947315064316e57516d32736d624c30523838734d414f664759356338783354315843334c4a5335694b4b583045584e3849685959326b53615a44496d343534303030/SoWkIImgAStDuOhMYbNGrRLJSCqjAAdauW9JO06tqfmS1Ik5vFYon9pC58N4l1I5lFmIXOBuejJ4b4e5_PYyygBCabI83f12Y0ISNm3LQ0ip0aac9R4a4IG1Pd1nWQm2smbL0R88sMAOfGY5c8x3T1XC3LJS5iKKX0EXN8IhYY2kSaZDIm454000" alt="Graphe d'états d'une FIFO à un élément" title="Source : http://www.plantuml.com/plantuml/png/SoWkIImgAStDuOhMYbNGrRLJSCqjAAdauW9JO06tqfmS1Ik5vFYon9pC58N4l1I5lFmIXOBuejJ4b4e5_PYyygBCabI83f12Y0ISNm3LQ0ip0aac9R4a4IG1Pd1nWQm2smbL0R88sMAOfGY5c8x3T1XC3LJS5iKKX0EXN8IhYY2kSaZDIm454000"></p>
<ul>
<li>Dans l'état <em>Empty</em> :
<ul>
<li>La FIFO est toujours prête à accepter de nouvelles données (<code>c_ready = 1</code>).</li>
<li>Elle se comporte de manière <em>transparente</em>, c'est-à-dire qu'elle copie les entrées <code>c_valid</code> et <code>c_data</code> sur les sorties <code>p_valid</code> et <code>p_data</code>.</li>
<li>Si une nouvelle donnée est disponible en entrée (<code>c_valid = 1</code>) pendant que le côté producteur est bloqué (<code>p_ready = 0</code>), la FIFO mémorise <code>c_data</code> (<code>write = 1</code>) dans un registre (que nous appellerons <code>r_data</code>) et passe dans l'état <em>Full</em>.</li>
</ul>
</li>
<li>Dans l'état <em>Full</em> :
<ul>
<li>la FIFO signale qu'elle a une donnée disponible (<code>p_valid = 1</code>).</li>
<li>Il s'agit de la dernière donnée qui a été mémorisée (<code>p_data = r_data</code>).</li>
<li>La FIFO est prête à accepter une nouvelle donnée à chaque fois que le côté producteur est débloqué (<code>c_ready = p_ready</code>).</li>
<li>Si une donnée est disponible en entrée au moment où la donnée de sortie est consommée (<code>c_valid = 1</code> et <code>p_ready = 1</code>), on peut écraser le registre <code>r_data</code> (<code>write = 1</code>) et la FIFO reste pleine.</li>
<li>Si la donnée de sortie est consommée (<code>p_ready = 1</code>) et si aucun nouvelle donnée n'arrive en entrée (<code>c_valid = 0</code>), la FIFO retourne dans l'état <em>Empty</em>.</li>
</ul>
</li>
</ul>
<p>Je propose de représenter l'état par un signal <code>full</code> sur un bit mémorisé dans une bascule. Sa valeur initiale est 0 et à chaque front d'horloge, il est mis à jour avec le résultat de l'expression <code>if</code> ci-dessous :</p>
<pre><code>signal full : bit = register(0, if full then
c_valid or not p_ready
else
c_valid and not p_ready)
</code></pre>
<p>Le plus souvent, le type d'un signal peut être déterminé automatiquement à partir de l'expression qui lui est affectée lorsqu'il n'y a pas de dépendance circulaire. J'ai dû indiquer le type du signal <code>full</code> explicitement mais je n'ai pas besoin de le faire pour ces deux autres signaux :</p>
<pre><code>signal write = c_valid and (if full then p_ready else not p_ready)
signal r_data = register(zero(T), c_data when write)
</code></pre>
<p>Le signal <code>r_data</code> mémorise la valeur de <code>c_data</code> lorsque <code>write</code> est vrai. Le mot-clé <code>when</code> utilisé dans le deuxième argument de <code>register</code> correspond à l'entrée <code>enable</code> du registre. Comme le type <code>T</code> n'est pas connu, on peut utiliser la fonction <code>zero</code> pour obtenir une valeur nulle de ce type. Par exemple, si <code>T</code> est un type tableau, <code>zero(T)</code> retournera un tableau de zéros.</p>
<p>Pour finir, voici les affectations des ports de sortie :</p>
<pre><code>c_ready = p_ready or not full
p_valid = c_valid or full
p_data = if full then r_data else c_data
</code></pre>
<p>Et la description complète du composant <code>fifo1</code> :</p>
<pre><code>#lang hydromel
component fifo1(T : type)
port c_valid : in bit
port c_ready : out bit
port c_data : in T
port p_valid : out bit
port p_ready : in bit
port p_data : out T
signal full : bit = register(0, if full then
c_valid or not p_ready
else
c_valid and not p_ready)
signal write = c_valid and (if full then p_ready else not p_ready)
signal r_data = register(zero(T), c_data when write)
c_ready = p_ready or not full
p_valid = c_valid or full
p_data = if full then r_data else c_data
end
</code></pre>
<h3 id="toc-linterface-producer">L'interface <code>producer</code>
</h3>
<p>L'interface de <code>fifo1</code> est composée de deux groupes de ports qui se ressemblent beaucoup. Pourquoi ne pas les déclarer dans une interface que l'on pourrait réutiliser à volonté ?</p>
<pre><code>interface producer(T : type)
port valid : out bit
port ready : in bit
port data : out T
end
component fifo1(T : type)
port c : flip producer(T)
port p : producer(T)
...
end
</code></pre>
<p><code>c</code> et <code>p</code> sont des ports <em>composites</em>. Le mot-clé <code>flip</code> permet d'utiliser l'interface <code>producer</code> en inversant le sens de ses ports. On évite ainsi de déclarer une interface <code>consumer</code>.</p>
<p>On modifie également le corps du composant pour accéder aux ports <code>valid</code>, <code>ready</code> et <code>data</code> à partir des ports <code>c</code> et <code>p</code> :</p>
<pre><code>signal full : bit = register(0, if full then
c.valid or not p.ready
else
c.valid and not p.ready)
signal write = c.valid and (if full then p.ready else not p.ready)
signal r_data = register(zero(T), c.data when write)
c.ready = p.ready or not full
p.valid = c.valid or full
p.data = if full then r_data else c.data
</code></pre>
<h3 id="toc-linterface-conducer">L'interface <code>conducer</code>
</h3>
<p>Dans la suite de cet article, nous allons créer d'autres composants qui auront un port consommateur et un port producteur. Regroupons <code>c</code> et <code>p</code> dans une interface <code>conducer</code> :</p>
<pre><code>interface conducer(T : type)
port c : flip producer(T)
port p : producer(T)
end
component fifo1(T : type)
port cp : conducer(T)
...
end
</code></pre>
<p>Par contre, ce ne serait pas très joli de devoir écrire <code>cp.c.valid</code>, <code>cp.c.ready</code>, <code>cp.c.data</code>, etc. Ajoutons le mot-clé <code>splice</code> dans la déclaration de <code>cp</code> pour que ses ports <code>c</code> et <code>p</code> soient directement accessibles dans <code>fifo1</code> comme avant :</p>
<pre><code>component fifo1(T : type)
port cp : splice conducer(T)
signal full : bit = register(0, if full then
c.valid or not p.ready
else
c.valid and not p.ready)
signal write = c.valid and (if full then p.ready else not p.ready)
signal r_data = register(zero(T), c.data when write)
c.ready = p.ready or not full
p.valid = c.valid or full
p.data = if full then r_data else c.data
end
</code></pre>
<h3 id="toc-une-fifo-à-deux-éléments">Une FIFO à deux éléments</h3>
<p>Le composant <code>fifo2</code> expose l'interface <code>conducer</code> et se compose de deux instances de <code>fifo1</code> en cascade :</p>
<pre><code>import "fifo1.mel"
component fifo2(T : type)
port cp : splice conducer(T)
instance f = fifo1(T)
f.c.valid = c.valid
f.c.data = c.data
c.ready = f.c.ready
instance g = fifo1(T)
g.c.valid = f.p.valid
g.c.data = f.p.data
f.p.ready = g.c.ready
p.valid = g.p.valid
p.data = g.p.data
g.p.ready = p.ready
end
</code></pre>
<p>Pour alléger l'écriture, on peut <em>connecter</em> deux ports composites qui ont la même interface en une seule instruction :</p>
<pre><code>component fifo2(T : type)
port cp : splice conducer(T)
instance f = fifo1(T)
f.c = c
instance g = fifo1(T)
g.c = f.p
p = g.p
end
</code></pre>
<h3 id="toc-une-fifo-à-n-éléments">Une FIFO à N éléments</h3>
<p>Nous arrivons finalement à la description d'un composant <code>fifo</code> de longueur <code>N</code> réglable. On peut l'écrire de façon récursive. L'instruction <code>if</code> utilisée ci-dessous est analogue à l'instruction <code>if-generate</code> de VHDL.</p>
<pre><code>component fifo_rec(T : type, N : natural)
port cp : splice conducer(T)
if N == 0 then
p = c
else
instance f = fifo1(T)
f.c = c
instance g = fifo_rec(T, N-1)
g.c = f.p
p = g.p
end
end
</code></pre>
<p>On peut également l'écrire de façon itérative, avec une boucle <code>for</code> qui correspond à l'instruction <code>for-generate</code> de VHDL :</p>
<pre><code>component fifo(T : type, N : natural)
port cp : splice conducer(T)
if N == 0 then
p = c
else
instance f<N> = fifo1(T)
f<0>.c = c
for n in 1 .. N-1 loop
f<n>.c = f<n-1>.p
end
p = f<N-1>.p
end
end
</code></pre>
<p>Petit détail de syntaxe : en Hydromel, on distingue les délimiteurs <code>[...]</code>, qui sont utilisés pour manipuler des valeurs de type tableau, et les délimiteurs <code><...></code>, qui permettent de manipuler des tableaux de ports <em>composites</em> ou des tableaux d'instances.</p>
<h2 id="toc-conclusion">Conclusion</h2>
<p>Il y aurait encore beaucoup de choses à écrire mais ce journal est déjà bien long et il faut rester raisonnable. En l'écrivant et en travaillant sur les exemples, j'ai remis en question certains choix. J'ai même découvert et corrigé des bugs passés inaperçus jusque-là.</p>
<p>Hydromel n'est pas encore utilisable pour des projets sérieux et je ne sais pas s'il le sera un jour. Il n'y a peut-être même pas de <em>marché</em> pour un tel langage aujourd'hui.</p>
<p>Évidemment, pour aller plus loin, il faudra encore écrire un convertisseur vers VHDL ou Verilog pour la synthèse. Ce ne sera pas facile. Et pour l'utilisation quotidienne, il faudra améliorer les messages d'erreur, accélérer le simulateur, et documenter tout ça.</p>
<p>Si ce journal vous a intéressé, vous pouvez visiter <a href="https://github.com/aumouvantsillage/Hydromel-lang">le projet Hydromel sur GitHub</a> et <a href="https://github.com/aumouvantsillage/Virgule-CPU">consulter la description d'un processeur, simple mais complet, inspiré de l'architecture RISC-V</a>. Le code source des deux projets est disponible sous les conditions de la licence MPL 2.0.</p>
<div><a href="https://linuxfr.org/users/llumeao/journaux/hydromel-mon-langage-de-description-de-materiel-ideal.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/127481/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/llumeao/journaux/hydromel-mon-langage-de-description-de-materiel-ideal#comments">ouvrir dans le navigateur</a>
</p>
Guillaume Savatonhttps://linuxfr.org/nodes/127481/comments.atomtag:linuxfr.org,2005:Diary/399842021-11-06T15:44:26+01:002021-11-06T15:44:26+01:00Des nouvelles de SoziLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p><a href="https://sozi.baierouge.fr/">Sozi</a> est un logiciel libre de création de présentations animées. Il est généralement utilisé pour réaliser des supports visuels pour des cours, des conférences, des réunions. Avec Sozi, une présentation n’est pas organisée comme une séquence de diapos, mais plutôt comme une succession de <em>points de vues</em> sur une <em>carte</em> que l’on explore.</p>
<h2 id="toc-de-2019-à-2021">De 2019 à 2021</h2>
<p>La dernière version qui a fait l'objet d'<a href="//linuxfr.org/news/de-sozi-12-a-sozi-19">un journal sur ce site</a> est Sozi 19.04, publiée en avril 2019. Depuis, plusieurs autres versions sont sorties en 2020 et 2021.</p>
<p>Sur cette période, la plupart des changements ont consisté à corriger des bugs, à nettoyer et à documenter les API, à mettre à jour les traductions de l'interface utilisateur. Pour une utilisation courante, l'interface d'édition des présentations a fait l'objet de quelques améliorations, mais elle est globalement stable. Généralement, je suis assez réticent à ajouter de nouvelles fonctionnalités qui pourraient en complexifier l'usage, ou qui seraient en rupture avec la philosophie générale de l'outil (en particulier, la séparation entre l'édition du contenu et l'organisation de la présentation).</p>
<p>En 2021, il y a tout de même eu des ajouts importants pour répondre à des besoins particuliers ou à des utilisations plus "avancées" :</p>
<ul>
<li>Le visionnage des présentations prend en charge les écrans tactiles.</li>
<li>L'outil d'export vers les formats PDF, PPTX et vidéo, autrefois distribué séparément sous la forme d'un paquet NPM, a été intégré à l'éditeur de présentations. Cela simplifie grandement son installation et son utilisation.</li>
<li>Il est maintenant possible d'ajouter ses propres fichiers JavaScript et CSS à une présentation. Auparavant, il fallait éditer manuellement le document HTML généré par Sozi, et répéter l'opération à chaque enregistrement de la présentation.</li>
<li>Pour les développeurs, une refonte complète des scripts de construction permet de perdre moins de temps entre les modifications de code source et le lancement de l'éditeur de présentations pour test.</li>
<li>Parmi les options d'installation possibles, Sozi est disponible sous la forme de paquets RPM.</li>
</ul>
<p>Pendant les confinements de 2020, avec un recours massif au télétravail et à l'enseignement à distance, la possibilité de <em>diffuser</em> une présentation en broadcast a été suggérée et une <em>preuve de concept</em>, <a href="https://sozi-remotifier.glitch.me/">sozi-remotifier</a>, a été réalisée par <a href="https://github.com/tshoppa">Schulzki</a>. Je ne sais pas si des utilisations <em>sérieuses</em> de cet outil on eu lieu pendant cette période.<br>
Pour ma part, je suis encore réservé sur le choix d'une solution technique définitive (WebSockets, WebRTC, intégration à une solution de streaming existante), qui permettrait un passage à l'échelle et serait le moins contraignante possible pour les utilisateurs. Je n'ai malheureusement pas eu le temps d'y travailler depuis que j'ai posé <a href="//linuxfr.org/forums/programmationweb/posts/quelle-technologie-pour-diffuser-une-presentation-sozi-en-streaming">cette question</a> sur le forum linuxfr.</p>
<h2 id="toc-bientôt-une-nouvelle-documentation">Bientôt une nouvelle documentation</h2>
<p>À force de travailler sur le logiciel lui-même, la documentation officielle de Sozi est devenue incomplète et parfois obsolète. Il y a quelques mois, j'ai entamé la rédaction d'un <em>guide utilisateur</em> sous la forme d'un livre en ligne à l'adresse <a href="http://sozi.guide">http://sozi.guide</a><br>
Ce livre sera disponible en français et en anglais. Il contiendra :</p>
<ul>
<li>Un guide pas à pas, illustré par des exemples, pour créer, jouer, distribuer des présentations exploitant toutes les possibilités de Sozi.</li>
<li>Une explication des <em>concepts</em>, des mécanismes sur lesquels repose Sozi et de ses limitations, pour démystifier les comportements surprenants que l'on peut parfois observer.</li>
<li>Une collection de <em>bonnes pratiques</em>, de <em>trucs et astuces</em> pour obtenir les effets souhaités avec un minimum d'efforts.</li>
<li>Un manuel de référence de l'interface utilisateur, et en particulier des fonctionnalités <em>périphériques</em> comme l'export de présentations vers d'autres formats de documents.</li>
</ul>
<p>Il s'agit d'un travail important auquel je ne peux malheureusement consacrer que quelques heures par semaine sur mon temps libre. Souvenez-vous que je développe Sozi quasiment seul et que ce n'est pas mon métier. Pour accélérer l'écriture de ce livre, j'aimerais donc pouvoir dédier autant de jours de congé que nécessaire, soit sur des semaines entières, soit au rythme d'un ou deux jour par semaine, sans pour autant sacrifier le temps que je peux consacrer à ma famille. J'ai donc lancé une <a href="https://gofund.me/2f2b11db">campagne de financement participatif</a> pour m'aider à atteindre cet objectif.</p>
<p>Si certains parmi vous ont déjà tenté une expérience similaire, je vous invite à partager vos conseils et vos remarques dans les commentaires.</p>
<div><a href="https://linuxfr.org/users/llumeao/journaux/des-nouvelles-de-sozi.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/125887/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/llumeao/journaux/des-nouvelles-de-sozi#comments">ouvrir dans le navigateur</a>
</p>
Guillaume Savatonhttps://linuxfr.org/nodes/125887/comments.atomtag:linuxfr.org,2005:News/392002019-04-29T08:19:51+02:002019-04-29T08:19:51+02:00De Sozi 12 à Sozi 19Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Sozi est une alternative à Prezi, un logiciel de création de présentations animées.</p>
<p>En lisant un <a href="//linuxfr.org/users/mothsart/journaux/edit-interactive-svg-1-1">journal récent à propos d’un éditeur de SVG interactif</a>, j’ai réalisé que Sozi n’avait fait l’objet d’aucune publication sur ce site depuis <a href="//linuxfr.org/news/sozi-12-09-est-disponible">l’annonce de la version 12</a>, sortie en… 2012.</p>
<p>Ce journal résume les principaux changements ayant eu lieu depuis cette version, en évitant une fastidieuse concaténation de <em>release notes</em>.</p>
</div><ul><li>lien nᵒ 1 : <a title="https://linuxfr.org/users/llumeao/journaux/de-sozi-12-a-sozi-19" hreflang="fr" href="https://linuxfr.org/redirect/103998">Journal à l’origine de la dépêche</a></li><li>lien nᵒ 2 : <a title="http://sozi.baierouge.fr/" hreflang="en" href="https://linuxfr.org/redirect/103999">Le site Web de Sozi</a></li><li>lien nᵒ 3 : <a title="http://sozi.baierouge.fr/community/" hreflang="en" href="https://linuxfr.org/redirect/104001">Le forum de discussion</a></li><li>lien nᵒ 4 : <a title="https://github.com/senshu/Sozi" hreflang="en" href="https://linuxfr.org/redirect/104002">La page du projet Sozi sur GitHub</a></li><li>lien nᵒ 5 : <a title="https://github.com/senshu/Sozi-export/" hreflang="en" href="https://linuxfr.org/redirect/104003">La page du projet Sozi-export sur GitHub</a></li></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-questce-que-sozi">Qu’est‐ce que Sozi ?</a></li>
<li><a href="#toc-qui-d%C3%A9veloppe-sozi-et-pourquoi">Qui développe Sozi et pourquoi ?</a></li>
<li><a href="#toc-sozi-hier-et-aujourdhui">Sozi hier et aujourd’hui</a></li>
<li>
<a href="#toc-que-permet-de-faire-sozi1904">Que permet de faire Sozi 19.04 ?</a><ul>
<li><a href="#toc-cr%C3%A9er-une-pr%C3%A9sentation-sous-la-forme-dune-s%C3%A9quence-de-vues-sur-un-document-svg">Créer une présentation sous la forme d’une séquence de vues sur un document SVG</a></li>
<li><a href="#toc-jouer-une-pr%C3%A9sentation-en-mode-pr%C3%A9sentateur">Jouer une présentation en mode présentateur</a></li>
<li><a href="#toc-cr%C3%A9er-des-liens-entre-les-vues-dune-pr%C3%A9sentation">Créer des liens entre les vues d’une présentation</a></li>
<li><a href="#toc-ins%C3%A9rer-une-pr%C3%A9sentation-sozi-dans-une-page-web">Insérer une présentation Sozi dans une page Web</a></li>
<li><a href="#toc-insertion-de-documents-vid%C3%A9o-et-audio-dans-une-pr%C3%A9sentation">Insertion de documents vidéo et audio dans une présentation</a></li>
<li><a href="#toc-convertir-une-pr%C3%A9sentation-sozi-en-une-vid%C3%A9o-ou-un-document-imprimable">Convertir une présentation Sozi en une vidéo ou un document imprimable</a></li>
</ul>
</li>
<li><a href="#toc-perspectives-et-%C3%A9volutions">Perspectives et évolutions</a></li>
</ul>
<h2 id="toc-questce-que-sozi">Qu’est‐ce que Sozi ?</h2>
<p>Sozi est un logiciel de création de présentations animées. Il se positionne comme une alternative à Prezi, en se différenciant de ce dernier sur les aspects suivants :</p>
<ul>
<li>Sozi est un logiciel libre, diffusé sous les termes de la <em>Mozilla Public License 2</em> ;</li>
<li>Sozi repose sur des standards ouverts ;</li>
<li>avec Sozi, l’utilisateur reste maître de ses données.</li>
</ul>
<p>La création d’une présentation s’effectue en deux temps :</p>
<ol>
<li>créer un document SVG contenant les éléments visuels de la présentation ; en théorie, n’importe quel logiciel de dessin vectoriel capable d’enregistrer au format SVG peut être utilisé ; en pratique, Inkscape est recommandé et il existe peu de retours d’expérience concernant la compatibilité de Sozi avec d’autres outils ;</li>
<li>importer le document SVG dans l’éditeur de présentation Sozi et définir une séquence de <em>vues</em> ainsi que les transitions entre ces vues.</li>
</ol>
<p>Sozi n’altère pas le document SVG d’origine. Il enregistre la présentation sous la forme d’un document HTML qui contient : une copie du document SVG, les données définissant le déroulement de la présentation, le code JavaScript de visionnage.</p>
<p>Ce document HTML peut être affiché à l’aide de tout navigateur Web prenant en charge HTML 5, SVG et JavaScript.</p>
<h2 id="toc-qui-développe-sozi-et-pourquoi">Qui développe Sozi et pourquoi ?</h2>
<p>Sozi est un projet personnel que je développe seul sur mon temps libre. La majorité des contributions externes concernent la traduction de l’interface utilisateur et du site Web.</p>
<p>Certains utilisateurs croient avoir affaire à une <em>équipe</em> de développeurs qui auraient l’ambition de gagner des <em>parts de marché</em>. Le <a href="http://sozi.baierouge.fr/">site Web</a> multilingue et le <a href="http://sozi.baierouge.fr/community/">forum de discussion</a> peuvent donner cette impression.</p>
<p>En réalité, je développe Sozi d’abord pour mon propre usage et parce que ça me fait plaisir. Je le distribue à la communauté en espérant que d’autres le trouveront utile, je donne un coup de main aux utilisateurs en détresse, mais je fais peu d’efforts pour le promouvoir.</p>
<p>Pour ces raisons également, je suis toujours réticent à développer de nouvelles fonctionnalités dont je n’aurais pas besoin, et qui seraient probablement mal testées et mal maintenues… Mais je peux faire une exception si je trouve l’idée amusante et si ça me donne l’occasion d’apprendre quelque chose de nouveau.</p>
<h2 id="toc-sozi-hier-et-aujourdhui">Sozi hier et aujourd’hui</h2>
<p>Les numéros de version de Sozi sont chronologiques : par exemple, la version 19.04 a été publiée en avril 2019.</p>
<p>Jusqu’à la version 13.11, l’éditeur de présentation était une extension pour Inkscape. Le système d’extensions d’Inkscape n’ayant pas été pensé pour ce type d’usage, cela posait tout un tas de problèmes difficiles à contourner (comme par exemple le gel de l’interface d’Inkscape tant que la fenêtre Sozi était ouverte), et il y avait finalement peu d’avantages comparé à un logiciel séparé.</p>
<p>Sozi paie aujourd’hui pour cette erreur de jeunesse : alors que ce n’est plus vrai depuis 2015, on peut encore lire sur le Web en 2019 que Sozi est « lié à Inkscape » et est « écrit en Python ». :-(</p>
<p>Or, en 2014, l’éditeur de présentation a été entièrement réécrit en JavaScript comme une application indépendante. Cela a permis notamment de passer d’une interface utilisateur de type <em>formulaire</em>, peu ergonomique, à une interface permettant une manipulation directe des calques du document SVG et offrant une prévisualisation des vues et des transitions.</p>
<p>Aujourd’hui, l’éditeur de présentation est une application Electron qui fonctionne aussi bien sous GNU/Linux (des paquets Debian sont disponibles) que sous Windows et macOS.</p>
<p>Sozi 19.04 est disponible pour les utilisateurs d’Arch Linux via AUR. Pour les autres distributions, il n’est pas recommandé d’installer Sozi via les dépôts officiels : Fedora fournit toujours Sozi 13.11, et Debian est resté bloqué sur la version 12.</p>
<h2 id="toc-que-permet-de-faire-sozi1904">Que permet de faire Sozi 19.04 ?</h2>
<p>Voici un aperçu des fonctionnalités offertes par Sozi aujourd’hui :</p>
<h3 id="toc-créer-une-présentation-sous-la-forme-dune-séquence-de-vues-sur-un-document-svg">Créer une présentation sous la forme d’une séquence de vues sur un document SVG</h3>
<p>L’éditeur de présentation permet de construire un parcours dans le plan du document SVG, en définissant à chaque étape la région visible par le spectateur. Les transitions entre ces étapes sont animées et il est possible de configurer leur durée ainsi que la fonction de progression du temps à utiliser.</p>
<p>Si le document est organisé en plusieurs calques, il est possible de créer un parcours et des transitions différentes pour chaque calque. Cela permet de réaliser des effets intéressants, comme par exemple :</p>
<ul>
<li>animer des objets par rapport à un décor en les plaçant dans des calques séparés ; cet usage n’est pas facile à maîtriser car, dans Sozi, les animations sont définies comme des déplacements de la caméra ;</li>
<li>faire apparaître ou disparaître des objets en contrôlant l’opacité des calques ; s’il y a de nombreux objets à gérer, il faudra créer de nombreux calques ou réutiliser intelligemment le même calque pour plusieurs objets ;</li>
<li>réaliser un effet de parallaxe.</li>
</ul>
<h3 id="toc-jouer-une-présentation-en-mode-présentateur">Jouer une présentation en mode présentateur</h3>
<p>Il s’agit d’une nouvelle fonctionnalité dans Sozi 19.04. Plusieurs contributeurs ont proposé des implémentations par le passé, mais j’ai mis beaucoup de temps à me décider sur ce qu’il convenait de faire.</p>
<p>Désormais, l’éditeur enregistre deux fichiers HTML pour une même présentation :</p>
<ul>
<li>un fichier contenant la présentation proprement dite, comme dans les versions précédentes de Sozi ;</li>
<li>un fichier contenant une <em>console présentateur</em> qui affiche les vues précédentes, courante et suivante, ainsi que les notes du présentateur.</li>
</ul>
<p>Le premier fichier s’utilise comme précédemment, lorsque vous souhaitez jouer une présentation sans le mode présentateur. Le second ouvre automatiquement la présentation dans une nouvelle fenêtre et se synchronise avec elle au cours de son déroulement.</p>
<h3 id="toc-créer-des-liens-entre-les-vues-dune-présentation">Créer des liens entre les vues d’une présentation</h3>
<p>Au cours de la lecture d’une présentation Sozi dans un navigateur Web, chaque vue peut être adressée par son identifiant ou son numéro : on ajoute pour cela <code>#id</code> ou <code>#numéro</code> à l’URL du document courant.</p>
<p>Comme HTML, SVG prend en charge la balise <code><a></code> qui permet de transformer un élément en lien. On peut faire pointer ce lien soit vers une URL externe, soit vers l’identifiant d’une vue de la présentation. Il est ainsi possible de créer de véritables présentations <em>non linéaires</em>, ou même de réaliser un site Web animé dont chaque <em>page</em> serait une vue d’une présentation Sozi.</p>
<h3 id="toc-insérer-une-présentation-sozi-dans-une-page-web">Insérer une présentation Sozi dans une page Web</h3>
<p>Comme Sozi produit des documents HTML, ces derniers peuvent être insérés dans d’autres pages Web au moyen de la balise <code><iframe></code>. Si nécessaire, l’API de Sozi permet de gérer le déroulement de la présentation depuis un script sur la page principale. Par exemple, on peut ajouter des boutons de navigation comme dans <a href="http://sozi.baierouge.fr/pages/tutorial-embedding-fr.html">l’exemple situé en bas de ce tutoriel</a>.</p>
<p>Depuis Sozi 17.11, il est possible de désactiver les actions au clavier et à la souris dans une présentation. Certains utilisateurs réalisent ainsi des animations destinées à être insérées dans des pages Web, et à être jouées automatiquement sans intervention du spectateur.</p>
<h3 id="toc-insertion-de-documents-vidéo-et-audio-dans-une-présentation">Insertion de documents vidéo et audio dans une présentation</h3>
<p>Par principe, l’éditeur de présentation Sozi ne gère que le déroulement d’une présentation et ne permet pas d’ajouter des éléments visuels (ou auditifs). L’insertion de documents vidéo ou audio a donc été réalisée sous la forme d’une extension pour Inkscape.</p>
<p>Cette extension ajoute au document SVG un rectangle gris à l’emplacement où le media devra s’afficher. Ce rectangle est remplacé par un éléments HTML <code><video></code> ou <code><audio></code> lorsque la présentation est jouée.</p>
<p>À ce jour, seul Firefox affiche correctement les vidéos en respectant les transformations géométriques appliquées par Sozi.</p>
<h3 id="toc-convertir-une-présentation-sozi-en-une-vidéo-ou-un-document-imprimable">Convertir une présentation Sozi en une vidéo ou un document imprimable</h3>
<p>Le projet <a href="http://sozi.baierouge.fr/pages/tutorial-converting-fr.html">Sozi-export</a> propose un ensemble d’outils en ligne de commande pour convertir une présentation dans différents formats :</p>
<ul>
<li>séquence d’images ;</li>
<li>vidéo, avec FFmpeg ;</li>
<li>PDF, avec PDFjam ;</li>
<li>PowerPoint.</li>
</ul>
<p>Sozi-export est distribué comme un paquet Node.js. La version la plus récente a été publiée en octobre 2018.</p>
<p>Malheureusement, <a href="http://sozi.baierouge.fr/community/d/79-sozi-to-pdf-failing-with-file-argument-must-be-of-type-string">ces outils ne fonctionnent plus aujourd’hui sur certaines plates‐formes</a> du fait de l’obsolescence de PhantomJS, sur lequel ils reposent. En attendant que ce problème soit résolu, il existe une <a href="https://hub.docker.com/r/escalope/inkscape-sozi">image Docker</a> qui fournit un environnement stable où Sozi-export fonctionne encore.</p>
<h2 id="toc-perspectives-et-évolutions">Perspectives et évolutions</h2>
<p>Les principales fonctionnalités de l’éditeur de présentation sont stabilisées et la plupart des modifications envisagées portent sur l’amélioration de l’ergonomie et des performances.</p>
<p>À moyen terme, les améliorations suivantes sont prévues :</p>
<ul>
<li>ajouter des vignettes pour chaque vue dans l’éditeur de présentation ;</li>
<li>porter Sozi-export vers Headless Chromium à la place de PhantomJS ;</li>
<li>compléter la <a href="http://sozi.baierouge.fr/pages/ui-fr.html">documentation de l’interface utilisateur</a>.</li>
</ul>
<p>Je réfléchis également à la possibilité de distribuer Sozi sous une forme plus légère qui n’embarque pas une copie de Chromium. Pour une application qui tient en 650 Kio de code JavaScript, on se retrouve avec un paquet Debian de 40 Mio, tandis que le fichier <code>tar.gz</code> pour macOS pèse 133 Mio.</p>
<p>Après tout, Sozi s’exécute très bien dans un navigateur Web. La seule raison d’utiliser Electron dans mon cas est la possibilité d’accéder au système de fichiers et de détecter automatiquement les modifications du document SVG. Je suis preneur de toutes idées qui pourraient m’aider à obtenir le même résultat tout en utilisant le navigateur déjà installé sur l’ordinateur de l’utilisateur.</p>
</div><div><a href="https://linuxfr.org/news/de-sozi-12-a-sozi-19.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117077/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/de-sozi-12-a-sozi-19#comments">ouvrir dans le navigateur</a>
</p>
Guillaume SavatonZeroHeureDavy DefaudJulien Jorgehttps://linuxfr.org/nodes/117077/comments.atomtag:linuxfr.org,2005:Diary/384832019-04-28T19:00:12+02:002019-04-28T19:00:12+02:00De Sozi 12 à Sozi 19Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#toc-quest-ce-que-sozi">Qu'est-ce que Sozi ?</a></li>
<li><a href="#toc-qui-d%C3%A9veloppe-sozi-et-pourquoi">Qui développe Sozi et pourquoi ?</a></li>
<li><a href="#toc-sozi-hier-et-aujourdhui">Sozi hier et aujourd'hui</a></li>
<li>
<a href="#toc-que-permet-de-faire-sozi-1904">Que permet de faire Sozi 19.04 ?</a><ul>
<li><a href="#toc-cr%C3%A9er-une-pr%C3%A9sentation-sous-la-forme-dune-s%C3%A9quence-de-vues-sur-un-document-svg">Créer une présentation sous la forme d'une séquence de vues sur un document SVG</a></li>
<li><a href="#toc-jouer-une-pr%C3%A9sentation-en-mode-pr%C3%A9sentateur">Jouer une présentation en mode présentateur</a></li>
<li><a href="#toc-cr%C3%A9er-des-liens-entre-les-vues-dune-pr%C3%A9sentation">Créer des liens entre les vues d'une présentation</a></li>
<li><a href="#toc-ins%C3%A9rer-une-pr%C3%A9sentation-sozi-dans-une-page-web">Insérer une présentation Sozi dans une page web</a></li>
<li><a href="#toc-insertion-de-documents-vid%C3%A9o-et-audio-dans-une-pr%C3%A9sentation">Insertion de documents vidéo et audio dans une présentation</a></li>
<li><a href="#toc-convertir-une-pr%C3%A9sentation-sozi-en-une-vid%C3%A9o-ou-un-document-imprimable">Convertir une présentation Sozi en une vidéo ou un document imprimable</a></li>
</ul>
</li>
<li><a href="#toc-perspectives-et-%C3%A9volutions">Perspectives et évolutions</a></li>
</ul>
<p>En lisant un <a href="//linuxfr.org/users/mothsart/journaux/edit-interactive-svg-1-1">journal récent à propos d'un éditeur de SVG interactif</a>, j'ai réalisé que Sozi n'avait fait l'objet d'aucune publication sur ce site depuis <a href="//linuxfr.org/news/sozi-12-09-est-disponible">l'annonce de la version 12</a>, sortie en… 2012.</p>
<p>Ce journal résume les principaux changements ayant eu lieu depuis cette version, en évitant une fastidieuse concaténation de <em>release notes</em>.</p>
<h2 id="toc-quest-ce-que-sozi">Qu'est-ce que Sozi ?</h2>
<p>Sozi est un logiciel de création de présentations animées.<br>
Il se positionne comme une alternative à Prezi, en se différenciant de ce dernier sur les aspects suivants :</p>
<ul>
<li>Sozi est un logiciel libre.</li>
<li>Sozi repose sur des standards ouverts.</li>
<li>Avec Sozi, l'utilisateur reste maître de ses données.</li>
</ul>
<p>La création d'une présentation s'effectue en deux temps :</p>
<ol>
<li>Créer un document SVG contenant les éléments visuels de la présentation. En théorie, n'importe quel logiciel de dessin vectoriel capable d'enregistrer au format SVG peut être utilisé. En pratique, Inkscape est recommandé et il existe peu de retours d'expérience concernant la compatibilité de Sozi avec d'autres outils.</li>
<li>Importer le document SVG dans l'éditeur de présentation Sozi et définir une séquence de <em>vues</em> ainsi que les transitions entre ces vues.</li>
</ol>
<p>Sozi n'altère pas le document SVG d'origine. Il enregistre la présentation sous la forme d'un document HTML qui contient : une copie du document SVG, les données définissant le déroulement de la présentation, le code JavaScript de visionnage.</p>
<p>Ce document HTML peut être affiché à l'aide de tout navigateur web prenant en charge HTML5, SVG et JavaScript.</p>
<h2 id="toc-qui-développe-sozi-et-pourquoi">Qui développe Sozi et pourquoi ?</h2>
<p>Sozi est un projet personnel que je développe seul sur mon temps libre. La majorité des contributions externes concernent la traduction de l'interface utilisateur et du site web.</p>
<p>Certains utilisateurs croient avoir affaire à une <em>équipe</em> de développeurs qui auraient l'ambition de gagner des <em>parts de marché</em>. Le <a href="http://sozi.baierouge.fr/">site web</a> multilingue et le <a href="http://sozi.baierouge.fr/community/">forum de discussion</a> peuvent donner cette impression.</p>
<p>En réalité, je développe Sozi d'abord pour mon propre usage et parce que ça me fait plaisir. Je le distribue à la communauté en espérant que d'autres le trouveront utile, je donne un coup de main aux utilisateurs en détresse, mais je fais peu d'efforts pour le promouvoir.</p>
<p>Pour ces raisons également, je suis toujours réticent à développer de nouvelles fonctionnalités dont je n'aurais pas besoin, et qui seraient probablement mal testées et mal maintenues,… mais je peux faire une exception si je trouve l'idée amusante et si ça me donne l'occasion d'apprendre quelque chose de nouveau.</p>
<h2 id="toc-sozi-hier-et-aujourdhui">Sozi hier et aujourd'hui</h2>
<p>Les numéros de version de Sozi sont chronologiques : par exemple, la version 19.04 a été publiée en avril 2019.</p>
<p>Jusqu'à la version 13.11, l'éditeur de présentation était une extension pour Inkscape. Le système d'extensions d'Inkscape n'ayant pas été pensé pour ce type d'usage, cela posait tout un tas de problèmes difficiles à contourner (comme par exemple le gel de l'interface d'Inkscape tant que la fenêtre Sozi était ouverte), et il y avait finalement peu d'avantages comparé à un logiciel séparé.</p>
<p>Sozi paie aujourd'hui pour cette erreur de jeunesse : alors que ce n'est plus vrai depuis 2015, on peut encore lire sur le web en 2019 que Sozi est "lié à Inkscape" et est "écrit en Python" :(</p>
<p>Or, en 2014, l'éditeur de présentation a été entièrement réécrit en JavaScript comme une application indépendante. Cela a permis notamment de passer d'une interface utilisateur de type <em>formulaire</em>, peu ergonomique, à une interface permettant une manipulation directe des calques du document SVG et offrant une prévisualisation des vues et des transitions.</p>
<p>Aujourd'hui, l'éditeur de présentation est une application Electron qui fonctionne aussi bien sous GNU/Linux (des paquets Debian sont disponibles) que sous Windows et OS X.</p>
<p>Sozi 19.04 est disponible pour les utilisateurs d'ArchLinux via AUR. Pour les autres distributions, il n'est pas recommandé d'installer Sozi via les dépôts officiels : Fedora fournit toujours Sozi 13.11, et Debian est resté bloqué sur la version 12.</p>
<h2 id="toc-que-permet-de-faire-sozi-1904">Que permet de faire Sozi 19.04 ?</h2>
<p>Voici un aperçu des fonctionnalités offertes par Sozi aujourd'hui :</p>
<h3 id="toc-créer-une-présentation-sous-la-forme-dune-séquence-de-vues-sur-un-document-svg">Créer une présentation sous la forme d'une séquence de vues sur un document SVG</h3>
<p>L'éditeur de présentation permet de construire un parcours dans le plan du document SVG, en définissant à chaque étape la région visible par le spectateur. Les transitions entre ces étapes sont animées et il est possible de configurer leur durée ainsi que la fonction de progression du temps à utiliser.</p>
<p>Si le document est organisé en plusieurs calques, il est possible de créer un parcours et des transitions différentes pour chaque calque. Cela permet de réaliser des effets intéressants comme par exemple :</p>
<ul>
<li>Animer des objets par rapport à un décor, en les plaçant dans des calques séparés. Cet usage n'est pas facile à maîtriser car dans Sozi, les animations sont définies comme des déplacements de la caméra.</li>
<li>Faire apparaître ou disparaître des objets, en contrôlant l'opacité des calques. S'il y a de nombreux objets à gérer, il faudra créer de nombreux calques ou réutiliser intelligemment le même calque pour plusieurs objets.</li>
<li>Réaliser un effet de parallaxe.</li>
</ul>
<h3 id="toc-jouer-une-présentation-en-mode-présentateur">Jouer une présentation en mode présentateur</h3>
<p>Il s'agit d'une nouvelle fonctionnalité dans Sozi 19.04. Plusieurs contributeurs ont proposé des implémentations par le passé mais j'ai mis beaucoup de temps à me décider sur ce qu'il convenait de faire.</p>
<p>Désormais, l'éditeur enregistre deux fichiers HTML pour une même présentation :</p>
<ul>
<li>Un fichier contenant la présentation proprement dite, comme dans les versions précédentes de Sozi.</li>
<li>Un fichier contenant une <em>console présentateur</em> qui affiche les vues précédentes, courante et suivante, ainsi que les notes du présentateur.</li>
</ul>
<p>Le premier fichier s'utilise comme précédemment, lorsque vous souhaitez jouer une présentation sans le mode présentateur. Le second ouvre automatiquement la présentation dans une nouvelle fenêtre et se synchronise avec elle au cours de son déroulement.</p>
<h3 id="toc-créer-des-liens-entre-les-vues-dune-présentation">Créer des liens entre les vues d'une présentation</h3>
<p>Au cours de la lecture d'une présentation Sozi dans un navigateur web, chaque vue peut être adressée par son identifiant ou son numéro : on ajoute pour cela <code>#id</code> ou <code>#numéro</code> à l'URL du document courant.</p>
<p>Comme HTML, SVG prend en charge la balise <code><a></code> qui permet de transformer un élément en lien. On peut faire pointer ce lien soit vers une URL externe, soit vers l'identifiant d'une vue de la présentation. Il est ainsi possible de créer de véritables présentations <em>non linéaires</em>, ou même de réaliser un site web animé dont chaque <em>page</em> serait une vue d'une présentation Sozi.</p>
<h3 id="toc-insérer-une-présentation-sozi-dans-une-page-web">Insérer une présentation Sozi dans une page web</h3>
<p>Comme Sozi produit des documents HTML, ces derniers peuvent être insérés dans d'autres pages web au moyen de la balise <code><iframe></code>. Si nécessaire, l'API de Sozi permet de gérer le déroulement de la présentation depuis un script sur la page principale. Par exemple, on peut ajouter des boutons de navigation comme dans <a href="http://sozi.baierouge.fr/pages/tutorial-embedding-fr.html">l'exemple situé en bas de ce tutoriel</a>.</p>
<p>Depuis Sozi 17.11, il est possible de désactiver les actions au clavier et à la souris dans une présentation.<br>
Certains utilisateurs réalisent ainsi des animations destinées à être insérées dans des pages web, et à être jouées automatiquement sans intervention du spectateur.</p>
<h3 id="toc-insertion-de-documents-vidéo-et-audio-dans-une-présentation">Insertion de documents vidéo et audio dans une présentation</h3>
<p>Par principe, l'éditeur de présentation Sozi ne gère que le déroulement d'une présentation et ne permet pas d'ajouter des éléments visuels (ou auditifs). L'insertion de documents vidéo ou audio a donc été réalisée sous la forme d'une extension pour Inkscape.</p>
<p>Cette extension ajoute au document SVG un rectangle gris à l'emplacement où le media devra s'afficher.<br>
Ce rectangle est remplacé par un éléments HTML <code><video></code> ou <code><audio></code> lorsque la présentation est jouée.</p>
<p>À ce jour, seul Firefox affiche correctement les vidéos en respectant les transformations géométriques appliquées par Sozi.</p>
<h3 id="toc-convertir-une-présentation-sozi-en-une-vidéo-ou-un-document-imprimable">Convertir une présentation Sozi en une vidéo ou un document imprimable</h3>
<p>Le projet <a href="http://sozi.baierouge.fr/pages/tutorial-converting-fr.html">Sozi-export</a> propose un ensemble d'outils en ligne de commande pour convertir une présentation dans différents formats :</p>
<ul>
<li>Séquence d'images.</li>
<li>Vidéo, avec ffmpeg.</li>
<li>PDF, avec pdfjam.</li>
<li>PowerPoint.</li>
</ul>
<p>Sozi-export est distribué comme un package node.js. La version la plus récente a été publiée en octobre 2018.</p>
<p>Malheureusement, <a href="http://sozi.baierouge.fr/community/d/79-sozi-to-pdf-failing-with-file-argument-must-be-of-type-string">ces outils ne fonctionnent plus aujourd'hui sur certaines plates-formes</a> du fait de l'obsolescence de PhantomJS, sur lequel ils reposent. En attendant que ce problème soit résolu, il existe une <a href="https://hub.docker.com/r/escalope/inkscape-sozi">image Docker</a> qui fournit un environnement stable où Sozi-export fonctionne encore.</p>
<h2 id="toc-perspectives-et-évolutions">Perspectives et évolutions</h2>
<p>Les principales fonctionnalités de l'éditeur de présentation sont stabilisées et la plupart des modifications envisagées portent sur l'amélioration de l'ergonomie et des performances.</p>
<p>À moyen terme, les améliorations suivantes sont prévues :</p>
<ul>
<li>Ajouter des vignettes pour chaque vue dans l'éditeur de présentation.</li>
<li>Porter Sozi-export vers Headless Chromium à la place de PhantomJS.</li>
<li>Compléter la <a href="http://sozi.baierouge.fr/pages/ui-fr.html">documentation de l'interface utilisateur</a>.</li>
</ul>
<p>Je réfléchis également à la possibilité de distribuer Sozi sous une forme plus légère qui n'embarque pas une copie de Chromium. Pour une application qui tient en 650 Ko de code JavaScript, on se retrouve avec un paquet Debian de 40 Mo, tandis que le fichier <code>tar.gz</code> pour OS X pèse 133 Mo.</p>
<p>Après tout, Sozi s'exécute très bien dans un navigateur web. La seule raison d'utiliser Electron dans mon cas est la possibilité d'accéder au système de fichiers et de détecter automatiquement les modifications du document SVG. Je suis preneur de toutes idées qui pourraient m'aider à obtenir le même résultat tout en utilisant le navigateur déjà installé sur l'ordinateur de l'utilisateur.</p>
<ul>
<li><a href="http://sozi.baierouge.fr/">Le site web de Sozi</a></li>
<li><a href="http://sozi.baierouge.fr/community/">Le forum de discussion</a></li>
<li><a href="https://github.com/senshu/Sozi">La page du projet Sozi sur GitHub</a></li>
<li><a href="https://github.com/senshu/Sozi-export/">La page du projet Sozi-export sur GitHub</a></li>
</ul>
<div><a href="https://linuxfr.org/users/llumeao/journaux/de-sozi-12-a-sozi-19.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/117075/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/llumeao/journaux/de-sozi-12-a-sozi-19#comments">ouvrir dans le navigateur</a>
</p>
Guillaume Savatonhttps://linuxfr.org/nodes/117075/comments.atomtag:linuxfr.org,2005:News/333842012-09-29T19:03:09+02:002013-01-19T16:52:38+01:00Sozi 12.09 est disponibleLicence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<div><p>Sozi est un logiciel libre (licence GPL 3.0) permettant de réaliser des présentations animées. Initialement inspiré par le logiciel propriétaire <a href="http://fr.wikipedia.org/wiki/Prezi">Prezi</a>, l’un des intérêts de Sozi est l’utilisation de formats ouverts. Ainsi, les présentations créées avec Sozi peuvent être jouées dans tout navigateur web capable d’afficher des documents <a href="http://fr.wikipedia.org/wiki/SVG" title="Définition Wikipédia">SVG</a> et d’exécuter du JavaScript.<br />
Pour créer une nouvelle présentation, un greffon pour l’éditeur de dessin vectoriel <a href="http://inkscape.org/">Inkscape</a> est fourni.</p>
<p>Sur <em>LinuxFr.org</em>, aucune nouvelle n’a été publiée sur ce projet depuis l’<a href="http://linuxfr.org/users/llumeao/journaux/sozi-revient">annonce de la sortie de la version 10.10</a>. Le projet est pourtant bien vivant, et une dizaine de nouvelles versions ont été publiées au cours des deux dernières années. Cette dépêche fait le point sur les évolutions les plus significatives.</p></div><ul><li>lien nᵒ 1 : <a title="http://sozi.baierouge.fr/wiki/fr:bienvenue" hreflang="fr" href="https://linuxfr.org/redirect/83567">Le site officiel du projet Sozi</a></li><li>lien nᵒ 2 : <a title="https://github.com/senshu/Sozi" hreflang="en" href="https://linuxfr.org/redirect/83568">La page du projet Sozi chez GitHub</a></li><li>lien nᵒ 3 : <a title="http://youtu.be/fgAmuvZE_mw" hreflang="fr" href="https://linuxfr.org/redirect/83569">Une vidéo de démonstration de Sozi 12.09</a></li><li>lien nᵒ 4 : <a title="https://translations.launchpad.net/sozi" hreflang="en" href="https://linuxfr.org/redirect/83570">La page du projet de traduction de Sozi</a></li></ul><div><h2 id="toc_0">Ajout de documents audio et vidéo</h2>
<p>Cette fonctionnalité repose sur l’utilisation des balises <code><audio></code> et <code><video></code> du standard HTML 5 et la possibilité de les inclure dans un document SVG. Elle peut être utilisée aussi bien dans un document SVG statique que dans une présentation Sozi. Dans ce dernier cas, il est alors possible de déclencher le démarrage ou l’arrêt d’une vidéo automatiquement au cours du déroulement de la présentation.</p>
<p>Pour le moment, seuls les navigateurs utilisant le moteur de rendu <em>Gecko</em>, comme par exemple Firefox, sont capables d’afficher correctement les vidéos insérées de cette manière.</p>
<h2 id="toc_1">Ajout d’hyperliens</h2>
<p>Dans une présentation Sozi, chaque vue possède sa propre adresse URL. Pour réaliser de véritables présentations « non linéaires », une petite extension Inkscape permet maintenant de créer des hyperliens vers une vue d’un document, ou vers n’importe quelle adresse externe.</p>
<p>En réalité, cette possibilité est offerte nativement par la balise SVG <code><a></code>, qui fonctionne de la même manière qu’en HTML. Cette extension ne fait que combler une fonctionnalité manquante dans Inkscape.</p>
<h2 id="toc_2">Amélioration de l’interface utilisateur</h2>
<p>L’interface utilisateur de l’éditeur a régulièrement fait l’objet d’améliorations visant à pallier les limitations du système d’extension d’Inkscape.</p>
<p>La principale difficulté tient au fait qu’il est impossible de laisser ouverte la « fenêtre Sozi » tout en continuant à éditer le document. L’éditeur a donc été modifié pour permettre de créer et de manipuler plusieurs vues sans avoir à fermer et réouvrir la fenêtre à chaque opération. Cependant, même avec ces améliorations, l’utilisation de l’éditeur reste moins agréable que s’il était complètement intégré à Inkscape.</p>
<h2 id="toc_3">Utilisation de calques</h2>
<p>Une nouveauté importante de la version 12.09 est la possibilité de construire une présentation comme la superposition de plusieurs calques animés séparément. <a href="http://youtu.be/fgAmuvZE_mw">Une démonstration en vidéo</a> illustre la création d’une présentation avec trois calques.</p>
<h2 id="toc_4">Traduction</h2>
<p>L’interface utilisateur de l’éditeur fait appel à <a href="https://www.gnu.org/software/gettext/gettext.html"><em>GNU gettext</em></a>.<br />
Des traductions sont disponibles en français, portugais brésilien, néerlandais et espagnol. Bien qu’il soit possible d’éditer un fichier de traduction à l’aide d’un simple éditeur de texte, ou à l’aide d’un outil comme <a href="http://www.poedit.net/"><em>poedit</em></a>, un <a href="https://translations.launchpad.net/sozi">projet de traduction en ligne</a> a également été créé pour fédérer les traducteurs et bénéficier des équipes existantes.</p>
<h2 id="toc_5">Disponibilité</h2>
<p>Sozi fonctionne sous GNU/Linux, Windows et Mac OS X.</p>
<p>Des paquets sont disponibles pour les distributions Archlinux (<a href="https://aur.archlinux.org/packages.php?ID=42270">dans le dépôt AUR</a>), Ubuntu (<a href="https://launchpad.net/~sunab/+archive/sozi-release">dans un dépôt PPA</a>), <a href="http://packages.debian.org/search?suite=default&section=all&arch=any&searchon=names&keywords=sozi">Debian</a> et <a href="https://admin.fedoraproject.org/pkgdb/acls/name/inkscape-sozi">Fedora</a>.</p>
<p>Les utilisateurs de Windows et Mac OS X doivent passer par une procédure d’installation manuelle qui peut décourager les débutants.</p>
<h2 id="toc_6">Les développements en cours</h2>
<p>La prochaine version de Sozi devrait permettre l’exportation des présentations sous forme de documents PDF et de vidéos.</p>
<p>L’interface utilisateur de l’éditeur devrait encore faire l’objet d’améliorations en permettant, par exemple, d’éditer simultanément les propriétés de plusieurs vues et de définir des valeurs par défaut pour certaines propriétés.</p></div><div><a href="https://linuxfr.org/news/sozi-12-09-est-disponible.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/95796/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sozi-12-09-est-disponible#comments">ouvrir dans le navigateur</a>
</p>
Guillaume SavatonDavy DefaudclaudexXavier Teyssierbaud123https://linuxfr.org/nodes/95796/comments.atomtag:linuxfr.org,2005:Diary/303632010-10-24T20:51:27+02:002010-10-24T20:51:27+02:00Sozi revient
Bonjour à toutes et tous,<br />
<br />
J'ai peur de faire pâle figure après <a href="http://linuxfr.org/~O_Possum/30361.html">l'annonce du retour de MultideskOS</a>, mais je tente ma chance malgré tout.<br />
<br />
Après des mois de silence, voici donc des nouvelles du <a href="http://sozi.baierouge.fr">projet Sozi</a>.<br />
<br />
Souvenez-vous : en décembre 2009, je publiai un journal intitulé <a href="http://linuxfr.org/~llumeao/29133.html">Sozi : vers un système de présentation alternatif libre</a>. À l'époque, Sozi n'était qu'un bricolage vite fait, juste pour montrer ce que pourrait être un outil de présentation à la <a href="http://prezi.com/">Prezi</a>, mais libre et utilisant des standards ouverts (SVG et Javascript). Malgré les nombreux encouragements que j'ai reçus, les retours d'expérience, les propositions d'améliorations et les patches, je n'ai pas eu la possibilité de revenir sur ce projet pendant plus de six mois.<br />
<br />
<strong>Réflexions préliminaires</strong><br />
<br />
Dans la première incarnation de Sozi, de simples rectangles permettaient de délimiter les vues à parcourir dans le document SVG. L'ordre des vues dépendait de l'ordre de création des rectangles. Pour modifier cet ordre ou insérer une nouvelle vue, il fallait manipuler directement le code XML du document.<br />
<br />
D'autre part, des besoins ont été exprimés, comme par exemple le paramétrage de la durée des transitions, le passage automatique d'une vue à la suivante après une durée de notre choix, etc.<br />
<br />
Ces deux constats m'ont amené à réfléchir sur le format des données spécifiques à Sozi et sur l'interface utilisateur nécessaire à la création des présentations. Parmi les candidats pour les formats de données, j'ai envisagé l'utilisation de JSON, directement manipulable en Javascript, ou alors plus directement l'ajout d'attributs dans le document SVG lui-même.<br />
<br />
Concernant l'interface utilisateur, deux solutions ont été explorées : la première a consisté à développer une extension pour Firefox, mais a été abandonnée. La seconde a consisté à développer une extension pour <a href="http://inkscape.org/">Inkscape</a>.<br />
<br />
<strong>Une extension pour Inkscape</strong><br />
<br />
Le mécanisme d'extension d'Inkscape est assez pauvre : pour simplifier, une extension est un simple programme externe (en Python) qui prend en entrée le document courant, le modifie, et le renvoie à Inkscape. Ce fonctionnement me paraissait tout à fait inadapté dans le cas de Sozi, jusqu'à ce que je (re)découvre l'outil de présentation <a href="http://code.google.com/p/jessyink/">JessyInk</a>, qui parvient très bien à s'en accommoder.<br />
<br />
Pour offrir une interface d'édition adaptée à Sozi, j'ai effectué les choix suivants :<br />
<ul>
<li>Les informations des différentes vues sont matérialisées par des attributs, spécifiques à Sozi, dans le document SVG.</li>
<li>Comme dans JessyInk, le script d'animation est incorporé au document. Une présentation se compose ainsi d'un unique fichier facile à distribuer.</li>
<li>Pour contourner les limitations des extensions Inkscape, l'outil d'édition ouvre une fenêtre GTK où les propriétés de la vue courante peuvent être saisies.</li>
</ul>
<br />
<strong>Une première version officielle</strong><br />
<br />
Aujourd'hui, Sozi revient donc avec une première version officielle.<br />
Ce n'est pas encore parfait, mais je l'utilise déjà avec beaucoup de satisfaction dans mon métier d'enseignant.<br />
<br />
Comparée à la version de décembre dernier, la gestion des événements a été améliorée :<br />
<ul>
<li>Un meilleur respect de la durée des animations : sur un ordinateur un peu lent ou très occupé par d'autres tâches, l'animation pourra être saccadée, mais la durée spécifiée devrait être à peu près respectée.</li>
<li>Une meilleure réactivité aux actions de l'utilisateur : les actions de l'utilisateur (aller à la vue suivante, à la vue précédente, au début, à la fin) prennent effet immédiatement sans attendre la fin de l'animation en cours.</li>
</ul>
<br />
De nouvelles fonctionnalités ont été ajoutées :<br />
<ul>
<li>Zoomer/dézoomer avec la molette de la souris.</li>
<li>Déplacer la page en faisant glisser avec le bouton gauche.</li>
<li>Afficher la liste des vues.</li>
<li>Passer automatique à la vue suivante au bout d'une durée spécifiée.</li>
<li>Choisir parmi différents profils d'accélération/décélération pour passer d'une vue à l'autre.</li>
</ul>
<br />
Je vous invite donc à essayer cette nouvelle version et à me faire part de votre expérience. Pour plus d'informations, vous pouvez visiter le <a href="http://sozi.baierouge.fr">site officiel de Sozi</a>, dont la partie francophone rassemble la plupart des informations utiles pour débuter.<br />
Pour ceux qui sont intéressés par des astuces techniques avec SVG et Javascript, <a href="http://senshu.baierouge.fr/blog/?tag/Sozi">quelques billets récents sur mon blog</a> présentent certaines recettes utilisées dans Sozi.<div><a href="https://linuxfr.org/users/llumeao/journaux/sozi-revient.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/56637/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/llumeao/journaux/sozi-revient#comments">ouvrir dans le navigateur</a>
</p>
Guillaume Savatonhttps://linuxfr.org/nodes/56637/comments.atomtag:linuxfr.org,2005:Diary/291332009-12-09T21:30:53+01:002009-12-09T21:30:53+01:00Sozi : vers un système de présentation alternatif libre
Avez-vous entendu parler de Prezi ( <a href="http://prezi.com/">http://prezi.com/</a> ), une plate-forme de création et de partage de présentations développée en Hongrie ?<br />
<br />
À la différence des outils de présentations classiques (MS PowerPoint, OOImpress, KeyNote), Prezi abandonne le principe du diaporama.<br />
Au lieu d'organiser votre discours en une succession linéaire de diapos, Prezi vous fournit une grande page blanche sur laquelle vous allez disposer le contenu de votre présentation de façon "créative". Le déroulement de la présentation consiste en une succession de translations, zooms et rotations permettant de focaliser l'attention sur les éléments que vous voulez montrer.<br />
<br />
Le concept a séduit de nombreux utilisateurs, tandis que d'autres sont restés sceptiques. Il ne s'agit sans doute pas d'une révolution, ni d'une solution miracle pour mettre fin aux projections soporifiques. Mais l'idée est amusante et le libriste qui s'agite en nous ne tarde pas à s'intéresser à la licence de cet outil, aux formats de données qu'il accepte et produit, à son fonctionnement sur son OS favori.<br />
<br />
<b>Un outil propriétaire</b><br />
<br />
La déception est immédiate : l'outil est propriétaire, le format des données est fermé, la technologie de visionnage est... Flash.<br />
Si vous utilisez la version gratuite du service, vous ne pourrez même pas conserver les sources des documents que vous produirez : ils resteront stockés sur les serveurs de prezi.com et vous devrez vous contenter d'un fichier ".exe" si vous voulez rejouer votre présentation sur votre PC en l'absence d'une connexion internet.<br />
<br />
<b>Aucun concurrent libre</b><br />
<br />
Face à ce constat, je me suis intéressé aux éventuelles solutions, si possible libres, qui utiliseraient des formats ouverts, comme par exemple <a href="http://fr.wikipedia.org/wiki/SVG" title="Définition Wikipédia">SVG</a>.<br />
Il y a bien JessyInk ( <a href="http://code.google.com/p/jessyink/">http://code.google.com/p/jessyink/</a> ), une extension au logiciel Inkscape. Bien qu'orienté diaporama, cet outil permet de programmer des zooms à l'intérieur des diapos.<br />
Pour le moment, il semble qu'aucun outil libre ne concurrence Prezi sur son terrain.<br />
<br />
<b>Une expérience "preuve de concept"</b><br />
<br />
Après un temps de réflexion et une après-midi de développement, je suis fier de vous proposer Sozi : une imitation approximative et incomplète de Prezi utilisant le standard SVG.<br />
<br />
Sozi, c'est :<br />
<ul>
<li>L'éditeur SVG de votre choix (j'utilise Inkscape sans plugin particulier)</li>
<li>Un document SVG "fond de tarte" avec quelques éléments prédéfinis et des règles d'utilisation à respecter pour ajouter du contenu</li>
<li>Un script Javascript d'environ 120 lignes pour animer le résultat</li>
<li>Le navigateur web de votre choix s'il prend en charge SVG et Javascript (testé sous Firefox 3.5)</li>
</ul>
<br />
Pour plus d'explications, vous pouvez vous rendre sur cette page : <a href="http://senshu.baierouge.fr/blog/?post/2009/12/07/Sozi-%3A-un-syst%C3%A8me-de-pr%C3%A9sentation-alternatif">http://senshu.baierouge.fr/blog/?post/2009/12/07/Sozi-%3A-un(...)</a><br />
<br />
Pour visionner une démo, c'est ici : <a href="http://senshu.baierouge.fr/blog/public/Sozi/sozi-demo.svg">http://senshu.baierouge.fr/blog/public/Sozi/sozi-demo.svg</a><br />
<br />
<b>À propos de la licence</b><br />
<br />
Le script qui gère l'animation est sous licence GPL.<br />
Pour le document SVG "fond de tarte", je me pose des questions :<br />
<ul>
<li>C'est un "document", pas un "programme" : la licence GPL s'applique-t-elle à ce fichier ?</li>
<li>L'utilisateur est censé le modifier pour y insérer son contenu : une présentation créée de cette manière devient-elle un travail "dérivé" soumis à la même licence ?</li>
</ul>
<br />
<b>Conclusion</b><br />
<br />
Le résultat est loin d'être parfait : le système d'édition est un peu artisanal et l'animation peut manquer de fluidité selon votre configuration matérielle.<br />
J'ai souhaité partager ce modeste travail en espérant que certains y trouvent une source d'inspiration. Vos idées d'améliorations sont les bienvenues.<div><a href="https://linuxfr.org/users/llumeao/journaux/sozi-vers-un-syst%C3%A8me-de-pr%C3%A9sentation-alternatif-libre.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/55435/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/llumeao/journaux/sozi-vers-un-syst%C3%A8me-de-pr%C3%A9sentation-alternatif-libre#comments">ouvrir dans le navigateur</a>
</p>
Guillaume Savatonhttps://linuxfr.org/nodes/55435/comments.atom