guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

04/05: website: Add post about 'guix pull'.


From: Ludovic Courtčs
Subject: 04/05: website: Add post about 'guix pull'.
Date: Tue, 24 Jul 2018 08:36:49 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix-artwork.

commit 7d5e26b9cf845bf3a9f7e8194a95b38653719746
Author: Ludovic Courtès <address@hidden>
Date:   Tue Jul 24 14:16:05 2018 +0200

    website: Add post about 'guix pull'.
    
    * website/posts/pull.md,
    website/static/blog/img/guix-pull1.png,
    website/static/blog/img/guix-pull1.svg,
    website/static/blog/img/guix-pull2.svg,
    website/static/blog/img/guix-pull3.png,
    website/static/blog/img/guix-pull3.svg: New files.
---
 website/posts/pull.md                  | 276 +++++++++++++++++++++++++++++++++
 website/static/blog/img/guix-pull1.png | Bin 0 -> 53991 bytes
 website/static/blog/img/guix-pull1.svg |  68 ++++++++
 website/static/blog/img/guix-pull2.svg |  66 ++++++++
 website/static/blog/img/guix-pull3.png | Bin 0 -> 53513 bytes
 website/static/blog/img/guix-pull3.svg |  74 +++++++++
 6 files changed, 484 insertions(+)

diff --git a/website/posts/pull.md b/website/posts/pull.md
new file mode 100644
index 0000000..2416bc6
--- /dev/null
+++ b/website/posts/pull.md
@@ -0,0 +1,276 @@
+title: Multi-dimensional transactions and rollbacks, oh my!
+date: 2018-07-24 14:30
+author: Ludovic Courtès
+tags: Software development, Reproducibility, Programming interfaces, Scheme API
+---
+One of the [highlights of version
+0.15.0](https://www.gnu.org/software/guix/blog/2018/gnu-guix-and-guixsd-0.15.0-released/)
+was the overhaul of [`guix
+pull`](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-pull.html),
+the command that updates Guix and its package collection.  In Debian
+terms, you can think of `guix pull` as:
+
+```
+apt-get update && apt-get install apt
+```
+
+Let’s be frank, `guix pull` does not yet run as quickly as this
+`apt-get` command—in the “best case”, when pre-built binaries are
+available, it currently runs in about 1m30s on a recent laptop.  More
+about the performance story in a future post…
+
+One of the key features of the new `guix pull` is the ability to _roll
+back_ to previous versions of Guix.  That’s a distinguishing feature
+that opens up new possibilities.
+
+# “Profile generations”
+
+Transactional upgrades and rollbacks have been a distinguishing feature
+of Guix since Day 1.  They come for free as a consequence of the
+functional package management model inherited from the Nix package
+manager.  To many users, this alone is enough to justify using a
+functional package manager: if an upgrade goes wrong, you can always
+roll back.  Let’s recap how this all works.
+
+As a user, you install packages in your own _profile_, which defaults to
+`~/.guix-profile`.  Then from time to time you update Guix and its
+package collection:
+
+```
+$ guix pull
+```
+
+This updates `~/.config/guix/current`, giving you an updated `guix`
+executable along with an updated set of packages.  You can now upgrade
+the packages that are in your profile:
+
+```
+$ guix package -u
+The following packages will be upgraded:
+   diffoscope  93 → 96     /gnu/store/…-diffoscope-96
+   emacs    25.3 → 26.1     /gnu/store/…-emacs-26.1
+   gimp     2.8.22 → 2.10.4 /gnu/store/…-gimp-2.10.4
+   gnupg    2.2.7 → 2.2.9   /gnu/store/…-gnupg-2.2.9
+```
+
+The upgrade creates a new _generation_ of your profile—the previous
+generation of your profile, with diffoscope 93, emacs 25.3, and so on is
+still around.  You can list profile generations:
+
+```
+$ guix package --list-generations
+Generation 1  Jun 08 2018 20:06:21
+   diffoscope  93     out   /gnu/store/…-diffoscope-93
+   emacs        25.3   out   /gnu/store/…-emacs-25.3
+   gimp         2.8.22 out   /gnu/store/…-gimp-2.8.22
+   gnupg        2.2.7  out   /gnu/store/…-gnupg-2.2.7
+   python       3.6.5  out   /gnu/store/…-python-3.6.5
+
+Generation 2  Jul 12 2018 12:42:08     (current)
+-  diffoscope  93     out   /gnu/store/…-diffoscope-93
+-  emacs        25.3   out   /gnu/store/…-emacs-25.3
+-  gimp         2.8.22 out   /gnu/store/…-gimp-2.8.22
+-  gnupg        2.2.7  out   /gnu/store/…-gnupg-2.2.7
++  diffoscope  96     out   /gnu/store/…-diffoscope-96
++  emacs        26.1   out   /gnu/store/…-emacs-26.1
++  gimp         2.10.4 out   /gnu/store/…-gimp-2.10.4
++  gnupg        2.2.9  out   /gnu/store/…-gnupg-2.2.9
+```
+
+That shows our two generations with the diff between Generation 1 and
+Generation 2.  We can at any time run `guix package --roll-back` and get
+our previous versions of gimp, emacs, and so on.  Each generation is
+just a bunch of symlinks to those packages, so what we have looks like
+this:
+
+![Image of the profile 
generations.](https://www.gnu.org/software/guix/static/blog/img/guix-pull1.png)
+
+Notice that python was not updated, so it’s shared between both
+generations.  And of course, all the dependencies that didn’t change in
+between—e.g., the C library—are shared among all packages.
+
+# `guix pull` generations
+
+Like I wrote above, `guix pull` brings the latest set of package
+definitions from Git `master`.  The Guix package collection usually only
+contains only the latest version of each package; for example, current
+`master` only has version 26.1 of Emacs and version 2.10.4 of the GIMP
+(there are notable exceptions such as GCC or Python.)  Thus, `guix
+package -i gimp`, from today’s master, can only install gimp 2.10.4.
+Often, that’s not a problem: you can keep old profile generations
+around, so if you really need that older version of Emacs, you can run
+it from your previous generation.
+
+Still, having `guix pull` keep track of the changes to Guix and its
+package collection is useful.  Starting from 0.15.0, `guix pull` creates
+a new generation, just like `guix package` does.  After you’ve run `guix
+pull`, you can now list Guix generations as well:
+
+```
+$ guix pull -l
+Generation 10  Jul 14 2018 00:02:03
+  guix 27f7cbc
+    repository URL: https://git.savannah.gnu.org/git/guix.git
+    branch: origin/master
+    commit: 27f7cbc91d1963118e44b14d04fcc669c9618176
+Generation 11  Jul 20 2018 10:44:46
+  guix 82549f2
+    repository URL: https://git.savannah.gnu.org/git/guix.git
+    branch: origin/master
+    commit: 82549f2328c59525584b92565846217c288d8e85
+  14 new packages: bsdiff, electron-cash, emacs-adoc-mode,
+    emacs-markup-faces, emacs-rust-mode, inchi, luakit, monero-gui,
+       nethack, openbabel, qhull, r-txtplot, stb-image, stb-image-write
+  52 packages upgraded: address@hidden, address@hidden,
+    address@hidden, address@hidden, address@hidden, address@hidden,
+    …
+Generation 12  Jul 23 2018 15:22:52    (current)
+  guix fef7bab
+    repository URL: https://git.savannah.gnu.org/git/guix.git
+    branch: origin/master
+    commit: fef7baba786a96b7a3100c9c7adf8b45782ced37
+  20 new packages: ccrypt, demlo, emacs-dired-du,
+    emacs-helm-org-contacts, emacs-ztree, ffmpegthumbnailer, 
+       go-github-com-aarzilli-golua, go-github-com-kr-text, 
+       go-github-com-mattn-go-colorable, go-github-com-mattn-go-isatty, 
+       go-github-com-mgutz-ansi, go-github-com-michiwend-golang-pretty, 
+       go-github-com-michiwend-gomusicbrainz, go-github-com-stevedonovan-luar, 
+       go-github-com-wtolson-go-taglib, go-github-com-yookoala-realpath, 
+       go-gitlab-com-ambrevar-damerau, go-gitlab-com-ambrevar-golua-unicode,
+    guile-pfds, u-boot-cubietruck
+  27 packages upgraded: address@hidden, address@hidden,
+    address@hidden, 
+    …
+```
+
+The nice thing here is that `guix pull` provides high-level information
+about the differences between two subsequent generations of Guix.
+
+In the end, Generation 1 of our profile was presumably built with Guix
+Generation 11, while Generation 2 of our profile was built with Guix
+Generation 12.  We have a clear mapping between Guix generations as
+created by `guix pull` and profile generations as created with `guix
+package`:
+
+![Image of the Guix 
generations.](https://www.gnu.org/software/guix/static/blog/img/guix-pull3.png)
+
+Each generation created by `guix pull` corresponds to one commit in the
+Guix repo.  Thus, if I go to another machine and run:
+
+```
+$ guix pull --commit=fef7bab
+```
+
+then I know that I get the exact same Guix instance as my Generation 12
+above.  From there I can install diffoscope, emacs, etc. and I know I’ll
+get the exact same binaries as those I have above, thanks to
+[reproducible builds](https://reproducible-builds.org/docs/definition/).
+
+These are very strong guarantees in terms of reproducibility and
+provenance tracking—properties that are
+[typically](https://github.com/canonical-websites/snapcraft.io/issues/651)
+[missing](https://lwn.net/Articles/752982/) from “applications bundles”
+Ă  la Docker.
+
+In addition, you can easily run an older Guix.  For instance, this is
+how you would install the version of gimp that was current as of
+Generation 10:
+
+```
+$ ~/.config/guix/current-10-link/bin/guix package -i gimp
+```
+
+At this point your profile contains gimp coming from an old Guix along
+with packages installed from the latest Guix.  Past and present coexist
+in the same profile.  The historical dimension of the profile no longer
+matches exactly the history of Guix itself.
+
+# Composing Guix revisions
+
+Some people have expressed interest in being able to compose packages
+coming from different revisions of Guix—say to create a profile
+containing old versions of Python and NumPy, but also the latest and
+greatest GCC.  It may seem far-fetched but it has very real
+applications: there are large collections of scientific packages and in
+particular bioinformatics packages that don’t move as fast as our
+beloved flagship free software packages, and users may require ancient
+versions of some of the tools.
+
+We could keep old versions of many packages but maintainability costs
+would grow exponentially.  Instead, Guix users can take advantage of the
+version control history of Guix itself to mix and match packages coming
+from different revisions of Guix.  As shown above, it’s already possible
+to achieve this by running the `guix` program off the generation of
+interest.  It does the job, but can we do better?
+
+In the process of enhancing `guix pull` we developed a high-level API
+that allows an instance of Guix to “talk” to a different instance of
+Guix—[an
+“inferior”](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=32115).  It’s
+what allows `guix pull` to display the list of packages that were added
+or upgraded between two revisions.  The next logical step will be to
+provide seamless integration of packages coming from an inferior.  That
+way, users would be able to refer to “past” package graphs right from [a
+profile
+manifest](https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html#index-profile-manifest)
+or from the command-line.  Future work!
+
+# On coupling
+
+The time traveler in you might be wondering: Why are package definitions
+coupled with the package manager, doesn’t it make it harder to compose
+packages coming from different revisions?  Good point!
+
+Tight coupling certainly complicates this kind of composition: we can’t
+just have any revision of Guix load package definitions from any other
+revision; this could fail altogether, or it could provide a different
+build result.  Another potential issue is that `guix pull`ing an older
+revision not only gives you an older set of packages, it also gives you
+older tools, bug-for-bug.
+
+The reason for this coupling is that a package definition [like this
+one](https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html)
+doesn’t exist in a vacuum.  Its meaning is defined by the implementation
+of [package
+objects](https://www.gnu.org/software/guix/manual/en/html_node/package-Reference.html),
+by
+[`gnu-build-system`](https://www.gnu.org/software/guix/manual/en/html_node/Build-Systems.html),
+by a number of [lower-level](https://arxiv.org/abs/1305.4584)
+[abstractions](https://hal.inria.fr/hal-01580582/en) that are all
+defined as extensions of the Scheme language in Guix itself, and
+ultimately by [Guile](https://www.gnu.org/software/guile/), which
+implements the language Guix is written in.  Each instance created by
+`guix pull` brings all these components.  Because Guix is implemented as
+a set of programming language extensions and libraries, that package
+definitions depend on all these parts becomes manifest.  Instead of
+being frozen, the APIs and package definitions evolve together, which
+gives us developers a lot of freedom on the changes we can make.
+
+[Nix](https://nixos.org/nix/) results from a different design choice.
+Nix-the-package-manager implements the Nix language, which acts as a
+“frozen” interface.  Package definitions in Nixpkgs are written in that
+language, and a given version of Nix can _possibly_ interpret both
+current and past package definitions without further ado.  The Nix
+language does evolve though, so at one point an old Nix inevitably
+[becomes unable to evaluate a new
+Nixpkgs](https://github.com/NixOS/nixpkgs/blob/master/lib/minver.nix),
+and _vice versa_.
+
+These two approaches make different tradeoffs.  Nix’ loose coupling
+simplifies the implementation and makes it easy to compose old and new
+package definitions, to some extent; Guix’ tight coupling makes such
+composition more difficult to implement, but it leaves developers more
+freedom and, we hope, may support “time travels” over longer period of
+times.  Time will tell!
+
+# It’s like driving a DeLorean
+
+![Inside the cabin of the DeLorean time machine in “Back to the 
Future.”](https://upload.wikimedia.org/wikipedia/commons/thumb/1/15/TeamTimeCar.com-BTTF_DeLorean_Time_Machine-OtoGodfrey.com-JMortonPhoto.com-05.jpg/800px-TeamTimeCar.com-BTTF_DeLorean_Time_Machine-OtoGodfrey.com-JMortonPhoto.com-05.jpg)
+
+That profile generations are kept around already gave users a time
+machine of sorts—you can always roll back to a previous state of your
+software environment.  With the addition of roll-back support for `guix
+pull`, this adds another dimension to the time machine: you can
+roll-back to a previous state of Guix itself and from there create
+alternative futures or even mix bits from the past with bits from the
+present.  We hope you’ll enjoy it!
diff --git a/website/static/blog/img/guix-pull1.png 
b/website/static/blog/img/guix-pull1.png
new file mode 100644
index 0000000..5d64538
Binary files /dev/null and b/website/static/blog/img/guix-pull1.png differ
diff --git a/website/static/blog/img/guix-pull1.svg 
b/website/static/blog/img/guix-pull1.svg
new file mode 100644
index 0000000..8d19587
--- /dev/null
+++ b/website/static/blog/img/guix-pull1.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="49.612511mm"
+   height="38.014778mm"
+   viewBox="0 0 49.612511 38.014778"
+   version="1.1"
+   id="svg4555"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="guix-pull1.svg">
+  <defs
+     id="defs4549" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="1"
+     inkscape:pageshadow="2"
+     inkscape:zoom="3.7810944"
+     inkscape:cx="82.648029"
+     inkscape:cy="71.838953"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1198"
+     inkscape:window-height="1918"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata4552">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Tavolo 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-68.17583,-113.9511)">
+    <path
+       style="fill:#000080;fill-opacity:1;stroke-width:0.08466666"
+       d="m 96.508898,151.90988 c -0.03105,-0.031 -0.05645,-0.12769 
-0.05645,-0.21478 0,-0.11334 0.174463,-0.2411 0.613833,-0.44954 
0.529998,-0.25143 0.579144,-0.29238 0.359833,-0.29978 -0.300971,-0.0102 
-0.946832,-0.23746 -1.206553,-0.42462 -0.299672,-0.21594 -0.766442,-1.0739 
-1.031028,-1.89509 -0.353012,-1.09564 -0.85575,-2.21942 -1.29423,-2.89303 
-0.500015,-0.76814 -1.369062,-1.65217 -1.847341,-1.8792 -0.426593,-0.20249 
-1.209766,-0.33345 -1.857844,-0.31064 -0.360394,0.0127 -0.425336 [...]
+       id="path4538"
+       inkscape:connector-curvature="0"
+       inkscape:export-xdpi="204.78999"
+       inkscape:export-ydpi="204.78999" />
+  </g>
+</svg>
diff --git a/website/static/blog/img/guix-pull2.svg 
b/website/static/blog/img/guix-pull2.svg
new file mode 100644
index 0000000..3f7d513
--- /dev/null
+++ b/website/static/blog/img/guix-pull2.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="37.142097mm"
+   height="27.085258mm"
+   viewBox="0 0 37.142097 27.085258"
+   version="1.1"
+   id="svg834"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="guix-pull2.svg">
+  <defs
+     id="defs828" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="5.0505921"
+     inkscape:cx="70.189791"
+     inkscape:cy="51.184742"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1198"
+     inkscape:window-height="1918"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata831">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Tavolo 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-71.387282,-106.56456)">
+    <path
+       style="fill:#800080;stroke-width:0.08466666;fill-opacity:1"
+       d="m 86.366963,133.46185 c -0.300784,-0.32018 -0.168301,-0.68572 
0.137641,-0.37978 0.120086,0.12009 0.129921,-0.0853 0.04642,-0.96943 
-0.04992,-0.52853 -0.06897,-0.5715 -0.253398,-0.5715 -0.244236,0 
-0.258034,-0.17472 -0.03009,-0.381 0.117451,-0.1063 0.169333,-0.26077 
0.169333,-0.50419 0,-0.57284 0.260301,-0.70948 0.635942,-0.33384 
0.252787,0.25279 0.270115,0.67634 0.02692,0.65805 -0.08812,-0.007 
-0.124461,0.0337 -0.09636,0.10691 0.02481,0.0647 -0.0015,0.17373 
-0.05848,0.24238 -0. [...]
+       id="path817"
+       inkscape:connector-curvature="0" />
+  </g>
+</svg>
diff --git a/website/static/blog/img/guix-pull3.png 
b/website/static/blog/img/guix-pull3.png
new file mode 100644
index 0000000..d5f0a8c
Binary files /dev/null and b/website/static/blog/img/guix-pull3.png differ
diff --git a/website/static/blog/img/guix-pull3.svg 
b/website/static/blog/img/guix-pull3.svg
new file mode 100644
index 0000000..e820b7a
--- /dev/null
+++ b/website/static/blog/img/guix-pull3.svg
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/";
+   xmlns:cc="http://creativecommons.org/ns#";
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#";
+   xmlns:svg="http://www.w3.org/2000/svg";
+   xmlns="http://www.w3.org/2000/svg";
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd";
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape";
+   width="77.602425mm"
+   height="37.504372mm"
+   viewBox="0 0 77.602425 37.504372"
+   version="1.1"
+   id="svg1419"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="guix-pull3.svg">
+  <defs
+     id="defs1413" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="1.9032679"
+     inkscape:cx="168.20973"
+     inkscape:cy="80.254816"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     fit-margin-top="0"
+     fit-margin-left="0"
+     fit-margin-right="0"
+     fit-margin-bottom="0"
+     inkscape:window-width="1198"
+     inkscape:window-height="1918"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="0" />
+  <metadata
+     id="metadata1416">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage"; />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Tavolo 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(-36.413582,-114.42019)">
+    <path
+       style="fill:#800080;fill-opacity:1;stroke-width:0.08466666"
+       d="m 51.393263,147.40785 c -0.300784,-0.32018 -0.168301,-0.68572 
0.137641,-0.37978 0.120086,0.12009 0.129921,-0.0853 0.04642,-0.96943 
-0.04992,-0.52853 -0.06897,-0.5715 -0.253398,-0.5715 -0.244236,0 
-0.258034,-0.17472 -0.03009,-0.381 0.117451,-0.1063 0.169333,-0.26077 
0.169333,-0.50419 0,-0.57284 0.260301,-0.70948 0.635942,-0.33384 
0.252787,0.25279 0.270115,0.67634 0.02692,0.65805 -0.08812,-0.007 
-0.124461,0.0337 -0.09636,0.10691 0.02481,0.0647 -0.0015,0.17373 
-0.05848,0.24238 -0. [...]
+       id="path817"
+       inkscape:connector-curvature="0" />
+    <path
+       style="fill:#000080;fill-opacity:1;stroke-width:0.08466666"
+       d="m 92.045921,151.86235 c -0.0299,-0.032 -0.05193,-0.12957 
-0.0489,-0.21661 0.0039,-0.11327 0.182734,-0.23489 0.629082,-0.42793 
0.538418,-0.23286 0.588961,-0.27208 0.370041,-0.2871 -0.300434,-0.0207 
-0.938006,-0.27022 -1.191065,-0.46629 -0.291994,-0.22622 -0.728666,-1.09989 
-0.964548,-1.92978 -0.31473,-1.10724 -0.778102,-2.24782 -1.192908,-2.93626 
-0.473023,-0.78505 -1.310826,-1.69875 -1.780927,-1.94226 -0.419295,-0.21719 
-1.197441,-0.37529 -1.845922,-0.37502 -0.360614,1.7e-4 -0. [...]
+       id="path4538"
+       inkscape:connector-curvature="0"
+       inkscape:export-xdpi="204.78999"
+       inkscape:export-ydpi="204.78999"
+       
sodipodi:nodetypes="cscccccccsccccccccsccscscccsccsccccccsccccccsccsccccccccccsccscccccscccccccccccsccccssccccccccccscccccscccscccscccccccccccccscccccccccccccccccccccsccccccssccccscccccccccccsccccccccccscccscccscccccccccccscccsccccccccccccccccsccccccccccccccccccccccccscccccccccscccccscscsccccccccccccccccccccccccccsccccsccccccccsccccsccscccccsccccsccccccccccccccccccccccccccscscssssscccccccsccccccccccccccccccccscccscccccccccccccccccccsccscsscsccccccccscsccscccccccccccccccscccccccccc
 [...]
+  </g>
+</svg>



reply via email to

[Prev in Thread] Current Thread [Next in Thread]