Planet GNU https://planet.gnu.org/ Planet GNU - https://planet.gnu.org/ FSF Blogs: June 2019: Photos from Brno http://www.fsf.org/blogs/rms/photo-blog-2019-june-brno <div style="border-style: solid; border-width: 2px; text-align: left; margin: 4px 50px 4px 50px; padding-top: 4px; padding-left: 5px; padding-right: 5px;"> <p>Free Software Foundation president Richard Stallman (RMS) was in <strong>Brno, Czech Republic</strong> on June 6, 2019, to give two speeches.</p> <p>In the morning, he took part in the <a href="https://www.smartcityfair.cz/en/">URBIS Smart City Fair</a>, at the Brno Fair Grounds, giving his speech "Computing, freedom, and privacy."<sup style="font-size: 8px;"><a href="https://static.fsf.org/fsforg/rss/blogs.xml#fn1" id="ref1">1</a></sup></p> <p style="text-align: center;"> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-fair-grounds/20190606-brno-c-2019-veletrhy-brno-a-s-cc-by-4-0-1-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-fair-grounds/20190606-brno-c-2019-veletrhy-brno-a-s-cc-by-4-0-2-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-fair-grounds/20190606-brno-c-2019-veletrhy-brno-a-s-cc-by-4-0-3-thumb.jpg" style="margin-top: 4px;" width="530" /> </p> <p style="padding: 0px 20px 0px 20px; margin-top: 1px; text-align: center;"> <em>(Copyright © 2019 Veletrhy Brno, a. s. Photos licensed under <a href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.)</em> <br style="margin-bottom: 15px;" /> </p><p>In the afternoon, at the University Cinema Scala, he gave his speech "The free software movement and the GNU/Linux operating system," to about three hundred people. </p><p style="text-align: center;"> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-jan-prokopius-cc-by-4-0-1-thumb.jpg" style="margin-top: 4px;" width="530" /> </p><p style="padding: 0px 20px 0px 20px; margin-top: 1px; text-align: center;"> <em>(Copyright © 2019 Pavel Loutocký. Photos licensed under <a href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.)</em> <br style="margin-bottom: 15px;" /> </p><p style="text-align: center;"> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-047-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-050-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-051-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-052-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-053-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-054-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-055-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-056-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-057-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-058-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-064-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-063-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-066-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-069-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-070-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-071-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-073-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-074-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-068-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-072-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-075-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-076-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-078-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-079-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-080-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-081-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-082-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-083-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-084-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-085-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-086-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-087-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-088-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-090-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-091-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-092-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-093-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-094-thumb.jpg" style="margin-top: 4px;" width="133" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-095-thumb.jpg" style="margin-top: 4px;" width="132" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-114-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-115-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-116-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-117-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-120-thumb.jpg" style="margin-top: 4px;" width="265" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-121-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-124-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-126-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-128-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-132-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-131-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-133-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-134-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-135-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-136-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-140-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-137-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-141-thumb.jpg" style="margin-top: 4px;" width="530" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-143-thumb.jpg" style="margin-top: 4px;" width="176" /><img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-145-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-146-thumb.jpg" style="margin-top: 4px;" width="176" /> <img alt="" src="https://static.fsf.org/static/nosvn/rms-photos/20190606-brno-scala/20190606-brno-c-2019-pavel-loutocky-cc-by-4-0-144-thumb.jpg" style="margin-top: 4px;" width="530" /> </p> <p style="padding: 0px 20px 0px 20px; margin-top: 1px; text-align: center;"> <em>(Copyright © 2019 Pavel Loutocký. Photos licensed under <a href="http://creativecommons.org/licenses/by/4.0/">CC BY 4.0</a>.)</em> <br style="margin-bottom: 15px;" /> </p><p style="text-align: center;"><strong>Thank you to everyone who made this visit possible!</strong></p> <p style="text-align: center;">If you're in the area, please fill out our contact form, so that we can inform you about future events in and around <a href="https://my.fsf.org/civicrm/profile/create?gid=578&amp;reset=1">Brno</a>. </p> <p style="text-align: center;">Please see <a href="http://www.fsf.org/events">www.fsf.org/events</a> for a full list of all of RMS's confirmed engagements, <br /> and contact <a href="mailto:rms-assist@gnu.org">rms-assist@gnu.org</a> if you'd like him to come speak.</p> <hr /> <sup id="fn1">1. The recording will soon be posted on <a href="http://audio-video.gnu.org">our audio-video archive</a>.<a href="https://static.fsf.org/fsforg/rss/blogs.xml#ref1" title="Jump back to footnote 1 in the text.">↩</a></sup><br /></div> 2019-07-09T15:39:21+00:00 FSF Blogs Christopher Allan Webber: Racket is an acceptable Python http://dustycloud.org/blog/racket-is-an-acceptable-python/ <p>A little over a decade ago, there were some popular blogposts about whether <a class="reference external" href="http://www.randomhacks.net/2005/12/03/why-ruby-is-an-acceptable-lisp/">Ruby was an acceptable Lisp</a> or whether even <a class="reference external" href="https://steve-yegge.blogspot.com/2006/04/lisp-is-not-acceptable-lisp.html">Lisp was an acceptable Lisp</a>. Peter Norvig was also writing at the time <a class="reference external" href="https://norvig.com/python-lisp.html">introducing Python to Lisp programmers</a>. Lisp, those in the know knew, was the right thing to strive for, and yet seemed unattainable for anything aimed for production since the AI Winter shattered Lisp's popularity in the 80s/early 90s. If you can't get Lisp, what's closest thing you can get?</p> <p>This was around the time I was starting to program; I had spent some time configuring my editor with Emacs Lisp and loved every moment I got to do it; I read some Lisp books and longed for more. And yet when I tried to "get things done" in the language, I just couldn't make as much headway as I could with my preferred language for practical projects at the time: Python.</p> <p>Python was great... mostly. It was easy to read, it was easy to write, it was easy-ish to teach to newcomers. (Python's intro material is better than most, but <a class="reference external" href="https://mlemmer.org/">my spouse</a> has talked before about some major pitfalls that the Python documentation has which make getting started unnecessarily hard. You can <a class="reference external" href="https://www.youtube.com/watch?v=pv0lLciMI24&amp;t=4220s">hear her talk about that</a> at this talk we co-presented on at last year's RacketCon.) I ran a large free software project on a Python codebase, and it was easy to get new contributors; the barrier to entry to becoming a programmer with Python was low. I consider that to be a feature, and it certainly helped me bootstrap my career.</p> <p>Most importantly of all though, Python was easy to pick up and run with because no matter what you wanted to do, either the tools came built in or the Python ecosystem had enough of the pieces nearby that building what you wanted was usually fairly trivial.</p> <p>But Python has its limitations, and I always longed for a lisp. For a brief time, I thought I could get there by contributing to the <a class="reference external" href="https://hy.readthedocs.io/en/stable/">Hy project</a>, which was a lisp that transformed itself into the Python AST. "Why write Python in a syntax that's easy to read when you could add a bunch of parentheses to it instead?" I would joke when I talked about it. Believe it or not though, I do consider lisps easier to read, once you are comfortable to understand their syntax. I certainly find them easier to write and modify. And I longed for the metaprogramming aspects of Lisp.</p> <p>Alas, Hy didn't really reach my dream. That macro expansion made debugging a nightmare as Hy would lose track of where the line numbers are; it wasn't until that when I really realized that without line numbers, you're just lost in terms of debugging in Python-land. That and Python didn't really have the right primitives; immutable datastructures for whatever reason never became first class, meaning that functional programming was hard, "cons" didn't really exist (actually this doesn't matter as much as people might think), recursive programming isn't really as possible without tail call elimination, etc etc etc.</p> <p>But I missed parentheses. I longed for parentheses. I <em>dreamed in</em> parentheses. I'm not kidding, the only dreams I've ever had in code were in lisp, and it's happened multiple times, programs unfolding before me. The structure of lisp makes the flow of code so clear, and there's simply nothing like the comfort of developing in front of a lisp REPL.</p> <p>Yet to choose to use a lisp seemed to mean opening myself up to eternal yak-shaving of developing packages that were already available on the Python Package Index or limiting my development community an elite group of Emacs users. When I was in Python, I longed for the beauty of a Lisp; when I was in a Lisp, I longed for the ease of Python.</p> <p>All this changed when I discovered Racket:</p> <ul class="simple"> <li>Racket comes with a full-featured editor named DrRacket built-in that's damn nice to use. It has all the features that make lisp hacking comfortable previously mostly only to Emacs users: parenthesis balancing, comfortable REPL integration, etc etc. But if you want to use Emacs, you can use racket-mode. Win-win.</li> <li>Racket has intentionally been built as an educational language, not unlike Python. One of the core audiences of Racket is middle schoolers, and it even comes with a built-in game engine for kids.</li> <li>My spouse and I even taught classes about how to learn to program for <a class="reference external" href="https://dustycloud.org/misc/digital-humanities/">humanities academics</a> using Racket. We found the age-old belief that "lisp syntax is just too hard" is simply false; the main thing that most people lack is decent lisp-friendly tooling with a low barrier to entry, and DrRacket provides that. The only people who were afraid of the parentheses turned out to be people who already knew how to program. Those who didn't even praised the syntax for its clarity and the way the editor could help show you when you made a syntax error (DrRacket is very good at that). "Lisp is too hard to learn" is a lie; if middle schoolers can learn it, so can more seasoned programmers.</li> <li>Racket might even be <em>more</em> batteries included than Python. At least all the batteries that come included are generally nicer; <a class="reference external" href="https://docs.racket-lang.org/gui/">Racket's GUI library</a> is the only time I've ever had fun in my life writing GUI programs (and they're cross platform too). Constructing pictures with its <a class="reference external" href="https://docs.racket-lang.org/pict/index.html">pict</a> library is a delight. Plotting graphs with <a class="reference external" href="https://docs.racket-lang.org/plot/index.html">plot</a> is an incredible experience. Writing documentation with <a class="reference external" href="https://docs.racket-lang.org/scribble/index.html">Scribble</a> is the best non-org-mode experience I've ever had, but has the advantage over org-mode in that your document is just inverted code. I could go on. And these are just some packages bundled with Racket; the <a class="reference external" href="https://pkgs.racket-lang.org">Package repository</a> contains much more.</li> <li>Racket's documentation is, in my experience, unparalleled. The <a class="reference external" href="https://docs.racket-lang.org/guide/index.html">Racket Guide</a> walks you through all the key concepts, and the <a class="reference external" href="https://docs.racket-lang.org/reference/index.html">Racket Reference</a> has everything else you need.</li> <li>The tutorials are also wonderful; the <a class="reference external" href="https://docs.racket-lang.org/quick/index.html">introductory tutorial</a> gets your feet wet not through composing numbers or strings but by building up pictures. Want to learn more? The next two tutorials show you how to <a class="reference external" href="https://docs.racket-lang.org/continue/index.html">build web applications</a> and then <a class="reference external" href="https://docs.racket-lang.org/more/index.html">build your own web server</a>.</li> <li>Like Python, even though Racket has its roots in education, it is more than ready for serious practical use. These days, when I want to build something and get it done quickly and efficiently, I reach for Racket first.</li> </ul> <p>Racket is a great Lisp, but it's also an acceptable Python. Sometimes you really can have it all.</p> 2019-07-09T14:27:00+00:00 Christopher Lemmer Webber FSF Blogs: Thank you for advancing free software: Read FSF spring news in the latest Bulletin http://www.fsf.org/blogs/community/thank-you-for-advancing-free-software-read-fsf-spring-news-in-the-latest-bulletin <p><a href="https://www.fsf.org/appeal"><img alt="ThankGNU Star Supporter" src="https://static.fsf.org/nosvn/images/badges/Spring19-lock-in.png" style="margin-top: 4px;" width="650" /></a></p><a href="https://www.fsf.org/appeal"> </a><p><a href="https://www.fsf.org/appeal"></a><a href="https://www.fsf.org/bulletin/2019/spring/issue-34-spring-2019">Our <em>Bulletin</em></a> highlights some important activities and issues in free software over the last six months, including:</p> <p>It highlights some important activities and issues in free software over the last six months, including:</p> <ul> <li> <p>an educational program we launched, together with free software activist <a href="https://www.fsf.org/bulletin/2019/spring/fsf-teaches-free-software-to-public-school-youth">Devin Ulibarri</a>, where we used the program Music Blocks to teach Boston area public school youth about coding and free software, and then proceeded to donate ten fully freed laptops to the schools we visited;</p> </li> <li> <p>some ideas on how the free software community can do better to bring visibility to our movement, according to LibrePlanet 2019 conference speaker and free software activist <a href="https://www.fsf.org/bulletin/2019/spring/sparking-change-what-free-software-can-learn-from-social-justice-movements">Mary Kate Fain</a>, pulled from her superb LibrePlanet talk <a href="https://media.libreplanet.org/u/libreplanet/m/sparking-change-what-free-software-can-learn-from-successful-social-movements/">“Sparking change: What free software can learn from social justice movements”</a>; and</p> </li> <li> <p>our licensing and compliance manager, <a href="https://www.fsf.org/bulletin/2019/spring/what-respects-your-freedom-is-for-and-what-it-isnt">Donald Robertson, III, reports</a> on the progress of our Respects Your Freedom program, with further explanation on the parameters needed for the certification of hardware devices that meet FSF's criteria for protecting the rights of users.</p> </li> </ul> <p>Thirty-five volunteers joined FSF staff over the course of three days to get all the <em>Bulletins</em> stuffed in envelopes and mailed out. This was a great opportunity to catch up on free software issues with some of our most dedicated free software enthusiasts here in Boston. We are grateful to have such a strong core of supporters that keep the movement growing, and thanks to your generous contribution, we will be even stronger.</p> <p>Please be vocal about your support for free software. <a href="https://www.fsf.org/bulletin/2019/spring/issue-34-spring-2019">Read and share the <em>Bulletin</em> articles</a> online using the #ISupportFreeSoftware hashtag, use our <a href="https://www.fsf.org/resources/badges">fundraiser support images</a>, and talk to your community about why you support the FSF. It makes a difference.</p> <p>Throughout our spring fundraiser, we have been enjoying both the public posts from supporters using the hashtag on <a href="https://www.fsf.org/share">social media</a>, as well as answers to the "What inspired you to join today?" question we ask new members. Here are some of our favorites.</p> <ul> <li>We see many excited calls for user freedom and user control: <br /> <ul> <li><em>"For freedom!"</em> <br /> </li> <li><em>"Does the software you use grant you the freedom to redistribute copies so you can help others? #FreeSoftware does. Learn more by listening to Richard M. Stallman, on the <a href="https://www.makingbetterpod.com/2019/06/17/making-better-episode-4-richard-stallman/">Making Better podcast</a>. #ISupportFreeSoftware"</em> from @makingbetterpod</li> <li>@mmaug shared: <em>"There are alternatives to Facebook, Microsoft, Google, and Twitter. Take control of your privacy, and your computer! #ISupportFreeSoftware #FSF"</em></li> <li>@globalspectator posted: <em>"Software you don't control seizes control over you. Help @fsf break the chains of proprietary software for a freer future #ISupportFreeSoftware"</em> <br /> </li> </ul> </li> <li> <p>We receive humbling thank you's from people appreciating our work, naming the <a href="https://media.libreplanet.org/">LibrePlanet conference</a>, our <a href="https://www.fsf.org/licensing/">licensing work</a>, and the <a href="https://www.gnu.org/">GNU Project</a>:<br /> </p> <ul> <li><em>"Wanted to for a long time. Also, LibrePlanet!"</em> <br /> </li> <li><em>"Gratitude. And a long lasting debt feeling. Thanks so much!"</em></li> <li><em>"As a software developer and GNU/Linux user I want to set a statement and do my part in keeping free software popular"</em> <br /> </li> <li><em>"I use GNU tools, and have since the beginning"</em> <br /> </li> </ul> </li> <li> <p>And most importantly, we hear from people who have come across our activities and campaign images online, or who were informed about FSF through their on- and offline community and decided to take action -- convincing us that people inspiring each other to join the <a href="https://www.fsf.org/free-software-supporter/"><em>Free Software Supporter</em> mailing list</a>, or to <a href="https://my.fsf.org/join?pk_campaign=fr_sp2019&amp;pk_source=email2">become an associate member</a> is by far the most powerful way to expand our reach and strengthen our message: <br /> </p> <ul> <li><em>"I watched an interview with Richard Stallman"</em> <br /> </li> <li><em>"A friend"</em> <br /> </li> <li><em>"A post in the <a href="https://victorhckinthefreeworld.com/2019/06/27/la-free-software-foundation-quiere-redoblar-la-comunidad-del-software-libre-isupportfreesoftware/">'Victorhck in the free world'</a> blog"</em> <br /> </li> <li>@opc_5 called for digital liberation through free software: <em>"Software Libre para la liberación digital. #ISupportFreeSoftware"</em></li> <li>@AugustinPMichel tagged his connections with: <em>"#ISupportFreeSoftware, do you?"</em></li> </ul> </li> </ul> <p>Today, we have one week left in our <a href="https://www.fsf.org/appeal?pk_campaign=fr_sp2019&amp;pk_source=email2">spring fundraiser</a>, and we are confident we will achieve our membership goal of 200 members in 28 days if we keep at it. With your help, we may engage enough people to also reach 400 <a href="https://my.fsf.org/donate?pk_campaign=fr_sp2019&amp;pk_source=email2">donations</a> before the 15th of July. Your support helped get us where we are, in position to succeed. Your generosity and outspokenness fuel our message, increase our reach, and will allow us to continue to advocate on your behalf.</p> <p>Thank you for your contribution to free software.</p> 2019-07-09T04:55:00+00:00 FSF Blogs Aleksander Morgado: DW5821e firmware update integration in ModemManager and fwupd https://sigquit.wordpress.com/2019/07/03/dw5821e-firmware-update-integration-in-modemmanager-and-fwupd/ <p><img alt="" class="aligncenter size-full wp-image-1222" height="522" src="https://sigquit.files.wordpress.com/2019/07/dw5821e-image.png?w=604&amp;h=522" width="604" /></p> <p>The <strong>Dell Wireless 5821e</strong> module is a <a href="https://www.qualcomm.com/products/snapdragon-modems-4g-lte-x20" rel="noopener" target="_blank">Qualcomm SDX20</a> based LTE Cat16 device. This modem can work in either MBIM mode or QMI mode, and provides different USB layouts for each of the modes. In Linux kernel based and Windows based systems, the MBIM mode is the default one, because it provides easy integration with the OS (e.g. no additional drivers or connection managers required in Windows) and also provides all the features that QMI provides through QMI over MBIM operations.</p> <p>The firmware update process of this DW5821e module is integrated in your GNU/Linux distribution, since <a href="https://lists.freedesktop.org/archives/modemmanager-devel/2019-January/006983.html" rel="noopener" target="_blank">ModemManager 1.10.0</a> and <a href="https://groups.google.com/forum/#!msg/fwupd/HXavD9QqW4Q/WAsKVunxBQAJ" rel="noopener" target="_blank">fwupd 1.2.6</a>. There is no official firmware released in the LVFS (yet) but the setup is completely ready to be used, just waiting for Dell to publish an initial official firmware release.</p> <p>The firmware update integration between ModemManager and fwupd involves different steps, which I’ll try to describe here so that it’s clear how to add support for more devices in the future.</p> <h2>1) ModemManager reports expected update methods, firmware version and device IDs</h2> <p>The Firmware interface in the modem object exposed in DBus contains, since MM 1.10, a new <a href="https://www.freedesktop.org/software/ModemManager/api/latest/gdbus-org.freedesktop.ModemManager1.Modem.Firmware.html#gdbus-property-org-freedesktop-ModemManager1-Modem-Firmware.UpdateSettings" rel="noopener" target="_blank">UpdateSettings</a> property that provides a bitmask specifying which is the expected firmware update method (or methods) required for a given module, plus a dictionary of key-value entries specifying settings applicable to each of the update methods.</p> <p>In the case of the DW5821e, two update methods are reported in the bitmask: “<strong>fastboot</strong>” and “<strong>qmi-pdc</strong>“, because both are required to have a complete firmware upgrade procedure. “fastboot” would be used to perform the system upgrade by using an OTA update file, and “qmi-pdc” would be used to install the per-carrier configuration files after the system upgrade has been done.</p> <p>The list of settings provided in the dictionary contain the two mandatory fields required for all devices that support at least one firmware update method: “device-ids” and “version”. These two fields are designed so that fwupd can fully rely on them during its operation:</p> <ul> <li>The “<strong>device-ids</strong>” field will include a list of strings providing the device IDs associated to the device, sorted from the most specific to the least specific. These device IDs are the ones that fwupd will use to build the GUIDs required to match a given device to a given firmware package. The DW5821e will expose four different device IDs: <ul> <li>“USB\<strong>VID_413C</strong>“: specifying this is a Dell-branded device.</li> <li>“USB\VID_413C&amp;<strong>PID_81D7</strong>“: specifying this is a DW5821e module.</li> <li>“USB\VID_413C&amp;PID_81D7&amp;<strong>REV_0318</strong>“: specifying this is hardware revision 0x318 of the DW5821e module.</li> <li>“USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;<strong>CARRIER_VODAFONE</strong>“: specifying this is hardware revision 0x318 of the DW5821e module running with a Vodafone-specific carrier configuration.</li> </ul> </li> <li>The “<strong>version</strong>” field will include the firmware version string of the module, using the same format as used in the firmware package files used by fwupd. This requirement is obviously very important, because if the format used is different, the simple version string comparison used by fwupd (literally ASCII string comparison) would not work correctly. It is also worth noting that if the carrier configuration is also versioned, the version string should contain not only the version of the system, but also the version of the carrier configuration. The DW5821e will expose a firmware version including both, e.g. “T77W968.F1.1.1.1.1.VF.001” (system version being F1.1.1.1.1 and carrier config version being “VF.001”)</li> <li>In addition to the mandatory fields, the dictionary exposed by the DW5821e will also contain a “<strong>fastboot-at</strong>” field specifying which AT command can be used to switch the module into fastboot download mode.</li> </ul> <h2>2) fwupd matches GUIDs and checks available firmware versions</h2> <p>Once fwupd detects a modem in ModemManager that is able to expose the correct UpdateSettings property in the Firmware interface, it will add the device as a known device that may be updated in its own records. The device exposed by fwupd will contain the <a href="https://en.wikipedia.org/wiki/Universally_unique_identifier" rel="noopener" target="_blank"><strong>GUIDs</strong></a> built from the “device-ids” list of strings exposed by ModemManager. E.g. for the “USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;CARRIER_VODAFONE” device ID, fwupd will use GUID “b595e24b-bebb-531b-abeb-620fa2b44045”.</p> <p>fwupd will then be able to look for firmware packages (CAB files) available in the <a href="https://fwupd.org/" rel="noopener" target="_blank">LVFS</a> that are associated to any of the GUIDs exposed for the DW5821e.</p> <p>The CAB files packaged for the LVFS will contain one single firmware OTA file plus one carrier MCFG file for each supported carrier in the give firmware version. The CAB files will also contain one “metainfo.xml” file for each of the supported carriers in the released package, so that per-carrier firmware upgrade paths are available: only firmware updates for the currently used carrier should be considered. E.g. we don’t want users running with the Vodafone carrier config to get notified of upgrades to newer firmware versions that aren’t certified for the Vodafone carrier.</p> <p>Each of the CAB files with multiple “metainfo.xml” files will therefore be associated to multiple GUID/version pairs. E.g. the same CAB file will be valid for the following GUIDs (using Device ID instead of GUID for a clearer explanation, but really the match is per GUID not per Device ID):</p> <ul> <li>Device ID “USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;CARRIER_VODAFONE” providing version “T77W968.F1.2.2.2.2.VF.002”</li> <li>Device ID “USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;CARRIER_TELEFONICA” providing version “T77W968.F1.2.2.2.2.TF.003”</li> <li>Device ID “USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;CARRIER_VERIZON” providing version “T77W968.F1.2.2.2.2.VZ.004”</li> <li>… and so on.</li> </ul> <p>Following our example, fwupd will detect our device exposing device ID “USB\VID_413C&amp;PID_81D7&amp;REV_0318&amp;CARRIER_VODAFONE” and version “T77W968.F1.1.1.1.1.VF.001” in ModemManager and will be able to find a CAB file for the same device ID providing a newer version “T77W968.F1.2.2.2.2.VF.002” in the LVFS. The firmware update is possible!</p> <h2>3) fwupd requests device inhibition from ModemManager</h2> <p>In order to perform the firmware upgrade, fwupd requires full control of the modem. Therefore, when the firmware upgrade process starts, fwupd will use the new <a href="https://www.freedesktop.org/software/ModemManager/api/latest/gdbus-org.freedesktop.ModemManager1.html#gdbus-method-org-freedesktop-ModemManager1.InhibitDevice" rel="noopener" target="_blank">InhibitDevice</a>(TRUE) method in the Manager DBus interface of ModemManager to request that a specific modem with a specific uid should be inhibited. Once the device is inhibited in ModemManager, it will be disabled and removed from the list of modems in DBus, and no longer used until the inhibition is removed.</p> <p>The inhibition may be removed by calling InhibitDevice(FALSE) explicitly once the firmware upgrade is finished, and will also be automatically removed if the program that requested the inhibition disappears from the bus.</p> <h2>4) fwupd downloads CAB file from LVFS and performs firmware update</h2> <p>Once the modem is inhibited in ModemManager, fwupd can right away start the firmware update process. In the case of the DW5821e, the firmware update requires two different methods and two different upgrade cycles.</p> <p>The first step would be to reboot the module into <strong>fastboot</strong> download mode using the AT command specified by ModemManager in the “at-fastboot” entry of the “UpdateSettings” property dictionary. After running the AT command, the module will reset itself and reboot with a completely different USB layout (and different vid:pid) that fwupd can detect as being the same device as before but in a different working mode. Once the device is in fastboot mode, fwupd will download and install the OTA file using the fastboot protocol, as defined in the “flashfile.xml” file provided in the CAB file:</p> <pre>&lt;parts interface="AP"&gt; &lt;part operation="flash" partition="ota" filename="T77W968.F1.2.2.2.2.AP.123_ota.bin" MD5="f1adb38b5b0f489c327d71bfb9fdcd12"/&gt; &lt;/parts&gt;</pre> <p>Once the OTA file is completely downloaded and installed, fwupd will trigger a reset of the module also using the fastboot protocol, and the device will boot from scratch on the newly installed firmware version. During this initial boot, the module will report itself running in a “default” configuration not associated to any carrier, because the OTA file update process involves fully removing all installed carrier-specific MCFG files.</p> <p>The second upgrade cycle performed by fwupd once the modem is detected again involves downloading all carrier-specific MCFG files one by one into the module using the <strong>QMI PDC</strong> protocol. Once all are downloaded, fwupd will activate the specific carrier configuration that was previously active before the download was started. E.g. if the module was running with the Vodafone-specific carrier configuration before the upgrade, fwupd will select the Vodafone-specific carrier configuration after the upgrade. The module would be reseted one last time using the QMI DMS protocol as a last step of the upgrade procedure.</p> <h2>5) fwupd removes device inhibition from ModemManager</h2> <p>The upgrade logic will finish by removing the device inhibition from ModemManager using InhibitDevice(FALSE) explicitly. At that point, ModemManager would re-detect and re-probe the modem from scratch, which should already be running in the newly installed firmware and with the newly selected carrier configuration.</p> 2019-07-03T13:27:10+00:00 aleksander rush @ Savannah: Version 2.0 http://savannah.gnu.org/forum/forum.php?forum_id=9461 <p>Version 2.0 is available for download from <a href="https://ftp.gnu.org/gnu/rush/rush-2.0.tar.xz">GNU</a> and <a href="http://download.gnu.org.ua/release/rush/rush-2.0.tar.xz">Puszcza</a> archives. <br /> </p> <p>This release features a complete rewrite of the configuration support. It introduces a new configuration file syntax that offers a large set of control structures and transformation instructions for handling arbitrary requests.  Please see the documentation for details. <br /> </p> <p>Backward compatibility with prior releases is retained and old configuration syntax is still supported.  This ensures that existing installations will remain operational without any changes. Nevertheless, system administrators are encouraged to switch to the new syntax as soon as possible.<br /> </p> 2019-07-01T08:15:26+00:00 Sergey Poznyakoff GNU Guile: GNU Guile 2.2.6 released https://www.gnu.org/software/guile/news/gnu-guile-226-released.html <p>We are pleased to announce GNU Guile 2.2.6, the sixth bug-fix release in the new 2.2 stable release series. This release represents 11 commits by 4 people since version 2.2.5. First and foremost, it fixes a <a href="https://issues.guix.gnu.org/issue/36350">regression</a> introduced in 2.2.5 that would break Guile’s built-in HTTP server.</p><p>See the <a href="https://lists.gnu.org/archive/html/guile-devel/2019-06/msg00059.html">release announcement</a> for details.</p> 2019-06-30T21:55:00+00:00 Ludovic Courtès trans-coord @ Savannah: Malayalam team re-established http://savannah.gnu.org/forum/forum.php?forum_id=9459 <p>After more than 8 years of being orphaned, Malayalam team is active again.  The new team leader, Aiswarya Kaitheri Kandoth, made a new translation of the <a href="https://www.gnu.org/philosophy/free-sw.html">Free Software Definition</a>, so now we have 41 translations of that page! <br /> </p> <p>Currently, Malayalam the only active translation team of official languages of India.  It is a Dravidian language spoken by about 40 million people worldwide, with the most speakers living in the Indian state of Kerala.  Like many Indian languages, it uses a syllabic script derived from Brahmi. <br /> </p> <p><a href="https://www.gnu.org/software/gnun/reports/report-ml.html#complete">Links to up-to-date translations</a> are shown on the automatically generated <a href="https://www.gnu.org/software/gnun/reports/report-ml.html">report page</a>.<br /> </p> 2019-06-29T06:54:45+00:00 Ineiev Christopher Allan Webber: How do Spritely's actor and storage layers tie together? http://dustycloud.org/blog/how-do-spritelys-actor-and-storage-layers-tie-together/ <p>I've been hacking away at <a class="reference external" href="https://gitlab.com/spritely">Spritely</a> (see <a class="reference external" href="https://dustycloud.org/blog/tag/spritely/">previously</a>). Recently I've been making progress on both the actor model (<a class="reference external" href="https://gitlab.com/spritely/goblins">goblins</a> and its rewrite <a class="reference external" href="https://gitlab.com/spritely/goblinoid">goblinoid</a>) as well as the storage layers (currently called <a class="reference external" href="https://gitlab.com/dustyweb/magenc/blob/master/magenc/scribblings/intro.org">Magenc</a> and <a class="reference external" href="https://gitlab.com/spritely/crystal/blob/master/crystal/scribblings/intro.org">Crystal</a>, but we are talking about probably renaming the both of them into a suite called "datashards"... yeah, everything is moving and changing fast right now.)</p> <p>In the <a class="reference external" href="https://webchat.freenode.net/?channels=spritely">#spritely channel on freenode</a> a friend asked, what is the big picture idea here? Both the actor model layer and the storage layer describe themselves as using "capabilities" (or more precisely "object capabilities" or "ocaps") but they seem to be implemented differently. How does it all tie together?</p> <p>A great question! I think the first point of confusion is that while both follow the ocap paradigm (which is to say, reference/possession-based authority... possessing the capability gives you access, and it does not matter what your identity is for the most part for access control), they are implemented very differently because they are solving different problems. The storage system is based on encrypted, persistent data, with its ideas drawn from <a class="reference external" href="https://tahoe-lafs.org/trac/tahoe-lafs">Tahoe-LAFS</a> and <a class="reference external" href="https://freenetproject.org/">Freenet</a>, and the way that capabilities work is based on possession of cryptographic keys (which are themselves embedded/referenced in the URIs). The actor model, on the other hand, is based on holding onto a reference to a unique, unguessable URL (well, that's a bit of an intentional oversimplification for the sake of this explaination but we'll run with it) where the actor at that URL is "live" and communicated with via message passing. (Most of the ideas from this come from <a class="reference external" href="http://erights.org/">E</a> and <a class="reference external" href="http://waterken.sourceforge.net/">Waterken</a>.) Actors are connected to each other over secure channels to prevent eavesdropping or leakage of the capabilities.</p> <p>So yeah, how do these two seemingly very different layers tie together? As usual, I find that I most easily explain things via narrative, so let's imagine the following game scenario: Alice is in a room with a goblin. First Alice sees the goblin, then Alice attacks the goblin, then the goblin and Alice realize that they are not so different and become best friends.</p> <p>The goblin and Alice both manifest in this universe as live actors. When Alice walks into the room (itself an actor), the room gives Alice a reference to the goblin actor. To "see" the goblin, Alice sends a message to it asking for its description. It replies with its datashards storage URI with its 3d model and associated textures. Alice can now query the storage system to reconstruct these models and textures from the datashards storage systems she uses. (The datashards storage systems themselves can't actually see the contents if they don't have the capability itself; this is much safer for peers to help the network share data because they can help route things through the network without personally knowing or being responsible for what the contents of those messages are. It could also be possible for the goblin to provide Alice with a direct channel to a storage system to retrieve its assets from.) Horray, Alice got the 3d model and images! Now she can see the goblin.</p> <p>Assuming that the goblin is an enemy, Alice attacks! Attacking is common in this game universe, and there is no reason necessarily to keep around attack messages, so sending a message to the goblin is just a one-off transient message... there's no need to persist it in the storage system.</p> <p>The attack misses! The goblin shouts, "Wait!" and makes its case, that both of them are just adventurers in this room, and shouldn't they both be friends? Alice is touched and halts her attack. These messages are also sent transiently; while either party could log them, they are closer to an instant messenger or IRC conversation rather than something intended to be persisted long-term.</p> <p>They exchange their mailbox addresses and begin sending each other letters. These, however, are intended to be persisted; when Alice receives a message from the goblin in her mailbox (or vice versa), the message received contains the datashards URI to the letter, which Alice can then retrieve from the appropriate store. She can then always refer to this message, and she can choose whether or not to persist it locally or elsewhere. Since the letter has its own storage URI, when Alice constructs a reply, she can clearly mark that it was in reference to the previous letter. Even if Alice or the goblin's servers go down, either can continue to refer to these letters. Alice and the goblin have the freedom to choose what storage systems they wish, whether targeted/direct/local or via a public peer to peer routing system, with reasonable assumptions (given the continued strength of the underlying cryptographic algorithms used) that the particular entities storing or forwarding their data cannot read its content.</p> <p>And so it is: live references of actors are able to send live, transient messages, but can only be sent to other actors whose (unguessable/unforgeable) address you have. This allows for highly dynamic and expressive interactions while retaining security. Datashards URIs allow for the storage and retrieval of content which can continue to be persisted by interested parties, even if the originating host goes down.</p> <p>There are some things I glossed over in this writeup. The particular ways that the actors' addresses and references work is one thing (unguessable http based capability URLs on their own have <a class="reference external" href="https://www.w3.org/TR/capability-urls/">leakage problems</a> due to the way various web technologies are implemented, and not even every actor reference needs to be a long-lived URI; see <a class="reference external" href="http://erights.org/elib/distrib/captp/index.html">CapTP for more details</a>), how to establish connections between actor processes/servers (we can reuse TLS, or even better, something like tor's onion services), so are how interactions such as fighting can be scoped to a room (<a class="reference external" href="https://www.uni-weimar.de/fileadmin/user/fak/medien/professuren/Virtual_Reality/documents/publications/capsec_vr2008_preprint.pdf">this paper</a> explains how), as well as how we can map human meaningful names onto unguessable identifiers (the answer there is <a class="reference external" href="https://github.com/cwebber/rebooting-the-web-of-trust-spring2018/blob/petnames/draft-documents/making-dids-invisible-with-petnames.md">petnames</a>). But I have plans for this and increasing confidence that it will come together... I think we're already on track.</p> <p>Hopefully this writeup brings some clarity on how some of the components will work together, though!</p> 2019-06-27T18:15:00+00:00 Christopher Lemmer Webber FSF Blogs: GNU Spotlight with Mike Gerwitz: 17 new GNU releases in June! http://www.fsf.org/blogs/community/gnu-spotlight-with-mike-gerwitz-17-new-gnu-releases-in-june <ul> <li><a href="https://www.gnu.org/software/apl/">apl-1.8</a></li> <li><a href="https://www.gnu.org/software/artanis/">artanis-0.3.2</a></li> <li><a href="https://www.gnu.org/software/dr-geo/">dr-geo-19.06a</a></li> <li><a href="https://www.gnu.org/software/gawk/">gawk-5.0.1</a></li> <li><a href="https://www.gnu.org/software/gengetopt/">gengetopt-2.23</a></li> <li><a href="https://www.gnu.org/software/gnunet/">gnunet-0.11.5</a></li> <li><a href="https://www.gnu.org/software/guile/">guile-2.2.5</a></li> <li><a href="https://www.gnu.org/software/gnuzilla/">icecat-60.7.0-gnu1</a></li> <li><a href="https://www.gnu.org/software/libmicrohttpd/">libmicrohttpd-0.9.64</a></li> <li><a href="https://www.gnu.org/software/libredwg/">libredwg-0.8</a></li> <li><a href="https://www.gnu.org/software/mailutils/">mailutils-3.7</a></li> <li><a href="https://www.gnu.org/software/mit-scheme/">mit-scheme-10.1.9</a></li> <li><a href="https://www.gnu.org/software/nano/">nano-4.3</a></li> <li><a href="https://www.gnu.org/software/nettle/">nettle-3.5</a></li> <li><a href="https://www.gnu.org/software/parallel/">parallel-20190622</a></li> <li><a href="https://www.gnu.org/software/unifont/">unifont-12.1.02</a></li> <li><a href="https://www.gnu.org/software/units/">units-2.19</a></li> </ul> <p>For announcements of most new GNU releases, subscribe to the info-gnu mailing list: <a href="https://lists.gnu.org/mailman/listinfo/info-gnu">https://lists.gnu.org/mailman/listinfo/info-gnu</a>.</p> <p>To download: nearly all GNU software is available from <a href="https://ftp.gnu.org/gnu/">https://ftp.gnu.org/gnu/</a>, or preferably one of its mirrors from <a href="https://www.gnu.org/prep/ftp.html">https://www.gnu.org/prep/ftp.html</a>. You can use the URL <a href="https://ftpmirror.gnu.org/">https://ftpmirror.gnu.org/</a> to be automatically redirected to a (hopefully) nearby and up-to-date mirror.</p> <p>A number of GNU packages, as well as the GNU operating system as a whole, are looking for maintainers and other assistance: please see <a href="https://www.gnu.org/server/takeaction.html#unmaint">https://www.gnu.org/server/takeaction.html#unmaint</a> if you'd like to help. The general page on how to help GNU is at <a href="https://www.gnu.org/help/help.html">https://www.gnu.org/help/help.html</a>.</p> <p>If you have a working or partly working program that you'd like to offer to the GNU project as a GNU package, see <a href="https://www.gnu.org/help/evaluation.html">https://www.gnu.org/help/evaluation.html</a>.</p> <p>As always, please feel free to write to us at <a href="mailto:maintainers@gnu.org">maintainers@gnu.org</a> with any GNUish questions or suggestions for future installments.</p> 2019-06-27T16:08:17+00:00 FSF Blogs Andy Wingo: fibs, lies, and benchmarks http://wingolog.org/archives/2019/06/26/fibs-lies-and-benchmarks <div><p>Friends, consider the recursive Fibonacci function, expressed most lovelily in Haskell:</p><pre>fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib (n-2) </pre><p>Computing elements of the Fibonacci sequence ("Fibonacci numbers") is a common microbenchmark. Microbenchmarks are like a <a href="https://en.wikipedia.org/wiki/Suzuki_method">Suzuki exercises for learning violin</a>: not written to be good tunes (good programs), but rather to help you improve a skill.</p><p>The <tt>fib</tt> microbenchmark teaches language implementors to improve recursive function call performance.</p><p>I'm writing this article because after adding native code generation to Guile, I wanted to check how Guile was doing relative to other language implementations. The results are mixed. We can start with the most favorable of the comparisons: Guile present versus Guile of the past.</p><p></p><center><img src="http://wingolog.org/pub/guile-versions.png" /><br /></center><p>I collected these numbers on my i7-7500U CPU @ 2.70GHz 2-core laptop, with no particular performance tuning, running each benchmark 10 times, waiting 2 seconds between measurements. The bar value indicates the median elapsed time, and above each bar is an overlayed histogram of all results for that scenario. Note that the y axis is on a log scale. The 2.9.3* version corresponds to unreleased Guile from git.</p><p>Good news: Guile has been getting significantly faster over time! Over decades, true, but I'm pleased.</p><p><b>where are we? static edition</b></p><p>How good are Guile's numbers on an absolute level? It's hard to say because there's no absolute performance oracle out there. However there are relative performance oracles, so we can try out perhaps some other language implementations.</p><p>First up would be the industrial C compilers, GCC and LLVM. We can throw in a few more "static" language implementations as well: compilers that completely translate to machine code ahead-of-time, with no type feedback, and a minimal run-time.</p><p></p><center><img src="http://wingolog.org/pub/static-languages.png" /><br /></center><p>Here we see that GCC is doing best on this benchmark, completing in an impressive 0.304 seconds. It's interesting that the result differs so much from clang. I had a look at the disassembly for GCC and I see:</p><pre>fib: push %r12 mov %rdi,%rax push %rbp mov %rdi,%rbp push %rbx cmp $0x1,%rdi jle finish mov %rdi,%rbx xor %r12d,%r12d again: lea -0x1(%rbx),%rdi sub $0x2,%rbx callq fib add %rax,%r12 cmp $0x1,%rbx jg again and $0x1,%ebp lea 0x0(%rbp,%r12,1),%rax finish: pop %rbx pop %rbp pop %r12 retq </pre><p>It's not quite straightforward; what's the loop there for? It turns out that <a href="https://stackoverflow.com/a/10058823">GCC inlines one of the recursive calls to <tt>fib</tt></a>. The microbenchmark is no longer measuring call performance, because GCC managed to reduce the number of calls. If I had to guess, I would say this optimization doesn't have a wide applicability and is just to game benchmarks. In that case, well played, GCC, well played.</p><p>LLVM's compiler (clang) looks more like what we'd expect:</p><pre>fib: push %r14 push %rbx push %rax mov %rdi,%rbx cmp $0x2,%rdi jge recurse mov %rbx,%rax add $0x8,%rsp pop %rbx pop %r14 retq recurse: lea -0x1(%rbx),%rdi <b>callq fib</b> mov %rax,%r14 add $0xfffffffffffffffe,%rbx mov %rbx,%rdi <b>callq fib</b> add %r14,%rax add $0x8,%rsp pop %rbx pop %r14 retq </pre><p>I bolded the two recursive calls.</p><p>Incidentally, the <tt>fib</tt> as implemented by GCC and LLVM isn't quite the same program as Guile's version. If the result gets too big, GCC and LLVM will overflow, whereas in Guile we overflow into a <a href="https://wingolog.org/archives/2019/05/23/bigint-shipping-in-firefox">bignum</a>. Also in C, it's possible to "smash the stack" if you recurse too much; compilers and run-times attempt to mitigate this danger but it's not completely gone. In Guile <a href="https://wingolog.org/archives/2014/03/17/stack-overflow">you can recurse however much you want</a>. Finally in Guile you can interrupt the process if you like; the compiled code is instrumented with safe-points that can be used to run profiling hooks, debugging, and so on. Needless to say, this is not part of C's mission.</p><p>Some of these additional features can be implemented with no significant performance cost (e.g., via guard pages). But it's fair to expect that they have some amount of overhead. More on that later.</p><p>The other compilers are OCaml's <tt>ocamlopt</tt>, coming in with a very respectable result; Go, also doing well; and V8 WebAssembly via Node. As you know, you can compile C to WebAssembly, and then V8 will compile that to machine code. In practice it's just as static as any other compiler, but the generated assembly is a bit more involved:</p><pre> fib_tramp: jmp fib fib: push %rbp mov %rsp,%rbp pushq $0xa push %rsi sub $0x10,%rsp mov %rsi,%rbx mov 0x2f(%rbx),%rdx mov %rax,-0x18(%rbp) cmp %rsp,(%rdx) jae stack_check post_stack_check: cmp $0x2,%eax jl return_n lea -0x2(%rax),%edx mov %rbx,%rsi mov %rax,%r10 mov %rdx,%rax mov %r10,%rdx callq fib_tramp mov -0x18(%rbp),%rbx sub $0x1,%ebx mov %rax,-0x20(%rbp) mov -0x10(%rbp),%rsi mov %rax,%r10 mov %rbx,%rax mov %r10,%rbx callq fib_tramp return: mov -0x20(%rbp),%rbx add %ebx,%eax mov %rbp,%rsp pop %rbp retq return_n: jmp return stack_check: callq WasmStackGuard mov -0x10(%rbp),%rbx mov -0x18(%rbp),%rax jmp post_stack_check </pre><p>Apparently <tt>fib</tt> compiles to a function of two arguments, the first passed in <tt>rsi</tt>, and the second in <tt>rax</tt>. (V8 uses a custom calling convention for its compiled WebAssembly.) The first synthesized argument is a handle onto run-time data structures for the current thread or isolate, and in the function prelude there's a check to see that the function has enough stack. V8 uses these stack checks also to handle interrupts, for when a web page is stuck in JavaScript.</p><p>Otherwise, it's a more or less normal function, with a bit more register/stack traffic than would be strictly needed, but pretty good.</p><p><b>do optimizations matter?</b></p><p>You've heard of Moore's Law -- though it doesn't apply any more, it roughly translated into hardware doubling in speed every 18 months. (Yes, I know it wasn't precisely that.) There is a corresponding rule of thumb for compiler land, <a href="http://proebsting.cs.arizona.edu/law.html">Proebsting's Law</a>: compiler optimizations make software twice as fast every 18 <i>years</i>. Zow!</p><p>The previous results with GCC and LLVM were with optimizations enabled (-O3). One way to measure Proebsting's Law would be to compare the results with -O0. Obviously in this case the program is small and we aren't expecting much work out of the optimizer, but it's interesting to see anyway:</p><p></p><center><img src="http://wingolog.org/pub/optimization-levels.png" /><br /></center><p>Answer: optimizations don't matter much for this benchark. This investigation does give a good baseline for compilers from high-level languages, like Guile: in the absence of clever trickery like the recursive inlining thing GCC does and in the absence of industrial-strength instruction selection, what's a good baseline target for a compiler? Here we see for this benchmark that it's somewhere between 420 and 620 milliseconds or so. Go gets there, and OCaml does even better.</p><p><b>how is time being spent, anyway?</b></p><p>Might we expect V8/WebAssembly to get there soon enough, or is the stack check that costly? How much time does one stack check take anyway? For that we'd have to determine the number of recursive calls for a given invocation.</p><p>Friends, it's not entirely clear to me why this is, but I instrumented a copy of <tt>fib</tt>, and I found that the number of calls in <tt>fib(<i>n</i>)</tt> was a more or less constant factor of the result of calling <tt>fib</tt>. That ratio converges to twice the golden ratio, which means that since <tt>fib(n+1) ~= φ * fib(n)</tt>, then the number of calls in <tt>fib(n)</tt> is approximately <tt>2 * fib(n+1)</tt>. I scratched my head for a bit as to why this is and I gave up; the Lord works in mysterious ways.</p><p>Anyway for <tt>fib(40)</tt>, that means that there are around 3.31e8 calls, absent GCC shenanigans. So that would indicate that each call for clang takes around 1.27 ns, which at turbo-boost speeds on this machine is 4.44 cycles. At maximum throughput (4 IPC), that would indicate 17.8 instructions per call, and indeed on the <tt>n &gt; 2</tt> path I count 17 instructions.</p><p>For WebAssembly I calculate 2.25 nanoseconds per call, or 7.9 cycles, or 31.5 (fused) instructions at max IPC. And indeed counting the extra jumps in the trampoline, I get 33 cycles on the recursive path. I count 4 instructions for the stack check itself, one to save the current isolate, and two to shuffle the current isolate into place for the recursive calls. But, compared to clang, V8 puts 6 words on the stack per call, as opposed to only 4 for LLVM. I think with better interprocedural register allocation for the isolate (i.e.: reserve a register for it), V8 could get a nice boost for call-heavy workloads.</p><p><b>where are we? dynamic edition</b></p><p>Guile doesn't aim to replace C; it's different. It has garbage collection, an integrated debugger, and a compiler that's available at run-time, it is dynamically typed. It's perhaps more fair to compare to languages that have some of these characteristics, so I ran these tests on versions of recursive <tt>fib</tt> written in a number of languages. Note that all of the numbers in this post include start-up time.</p><p></p><center><img src="http://wingolog.org/pub/dynamic-languages.png" /><br /></center><p>Here, the ocamlc line is the same as before, but using the bytecode compiler instead of the native compiler. It's a bit of an odd thing to include but it performs so well I just had to include it.</p><p>I think the real takeaway here is that Chez Scheme has fantastic performance. I have not been able to see the disassembly -- does it do the trick like GCC does? -- but the numbers are great, and I can see why Racket decided to rebase its implementation on top of it.</p><p>Interestingly, as far as I understand, Chez implements stack checks in the straightfoward way (an inline test-and-branch), not with a guard page, and instead of using the stack check as a generic ability to interrupt a computation in a timely manner as V8 does, Chez emits a <a href="https://www.scheme.com/csug8/system.html#./system:s89">separate interrupt check</a>. I would like to be able to see Chez's disassembly but haven't gotten around to figuring out how yet.</p><p>Since I originally published this article, I added a LuaJIT entry as well. As you can see, LuaJIT performs as well as Chez in this benchmark.</p><p>Haskell's call performance is surprisingly bad here, beaten even by OCaml's bytecode compiler; is this the cost of laziness, or just a lacuna of the implementation? I do not know. I do know I have this mental image that Haskell is a good compiler but apparently if that's the standard, so is Guile :)</p><p>Finally, in this comparison section, I was not surprised by cpython's relatively poor performance; we know cpython is not fast. I think though that it just goes to show how little these microbenchmarks are worth when it comes to user experience; like many of you I use plenty of Python programs in my daily work and don't find them slow at all. Think of micro-benchmarks like x-ray diffraction; they can reveal the hidden substructure of DNA but they say nothing at all about the organism.</p><p><b>where to now?</b></p><p>Perhaps you noted that in the last graph, the Guile and Chez lines were labelled "(lexical)". That's because instead of running this program:</p><pre>(define (fib n) (if (&lt; n 2) n (+ (fib (- n 1)) (fib (- n 2))))) </pre><p>They were running this, instead:</p><pre>(define (fib n) (define (fib* n) (if (&lt; n 2) n (+ (fib* (- n 1)) (fib* (- n 2))))) (fib* n)) </pre><p>The thing is, historically, Scheme programs have treated top-level definitions as being mutable. This is because you don't know the extent of the top-level scope -- there could always be someone else who comes and adds a new definition of <tt>fib</tt>, effectively mutating the existing definition in place.</p><p>This practice has its uses. It's useful to be able to go in to a long-running system and change a definition to fix a bug or add a feature. It's also a useful way of developing programs, to incrementally build the program bit by bit.</p><p></p><center><img src="http://wingolog.org/pub/top-level-vs-lexical.png" /><br /></center><p>But, I would say that as someone who as written and maintained a lot of Scheme code, it's not a normal occurence to mutate a top-level binding on purpose, and it has a significant performance impact. If the compiler knows the target to a call, that unlocks a number of important optimizations: type check elision on the callee, more optimal closure representation, smaller stack frames, possible contification (turning calls into jumps), argument and return value count elision, representation specialization, and so on.</p><p>This overhead is especially egregious for calls inside modules. Scheme-the-language only gained modules relatively recently -- relative to the history of scheme -- and one of the aspects of modules is precisely to allow reasoning about top-level module-level bindings. This is why running Chez Scheme with the <tt>--program</tt> option is generally faster than <tt>--script</tt> (which I used for all of these tests): it opts in to the "newer" specification of what a top-level binding is.</p><p>In Guile we would probably like to move towards a more static way of treating top-level bindings, at least those within a single compilation unit. But we haven't done so yet. It's probably the most important single optimization we can make over the near term, though.</p><p>As an aside, it seems that LuaJIT also shows a similar performance differential for <tt>local function fib(n)</tt> versus just plain <tt>function fib(n)</tt>.</p><p>It's true though that even absent lexical optimizations, top-level calls can be made more efficient in Guile. I am not sure if we can reach Chez with the current setup of having a <a href="https://www.gnu.org/software/guile/docs/master/guile.html/Just_002dIn_002dTime-Native-Code.html#Just_002dIn_002dTime-Native-Code">template JIT</a>, because we need two return addresses: one virtual (for bytecode) and one "native" (for JIT code). Register allocation is also something to improve but it turns out to not be so important for <tt>fib</tt>, as there are few live values and they need to spill for the recursive call. But, we can avoid some of the indirection on the call, probably using an inline cache associated with the callee; Chez has had this optimization since 1984!</p><p><b>what guile learned from <tt>fib</tt></b></p><p>This exercise has been useful to speed up Guile's procedure calls, as you can see for the difference between the latest Guile 2.9.2 release and what hasn't been released yet (2.9.3).</p><p>To decide what improvements to make, I extracted the assembly that Guile generated for <tt>fib</tt> to a standalone file, and tweaked it in a number of ways to determine what the potential impact of different scenarios was. Some of the detritus from this investigation is <a href="https://gitlab.com/wingo/fib-asm-tinkering">here</a>.</p><p>There were three big performance improvements. One was to avoid eagerly initializing the slots in a function's stack frame; this took a surprising amount of run-time. Fortunately the rest of the toolchain like the local variable inspector was already ready for this change.</p><p>Another thing that became clear from this investigation was that our stack frames were too large; there was too much memory traffic. I was able to improve this in the lexical-call by adding an optimization to elide useless closure bindings. Usually in Guile when you call a procedure, you pass the callee as the 0th parameter, then the arguments. This is so the procedure has access to its closure. For some "well-known" procedures -- procedures whose callers can be enumerated -- we optimize to pass a specialized representation of the closure instead ("closure optimization"). But for well-known procedures with no free variables, there's no closure, so we were just passing a throwaway value (<tt>#f</tt>). An unhappy combination of Guile's current calling convention being stack-based and a strange outcome from the slot allocator meant that frames were a couple words too big. Changing to allow a custom calling convention in this case sped up <tt>fib</tt> considerably.</p><p>Finally, and also significantly, Guile's JIT code generation used to manually handle calls and returns via manual stack management and indirect jumps, instead of using the platform calling convention and the C stack. This is to allow <a href="https://wingolog.org/archives/2014/03/17/stack-overflow">unlimited stack growth</a>. However, it turns out that the indirect jumps at return sites were stalling the pipeline. Instead we switched to use call/return but keep our manual stack management; this allows the CPU to use its return address stack to predict return targets, speeding up code.</p><p><b>et voilà</b></p><p>Well, long article! Thanks for reading. There's more to do but I need to hit the publish button and pop this off my stack. Until next time, happy hacking!</p></div> 2019-06-26T10:34:11+00:00 Andy Wingo FSF Blogs: GNU Emacs T-shirts available now at the GNU Press Shop http://www.fsf.org/blogs/gnu-press/emacs-t-shirts-available-now-at-the-gnu-press-shop <p><img alt="zoe modeling emacs tee" src="https://shop.fsf.org/sites/default/files/styles/product_zoom/public/Emacs%20shirt%20three%20quarter.jpg" style="margin-top: 4px;" width="300" /> </p> <p>Have you been waiting with bated breath for the opportunity to show your love for GNU Emacs, the text editor that also does everything else, with a nifty T-shirt? Wait no longer. The GNU Press Shop now has GNU Emacs logo T-shirts in unisex sizes S through XXXL. Order one at <a href="https://shop.fsf.org/tshirts-hoodies/gnu-emacs-logo-t-shirt">https://shop.fsf.org/tshirts-hoodies/gnu-emacs-logo-t-shirt</a>, and we'll ship it to you sooner than you can say "extensible, customizable, self-documenting, real-time display editor."</p> <p>All GNU Press Shop purchases support the Free Software Foundation's efforts to free all software, and <a href="https://my.fsf.org/join">FSF associate members</a> get a 20% discount off of all purchases.</p> 2019-06-25T19:20:00+00:00 FSF Blogs Christopher Allan Webber: Let's Just Be Weird Together http://dustycloud.org/blog/lets-just-be-weird-together/ <div class="figure"> <img alt="ascii art of weird tea mugs with steam" src="http://dustycloud.org/etc/images/blog/ljbwt.gif" /> </div> <p>Approximately a month ago was <a class="reference external" href="https://mlemmer.org/">Morgan</a> and I's 10 year wedding anniversary. To commemorate that, and as a surprise gift, I made the above ascii art and animation.</p> <p>Actually, it's not just an animation, it's a program, and one <a class="reference external" href="https://gitlab.com/dustyweb/dos-hurd/blob/master/dos-hurd/examples/ljbwt.rkt">you can run</a>. As a side note, I originally thought I'd write up how I made it, but I kept procrastinating on that and it lead me to putting off writing this post for about a month. Oh well, all I'll say for now is that it lead to a <a class="reference external" href="https://gitlab.com/spritely/goblinoid">major rewrite</a> of one of the <a class="reference external" href="https://gitlab.com/spritely/goblins">main components of Spritely</a>. But that's something to speak of for another time, I suppose.</p> <p>Back to the imagery! Morgan was surprised to see the animation, and yet the image itself wasn't a surprise. That's because the design is actually built off of one we collaborated on together:</p> <div class="figure"> <img alt="embroidery of weird tea mugs with steam" src="http://dustycloud.org/etc/images/blog/ljbwt-embroidery-scaled.jpg" /> </div> <p>I did the sketch for it and Morgan embroidered it. The plan is to put this above the tea station we set up in the reading area of our house.</p> <p>The imagery and phrasing captures the philosophy of Morgan and I's relationship. We're both weird and deeply imperfect people, maybe even in some ways broken. But that's okay. We don't expect each other to change or become something else... we just try to become the best weird pairing we can together. I think that strategy has worked out for us.</p> <p>Thanks for all the happy times so far, Morgan. I look forward to many weird years ahead.</p> 2019-06-25T18:10:00+00:00 Christopher Lemmer Webber FSF Blogs: Drop the journalism charges against Julian Assange http://www.fsf.org/blogs/rms/drop-the-journalism-charges-against-julian-assange <p>The US government has persecuted Julian Assange for a decade for Wikileaks' journalism, and now <a href="https://theintercept.com/2019/05/24/the-indictment-of-julian-assange-under-the-espionage-act-is-a-threat-to-the-press-and-the-american-people/">seeks to use his case to label the publishing of leaked secret information as spying.</a></p> <p>The Free Software Foundation stands for freedom of publication and due process, because they are necessary to exercise and uphold the software freedom we campaign for. The attack on journalism threatens freedom of publication; the twisting of laws to achieve an unstated aim threatens due process of law. The FSF therefore calls on the United States to drop all present and future charges against Julian Assange relating to Wikileaks activities.</p> <p>Accusations against Assange that are unrelated to journalism should be pursued or not pursued based on their merits, giving him neither better nor worse treatment on account of his journalism.</p> 2019-06-25T17:50:06+00:00 FSF Blogs libredwg @ Savannah: libredwg-0.8 released http://savannah.gnu.org/forum/forum.php?forum_id=9457 <p>This is a major release, adding the new dynamic API, read and write <br /> all header and object fields by name. Many of the old dwg_api.h field <br /> accessors are deprecated. <br /> More here: <a href="https://www.gnu.org/software/libredwg/">https://www.gnu.org/software/libredwg/</a> and <a href="http://git.savannah.gnu.org/cgit/libredwg.git/tree/NEWS">http://git.savannah.gnu.org/cgit/libredwg.git/tree/NEWS</a> <br /> </p> <p>Here are the compressed sources: <br />   <a href="http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.gz">http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.gz</a>   (9.8MB) <br />   <a href="http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.xz">http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.xz</a>   (3.7MB) <br /> </p> <p>Here are the GPG detached signatures[*]: <br />   <a href="http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.gz.sig">http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.gz.sig</a> <br />   <a href="http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.xz.sig">http://ftp.gnu.org/gnu/libredwg/libredwg-0.8.tar.xz.sig</a> <br /> </p> <p>Use a mirror for higher download bandwidth: <br />   <a href="https://www.gnu.org/order/ftp.html">https://www.gnu.org/order/ftp.html</a> <br /> </p> <p>Here are more binaries: <br />   <a href="https://github.com/LibreDWG/libredwg/releases/tag/0.8">https://github.com/LibreDWG/libredwg/releases/tag/0.8</a> <br /> </p> <p>Here are the SHA256 checksums: <br /> </p> <p>087f0806220a0a33a9aab2c2763266a69e12427a5bd7179cff206289e60fe2fd  libredwg-0.8.tar.gz <br /> 0487c84e962a4dbcfcf3cbe961294b74c1bebd89a128b4929a1353bc7f58af26  libredwg-0.8.tar.xz <br /> </p> <p>[*] Use a .sig file to verify that the corresponding file (without the <br /> .sig suffix) is intact.  First, be sure to download both the .sig file <br /> and the corresponding tarball.  Then, run a command like this: <br /> </p> <p>  gpg --verify libredwg-0.8.tar.gz.sig <br /> </p> <p>If that command fails because you don't have the required public key, <br /> then run this command to import it: <br /> </p> <p>  gpg --keyserver keys.gnupg.net --recv-keys B4F63339E65D6414 <br /> </p> <p>and rerun the 'gpg --verify' command.<br /> </p> 2019-06-25T09:55:44+00:00 Reini Urban apl @ Savannah: GNU APL 1.8 Released http://savannah.gnu.org/forum/forum.php?forum_id=9456 <p>I am happy to announce that GNU APL 1.8 has been released. <br /> </p> <p>GNU APL is a free implementation of the ISO standard 13751 aka. <br /> "Programming Language APL, Extended", <br /> </p> <p>This release contains: <br /> </p> <ul> <li>bug fixes, </li> </ul> <ul> <li>⎕DLX (Donald Knuth's Dancing Links Algorithm), </li> </ul> <ul> <li>⎕FFT (fast fourier transforms; real, complex, and windows), </li> </ul> <ul> <li>⎕GTK (create GUI windows from APL), </li> </ul> <ul> <li>⎕RE (regular expressions), and </li> </ul> <ul> <li>user-defined APL commands. </li> </ul> <p>Also, you can now call GNU APL from Python.<br /> </p> 2019-06-23T13:03:32+00:00 Jürgen Sauermann denemo @ Savannah: Release 2.3 is imminent - please test. http://savannah.gnu.org/forum/forum.php?forum_id=9453 <p>New Features <br />     Seek Locations in Scores <br />         Specify type of object sought <br />         Or valid note range <br />         Or any custom condition <br />         Creates a clickable list of locations <br />         Each location is removed from list once visited <br />     Syntax highlighting in LilyPond view <br />     Playback Start/End markers draggable <br />     Source window navigation by page number <br />         Page number always visible <br />     Rapid marking of passages <br />     Two-chord Tremolos <br />     Allowing breaks at half-measure for whole movement <br />         Also breaks at every beat <br />     Passages <br />         Mark Passages of music <br />         Perform tasks on the marked passages <br />         Swapping musical material with staff below implemented <br />     Search for lost scores <br />         Interval-based <br />         Searches whole directory hierarchy <br />         Works for transposed scores <br />     Compare Scores <br />     Index Collection of Scores <br />         All scores below a start directory indexed <br />         Index includes typeset incipit for music <br />         Title, Composer, Instrumentation, Score Comment fields <br />         Sort by composer surname <br />         Filter by any Scheme condition <br />         Open files by clicking on them in Index <br />     Intelligent File Opening <br />         Re-interprets file paths for moved file systems <br />     Improved Score etc editor appearance <br />     Print History <br />         History records what part of the score was printed <br />         Date and printer included <br />     Improvements to Scheme Editor <br />         Title bar shows open file <br />         Save dialog gives help <br />     Colors now differentiate palettes, titles etc. in main display <br />     Swapping Display and Source positions <br />         for switching between entering music and editing <br />         a single keypress or MIDI command <br />     Activate object from keyboard <br />         Fn2 key equivalent to mouse-right click <br />         Shift and Control right-click via Shift-Fn2 and Control-Fn2 <br />     Help via Email <br />     Auto-translation to Spanish <br /> </p> <p>Bug Fixes <br /> </p> <p>    Adding buttons to palettes no longer brings hidden buttons back <br /> </p> <p>    MIDI playback of empty measures containing non-notes <br /> </p> <p>    Instrument name with Ambitus clash in staff properties menu fixed <br /> </p> <p>    Visibility of emmentaler glyphs fixed <br /> </p> <p>    Update of layout on staff to voice change <br /> </p> <p>    Open Recent anomalies fixed <br /> </p> <p>    Failures to translate menu titles and palettes fixed<br /> </p> 2019-06-22T09:29:29+00:00 Richard Shann parallel @ Savannah: GNU Parallel 20190622 ('HongKong') released http://savannah.gnu.org/forum/forum.php?forum_id=9451 <p>GNU Parallel 20190622 ('HongKong') has been released. It is available for download at: <a href="http://ftpmirror.gnu.org/parallel/">http://ftpmirror.gnu.org/parallel/</a> <br /> </p> <p>GNU Parallel is 10 years old in a year on 2020-04-22. You are here by invited to a reception on Friday 2020-04-17. <br /> </p> <p>See <a href="https://www.gnu.org/software/parallel/10-years-anniversary.html">https://www.gnu.org/software/parallel/10-years-anniversary.html</a> <br /> </p> <p>Quote of the month: <br /> </p> <p>  I want to make a shout-out for @GnuParallel, it's a work of beauty and power <br />     -- Cristian Consonni @CristianCantoro <br /> </p> <p>New in this release: <br /> </p> <ul> <li>--shard can now take a column name and optionally a perl expression. Similar to --group-by and replacement strings. </li> </ul> <ul> <li>Using AWK and R to parse 25tb <a href="https://livefreeordichotomize.com/2019/06/04/using_awk_and_r_to_parse_25tb/">https://livefreeordichotomize.com/2019/06/04/using_awk_and_r_to_parse_25tb/</a> </li> </ul> <ul> <li>Parallel and Visual testing with Behat <a href="http://parallelandvisualtestingwithbehat.blogspot.com/p/blog-page.html">http://parallelandvisualtestingwithbehat.blogspot.com/p/blog-page.html</a> </li> </ul> <ul> <li>维基百科,自由的百科全书<a href="https://zh.wikipedia.org/wiki/GNU_parallel">https://zh.wikipedia.org/wiki/GNU_parallel</a> </li> </ul> <ul> <li>Bug fixes and man page updates. </li> </ul> <p>Get the book: GNU Parallel 2018 <a href="http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html">http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html</a> <br /> </p> <p>GNU Parallel - For people who live life in the parallel lane. <br /> </p> <h2>About GNU Parallel</h2> <p>GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel. <br /> </p> <p>If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops. <br /> </p> <p>GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs. <br /> </p> <p>You can find more about GNU Parallel at: <a href="http://www.gnu.org/s/parallel/">http://www.gnu.org/s/parallel/</a> <br /> </p> <p>You can install GNU Parallel in just 10 seconds with: <br /> (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - <a href="http://pi.dk/3">http://pi.dk/3</a>) | bash <br /> </p> <p>Watch the intro video on <a href="http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1">http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1</a> <br /> </p> <p>Walk through the tutorial (man parallel_tutorial). Your command line will love you for it. <br /> </p> <p>When using programs that use GNU Parallel to process data for publication please cite: <br /> </p> <p>O. Tange (2018): GNU Parallel 2018, March 2018, <a href="https://doi.org/10.5281/zenodo.1146014">https://doi.org/10.5281/zenodo.1146014</a>. <br /> </p> <p>If you like GNU Parallel: <br /> </p> <ul> <li>Give a demo at your local user group/team/colleagues </li> <li>Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists </li> <li>Get the merchandise <a href="https://gnuparallel.threadless.com/designs/gnu-parallel">https://gnuparallel.threadless.com/designs/gnu-parallel</a> </li> <li>Request or write a review for your favourite blog or magazine </li> <li>Request or build a package for your favourite distribution (if it is not already there) </li> <li>Invite me for your next conference </li> </ul> <p>If you use programs that use GNU Parallel for research: <br /> </p> <ul> <li>Please cite GNU Parallel in you publications (use --citation) </li> </ul> <p>If GNU Parallel saves you money: <br /> </p> <ul> <li>(Have your company) donate to FSF <a href="https://my.fsf.org/donate/">https://my.fsf.org/donate/</a> </li> </ul> <h2>About GNU SQL</h2> <p>GNU sql aims to give a simple, unified interface for accessing databases through all the different databases' command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries. <br /> </p> <p>The database is addressed using a DBURL. If commands are left out you will get that database's interactive shell. <br /> </p> <p>When using GNU SQL for a publication please cite: <br /> </p> <p>O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32. <br /> </p> <h2>About GNU Niceload</h2> <p>GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.<br /> </p> 2019-06-21T13:36:51+00:00 Ole Tange mailutils @ Savannah: Version 3.7 http://savannah.gnu.org/forum/forum.php?forum_id=9450 <p>Version 3.7 of GNU mailutils is <a href="https://ftp.gnu.org/gnu/mailutils/mailutils-3.7.tar.gz">available for download</a>. <br /> </p> <p>This version introduces a new format for mailboxes: <strong>dotmail</strong>. Dotmail is a replacement for traditional mbox format, proposed by <br /> Kurt Hackenberg. A dotmail mailbox is a single disk file, where messages are stored sequentially. Each message ends with a single <br /> dot (similar to the format used in the SMTP DATA command). A dot appearing at the start of the line is doubled, to prevent it from being interpreted as end of message marker. <br /> </p> <p>For a complete list of changes, please see the <a href="http://git.savannah.gnu.org/cgit/mailutils.git/plain/NEWS?id=8a92bd208e5cf9f2a9f6b347051bf824b8c0995c">NEWS file</a>.<br /> </p> 2019-06-21T13:15:09+00:00 Sergey Poznyakoff GNU Guile: GNU Guile 2.2.5 released https://www.gnu.org/software/guile/news/gnu-guile-225-released.html <p>We are pleased to announce GNU Guile 2.2.5, the fifth bug-fix release in the new 2.2 stable release series. This release represents 100 commits by 11 people since version 2.2.4. It fixes bugs that had accumulated over the last few months, notably in the SRFI-19 date and time library and in the <code>(web uri)</code> module. This release also greatly improves performance of bidirectional pipes, and introduces the new <code>get-bytevector-some!</code> binary input primitive that made it possible.</p><p>Guile 2.2.5 can be downloaded from <a href="https://www.gnu.org/software/guile/download">the usual places</a>.</p><p>See the <a href="https://lists.gnu.org/archive/html/guile-devel/2019-06/msg00045.html">release announcement</a> for details.</p><p>Besides, we remind you that Guile 3.0 is in the works, and that you can try out <a href="https://www.gnu.org/software/guile/news/gnu-guile-292-beta-released.html">version 2.9.2, which is the latest beta release of what will become 3.0</a>.</p><p>Enjoy!</p> 2019-06-20T11:20:00+00:00 Ludovic Courtès FSF Events: Event - GNU Hackers Meeting (Madrid, Spain) http://www.fsf.org/events/event-20190904-madrid-gnuhackersmeeting <p>Twelve years after it's first edition in Orense, the GNU Hackers Meeting (2019-09-04–06) will help in Spain again. This is an opportunity to meet, hack, and learn with other free software enthusiasts.</p> <p>See <a href="https://www.gnu.org/ghm/2019/">event page</a> for registration, call-for-talks, accommodations, transportation, and other information.</p> <p><strong>Location:</strong> <em><a href="http://www.etsisi.upm.es/">ETSISI</a> (Escuela Técnica Superior de Ingeniería de Sistemas Informáticos), Universidad Politécnica de Madrid, Calle Alan Turing s/n (Carretera de Valencia Km 7), 28031 Madrid, España</em></p> <p>Please fill out our contact form, so that <a href="https://my.fsf.org/civicrm/profile/create?gid=69&amp;reset=1">we can contact you about future events in and around Madrid.</a></p> 2019-06-19T16:35:12+00:00 FSF Events FSF Events: Richard Stallman - "Are we facing surveillance like in China?" (Frankurt, Germany) http://www.fsf.org/events/rms-20190715-frankfurt <blockquote><p>Digital technology has enabled governments to impose surveillance that Stalin could only dream of, making it next to impossible to talk with a reporter (or do most things) unmonitored. This puts democracy and human rights danger, as illustrated by the totalitarian regime of China today.</p> <p>Stallman will present the absolute upper limit on surveillance of the public compatible with democracy, and present ways to design systems that don't collect dossiers on people, except those designated by courts based on valid specific suspicion of crime.</p></blockquote> <p>This speech by Richard Stallman will be nontechnical, admission is gratis, and the public is encouraged to attend.</p> <p><strong>Location:</strong> <em>Festsaal, Casino (<a href="http://www.uni-frankfurt.de/73177180/GU_Lageplan_Campus_Westend_0318_Mensa_Bib_ENGL.pdf?">#7</a>), Campus Westend, Johann Wolfgang Goethe-Universität Frankfurt am Main, GrĂźneburgplatz 1, 60323 Frankfurt</em></p> <p>Please fill out our contact form, so that <a href="https://my.fsf.org/civicrm/profile/create?gid=393&amp;reset=1">we can contact you about future events in and around Frankfurt.</a></p> 2019-06-18T08:15:00+00:00 FSF Events GNU Guix: Substitutes are now available as lzip https://gnu.org/software/guix/blog/2019/substitutes-are-now-available-as-lzip/ <p>For a long time, our build farm at ci.guix.gnu.org has been delivering <a href="https://www.gnu.org/software/guix/manual/en/html_node/Substitutes.html">substitutes</a> (pre-built binaries) compressed with gzip. Gzip was never the best choice in terms of compression ratio, but it was a reasonable and convenient choice: it’s rock-solid, and zlib made it easy for us to have <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/guix/zlib.scm">Guile bindings</a> to perform in-process compression in our multi-threaded <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-publish.html"><code>guix publish</code></a> server.</p><p>With the exception of building software from source, downloads take the most time of Guix package upgrades. If users can download less, upgrades become faster, and happiness ensues. Time has come to improve on this, and starting from early June, Guix can publish and fetch <a href="https://nongnu.org/lzip/">lzip</a>-compressed substitutes, in addition to gzip.</p><h1>Lzip</h1><p><a href="https://nongnu.org/lzip/">Lzip</a> is a relatively little-known compression format, initially developed by Antonio Diaz Diaz ca. 2013. It has several C and C++ implementations with surprisingly few lines of code, which is always reassuring. One of its distinguishing features is a very good compression ratio with reasonable CPU and memory requirements, <a href="https://nongnu.org/lzip/lzip_benchmark.html">according to benchmarks published by the authors</a>.</p><p><a href="https://nongnu.org/lzip/lzlib.html">Lzlib</a> provides a well-documented C interface and Pierre Neidhardt set out to write bindings for that library, which eventually landed as the <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/guix/lzlib.scm"><code>(guix lzlib)</code> module</a>.</p><p>With this in place we were ready to start migrating our tools, and then our build farm, to lzip compression, so we can all enjoy smaller downloads. Well, easier said than done!</p><h1>Migrating</h1><p>The compression format used for substitutes is not a core component like it can be in “traditional” binary package formats <a href="https://lwn.net/Articles/789449/">such as <code>.deb</code></a> since Guix is conceptually a “source-based” distro. However, deployed Guix installations did not support lzip, so we couldn’t just switch our build farm to lzip overnight; we needed to devise a transition strategy.</p><p>Guix asks for the availability of substitutes over HTTP. For example, a question such as:</p><blockquote><p>“Dear server, do you happen to have a binary of <code>/gnu/store/6yc4ngrsig781bpayax2cg6pncyhkjpq-emacs-26.2</code> that I could download?”</p></blockquote><p>translates into prose to an HTTP GET of <a href="https://ci.guix.gnu.org/6yc4ngrsig781bpayax2cg6pncyhkjpq.narinfo">https://ci.guix.gnu.org/6yc4ngrsig781bpayax2cg6pncyhkjpq.narinfo</a>, which returns something like:</p><pre><code>StorePath: /gnu/store/6yc4ngrsig781bpayax2cg6pncyhkjpq-emacs-26.2 URL: nar/gzip/6yc4ngrsig781bpayax2cg6pncyhkjpq-emacs-26.2 Compression: gzip NarHash: sha256:0h2ibqpqyi3z0h16pf7ii6l4v7i2wmvbrxj4ilig0v9m469f6pm9 NarSize: 134407424 References: 2dk55i5wdhcbh2z8hhn3r55x4873iyp1-libxext-1.3.3 … FileSize: 48501141 System: x86_64-linux Deriver: 6xqibvc4v8cfppa28pgxh0acw9j8xzhz-emacs-26.2.drv Signature: 1;berlin.guixsd.org;KHNpZ25hdHV…</code></pre><p>(This narinfo format is inherited from <a href="https://nixos.org/nix/">Nix</a> and implemented <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/guix/scripts/substitute.scm?id=121d9d1a7a2406a9b1cbe22c34343775f5955b34#n283">here</a> and <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/guix/scripts/publish.scm?id=121d9d1a7a2406a9b1cbe22c34343775f5955b34#n265">here</a>.) This tells us we can download the actual binary from <code>/nar/gzip/…-emacs-26.2</code>, and that it will be about 46 MiB (the <code>FileSize</code> field.) This is what <code>guix publish</code> serves.</p><p>The trick we came up with was to allow <code>guix publish</code> to advertise several URLs, one per compression format. Thus, for recently-built substitutes, we get something <a href="https://ci.guix.gnu.org/mvhaar2iflscidl0a66x5009r44fss15.narinfo">like this</a>:</p><pre><code>StorePath: /gnu/store/mvhaar2iflscidl0a66x5009r44fss15-gimp-2.10.12 URL: nar/gzip/mvhaar2iflscidl0a66x5009r44fss15-gimp-2.10.12 Compression: gzip FileSize: 30872887 URL: nar/lzip/mvhaar2iflscidl0a66x5009r44fss15-gimp-2.10.12 Compression: lzip FileSize: 18829088 NarHash: sha256:10n3nv3clxr00c9cnpv6x7y2c66034y45c788syjl8m6ga0hbkwy NarSize: 94372664 References: 05zlxc7ckwflz56i6hmlngr86pmccam2-pcre-8.42 … System: x86_64-linux Deriver: vi2jkpm9fd043hm0839ibbb42qrv5xyr-gimp-2.10.12.drv Signature: 1;berlin.guixsd.org;KHNpZ25hdHV…</code></pre><p>Notice that there are two occurrences of the <code>URL</code>, <code>Compression</code>, and <code>FileSize</code> fields: one for gzip, and one for lzip. Old Guix instances will just pick the first one, gzip; newer Guix will pick whichever supported method provides the smallest <code>FileSize</code>, usually lzip. This will make migration trivial in the future, should we add support for other compression methods.</p><p>Users need to upgrade their Guix daemon to benefit from lzip. On a “foreign distro”, simply run <code>guix pull</code> as root. On standalone Guix systems, run <code>guix pull &amp;&amp; sudo guix system reconfigure /etc/config.scm</code>. In both cases, the daemon has to be restarted, be it with <code>systemctl restart guix-daemon.service</code> or with <code>herd restart guix-daemon</code>.</p><h1>First impressions</h1><p>This new gzip+lzip scheme has been deployed on ci.guix.gnu.org for a week. Specifically, we run <code>guix publish -C gzip:9 -C lzip:9</code>, meaning that we use the highest compression ratio for both compression methods.</p><p>Currently, only a small subset of the package substitutes are available as both lzip and gzip; those that were already available as gzip have not been recompressed. The following Guile program that taps into the API of <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-weather.html"><code>guix weather</code></a> allows us to get some insight:</p><pre><code class="language-scheme">(use-modules (gnu) (guix) (guix monads) (guix scripts substitute) (srfi srfi-1) (ice-9 match)) (define all-packages (@@ (guix scripts weather) all-packages)) (define package-outputs (@@ (guix scripts weather) package-outputs)) (define (fetch-lzip-narinfos) (mlet %store-monad ((items (package-outputs (all-packages)))) (return (filter (lambda (narinfo) (member "lzip" (narinfo-compressions narinfo))) (lookup-narinfos "https://ci.guix.gnu.org" items))))) (define (lzip/gzip-ratio narinfo) (match (narinfo-file-sizes narinfo) ((gzip lzip) (/ lzip gzip)))) (define (average lst) (/ (reduce + 0 lst) (length lst) 1.))</code></pre><p>Let’s explore this at the <a href="https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop">REPL</a>:</p><pre><code class="language-scheme">scheme@(guile-user)&gt; (define lst (with-store s (run-with-store s (fetch-lzip-narinfos)))) computing 9,897 package derivations for x86_64-linux... updating substitutes from 'https://ci.guix.gnu.org'... 100.0% scheme@(guile-user)&gt; (length lst) $4 = 2275 scheme@(guile-user)&gt; (average (map lzip/gzip-ratio lst)) $5 = 0.7398994395478715</code></pre><p>As of this writing, around 20% of the package substitutes are available as lzip, so take the following stats with a grain of salt. Among those, the lzip-compressed substitute is on average 26% smaller than the gzip-compressed one. What if we consider only packages bigger than 5 MiB uncompressed?</p><pre><code class="language-scheme">scheme@(guile-user)&gt; (define biggest (filter (lambda (narinfo) (&gt; (narinfo-size narinfo) (* 5 (expt 2 20)))) lst)) scheme@(guile-user)&gt; (average (map lzip/gzip-ratio biggest)) $6 = 0.5974238562384483 scheme@(guile-user)&gt; (length biggest) $7 = 440</code></pre><p>For those packages, lzip yields substitutes that are 40% smaller on average. Pretty nice! Lzip decompression is slightly more CPU-intensive than gzip decompression, but downloads are bandwidth-bound, so the benefits clearly outweigh the costs.</p><h1>Going forward</h1><p>The switch from gzip to lzip has the potential to make upgrades “feel” faster, and that is great in itself.</p><p>Fundamentally though, we’ve always been looking in this project at peer-to-peer solutions with envy. Of course, the main motivation is to have a community-supported and resilient infrastructure, rather than a centralized one, and that vision goes <a href="https://www.gnu.org/software/guix/blog/2017/reproducible-builds-a-status-update/">hand-in-hand with reproducible builds</a>.</p><p>We started working on <a href="https://issues.guix.gnu.org/issue/33899">an extension to publish and fetch substitutes</a> over <a href="https://ipfs.io/">IPFS</a>. Thanks to its content-addressed nature, IPFS has the potential to further reduce the amount of data that needs to be downloaded on an upgrade.</p><p>The good news is that IPFS developers are also <a href="https://github.com/ipfs/package-managers">interested in working with package manager developers</a>, and I bet there’ll be interesting discussions at <a href="https://camp.ipfs.io/">IPFS Camp</a> in just a few days. We’re eager to pursue our IPFS integration work, and if you’d like to join us and hack the good hack, <a href="https://www.gnu.org/software/guix/contact/">let’s get in touch!</a></p><h4>About GNU Guix</h4><p><a href="https://www.gnu.org/software/guix">GNU Guix</a> is a transactional package manager and an advanced distribution of the GNU system that <a href="https://www.gnu.org/distros/free-system-distribution-guidelines.html">respects user freedom</a>. Guix can be used on top of any system running the kernel Linux, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.</p><p>In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through <a href="https://www.gnu.org/software/guile">Guile</a> programming interfaces and extensions to the <a href="http://schemers.org">Scheme</a> language.</p> 2019-06-17T12:30:00+00:00 Ludovic Courtès GNUnet News: 2019-06-05: GNUnet 0.11.5 released https://gnunet.org/#gnunet-0.11.5-release <h3> <a name="gnunet-0.11.5-release">2019-06-05: GNUnet 0.11.5 released</a> </h3> <p> We are pleased to announce the release of GNUnet 0.11.5. </p> <p> This is a bugfix release for 0.11.4, mostly fixing a few minor bugs and improving performance, in particular for identity management with a large number of egos. In the wake of this release, we also launched the <a href="https://rest.gnunet.org">REST API documentation</a>. In terms of usability, users should be aware that there are still a large number of known open issues in particular with respect to ease of use, but also some critical privacy issues especially for mobile users. Also, the nascent network is tiny (about 200 peers) and thus unlikely to provide good anonymity or extensive amounts of interesting information. As a result, the 0.11.5 release is still only suitable for early adopters with some reasonable pain tolerance. </p> <h4>Download links</h4> <ul> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.5.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.5.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.5.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.5.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.5.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.5.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.5.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.5.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig</a></li> </ul> <p> gnunet-gtk saw some minor changes to adopt it to API changes in the main code related to the identity improvements. gnunet-fuse was not released again, as there were no changes and the 0.11.0 version is expected to continue to work fine with gnunet-0.11.5. </p> <p> Note that due to mirror synchronization, not all links might be functional early after the release. For direct access try <a href="http://ftp.gnu.org/gnu/gnunet/">http://ftp.gnu.org/gnu/gnunet/</a> </p> <h4>Noteworthy changes in 0.11.5 (since 0.11.4)</h4> <ul> <li> <tt>gnunet-identity</tt> is much faster when creating or deleting egos given a large number of existing egos. </li> <li> GNS now supports CAA records. </li> <li> Documentation, comments and code quality was improved. </li> </ul> <h4>Known Issues</h4> <ul> <li> There are known major design issues in the TRANSPORT, ATS and CORE subsystems which will need to be addressed in the future to achieve acceptable usability, performance and security. </li> <li> There are known moderate implementation limitations in CADET that negatively impact performance. Also CADET may unexpectedly deliver messages out-of-order. </li> <li> There are known moderate design issues in FS that also impact usability and performance. </li> <li> There are minor implementation limitations in SET that create unnecessary attack surface for availability. </li> <li> The RPS subsystem remains experimental. </li> <li> Some high-level tests in the test-suite fail non-deterministically due to the low-level TRANSPORT issues. </li> </ul> <p> In addition to this list, you may also want to consult our bug tracker at <a href="https://bugs.gnunet.org/">bugs.gnunet.org</a> which lists about 190 more specific issues. </p> <h4>Thanks</h4> <p> This release was the work of many people. The following people contributed code and were thus easily identified: Christian Grothoff, Florian Dold, Marcello Stanisci, ng0, Martin Schanzenbach and Bernd Fix. </p> 2019-06-05T00:00:00+00:00 GNUnet News gengetopt @ Savannah: 2.23 released http://savannah.gnu.org/forum/forum.php?forum_id=9442 <p>New version (2.23) was released. Main changes were in build system, so please report any issues you notice.<br /> </p> 2019-06-04T08:41:09+00:00 Gray Wolf Andy Wingo: pictie, my c++-to-webassembly workbench http://wingolog.org/archives/2019/06/03/pictie-my-c-to-webassembly-workbench <div><p>Hello, interwebs! Today I'd like to share a little skunkworks project with y'all: <a href="https://github.com/wingo/pictie">Pictie</a>, a workbench for WebAssembly C++ integration on the web.</p><p><b id="pictie-status">loading pictie...</b></p><div id="pictie-log"></div><form hidden="1" id="pictie-form"> <label for="entry" id="pictie-prompt">&gt; </label> <input id="pictie-entry" name="entry" size="40" type="text" /> </form><p>&lt;noscript&gt; JavaScript disabled, no pictie demo. See <a href="https://github.com/wingo/pictie/">the pictie web page</a> for more information. &lt;/noscript&gt;&gt;&amp;&amp;&lt;&amp;&gt;&gt;&gt;&amp;&amp;&gt;&lt;&lt;&gt;&gt;&amp;&amp;&lt;&gt;&lt;&gt;&gt;</p><p><b>wtf just happened????!?</b></p><p>So! If everything went well, above you have some colors and a prompt that accepts Javascript expressions to evaluate. If the result of evaluating a JS expression is a painter, we paint it onto a canvas.</p><p>But allow me to back up a bit. These days everyone is talking about WebAssembly, and I think with good reason: just as many of the world's programs run on JavaScript today, tomorrow much of it will also be in languages compiled to WebAssembly. JavaScript isn't going anywhere, of course; it's around for the long term. It's the "also" aspect of WebAssembly that's interesting, that it appears to be a computing substrate that is compatible with JS and which can extend the range of the kinds of programs that can be written for the web.</p><p>And yet, it's early days. What are programs of the future going to look like? What elements of the web platform will be needed when we have systems composed of WebAssembly components combined with JavaScript components, combined with the browser? Is it all going to work? Are there missing pieces? What's the status of the toolchain? What's the developer experience? What's the user experience?</p><p>When you look at the current set of applications targetting WebAssembly in the browser, mostly it's games. While compelling, games don't provide a whole lot of insight into the shape of the future web platform, inasmuch as there doesn't have to be much JavaScript interaction when you have an already-working C++ game compiled to WebAssembly. (Indeed, much of the incidental interactions with JS that are currently necessary -- bouncing through JS in order to call WebGL -- people are actively working on removing all of that overhead, so that WebAssembly can call platform facilities (WebGL, etc) directly. But I digress!)</p><p>For WebAssembly to really succeed in the browser, there should also be incremental stories -- what does it look like when you start to add WebAssembly modules to a system that is currently written mostly in JavaScript?</p><p>To find out the answers to these questions and to evaluate potential platform modifications, I needed a small, standalone test case. So... I wrote one? It seemed like a good idea at the time.</p><p><b>pictie is a test bed</b></p><p>Pictie is a simple, standalone C++ graphics package implementing an algebra of painters. It was created not to be a great graphics package but rather to be a test-bed for compiling C++ libraries to WebAssembly. You can read more about it on <a href="https://github.com/wingo/pictie">its github page</a>.</p><p>Structurally, pictie is a modern C++ library with a functional-style interface, smart pointers, reference types, lambdas, and all the rest. We use emscripten to compile it to WebAssembly; you can see more information on how that's done in the repository, or check the <a href="https://github.com/wingo/pictie/blob/master/README.md#webassembly">README</a>.</p><p>Pictie is inspired by Peter Henderson's "Functional Geometry" (<a href="http://pmh-systems.co.uk/phAcademic/papers/funcgeo.pdf">1982</a>, <a href="https://eprints.soton.ac.uk/257577/1/funcgeo2.pdf">2002</a>). "Functional Geometry" inspired the <a href="https://sarabander.github.io/sicp/html/2_002e2.xhtml#g_t2_002e2_002e4">Picture language</a> from the well-known <i>Structure and Interpretation of Computer Programs</i> computer science textbook.</p><p><b>prototype in action</b></p><p>So far it's been surprising how much stuff just works. There's still lots to do, but just getting a C++ library on the web is pretty easy! I advise you to take a look to see the details.</p><p>If you are thinking of dipping your toe into the WebAssembly water, maybe take a look also at Pictie when you're doing your back-of-the-envelope calculations. You can use it or a prototype like it to determine the effects of different compilation options on compile time, load time, throughput, and network trafic. You can check if the different binding strategies are appropriate for your C++ idioms; Pictie currently uses <a href="https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html">embind</a> <a href="https://github.com/wingo/pictie/blob/master/pictie.bindings.cc">(source)</a>, but <a href="https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html">I would like to compare to WebIDL as well</a>. You might also use it if you're considering what shape your C++ library should have to have a minimal overhead in a WebAssembly context.</p><p>I use Pictie as a test-bed when working on the web platform; the <a href="https://github.com/tc39/proposal-weakrefs">weakref proposal</a> which adds finalization, <a href="https://github.com/emscripten-core/emscripten/pull/8687">leak detection</a>, and working on the binding layers around Emscripten. Eventually I'll be able to use it in other contexts as well, with the <a href="https://github.com/WebAssembly/webidl-bindings/blob/master/proposals/webidl-bindings/Explainer.md">WebIDL bindings</a> proposal, typed objects, and <a href="https://github.com/WebAssembly/webidl-bindings/blob/master/proposals/webidl-bindings/Explainer.md">GC</a>.</p><p><b>prototype the web forward</b></p><p>As the browser and adjacent environments have come to dominate programming in practice, we lost a bit of the delightful variety from computing. JS is a great language, but it shouldn't be the only medium for programs. WebAssembly is part of this future world, waiting in potentia, where applications for the web can be written in any of a number of languages. But, this future world will only arrive if it "works" -- if all of the various pieces, from standards to browsers to toolchains to virtual machines, only if all of these pieces fit together in some kind of sensible way. Now is the early phase of annealing, when the platform as a whole is actively searching for its new low-entropy state. We're going to need a lot of prototypes to get from here to there. In that spirit, may your prototypes be numerous and soon replaced. Happy annealing!</p></div> 2019-06-03T10:10:38+00:00 Andy Wingo unifont @ Savannah: GNU Unifont 12.1.02 Released http://savannah.gnu.org/forum/forum.php?forum_id=9440 <p><strong>1 June 2019</strong> Unifont 12.1.02 is now available. This version introduces a <strong>Japanese TrueType version</strong>, unifont_jp, replacing over 10,000 ideographs from the default Unifont build with kanji from the public domain Jiskan16 font. This version also contains redrawn Devanagari and Bengali glyphs. Full details are in the ChangeLog file. <br /> </p> <p>Download this release at: <br /> </p> <p><a href="https://ftpmirror.gnu.org/unifont/unifont-12.1.02/">https://ftpmirror.gnu.org/unifont/unifont-12.1.02/</a> <br /> </p> <p>or if that fails, <br /> </p> <p><a href="https://ftp.gnu.org/gnu/unifont/unifont-12.1.02/">https://ftp.gnu.org/gnu/unifont/unifont-12.1.02/</a> <br /> </p> <p>or, as a last resort, <br /> </p> <p><a href="ftp://ftp.gnu.org/gnu/unifont/unifont-12.1.02/">ftp://ftp.gnu.org/gnu/unifont/unifont-12.1.02/</a><br /> </p> 2019-06-01T22:43:49+00:00 Paul Hardy FSF Events: CANCELLED - Richard Stallman - "The Free Software Movement" (Mayhew, MS) http://www.fsf.org/events/rms-20190622-mayhew <strike><blockquote>The Free Software Movement campaigns for computer users' freedom to cooperate and control their own computing. The Free Software Movement developed the GNU operating system, typically used together with the kernel Linux, specifically to make these freedoms possible.</blockquote></strike> <strike></strike><p><strike>This speech by Richard Stallman will be nontechnical, admission is gratis, and the public is encouraged to attend.</strike> <strike></strike></p><p><strike><strong>Location:</strong> <em>Lyceum, 8731 South Frontage Rd., Mayhew, MS 39753</em></strike> <strike></strike></p><p><strike>Please fill out our contact form, so that <a href="https://my.fsf.org/civicrm/profile/create?gid=581&amp;reset=1">we can contact you about future events in and around Mayhew.</a></strike> </p><p>The event this speech was going to be part of has been cancelled.</p> 2019-05-30T17:10:00+00:00 FSF Events FSF Events: Richard Stallman - "Free software and your freedom" (Vienna, Austria) http://www.fsf.org/events/rms-20190607-vienna <p> </p><blockquote> Most computers now contain at least some free software. This success makes it more important than ever to know about the ideas behind free software. Users should be aware of the freedoms it gives us and how to make use of it. </blockquote> <blockquote> As opposed to secrecy and profit orientation, free access to and sharing of knowledge and ideas have the potential to change the world. Knowledge should be treated as a common good. This revolutionary idea was the base on which GNU/Linux and the free and collaborative encyclopedia Wikipedia were built. </blockquote> <p></p> <p>This speech by Richard Stallman will be nontechnical, admission is gratis, and the public is encouraged to attend.</p> <p><strong>Location:</strong> <em>Hall: FS0.01, Fachhochschule FH Technikum Wien, Höchstädtplatz 6, KG Brigittenau, 1200 Wien, Österreich</em></p> <p>Please fill out our contact form, so that <a href="https://my.fsf.org/civicrm/profile/create?gid=300&amp;reset=1">we can contact you about future events in and around Vienna.</a></p> 2019-05-30T16:55:00+00:00 FSF Events GNU Guile: Join the Guile and Guix Days in Strasbourg, June 21–22! https://www.gnu.org/software/guile/news/join-guile-guix-days-strasbourg-2019.html <p>We’re organizing Guile Days at the University of Strasbourg, France, <a href="https://journeesperl.fr/jp2019/">co-located with the Perl Workshop</a>, on June 21st and 22nd.</p><p><img alt="Guile Days 2019" src="https://www.gnu.org/software/guile/static/base/img/guile-days-2019.png" /></p><p><em><em>Update</em>: The program is now complete, <a href="https://journeesperl.fr/jp2019/schedule?day=2019-06-21">view the schedule on-line</a>.</em></p><p>The schedule is not complete yet, but we can already announce a couple of events:</p><ul><li><em>Getting Started with GNU Guix</em> will be an introductory hands-on session to <a href="https://www.gnu.org/software/guix/">Guix</a>, targeting an audience of people who have some experience with GNU/Linux but are new to Guix.</li><li>During a “<em>code buddy</em>” session, experienced Guile programmers will be here to get you started programming in Guile, and to answer questions and provide guidance while you hack at your pace on the project of your choice.</li></ul><p>If you’re already a Guile or Guix user or developer, consider submitting by June 8th, <a href="https://journeesperl.fr/jp2019/newtalk">on the web site</a>, talks on topics such as:</p><ul><li><p>The neat Guile- or Guix-related project you’ve been working on.</p></li><li><p>Cool Guile hacking topics—Web development, databases, system development, graphical user interfaces, shells, you name it!</p></li><li><p>Fancy Guile technology—concurrent programming with Fibers, crazy macrology, compiler front-ends, JIT compilation and Guile 3, development environments, etc.</p></li><li><p>Guixy things: on Guix subsystems, services, the Shepherd, Guile development with Guix, all things OS-level in Guile, Cuirass, reproducible builds, bootstrapping, Mes and Gash, all this!</p></li></ul><p>You can also propose hands-on workshops, which could last anything from an hour to a day. We expect newcomers at this event, people who don’t know Guile and Guix and want to learn about it. Consider submitting introductory workshops on Guile and Guix!</p><p>We encourage submissions from people in communities usually underrepresented in free software, including women, people in sexual minorities, or people with disabilities.</p><p>We want to make this event a pleasant experience for everyone, and participation is subject to a <a href="https://journeesperl.fr/jp2019/conduct.html">code of conduct</a>.</p><p>Many thanks to the organizers of the <a href="https://journeesperl.fr/jp2019/">Perl Workshop</a> and to the sponsors of the event: RENATER, Université de Strasbourg, X/Stra, and Worteks.</p> 2019-05-28T09:11:00+00:00 Ludovic Courtès FSF Events: Richard Stallman - "Computing, freedom, and privacy" (Brno, Czech Republic) http://www.fsf.org/events/rms-20190606-brno-smartcity <blockquote>The way digital technology is developing, it threatens our freedom, within our computers and in the internet. What are the threats? What must we change?</blockquote> <p>This speech by Richard Stallman will be nontechnical, admission to just the speech is gratis—<a href="https://my.fsf.org/civicrm/profile/create?gid=580&amp;reset=1">provided you register via the FSF link</a>—and the public is encouraged to attend.</p> <p><strong>Location:</strong> <em>Pavilion G1, Digital City Stage, Brno Fair Grounds (BVV), URBIS Smart City Fair, Výstaviště 405/1, 603 00 </em></p> <p><a href="https://my.fsf.org/civicrm/profile/create?gid=580&amp;reset=1">Please register, so that we can accommodate all the people who wish to attend</a>.</p> <p>Please fill out our contact form, so that <a href="https://my.fsf.org/civicrm/profile/create?gid=578&amp;reset=1">we can contact you about future events in and around Brno.</a></p> 2019-05-24T13:35:00+00:00 FSF Events Andy Wingo: lightening run-time code generation http://wingolog.org/archives/2019/05/24/lightening-run-time-code-generation <div><p>The upcoming Guile 3 release will have just-in-time native code generation. Finally, amirite? There's lots that I'd like to share about that and I need to start somewhere, so this article is about one piece of it: <a href="https://gitlab.com/wingo/lightening">Lightening, a library to generate machine code</a>.</p><p><b>on lightning</b></p><p>Lightening is a fork of <a href="https://www.gnu.org/software/lightning/">GNU Lightning</a>, adapted to suit the needs of Guile. In fact at first we chose to use GNU Lightning directly, "vendored" into the Guile source respository via the <a href="https://git-scm.com/book/en/v1/Git-Tools-Subtree-Merging">git subtree mechanism</a>. (I see that in the meantime, <tt>git</tt> gained a kind of a <a href="https://github.com/git/git/blob/master/contrib/subtree/git-subtree.txt"><tt>subtree</tt> command</a>; one day I will have to figure out what it's for.)</p><p><a href="https://www.gnu.org/software/lightning/">GNU Lightning</a> has lots of things going for it. It has support for many architectures, even things like Itanium that I don't really care about but which a couple Guile users use. It abstracts the differences between e.g. x86 and ARMv7 behind a common API, so that in Guile I don't need to duplicate the JIT for each back-end. Such an abstraction can have a slight performance penalty, because maybe it missed the opportunity to generate optimal code, but this is acceptable to me: I was more concerned about the maintenance burden, and GNU Lightning seemed to solve that nicely.</p><p>GNU Lightning also has <a href="https://www.gnu.org/software/lightning/manual/">fantastic documentation</a>. It's written in C and not C++, which is the right thing for Guile at this time, and it's also released under the LGPL, which is Guile's license. As it's a GNU project there's a good chance that GNU Guile's needs might be taken into account if any changes need be made.</p><p>I mentally associated Paolo Bonzini with the project, who I knew was a good no-nonsense hacker, as he used Lightning for a <a href="http://smalltalk.gnu.org/">smalltalk implementation</a>; and I knew also that Matthew Flatt used Lightning in <a href="https://racket-lang.org/">Racket</a>. Then I looked in the source code to see architecture support and was pleasantly surprised to see MIPS, POWER, and so on, so I went with GNU Lightning for Guile in our <a href="https://www.gnu.org/software/guile/news/gnu-guile-291-beta-released.html">2.9.1 release last October</a>.</p><p><b>on lightening the lightning</b></p><p>When I chose GNU Lightning, I had in mind that it was a very simple library to cheaply write machine code into buffers. (Incidentally, if you have never worked with this stuff, I remember a time when I was pleasantly surprised to realize that an assembler could be a library and not just a program that processes text. A CPU interprets machine code. Machine code is just bytes, and you can just write C (or Scheme, or whatever) functions that write bytes into buffers, and pass those buffers off to the CPU. Now you know!)</p><p>Anyway indeed GNU Lightning 1.4 or so was that very simple library that I had in my head. I needed simple because I would need to debug any problems that came up, and I didn't want to add more complexity to the C side of Guile -- eventually I should be migrating this code over to Scheme anyway. And, of course, simple can mean fast, and I needed fast code generation.</p><p>However, GNU Lightning has a new release series, the 2.x series. This series is a rewrite in a way of the old version. On the plus side, this new series adds all of the weird architectures that I was pleasantly surprised to see. The old 1.4 didn't even have much x86-64 support, much less AArch64.</p><p>This new GNU Lightning 2.x series fundamentally changes the way the library works: instead of having a <a href="https://www.gnu.org/software/lightning/manual/html_node/The-instruction-set.html#The-instruction-set"><tt>jit_ldr_f</tt></a> function that directly emits code to load a <tt>float</tt> from memory into a floating-point register, the <tt>jit_ldr_f</tt> function now creates a node in a graph. Before code is emitted, that graph is optimized, some register allocation happens around call sites and for temporary values, dead code is elided, and so on, then the graph is traversed and code emitted.</p><p>Unfortunately this wasn't really what I was looking for. The optimizations were a bit opaque to me and I just wanted something simple. Building the graph took more time than just emitting bytes into a buffer, and it takes more memory as well. When I found bugs, I couldn't tell whether they were related to my usage or in the library itself.</p><p>In the end, the node structure wasn't paying its way for me. But I couldn't just go back to the 1.4 series that I remembered -- it didn't have the architecture support that I needed. Faced with the choice between changing GNU Lightning 2.x in ways that went counter to its upstream direction, switching libraries, or refactoring GNU Lightning to be something that I needed, I chose the latter.</p><p><b>in which our protagonist cannot help himself</b></p><p>Friends, I regret to admit: I named the new thing "Lightening". True, it is a lightened Lightning, yes, but I am aware that it's horribly confusing. Pronounced like almost the same, visually almost identical -- I am a bad person. Oh well!!</p><p>I ported some of the existing GNU Lightning backends over to Lightening: ia32, x86-64, ARMv7, and AArch64. I deleted the backends for Itanium, HPPA, Alpha, and SPARC; they have no Debian ports and there is no situation in which I can afford to do QA on them. I would gladly accept contributions for PPC64, MIPS, RISC-V, and maybe S/390. At this point I reckon it takes around 20 hours to port an additional backend from GNU Lightning to Lightening.</p><p>Incidentally, if you need a code generation library, consider your choices wisely. It is likely that Lightening is not right for you. If you can afford platform-specific code and you need C, Lua's <a href="https://luajit.org/dynasm.html">DynASM</a> is probably the right thing for you. If you are in C++, copy the <a href="https://searchfox.org/mozilla-central/source/js/src/jit/arm/MacroAssembler-arm.cpp">assemblers</a> from a <a href="https://trac.webkit.org/browser/webkit/trunk/Source/JavaScriptCore/assembler">JavaScript</a> <a href="https://chromium.googlesource.com/v8/v8.git/+/refs/heads/master/src/x64/assembler-x64.h">engine</a> -- C++ offers much more type safety, capabilities for optimization, and ergonomics.</p><p>But if you can only afford one emitter of JIT code for all architectures, you need simple C, you don't need register allocation, you want a simple library to just include in your source code, and you are good with the LGPL, then Lightening could be a thing for you. Check the <a href="https://gitlab.com/wingo/lightening">gitlab page</a> for info on how to test Lightening and how to include it into your project.</p><p><b>giving it a spin</b></p><p>Yesterday's <a href="https://lists.gnu.org/archive/html/guile-devel/2019-05/msg00030.html">Guile 2.9.2 release</a> includes Lightening, so you can give it a spin. The switch to Lightening allowed us to lower our JIT optimization threshold by a factor of 50, letting us generate fast code sooner. If you try it out, let <tt>#guile</tt> on freenode know how it went. In any case, happy hacking!</p></div> 2019-05-24T08:44:56+00:00 Andy Wingo GNU Guile: GNU Guile 2.9.2 (beta) released https://www.gnu.org/software/guile/news/gnu-guile-292-beta-released.html <p>We are delighted to announce GNU Guile 2.9.2, the second beta release in preparation for the upcoming 3.0 stable series. See the <a href="https://lists.gnu.org/archive/html/guile-devel/2019-05/msg00030.html">release announcement</a> for full details and a download link.</p><p>This release extends just-in-time (JIT) native code generation support to the ia32, ARMv7, and AArch64 architectures. Under the hood, we swapped out GNU Lightning for a related fork called <a href="https://gitlab.com/wingo/lightening/">Lightening</a>, which was better adapted to Guile's needs.</p><p>GNU Guile 2.9.2 is a beta release, and as such offers no API or ABI stability guarantees. Users needing a stable Guile are advised to stay on the stable 2.2 series.</p><p>Users on the architectures that just gained JIT support are especially encouraged to report experiences (good or bad) to <code>guile-devel@gnu.org</code>. If you know you found a bug, please do send a note to <code>bug-guile@gnu.org</code>. Happy hacking!</p> 2019-05-23T21:00:00+00:00 Andy Wingo Andy Wingo: bigint shipping in firefox! http://wingolog.org/archives/2019/05/23/bigint-shipping-in-firefox <div><p>I am delighted to share with folks the results of a project I have been helping out on for the last few months: implementation of "BigInt" in Firefox, which is finally shipping in Firefox 68 (beta).</p><p><b>what's a bigint?</b></p><p>BigInts are a new kind of JavaScript primitive value, like numbers or strings. A BigInt is a true integer: it can take on the value of any finite integer (subject to some arbitrarily large implementation-defined limits, such as the amount of memory in your machine). This contrasts with JavaScript number values, which have the well-known property of <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/MAX_SAFE_INTEGER">only being able to precisely represent integers between -2<sup>53</sup> and 2<sup>53</sup></a>.</p><p>BigInts are written like "normal" integers, but with an <tt>n</tt> suffix:</p><pre>var a = 1n; var b = a + 42n; b &lt;&lt; 64n // result: 793209995169510719488n </pre><p>With the bigint proposal, the usual mathematical operations (<tt>+</tt>, <tt>-</tt>, <tt>*</tt>, <tt>/</tt>, <tt>%</tt>, <tt>&lt;&lt;</tt>, <tt>&gt;&gt;</tt>, <tt>**</tt>, and the comparison operators) are extended to operate on bigint values. As a new kind of primitive value, bigint values have their own <tt>typeof</tt>:</p><pre>typeof 1n // result: 'bigint' </pre><p>Besides allowing for more kinds of math to be easily and efficiently expressed, BigInt also allows for better interoperability with systems that use 64-bit numbers, such as <a href="https://github.com/nodejs/node/pull/20220">"inodes" in file systems</a>, <a href="https://sauleau.com/notes/wasm-bigint.html">WebAssembly i64 values</a>, <a href="https://nodejs.org/api/process.html#process_process_hrtime_bigint">high-precision timers</a>, and so on.</p><p>You can <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt">read more about the BigInt feature over on MDN</a>, as usual. You might also like this <a href="https://developers.google.com/web/updates/2018/05/bigint">short article on BigInt basics</a> that V8 engineer Mathias Bynens wrote when Chrome shipped support for BigInt last year. There is an accompanying <a href="https://v8.dev/blog/bigint">language implementation</a> article as well, for those of y'all that enjoy the nitties and the gritties. </p><p><b>can i ship it?</b></p><p>To try out BigInt in Firefox, simply download a copy of <a href="https://www.mozilla.org/en-US/firefox/channel/desktop/">Firefox Beta</a>. This version of Firefox will be fully released to the public in a few weeks, on July 9th. If you're reading this in the future, I'm talking about Firefox 68.</p><p>BigInt is also shipping already in V8 and Chrome, and my colleague Caio Lima has an project in progress to implement it in JavaScriptCore / WebKit / Safari. Depending on your target audience, BigInt might be deployable already!</p><p><b>thanks</b></p><p>I must mention that my role in the BigInt work was relatively small; my Igalia colleague Robin Templeton did the bulk of the BigInt implementation work in Firefox, so large ups to them. Hearty thanks also to Mozilla's Jan de Mooij and Jeff Walden for their patient and detailed code reviews.</p><p>Thanks as well to the V8 engineers for their open source implementation of BigInt fundamental algorithms, as we used many of them in Firefox.</p><p>Finally, I need to make one big thank-you, and I hope that you will join me in expressing it. The road to ship anything in a web browser is long; besides the "simple matter of programming" that it is to implement a feature, you need a <a href="https://github.com/tc39/proposal-bigint/blob/master/README.md">specification with buy-in from implementors and web standards people</a>, you need a good working relationship with a browser vendor, you need willing technical reviewers, you need to follow up on the inevitable security bugs that any browser change causes, and all of this takes time. It's all predicated on having the backing of an organization that's foresighted enough to invest in this kind of long-term, high-reward platform engineering.</p><p>In that regard I think all people that work on the web platform should send a big shout-out to <a href="https://techatbloomberg.com">Tech at Bloomberg</a> for making BigInt possible by underwriting all of <a href="https://igalia.com/">Igalia</a>'s work in this area. Thank you, Bloomberg, and happy hacking!</p></div> 2019-05-23T12:13:59+00:00 Andy Wingo parallel @ Savannah: GNU Parallel 20190522 ('Akihito') released http://savannah.gnu.org/forum/forum.php?forum_id=9434 <p>GNU Parallel 20190522 ('Akihito') has been released. It is available for download at: <a href="http://ftpmirror.gnu.org/parallel/">http://ftpmirror.gnu.org/parallel/</a> <br /> </p> <p>GNU Parallel is 10 years old in a year on 2020-04-22. You are here by invited to a reception on Friday 2020-04-17. <br /> </p> <p>See <a href="https://www.gnu.org/software/parallel/10-years-anniversary.html">https://www.gnu.org/software/parallel/10-years-anniversary.html</a> <br /> </p> <p>Quote of the month: <br /> </p> <p>  Amazingly useful script! <br />     -- <a href="mailto:unxusr@reddit.com">unxusr@reddit.com</a> <br /> </p> <p>New in this release: <br /> </p> <ul> <li>--group-by groups lines depending on value of a column. The value can be computed. </li> </ul> <ul> <li>How to compress (bzip/gzip) a very large text quickly? <a href="https://medium.com/">https://medium.com/</a>@gchandra/how-to-compress-bzip-gzip-a-very-large-text-quickly-27c11f4c6681 </li> </ul> <ul> <li>Simple tutorial to install &amp; use GNU Parallel <a href="https://medium.com/">https://medium.com/</a>@gchandra/simple-tutorial-to-install-use-gnu-parallel-79251120d618 </li> </ul> <ul> <li>Introducing Parallel into Shell <a href="https://petelawson.com/post/parallel-in-shell/">https://petelawson.com/post/parallel-in-shell/</a> </li> </ul> <ul> <li>Bug fixes and man page updates. </li> </ul> <p>Get the book: GNU Parallel 2018 <a href="http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html">http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html</a> <br /> </p> <p>GNU Parallel - For people who live life in the parallel lane. <br /> </p> <h2>About GNU Parallel</h2> <p>GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel. <br /> </p> <p>If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops. <br /> </p> <p>GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs. <br /> </p> <p>You can find more about GNU Parallel at: <a href="http://www.gnu.org/s/parallel/">http://www.gnu.org/s/parallel/</a> <br /> </p> <p>You can install GNU Parallel in just 10 seconds with: <br /> (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - <a href="http://pi.dk/3">http://pi.dk/3</a>) | bash <br /> </p> <p>Watch the intro video on <a href="http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1">http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1</a> <br /> </p> <p>Walk through the tutorial (man parallel_tutorial). Your command line will love you for it. <br /> </p> <p>When using programs that use GNU Parallel to process data for publication please cite: <br /> </p> <p>O. Tange (2018): GNU Parallel 2018, March 2018, <a href="https://doi.org/10.5281/zenodo.1146014">https://doi.org/10.5281/zenodo.1146014</a>. <br /> </p> <p>If you like GNU Parallel: <br /> </p> <ul> <li>Give a demo at your local user group/team/colleagues </li> <li>Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists </li> <li>Get the merchandise <a href="https://gnuparallel.threadless.com/designs/gnu-parallel">https://gnuparallel.threadless.com/designs/gnu-parallel</a> </li> <li>Request or write a review for your favourite blog or magazine </li> <li>Request or build a package for your favourite distribution (if it is not already there) </li> <li>Invite me for your next conference </li> </ul> <p>If you use programs that use GNU Parallel for research: <br /> </p> <ul> <li>Please cite GNU Parallel in you publications (use --citation) </li> </ul> <p>If GNU Parallel saves you money: <br /> </p> <ul> <li>(Have your company) donate to FSF <a href="https://my.fsf.org/donate/">https://my.fsf.org/donate/</a> </li> </ul> <h2>About GNU SQL</h2> <p>GNU sql aims to give a simple, unified interface for accessing databases through all the different databases' command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries. <br /> </p> <p>The database is addressed using a DBURL. If commands are left out you will get that database's interactive shell. <br /> </p> <p>When using GNU SQL for a publication please cite: <br /> </p> <p>O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32. <br /> </p> <h2>About GNU Niceload</h2> <p>GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.<br /> </p> 2019-05-22T20:29:50+00:00 Ole Tange GNU Guix: Creating and using a custom Linux kernel on Guix System https://gnu.org/software/guix/blog/2019/creating-and-using-a-custom-linux-kernel-on-guix-system/ <p>Guix is, at its core, a source based distribution with <a href="https://www.gnu.org/software/guix/manual/en/html_node/Substitutes.html">substitutes</a>, and as such building packages from their source code is an expected part of regular package installations and upgrades. Given this starting point, it makes sense that efforts are made to reduce the amount of time spent compiling packages, and recent changes and upgrades to the building and distribution of substitutes continues to be a topic of discussion within Guix.</p><p>One of the packages which I prefer to not build myself is the Linux-Libre kernel. The kernel, while not requiring an overabundance of RAM to build, does take a very long time on my build machine (which my children argue is actually their Kodi computer), and I will often delay reconfiguring my laptop while I want for a substitute to be prepared by the official build farm. The official kernel configuration, as is the case with many GNU/Linux distributions, errs on the side of inclusiveness, and this is really what causes the build to take such a long time when I build the package for myself.</p><p>The Linux kernel, however, can also just be described as a package installed on my machine, and as such can be customized just like any other package. The procedure is a little bit different, although this is primarily due to the nature of how the package definition is written.</p><p>The <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/linux.scm#n294"><code>linux-libre</code></a> kernel package definition is actually a procedure which creates a package.</p><pre><code class="language-scheme">(define* (make-linux-libre version hash supported-systems #:key ;; A function that takes an arch and a variant. ;; See kernel-config for an example. (extra-version #f) (configuration-file #f) (defconfig "defconfig") (extra-options %default-extra-linux-options) (patches (list %boot-logo-patch))) ...)</code></pre><p>The current <code>linux-libre</code> package is for the 5.1.x series, and is declared like this:</p><pre><code class="language-scheme">(define-public linux-libre (make-linux-libre %linux-libre-version %linux-libre-hash '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux") #:patches %linux-libre-5.1-patches #:configuration-file kernel-config))</code></pre><p>Any keys which are not assigned values inherit their default value from the <code>make-linux-libre</code> definition. When comparing the two snippets above, you may notice that the code comment in the first doesn't actually refer to the <code>#:extra-version</code> keyword; it is actually for <code>#:configuration-file</code>. Because of this, it is not actually easy to include a custom kernel configuration from the definition, but don't worry, there are other ways to work with what we do have.</p><p>There are two ways to create a kernel with a custom kernel configuration. The first is to provide a standard <code>.config</code> file during the build process by including an actual <code>.config</code> file as a native input to our custom kernel. The <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/packages/linux.scm#n379">following</a> is a snippet from the custom 'configure phase of the <code>make-linux-libre</code> package definition:</p><pre><code class="language-scheme">(let ((build (assoc-ref %standard-phases 'build)) (config (assoc-ref (or native-inputs inputs) "kconfig"))) ;; Use a custom kernel configuration file or a default ;; configuration file. (if config (begin (copy-file config ".config") (chmod ".config" #o666)) (invoke "make" ,defconfig))</code></pre><p>Below is a sample kernel package for one of my computers. Linux-Libre is just like other regular packages and can be inherited and overridden like any other:</p><pre><code class="language-scheme">(define-public linux-libre/E2140 (package (inherit linux-libre) (native-inputs `(("kconfig" ,(local-file "E2140.config")) ,@(alist-delete "kconfig" (package-native-inputs linux-libre))))))</code></pre><p>In the same directory as the file defining <code>linux-libre-E2140</code> is a file named <code>E2140.config</code>, which is an actual kernel configuration file. I left the defconfig keyword of <code>make-linux-libre</code> blank, so the only kernel configuration in the package is the one which I included as a native-input.</p><p>The second way to create a custom kernel is to pass a new value to the extra-options keyword of the <code>make-linux-libre</code> procedure. The extra-options keyword works with another function defined right below it:</p><pre><code class="language-scheme">(define %default-extra-linux-options `(;; https://lists.gnu.org/archive/html/guix-devel/2014-04/msg00039.html ("CONFIG_DEVPTS_MULTIPLE_INSTANCES" . #t) ;; Modules required for initrd: ("CONFIG_NET_9P" . m) ("CONFIG_NET_9P_VIRTIO" . m) ("CONFIG_VIRTIO_BLK" . m) ("CONFIG_VIRTIO_NET" . m) ("CONFIG_VIRTIO_PCI" . m) ("CONFIG_VIRTIO_BALLOON" . m) ("CONFIG_VIRTIO_MMIO" . m) ("CONFIG_FUSE_FS" . m) ("CONFIG_CIFS" . m) ("CONFIG_9P_FS" . m))) (define (config-&gt;string options) (string-join (map (match-lambda ((option . 'm) (string-append option "=m")) ((option . #t) (string-append option "=y")) ((option . #f) (string-append option "=n"))) options) "\n"))</code></pre><p>And in the custom configure script from the <code>make-linux-libre</code> package:</p><pre><code class="language-scheme">;; Appending works even when the option wasn't in the ;; file. The last one prevails if duplicated. (let ((port (open-file ".config" "a")) (extra-configuration ,(config-&gt;string extra-options))) (display extra-configuration port) (close-port port)) (invoke "make" "oldconfig"))))</code></pre><p>So by not providing a configuration-file the <code>.config</code> starts blank, and then we write into it the collection of flags that we want. Here's another custom kernel which I have:</p><pre><code class="language-scheme">(define %macbook41-full-config (append %macbook41-config-options %filesystems %efi-support %emulation (@@ (gnu packages linux) %default-extra-linux-options))) (define-public linux-libre-macbook41 ;; XXX: Access the internal 'make-linux-libre' procedure, which is ;; private and unexported, and is liable to change in the future. ((@@ (gnu packages linux) make-linux-libre) (@@ (gnu packages linux) %linux-libre-version) (@@ (gnu packages linux) %linux-libre-hash) '("x86_64-linux") #:extra-version "macbook41" #:patches (@@ (gnu packages linux) %linux-libre-5.1-patches) #:extra-options %macbook41-config-options))</code></pre><p>From the above example <code>%filesystems</code> is a collection of flags I compiled enabling different filesystem support, <code>%efi-support</code> enables EFI support and <code>%emulation</code> enables my x86_64-linux machine to act in 32-bit mode also. <code>%default-extra-linux-options</code> are the ones quoted above, which had to be added in since I replaced them in the extra-options keyword.</p><p>This all sounds like it should be doable, but how does one even know which modules are required for their system? The two places I found most helpful to try to answer this question were the <a href="https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Kernel">Gentoo Handbook</a>, and the <a href="https://www.kernel.org/doc/html/latest/admin-guide/README.html?highlight=localmodconfig">documentation</a> from the kernel itself. From the kernel documentation, it seems that <code>make localmodconfig</code> is the command we want.</p><p>In order to actually run <code>make localmodconfig</code> we first need to get and unpack the kernel source code:</p><pre><code class="language-shell">tar xf $(guix build linux-libre --source)</code></pre><p>Once inside the directory containing the source code run <code>touch .config</code> to create an initial, empty <code>.config</code> to start with. <code>make localmodconfig</code> works by seeing what you already have in <code>.config</code> and letting you know what you're missing. If the file is blank then you're missing everything. The next step is to run:</p><pre><code class="language-shell">guix environment linux-libre -- make localmodconfig</code></pre><p>and note the output. Do note that the <code>.config</code> file is still empty. The output generally contains two types of warnings. The first start with "WARNING" and can actually be ignored in our case. The second read:</p><pre><code class="language-shell">module pcspkr did not have configs CONFIG_INPUT_PCSPKR</code></pre><p>For each of these lines, copy the <code>CONFIG_XXXX_XXXX</code> portion into the <code>.config</code> in the directory, and append <code>=m</code>, so in the end it looks like this:</p><pre><code class="language-shell">CONFIG_INPUT_PCSPKR=m CONFIG_VIRTIO=m</code></pre><p>After copying all the configuration options, run <code>make localmodconfig</code> again to make sure that you don't have any output starting with "module". After all of these machine specific modules there are a couple more left that are also needed. <code>CONFIG_MODULES</code> is necessary so that you can build and load modules separately and not have everything built into the kernel. <code>CONFIG_BLK_DEV_SD</code> is required for reading from hard drives. It is possible that there are other modules which you will need.</p><p>This post does not aim to be a guide to configuring your own kernel however, so if you do decide to build a custom kernel you'll have to seek out other guides to create a kernel which is just right for your needs.</p><p>The second way to setup the kernel configuration makes more use of Guix's features and allows you to share configuration segments between different kernels. For example, all machines using EFI to boot have a number of EFI configuration flags that they need. It is likely that all the kernels will share a list of filesystems to support. By using variables it is easier to see at a glance what features are enabled and to make sure you don't have features in one kernel but missing in another.</p><p>Left undiscussed however, is Guix's initrd and its customization. It is likely that you'll need to modify the initrd on a machine using a custom kernel, since certain modules which are expected to be built may not be available for inclusion into the initrd.</p><p>Suggestions and contributions toward working toward a satisfactory custom initrd and kernel are welcome!</p><h4>About GNU Guix</h4><p><a href="https://www.gnu.org/software/guix">GNU Guix</a> is a transactional package manager and an advanced distribution of the GNU system that <a href="https://www.gnu.org/distros/free-system-distribution-guidelines.html">respects user freedom</a>. Guix can be used on top of any system running the kernel Linux, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.</p><p>In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through <a href="https://www.gnu.org/software/guile">Guile</a> programming interfaces and extensions to the <a href="http://schemers.org">Scheme</a> language.</p> 2019-05-21T10:00:00+00:00 Efraim Flashner GNU Guix: GNU Guix 1.0.1 released https://gnu.org/software/guix/blog/2019/gnu-guix-1.0.1-released/ <p>We are pleased to announce the release of GNU Guix version 1.0.1. This new version fixes bugs in the <a href="https://www.gnu.org/software/guix/manual/en/html_node/Guided-Graphical-Installation.html">graphical installer</a> for the standalone Guix System.</p><p>The release comes with <a href="https://www.gnu.org/software/guix/manual/en/html_node/System-Installation.html">ISO-9660 installation images</a>, a <a href="https://www.gnu.org/software/guix/manual/en/html_node/Running-Guix-in-a-VM.html">virtual machine image</a>, and with tarballs to install the package manager on top of your GNU/Linux distro, either <a href="https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html">from source</a> or <a href="https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html">from binaries</a>. Guix users can update by running <code>guix pull</code>.</p><p>It’s been just over two weeks since we <a href="https://www.gnu.org/software/guix/blog/2019/gnu-guix-1.0.0-released/">announced 1.0.0</a>—two weeks and 706 commits by 40 people already!</p><p>This is primarily a bug-fix release, specifically focusing on issues in the graphical installer for the standalone system:</p><ul><li>The most <a href="https://issues.guix.gnu.org/issue/35541">embarrassing bug</a> would lead the graphical installer to produce a configuration where <a href="https://www.gnu.org/software/guix/manual/en/html_node/Using-the-Configuration-System.html#index-_0025base_002dpackages"><code>%base-packages</code></a> was omitted from the <code>packages</code> field. Consequently, the freshly installed system would not have the usual commands in <code>$PATH</code>—<code>ls</code>, <code>ps</code>, etc.—and Xfce would fail to start for that reason. See below for a “post-mortem” analysis.</li><li>The <code>wpa-supplicant</code> service would <a href="https://issues.guix.gnu.org/issue/35550">sometimes fail to start</a> in the installation image, thereby breaking network access; this is now fixed.</li><li>The installer <a href="https://issues.guix.gnu.org/issue/35540">now</a> allows you to toggle the visibility of passwords and passphrases, and it <a href="https://issues.guix.gnu.org/issue/35716">no longer</a> restricts their length.</li><li>The installer <a href="https://issues.guix.gnu.org/issue/35657">can now create</a> Btrfs file systems.</li><li><code>network-manager-applet</code> is <a href="https://issues.guix.gnu.org/35554">now</a> part of <a href="https://www.gnu.org/software/guix/manual/en/html_node/Desktop-Services.html#index-_0025desktop_002dservices"><code>%desktop-services</code></a>, and thus readily usable not just from GNOME but also from Xfce.</li><li>The <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/NEWS?h=version-1.0.1"><code>NEWS</code></a> file has more details, but there were also minor bug fixes for <a href="https://issues.guix.gnu.org/issue/35618"><code>guix environment</code></a>, <a href="https://issues.guix.gnu.org/issue/35588"><code>guix search</code></a>, and <a href="https://issues.guix.gnu.org/issue/35684"><code>guix refresh</code></a>.</li></ul><p>A couple of new features were reviewed in time to make it into 1.0.1:</p><ul><li><a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-system.html"><code>guix system docker-image</code></a> now produces an OS image with an “entry point”, which makes it easier to use than before.</li><li><a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-system.html"><code>guix system container</code></a> has a new <code>--network</code> option, allowing the container to share networking access with the host.</li><li>70 new packages were added and 483 packages were updated.</li><li>Translations were updated as usual and we are glad to announce a 20%-complete <a href="https://www.gnu.org/software/guix/manual/ru/html_node">Russian translation of the manual</a>.</li></ul><h1>Recap of <a href="https://issues.guix.gnu.org/issue/35541">bug #35541</a></h1><p>The 1.0.1 release was primarily motivated by <a href="https://issues.guix.gnu.org/issue/35541">bug #35541</a>, which was reported shortly after the 1.0.0 release. If you installed Guix System with the <a href="https://www.gnu.org/software/guix/manual/en/html_node/Guided-Graphical-Installation.html">graphical installer</a>, chances are that, because of this bug, you ended up with a system where all the usual GNU/Linux commands—<code>ls</code>, <code>grep</code>, <code>ps</code>, etc.—were <em>not</em> in <code>$PATH</code>. That in turn would also prevent Xfce from starting, if you chose that desktop environment for your system.</p><p>We quickly published a note in the <a href="https://www.gnu.org/software/guix/manual/en/html_node/Guided-Graphical-Installation.html">system installation instructions</a> explaining how to work around the issue:</p><ul><li><p>First, install packages that provide those commands, along with the text editor of your choice (for example, <code>emacs</code> or <code>vim</code>):</p><pre><code>guix install coreutils findutils grep procps sed emacs vim</code></pre></li><li><p>At this point, the essential commands you would expect are available. Open your configuration file with your editor of choice, for example <code>emacs</code>, running as root:</p><pre><code>sudo emacs /etc/config.scm</code></pre></li><li><p>Change the <code>packages</code> field to add the “base packages” to the list of globally-installed packages, such that your configuration looks like this:</p><pre><code class="language-scheme">(operating-system ;; … snip … (packages (append (list (specification-&gt;package "nss-certs")) %base-packages)) ;; … snip … )</code></pre></li><li><p>Reconfigure the system so that your new configuration is in effect:</p><pre><code>guix pull &amp;&amp; sudo guix system reconfigure /etc/config.scm</code></pre></li></ul><p>If you already installed 1.0.0, you can perform the steps above to get all these core commands back.</p><p>Guix is <em>purely declarative</em>: if you give it <a href="https://www.gnu.org/software/guix/manual/en/html_node/Using-the-Configuration-System.html">an operating system definition</a> where the “base packages” are not <a href="https://www.gnu.org/software/guix/manual/en/html_node/Using-the-Configuration-System.html#Globally_002dVisible-Packages">available system-wide</a>, then it goes ahead and installs precisely that. That’s exactly what happened with this bug: the installer generated such a configuration and passed it to <code>guix system init</code> as part of the installation process.</p><h1>Lessons learned</h1><p>Technically, this is a “trivial” bug: it’s fixed by adding one line to your operating system configuration and reconfiguring, and the fix for the installer itself <a href="https://git.savannah.gnu.org/cgit/guix.git/commit/?id=ecb0df6817eb3767e6b4dcf1945f3c2dfbe3b44f">is also a one-liner</a>. Nevertheless, it’s obviously a serious bug for the impression it gives—this is <em>not</em> the user experience we want to offer. So how did such a serious bug go through unnoticed?</p><p>For several years now, Guix has had a number of automated <a href="https://www.gnu.org/software/guix/blog/2016/guixsd-system-tests/"><em>system tests</em></a> running in virtual machines (VMs). These tests primarily ensure that <a href="https://www.gnu.org/software/guix/manual/en/html_node/Services.html">system services</a> work as expected, but some of them <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/gnu/tests/install.scm">specifically test system installation</a>: installing to a RAID or encrypted device, with a separate <code>/home</code>, using Btrfs, etc. These tests even run on our <a href="https://ci.guix.gnu.org/jobset/guix-master">continuous integration service</a> (search for the “tests.*” jobs there).</p><p>Unfortunately, those installation tests target the so-called <a href="https://www.gnu.org/software/guix/manual/en/html_node/Manual-Installation.html">“manual” installation process</a>, which is scriptable. They do <em>not</em> test the installer’s graphical user interface. Consequently, testing the user interface (UI) itself was a manual process. Our attention was, presumably, focusing more on UI aspects since—so we thought—the actual installation tests were already taken care of by the system tests. That the generated system configuration could be syntactically correct but definitely wrong from a usability viewpoint perhaps didn’t occur to us. The end result is that the issue went unnoticed.</p><p>The lesson here is that: manual testing should <em>also</em> look for issues in “unexpected places”, and more importantly, we need automated tests for the graphical UI. The Debian and Guix installer UIs are similar—both using the <a href="https://pagure.io/newt">Newt</a> toolkit. Debian tests its installer using <a href="https://wiki.debian.org/DebianInstaller/Preseed">“pre-seeds”</a> (<a href="https://salsa.debian.org/installer-team/preseed">code</a>), which are essentially answers to all the questions and choices the UI would present. We could adopt a similar approach, or we could test the UI itself at a lower level—reading the screen, and simulating key strokes. UI testing is notoriously tricky so we’ll have to figure out how to get there.</p><h1>Conclusion</h1><p>Our 1.0 party was a bit spoiled by this bug, and we are sorry that installation was disappointing to those of you who tried 1.0. We hope 1.0.1 will allow you to try and see what declarative and programmable system configuration management is like, because that’s where the real value of Guix System is—the graphical installer is icing on the cake.</p><p>Join us <a href="https://www.gnu.org/software/guix/contact/">on <code>#guix</code> and on the mailing lists</a>!</p><h4>About GNU Guix</h4><p><a href="https://www.gnu.org/software/guix">GNU Guix</a> is a transactional package manager and an advanced distribution of the GNU system that <a href="https://www.gnu.org/distros/free-system-distribution-guidelines.html">respects user freedom</a>. Guix can be used on top of any system running the kernel Linux, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.</p><p>In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through <a href="https://www.gnu.org/software/guile">Guile</a> programming interfaces and extensions to the <a href="http://schemers.org">Scheme</a> language.</p> 2019-05-19T21:30:00+00:00 Ludovic Courtès bison @ Savannah: Bison 3.4 released [stable] http://savannah.gnu.org/forum/forum.php?forum_id=9433 <p>We are happy to announce the release of Bison 3.4. <br /> </p> <p>A particular focus was put on improving the diagnostics, which are now <br /> colored by default, and accurate with multibyte input. Their format was <br /> also changed, and is now similar to GCC 9's diagnostics. <br /> </p> <p>Users of the default backend (yacc.c) can use the new %define variable <br /> api.header.include to avoid duplicating the content of the generated header <br /> in the generated parser. There are two new examples installed, including a <br /> reentrant calculator which supports recursive calls to the parser and <br /> Flex-generated scanner. <br /> </p> <p>See below for more details. <br /> </p> <p>================================================================== <br /> </p> <p>Bison is a general-purpose parser generator that converts an annotated <br /> context-free grammar into a deterministic LR or generalized LR (GLR) parser <br /> employing LALR(1) parser tables. Bison can also generate IELR(1) or <br /> canonical LR(1) parser tables. Once you are proficient with Bison, you can <br /> use it to develop a wide range of language parsers, from those used in <br /> simple desk calculators to complex programming languages. <br /> </p> <p>Bison is upward compatible with Yacc: all properly-written Yacc grammars <br /> work with Bison with no change. Anyone familiar with Yacc should be able to <br /> use Bison with little trouble. You need to be fluent in C, C++ or Java <br /> programming in order to use Bison. <br /> </p> <p>Here is the GNU Bison home page: <br /> <a href="https://gnu.org/software/bison/">https://gnu.org/software/bison/</a> <br /> </p> <p>================================================================== <br /> </p> <p>Here are the compressed sources: <br /> <a href="https://ftp.gnu.org/gnu/bison/bison-3.4.tar.gz">https://ftp.gnu.org/gnu/bison/bison-3.4.tar.gz</a> (4.1MB) <br /> <a href="https://ftp.gnu.org/gnu/bison/bison-3.4.tar.xz">https://ftp.gnu.org/gnu/bison/bison-3.4.tar.xz</a> (3.1MB) <br /> </p> <p>Here are the GPG detached signatures[*]: <br /> <a href="https://ftp.gnu.org/gnu/bison/bison-3.4.tar.gz.sig">https://ftp.gnu.org/gnu/bison/bison-3.4.tar.gz.sig</a> <br /> <a href="https://ftp.gnu.org/gnu/bison/bison-3.4.tar.xz.sig">https://ftp.gnu.org/gnu/bison/bison-3.4.tar.xz.sig</a> <br /> </p> <p>Use a mirror for higher download bandwidth: <br /> <a href="https://www.gnu.org/order/ftp.html">https://www.gnu.org/order/ftp.html</a> <br /> </p> <p>[*] Use a .sig file to verify that the corresponding file (without the <br /> .sig suffix) is intact. First, be sure to download both the .sig file <br /> and the corresponding tarball. Then, run a command like this: <br /> </p> <p> gpg --verify bison-3.4.tar.gz.sig <br /> </p> <p>If that command fails because you don't have the required public key, <br /> then run this command to import it: <br /> </p> <p> gpg --keyserver keys.gnupg.net --recv-keys 0DDCAA3278D5264E <br /> </p> <p>and rerun the 'gpg --verify' command. <br /> </p> <p>This release was bootstrapped with the following tools: <br /> Autoconf 2.69 <br /> Automake 1.16.1 <br /> Flex 2.6.4 <br /> Gettext 0.19.8.1 <br /> Gnulib v0.1-2563-gd654989d8 <br /> </p> <p>================================================================== <br /> </p> <p>NEWS <br /> </p> <textarea class="verbatim" cols="80" readonly="readonly" rows="20">* Noteworthy changes in release 3.4 (2019-05-19) [stable] ** Deprecated features The %pure-parser directive is deprecated in favor of '%define api.pure' since Bison 2.3b (2008-05-27), but no warning was issued; there is one now. Note that since Bison 2.7 you are strongly encouraged to use '%define api.pure full' instead of '%define api.pure'. ** New features *** Colored diagnostics As an experimental feature, diagnostics are now colored, controlled by the new options --color and --style. To use them, install the libtextstyle library before configuring Bison. It is available from https://alpha.gnu.org/gnu/gettext/ for instance https://alpha.gnu.org/gnu/gettext/libtextstyle-0.8.tar.gz The option --color supports the following arguments: - always, yes: Enable colors. - never, no: Disable colors. - auto, tty (default): Enable colors if the output device is a tty. To customize the styles, create a CSS file similar to /* bison-bw.css */ .warning { } .error { font-weight: 800; text-decoration: underline; } .note { } then invoke bison with --style=bison-bw.css, or set the BISON_STYLE environment variable to "bison-bw.css". *** Disabling output When given -fsyntax-only, the diagnostics are reported, but no output is generated. The name of this option is somewhat misleading as bison does more than just checking the syntax: every stage is run (including checking for conflicts for instance), except the generation of the output files. *** Include the generated header (yacc.c) Before, when --defines is used, bison generated a header, and pasted an exact copy of it into the generated parser implementation file. If the header name is not "y.tab.h", it is now #included instead of being duplicated. To use an '#include' even if the header name is "y.tab.h" (which is what happens with --yacc, or when using the Autotools' ylwrap), define api.header.include to the exact argument to pass to #include. For instance: %define api.header.include {"parse.h"} or %define api.header.include {&lt;parser/parse.h&gt;} *** api.location.type is now supported in C (yacc.c, glr.c) The %define variable api.location.type defines the name of the type to use for locations. When defined, Bison no longer defines YYLTYPE. This can be used in programs with several parsers to factor their definition of locations: let one of them generate them, and the others just use them. ** Changes *** Graphviz output In conformance with the recommendations of the Graphviz team, if %require "3.4" (or better) is specified, the option --graph generates a *.gv file by default, instead of *.dot. *** Diagnostics overhaul Column numbers were wrong with multibyte characters, which would also result in skewed diagnostics with carets. Beside, because we were indenting the quoted source with a single space, lines with tab characters were incorrectly underlined. To address these issues, and to be clearer, Bison now issues diagnostics as GCC9 does. For instance it used to display (there's a tab before the opening brace): foo.y:3.37-38: error: $2 of ‘expr’ has no declared type expr: expr '+' "number" { $$ = $1 + $2; } ^~ It now reports foo.y:3.37-38: error: $2 of ‘expr’ has no declared type 3 | expr: expr '+' "number" { $$ = $1 + $2; } | ^~ Other constructs now also have better locations, resulting in more precise diagnostics. *** Fix-it hints for %empty Running Bison with -Wempty-rules and --update will remove incorrect %empty annotations, and add the missing ones. *** Generated reports The format of the reports (parse.output) was improved for readability. *** Better support for --no-line. When --no-line is used, the generated files are now cleaner: no lines are generated instead of empty lines. Together with using api.header.include, that should help people saving the generated files into version control systems get smaller diffs. ** Documentation A new example in C shows an simple infix calculator with a hand-written scanner (examples/c/calc). A new example in C shows a reentrant parser (capable of recursive calls) built with Flex and Bison (examples/c/reccalc). There is a new section about the history of Yaccs and Bison. ** Bug fixes A few obscure bugs were fixed, including the second oldest (known) bug in Bison: it was there when Bison was entered in the RCS version control system, in December 1987. See the NEWS of Bison 3.3 for the previous oldest bug. </textarea> 2019-05-19T10:01:36+00:00 Akim Demaille FSF News: Six more devices from ThinkPenguin, Inc. now FSF-certified to Respect Your Freedom http://www.fsf.org/news/six-more-devices-from-thinkpenguin-inc-now-fsf-certified-to-respect-your-freedom <p>This is ThinkPenguin's second batch of devices to receive <a href="https://www.fsf.org/ryf">RYF certification</a> this spring. The <a href="https://www.fsf.org/news/seven-new-devices-from-thinkpenguin-inc-now-fsf-certified-to-respect-your-freedom">FSF announced certification</a> of seven other devices from ThinkPenguin on March 21st. This latest collection of devices makes ThinkPenguin the retailer with the largest catalog of RYF-certified devices.</p> <p>"It's unfortunate that so many of even the simplest devices out there have surprise proprietary software requirements. RYF is an antidote for that. It connects ethical shoppers concerned about their freedom with companies offering options respecting that freedom," said the FSF's executive director, John Sullivan.</p> <p>Today's certifications expands the availability of RYF-certified peripheral devices. The <a href="https://www.thinkpenguin.com/gnu-linux/penguin-usb-20-external-stereo-sound-adapter-gnu-linux-tpe-usbsound">Penguin USB 2.0 External USB Stereo Sound Adapter</a> and the <a href="https://www.thinkpenguin.com/gnu-linux/51-channels-24-bit-96khz-pci-express-audio-sound-card-w-full-low-profile-bracket-tpe-pcies">5.1 Channels 24-bit 96KHz PCI Express Audio Sound Card</a> help users get the most of their computers in terms of sound quality. For wireless connectivity, ThinkPenguin offers the <a href="https://www.thinkpenguin.com/gnu-linux/wireless-n-pci-express-dual-band-mini-half-height-card-w-full-height-bracket-option-tpe-nh">Wireless N PCI Express Dual-Band Mini Half-Height Card</a> and <a href="https://www.thinkpenguin.com/gnu-linux/penguin-wireless-n-mini-pcie">Penguin Wireless N Mini PCIe Card</a>. For users with an older printer, the <a href="https://www.thinkpenguin.com/gnu-linux/usb-parallel-printer-cable-tpe-usbparal">USB to Parallel Printer Cable</a> can let them continue to use it with their more current hardware. Finally, the <a href="https://www.thinkpenguin.com/gnu-linux/pcie-esata-sata-6gbps-controller-card-w-full-lowprofile-brackets-tpe-pciesata">PCIe eSATA / SATA 6Gbps Controller Card</a> help users to connect to external eSATA devices as well as internal SATA.</p> <p>"I've spent the last 14 years working on projects aimed at making free software adoption easy for everyone, but the single greatest obstacle over the past 20 years has not been software. It's been hardware. The RYF program helps solve this problem by linking users to trustworthy sources where they can get hardware guaranteed to work on GNU/Linux, and be properly supported using free software," said Christopher Waid, founder and CEO of ThinkPenguin.</p> <p>While ThinkPenguin has consistently sought certification since the inception of the RYF program -- gaining their <a href="https://www.fsf.org/news/ryf-certification-thinkpenguin-usb-with-atheros-chip">first</a> certification in 2013, and adding several more over the years since -- the pace at which they are gaining certifications now eclipses all past efforts.</p> <p>"ThinkPenguin continues to impress with the rapid expansion of their catalog of RYF-certified devices. Adding 14 new devices in a little over a month shows their dedication to the RYF certification program and the protection of users it represents," said the FSF's licensing and compliance manager, Donald Robertson, III.</p> <p>To learn more about the Respects Your Freedom certification program, including details on the certification of these ThinkPenguin devices, please visit <a href="https://fsf.org/ryf">https://fsf.org/ryf</a>.</p> <p>Retailers interested in applying for certification can consult <a href="https://www.fsf.org/resources/hw/endorsement/criteria">https://www.fsf.org/resources/hw/endorsement/criteria</a>.</p> <h3>About the Free Software Foundation</h3> <p>The <a href="https://fsf.org">Free Software Foundation</a>, founded in 1985, is dedicated to promoting computer users' right to use, study, copy, modify, and redistribute computer programs. The FSF promotes the development and use of free (as in freedom) software -- particularly the GNU operating system and its GNU/Linux variants -- and free documentation for free software. The FSF also helps to spread awareness of the ethical and political issues of freedom in the use of software, and its Web sites, located at <a href="https://fsf.org">https://fsf.org</a> and <a href="https://gnu.org">https://gnu.org</a>, are an important source of information about GNU/Linux. Donations to support the FSF's work can be made at <a href="https://donate.fsf.org">https://donate.fsf.org</a>. Its headquarters are in Boston, MA, USA.</p> <p>More information about the FSF, as well as important information for journalists and publishers, is at <a href="https://www.fsf.org/press">https://www.fsf.org/press</a>.</p> <h3>About ThinkPenguin, Inc.</h3> <p>Started by Christopher Waid, founder and CEO, ThinkPenguin, Inc., is a consumer-driven company with a mission to bring free software to the masses. At the core of the company is a catalog of computers and accessories with broad support for GNU/Linux. The company provides technical support for end-users and works with the community, distributions, and upstream projects to make GNU/Linux all that it can be.</p> <h3>Media Contacts</h3> <p>Donald Robertson, III <br /> Licensing and Compliance Manager <br /> Free Software Foundation<br /> +1 (617) 542 5942<br /> <a href="mailto:licensing@fsf.org">licensing@fsf.org</a><br /> </p> <p>ThinkPenguin, Inc. <br /> +1 (888) 39 THINK (84465) x703 <br /> <a href="mailto:media@thinkpenguin.com">media@thinkpenguin.com</a> <br /> </p> 2019-05-16T17:44:36+00:00 FSF News GNUnet News: 2019-05-12: GNUnet 0.11.4 released https://gnunet.org/#gnunet-0.11.4-release <h3> <a name="gnunet-0.11.4-release">2019-05-12: GNUnet 0.11.4 released</a> </h3> <p> We are pleased to announce the release of GNUnet 0.11.4. </p> <p> This is a bugfix release for 0.11.3, mostly fixing minor bugs, improving documentation and fixing various build issues. In terms of usability, users should be aware that there are still a large number of known open issues in particular with respect to ease of use, but also some critical privacy issues especially for mobile users. Also, the nascent network is tiny (about 200 peers) and thus unlikely to provide good anonymity or extensive amounts of interesting information. As a result, the 0.11.4 release is still only suitable for early adopters with some reasonable pain tolerance. </p> <h4>Download links</h4> <ul> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.4.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.4.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.4.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.4.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig</a></li> </ul> <p> (gnunet-gtk and gnunet-fuse were not released again, as there were no changes and the 0.11.0 versions are expected to continue to work fine with gnunet-0.11.4.) </p> <p> Note that due to mirror synchronization, not all links might be functional early after the release. For direct access try <a href="http://ftp.gnu.org/gnu/gnunet/">http://ftp.gnu.org/gnu/gnunet/</a> </p> <p> Note that GNUnet is now started using <tt>gnunet-arm -s</tt>. GNUnet should be stopped using <tt>gnunet-arm -e</tt>. </p> <h4>Noteworthy changes in 0.11.4</h4> <ul> <li>gnunet-arm -s no longer logs into the console by default and instead into a logfile (in $GNUNET_HOME). </li> <li>The reclaim subsystem is no longer experimental. Further, the internal encryption scheme moved from ABE to GNS-style encryption. </li> <li>GNUnet now depends on a more recent version of libmicrohttpd. </li> <li>The REST API now includes read-only access to the configuration. </li> <li>All manpages are now in mdoc format. </li> <li>gnunet-download-manager.scm removed. </li> </ul> <h4>Known Issues</h4> <ul> <li>There are known major design issues in the TRANSPORT, ATS and CORE subsystems which will need to be addressed in the future to achieve acceptable usability, performance and security.</li> <li>There are known moderate implementation limitations in CADET that negatively impact performance. Also CADET may unexpectedly deliver messages out-of-order.</li> <li>There are known moderate design issues in FS that also impact usability and performance.</li> <li>There are minor implementation limitations in SET that create unnecessary attack surface for availability.</li> <li>The RPS subsystem remains experimental.</li> <li>Some high-level tests in the test-suite fail non-deterministically due to the low-level TRANSPORT issues.</li> </ul> <p> In addition to this list, you may also want to consult our bug tracker at <a href="https://bugs.gnunet.org/">bugs.gnunet.org</a> which lists about 190 more specific issues. </p> <h4>Thanks</h4> <p> This release was the work of many people. The following people contributed code and were thus easily identified: ng0, Christian Grothoff, Hartmut Goebel, Martin Schanzenbach, Devan Carpenter, Naomi Phillips and Julius Bünger. </p> 2019-05-12T17:40:00+00:00 GNUnet News unifont @ Savannah: Unifont 12.1.01 Released http://savannah.gnu.org/forum/forum.php?forum_id=9432 <p><strong>11 May 2019</strong> Unifont 12.1.01 is now available. Significant changes in this version include the <strong>Reiwa Japanese era glyph</strong> (U+32FF), which was the only addition made in the Unicode 12.1.0 release of 7 May 2019; Rebecca Bettencourt has contributed many Under ConScript Uniocde Registry (UCSUR) scripts; and David Corbett and Johnnie Weaver modified glyphs in two Plane 1 scripts. Full details are in the ChangeLog file. <br /> </p> <p>Download this release at: <br /> </p> <p><a href="https://ftpmirror.gnu.org/unifont/unifont-12.1.01/">https://ftpmirror.gnu.org/unifont/unifont-12.1.01/</a> <br /> </p> <p>or if that fails, <br /> </p> <p><a href="https://ftp.gnu.org/gnu/unifont/unifont-12.1.01/">https://ftp.gnu.org/gnu/unifont/unifont-12.1.01/</a> <br /> </p> <p>or, as a last resort, <br /> </p> <p><a href="ftp://ftp.gnu.org/gnu/unifont/unifont-12.1.01/">ftp://ftp.gnu.org/gnu/unifont/unifont-12.1.01/</a><br /> </p> 2019-05-11T20:59:48+00:00 Paul Hardy remotecontrol @ Savannah: Nest, the company, died at Google I/O 2019 http://savannah.gnu.org/forum/forum.php?forum_id=9431 <p><a href="https://arstechnica.com/gadgets/2019/05/nest-the-company-died-at-google-io-2019/">https://arstechnica.com/gadgets/2019/05/nest-the-company-died-at-google-io-2019/</a><br /> </p> 2019-05-11T11:39:18+00:00 Stephen H. Dawson DSL gettext @ Savannah: GNU gettext 0.20 released http://savannah.gnu.org/forum/forum.php?forum_id=9430 <p>Download from <a href="https://ftp.gnu.org/pub/gnu/gettext/gettext-0.20.tar.gz">https://ftp.gnu.org/pub/gnu/gettext/gettext-0.20.tar.gz</a> <br /> </p> <p>New in this release: <br /> </p> <ul> <li>Support for reproducible builds: </li> </ul><p> - msgfmt now eliminates the POT-Creation-Date header field from .mo files. <br /> </p> <ul> <li>Improvements for translators: </li> </ul><p> - update-po target in Makefile.in.in now uses msgmerge --previous. <br /> </p> <ul> <li>Improvements for maintainers: </li> </ul><p> - msgmerge now has an option --for-msgfmt, that produces a PO file meant for use by msgfmt only. This option saves processing time, in particular by omitting fuzzy matching that is not useful in this situation. <br /> - The .pot file in a 'po' directory is now erased by "make maintainer-clean". <br /> - It is now possible to override xgettext options from the po/Makefile.in.in through options in XGETTEXT_OPTIONS (declared in po/Makevars). <br /> - The --intl option of the gettextize program (deprecated since 2010) is no longer available. Instead of including the intl sources in your package, we suggest making the libintl library an optional prerequisite of your package. This will simplify the build system of your package. <br /> - Accordingly, the Autoconf macro AM_GNU_GETTEXT_INTL_SUBDIR is gone as well. <br /> </p> <ul> <li>Programming languages support: </li> </ul><p> - C, C++: <br /> xgettext now supports strings in u8"..." syntax, as specified in C11 and C++11. <br /> - C, C++: <br /> xgettext now supports 'p'/'P' exponent markers in number tokens, as specified in C99 and C++17. <br /> - C++: <br /> xgettext now supports underscores in number tokens. <br /> - C++: <br /> xgettext now supports single-quotes in number tokens, as specified in C++14. <br /> - Shell: <br /> o The programs 'gettext', 'ngettext' now support a --context argument. <br /> o gettext.sh contains new function eval_pgettext and eval_npgettext for producing translations of messages with context. <br /> - Java: <br /> o xgettext now supports UTF-8 encoded .properties files (a new feature of Java 9). <br /> o The build system and tools now support Java 9, 10, and 11. On the other hand, support for old versions of Java (Java 5 and older, GCJ 4.2.x and older) has been dropped. <br /> - Perl: <br /> o Native support for context functions (pgettext, dpgettext, dcpgettext, npgettext, dnpgettext, dcnpgettext). <br /> o better detection of question mark and slash as operators (as opposed to regular expression delimiters). <br /> - Scheme: <br /> xgettext now parses the syntax for specialized byte vectors (#u8(...), #vu8(...), etc.) correctly. <br /> - Pascal: <br /> xgettext can now extract strings from .rsj files, produced by the Free Pascal compiler version 3.0.0 or newer. <br /> - Vala: <br /> xgettext now parses escape sequences in strings more accurately. <br /> - JavaScript: <br /> xgettext now parses template literals correctly. <br /> </p> <ul> <li>Runtime behaviour: </li> </ul><p> - The interpretation of the language preferences on macOS has been fixed. <br /> - Per-thread locales are now also supported on Solaris 11.4. <br /> - The replacements for the printf()/fprintf()/... functions that are provided through &lt;libintl.h&gt; on native Windows and NetBSD are now POSIX compliant. There is no conflict any more between these replacements and other possible replacements provided by gnulib or mingw. <br /> </p> <ul> <li>Libtextstyle: </li> </ul><p> - This package installs a new library 'libtextstyle', together with a new header file &lt;textstyle.h&gt;. It is a library for styling text output sent to a console or terminal emulator. Packagers: please see the suggested packaging hints in the file PACKAGING.<br /> </p> 2019-05-09T02:15:21+00:00 Bruno Haible cssc @ Savannah: CSSC-1.4.1 released http://savannah.gnu.org/forum/forum.php?forum_id=9429 <textarea class="verbatim" cols="80" readonly="readonly" rows="20">I'm pleased to announce the release of GNU CSSC, version 1.4.1. This is a stable release. The previous stable release was 1.4.0. Stable releases of CSSC are available from https://ftp.gnu.org/gnu/cssc/. Development releases and release candidates are available from https://alpha.gnu.org/gnu/cssc/. CSSC ("Compatibly Stupid Source Control") is the GNU project's replacement for the traditional Unix SCCS suite. It aims for full compatibility, including precise nuances of behaviour, support for all command-line options, and in most cases bug-for-bug compatibility. CSSC comes with an extensive automated test suite. If you are currently using SCCS to do version control of software, you should be able to just drop in CSSC, even for example if you have a large number of shell scripts which are layered on top of SCCS and depend on it. This should allow you to develop on and for the GNU/Linux platform if your source code exists only in an SCCS repository. CSSC also allows you to migrate to a more modern version control system (such as git). There is a mailing list for users of the CSSC suite. To join it, please send email to &lt;cssc-users-request@gnu.org&gt; or visit the URL http://lists.gnu.org/mailman/listinfo/cssc-users. There is also a mailing list for (usually automated) mails about bugs and changes to CSSC. This is http://lists.gnu.org/mailman/listinfo/bug-cssc. For more information about CSSC, please see http://www.gnu.org/software/cssc/. These people have contributed to the development of CSSC :- James Youngman, Ross Ridge, Eric Allman, Lars Hecking, Larry McVoy, Dave Bodenstab, Malcolm Boff, Richard Polton, Fila Kolodny, Peter Kjellerstedt, John Interrante, Marko Rauhamaa, Achim Hoffann, Dick Streefland, Greg A. Woods, Aron Griffis, Michael Sterrett, William W. Austin, Hyman Rosen, Mark Reynolds, Sergey Ostashenko, Frank van Maarseveen, Jeff Sheinberg, Thomas Duffy, Yann Dirson, Martin Wilck Many thanks to all the above people. Changes since the previous release stable are: New in CSSC-1.4.1, 2019-05-07 * This release - and future releases - of CSSC must be compiled with a C++ compiler that supports the 2011 C++ standard. * When the history file is updated (with admin or delta for example) the history file is not made executable simply because the 'x' flag is set. Instead, preserve the executable-ness from the history file we are replacing. * This release is based on updated versions of gnulib and of the googletest unit test framework. Checksums for the release file are: $ for sum in sha1sum md5sum ; do $sum CSSC-1.4.1.tar.gz; done bfb99cbd6255c7035e99455de7241d4753746fe1 CSSC-1.4.1.tar.gz c9aaae7602e39b7a5d438b0cc48fcaa3 CSSC-1.4.1.tar.gz Please report any bugs via this software to the CSSC bug reporting page, http://savannah.gnu.org/bugs/?group=cssc </textarea> 2019-05-07T20:27:17+00:00 James Youngman GNU Guix: GNU Guix 1.0.0 released https://gnu.org/software/guix/blog/2019/gnu-guix-1.0.0-released/ <p>We are excited to announce the release of GNU Guix version 1.0.0!</p><p>The release comes with <a href="https://www.gnu.org/software/guix/manual/en/html_node/System-Installation.html">ISO-9660 installation images</a>, a <a href="https://www.gnu.org/software/guix/manual/en/html_node/Running-Guix-in-a-VM.html">virtual machine image</a>, and with tarballs to install the package manager on top of your GNU/Linux distro, either <a href="https://www.gnu.org/software/guix/manual/en/html_node/Requirements.html">from source</a> or <a href="https://www.gnu.org/software/guix/manual/en/html_node/Binary-Installation.html">from binaries</a>. Guix users can update by running <code>guix pull</code>.</p><p><img alt="Guix 1.0!" src="https://www.gnu.org/software/guix/static/blog/img/guix-1.0.png" /></p><p>One-point-oh always means a lot for free software releases. For Guix, 1.0 is the result of seven years of development, with code, packaging, and documentation contributions made by 260 people, translation work carried out by a dozen of people, and artwork and web site development by a couple of individuals, to name some of the activities that have been happening. During those years we published no less than <a href="https://www.gnu.org/software/guix/blog/tags/releases/">19 “0.x” releases</a>.</p><h1>The journey to 1.0</h1><p>We took our time to get there, which is quite unusual in an era where free software moves so fast. Why did we take this much time? First, it takes time to build a community around a GNU/Linux distribution, and a distribution wouldn’t really exist without it. Second, we feel like we’re contributing an important piece to <a href="https://www.gnu.org/gnu/about-gnu.html">the GNU operating system</a>, and that is surely intimidating and humbling.</p><p>Last, we’ve been building something new. Of course we stand on the shoulders of giants, and in particular <a href="https://nixos.org/nix/">Nix</a>, which brought the functional software deployment paradigm that Guix implements. But developing Guix has been—and still is!—a challenge in many ways: it’s a <a href="https://arxiv.org/abs/1305.4584">programming</a> <a href="https://www.gnu.org/software/guix/blog/2017/back-from-gpce/">language</a> design challenge, an <a href="https://www.gnu.org/software/guix/blog/2015/service-composition-in-guixsd/">operating</a> <a href="https://www.gnu.org/software/guix/blog/2017/running-system-services-in-containers/">system</a> design challenge, a challenge for <a href="https://www.gnu.org/software/guix/blog/2016/timely-delivery-of-security-updates/">security</a>, <a href="https://www.gnu.org/software/guix/blog/tags/reproducibility/">reproducibility</a>, <a href="https://www.gnu.org/software/guix/blog/tags/bootstrapping/">bootstrapping</a>, usability, and more. In other words, it’s been a long but insightful journey! :-)</p><h1>What GNU Guix can do for you</h1><p>Presumably some of the readers are discovering Guix today, so let’s recap what Guix can do for you as a user. Guix is a complete toolbox for software deployment in general, which makes it different from most of the tools you may be familiar with.</p><p><img alt="Guix manages packages, environments, containers, and systems." src="https://www.gnu.org/software/guix/static/blog/img/guix-scope.png" /></p><p>This may sound a little abstract so let’s look at concrete use cases:</p><ul><li><p><em>As a user</em>, Guix allows you to <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html">install applications and to keep them up-to-date</a>: search for software with <code>guix search</code>, install it with <code>guix install</code>, and maintain it up-to-date by regularly running <code>guix pull</code> and <code>guix upgrade</code>. Guix follows a so-called “rolling release” model, so you can run <code>guix pull</code> at any time to get the latest and greatest bits of free software.</p><p>This certainly sounds familiar, but a distinguishing property here is <em>dependability</em>: Guix is transactional, meaning that you can at any time roll back to a previous “generation” of your package set with <code>guix package --roll-back</code>, inspect differences with <code>guix package -l</code>, and so on.</p><p>Another useful property is <em>reproducibility</em>: Guix allows you to deploy the <em>exact same software environment</em> on different machines or at different points in time thanks to <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-describe.html"><code>guix describe</code></a> and <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-pull.html"><code>guix pull</code></a>.</p><p>This, coupled with the fact that package management operations do not require root access, is invaluable notably in the context of high-performance computing (HPC) and reproducible science, which the <a href="https://guix-hpc.bordeaux.inria.fr/">Guix-HPC effort</a> has been focusing on.</p></li><li><p><em>As a developer</em>, we hope you’ll enjoy <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-environment.html"><code>guix environment</code></a>, which allows you to spawn one-off software environments. Suppose you’re a GIMP developer: running <code>guix environment gimp</code> spawns a shell with everything you need to hack on GIMP—much quicker than manually installing its many dependencies.</p><p>Developers often struggle to push their work to users so they get quick feedback. The <a href="https://www.gnu.org/software/guix/blog/2017/creating-bundles-with-guix-pack/"><code>guix pack</code></a> provides an easy way to create <em>container images</em> for use by Docker &amp; co., or even <a href="https://www.gnu.org/software/guix/blog/2018/tarballs-the-ultimate-container-image-format/">standalone relocatable tarballs</a> that anyone can run, regardless of the GNU/Linux distribution they use.</p><p>Oh, and you may also like <a href="https://www.gnu.org/software/guix/manual/en/html_node/Package-Transformation-Options.html">package transformation options</a>, which allow you define package variants from the command line.</p></li><li><p><em>As a system administrator</em>—and actually, we’re all system administrators of sorts on our laptops!—, Guix’s declarative and unified approach to configuration management should be handy. It surely is a departure from what most people are used to, but it is so reassuring: one configuration file is enough to specify <a href="https://www.gnu.org/software/guix/manual/en/html_node/Using-the-Configuration-System.html">all the aspects of the system config</a>—services, file systems, locale, accounts—all in the same language.</p><p>That makes it surprisingly easy to deploy otherwise complex services such as applications that depend on Web services. For instance, setting up <a href="https://www.gnu.org/software/guix/manual/en/html_node/Version-Control-Services.html#Cgit-Service">CGit</a> or <a href="https://www.gnu.org/software/guix/manual/en/html_node/Monitoring-Services.html#Zabbix-front_002dend">Zabbix</a> is a one-liner, even though behind the scenes that involves setting up nginx, fcgiwrap, etc. We’d love to see to what extent this helps people self-host services—sort of similar to what <a href="https://freedombox.org/">FreedomBox</a> and <a href="https://yunohost.org/">YunoHost</a> have been focusing on.</p><p>With <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-system.html"><code>guix system</code></a> you can instantiate a configuration on your machine, or in a virtual machine (VM) where you can test it, or in a container. You can also provision ISO images, VM images, or container images with a complete OS, from the same config, all with <code>guix system</code>.</p></li></ul><p>The <a href="https://www.gnu.org/software/guix/guix-refcard.pdf">quick reference card</a> shows the important commands. As you start diving deeper into Guix, you’ll discover that many aspects of the system are exposed using consistent <a href="https://www.gnu.org/software/guile/">Guile</a> programming interfaces: <a href="https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html">package definitions</a>, <a href="https://www.gnu.org/software/guix/manual/en/html_node/Services.html">system services</a>, the <a href="https://www.gnu.org/software/shepherd/">“init” system</a>, and a whole bunch of system-level libraries. We believe that makes the system very <em>hackable</em>, and we hope you’ll find it as much fun to play with as we do.</p><p>So much for the overview!</p><h1>What’s new since 0.16.0</h1><p>For those who’ve been following along, a great many things have changed over the last 5 months since the <a href="https://www.gnu.org/software/guix/blog/2018/gnu-guix-and-guixsd-0.16.0-released/">0.16.0 release</a>—99 people contributed over 5,700 commits during that time! Here are the highlights:</p><ul><li>The ISO installation image now runs a cute <a href="https://www.gnu.org/software/guix/manual/en/html_node/Guided-Graphical-Installation.html">text-mode graphical installer</a>—big thanks to Mathieu Othacehe for writing it and to everyone who tested it and improved it! It is similar in spirit to the Debian installer. Whether you’re a die-hard GNU/Linux hacker or a novice user, you’ll certainly find that this makes system installation much less tedious than it was! The installer is fully translated to French, German, and Spanish.</li><li>The new <a href="https://www.gnu.org/software/guix/manual/en/html_node/Running-GuixSD-in-a-VM.html">VM image</a> better matches user expectations: whether you want to tinker with Guix System and see what it’s like, or whether you want to use it as a development environment, this VM image should be more directly useful.</li><li>The user interface was improved: aliases for common operations <a href="https://www.gnu.org/software/guix/manual/en/html_node/Invoking-guix-package.html">such as <code>guix search</code> and <code>guix install</code></a> are now available, diagnostics are now colorized, more operations show a progress bar, there’s a new <code>--verbosity</code> option recognized by all commands, and most commands are now “quiet” by default.</li><li>There’s a new <code>--with-git-url</code> <a href="https://www.gnu.org/software/guix/manual/en/html_node/Package-Transformation-Options.html">package transformation option</a>, that goes with <code>--with-branch</code> and <code>--with-commit</code>.</li><li>Guix now has a first-class, uniform mechanism to configure <a href="https://www.gnu.org/software/guix/manual/en/html_node/Keyboard-Layout.html">keyboard layout</a>—a long overdue addition. Related to that, <a href="https://www.gnu.org/software/guix/manual/en/html_node/X-Window.html">Xorg configuration</a> has been streamlined with the new <code>xorg-configuration</code> record.</li><li>We introduced <code>guix pack -R</code> <a href="https://www.gnu.org/software/guix/blog/2018/tarballs-the-ultimate-container-image-format/">a while back</a>: it creates tarballs containing <em>relocatable</em> application bundles that rely on user namespaces. Starting from 1.0, <code>guix pack -RR</code> (like “reliably relocatable”?) generates relocatable binaries that fall back to <a href="https://proot-me.github.io/">PRoot</a> on systems where <a href="http://man7.org/linux/man-pages/man7/user_namespaces.7.html">user namespaces</a> are not supported.</li><li>More than 1,100 packages were added, leading to <a href="https://www.gnu.org/software/guix/packages">close to 10,000 packages</a>, 2,104 packages were updated, and several system services were contributed.</li><li>The manual has been fully translated to <a href="https://www.gnu.org/software/guix/manual/fr/html_node/">French</a>, the <a href="https://www.gnu.org/software/guix/manual/de/html_node/">German</a> and <a href="https://www.gnu.org/software/guix/manual/es/html_node/">Spanish</a> translations are nearing completion, and work has begun on a <a href="https://www.gnu.org/software/guix/manual/zh-cn/html_node/">Simplified Chinese</a> translation. You can help <a href="https://translationproject.org/domain/guix-manual.html">translate the manual into your language</a> by <a href="https://translationproject.org/html/translators.html">joining the Translation Project</a>.</li></ul><p>That’s a long list already, but you can find more details in the <a href="https://git.savannah.gnu.org/cgit/guix.git/tree/NEWS?h=version-1.0.0"><code>NEWS</code></a> file.</p><h1>What’s next?</h1><p>One-point-oh is a major milestone, especially for those of us who’ve been on board for several years. But with the wealth of ideas we’ve been collecting, it’s definitely not the end of the road!</p><p>If you’re interested in “devops” and distributed deployment, you will certainly be happy to help in that area, those interested in OS development might want to make <a href="https://www.gnu.org/software/shepherd/">the Shepherd</a> more flexible and snappy, furthering integration with <a href="https://www.gnu.org/software/guix/blog/2019/connecting-reproducible-deployment-to-a-long-term-source-code-archive/">Software Heritage</a> will probably be #1 on the to-do list of scientists concerned with long-term reproducibility, programming language tinkerers may want to push <a href="https://www.gnu.org/software/guix/manual/en/html_node/G_002dExpressions.html#G_002dExpressions">G-expressions</a> further, etc. Guix 1.0 is a tool that’s both serviceable for one’s day-to-day computer usage and a great playground for the tinkerers among us.</p><p>Whether you want to help on design, coding, maintenance, system administration, translation, testing, artwork, web services, funding, organizing a Guix install party… <a href="https://www.gnu.org/software/guix/contribute/">your contributions are welcome</a>!</p><p>We’re humans—don’t hesitate to <a href="https://www.gnu.org/software/guix/contact/">get in touch with us</a>, and enjoy Guix 1.0!</p><h4>About GNU Guix</h4><p><a href="https://www.gnu.org/software/guix">GNU Guix</a> is a transactional package manager and an advanced distribution of the GNU system that <a href="https://www.gnu.org/distros/free-system-distribution-guidelines.html">respects user freedom</a>. Guix can be used on top of any system running the kernel Linux, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.</p><p>In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through <a href="https://www.gnu.org/software/guile">Guile</a> programming interfaces and extensions to the <a href="http://schemers.org">Scheme</a> language.</p> 2019-05-02T14:00:00+00:00 Ludovic Courtès dico @ Savannah: Version 2.9 http://savannah.gnu.org/forum/forum.php?forum_id=9426 <p>Version 2.9 of GNU dico is available from download from <a href="https://ftp.gnu.org/gnu/dico/dico-2.9.tar.xz">the GNU archive</a> and from <a href="https://download.gnu.org.ua/release/dico/dico-2.9.tar.xz">its main archive</a> site. <br /> </p> <p>This version fixes compilation on 32-bit systems.<br /> </p> 2019-04-24T06:57:18+00:00 Sergey Poznyakoff rush @ Savannah: Version 1.9 http://savannah.gnu.org/forum/forum.php?forum_id=9425 <p>Version 1.9 is available for download from <a href="https://ftp.gnu.org/gnu/rush/rush-1.9.tar.xz">GNU</a> and <a href="http://download.gnu.org.ua/release/rush/rush-1.9.tar.xz">Puszcza</a> archives. It should soon become available in the mirrors too. <br /> </p> <p>New in this version: <br /> </p> <h4>Backreference expansion</h4> <p>Arguments to tranformations, chroot and chdir statements can contain references to parenthesized groups in the recent regular expression match. Such references are replaced with the strings that matched the corresponding groups. Syntactically, a backreference expansion is a percent sign followed by one-digit number of the subexpression (1-based, %0 refers to entire matched line). For example <br /> </p> <blockquote class="verbatim"><p>  rule X<br />    command ^cd (.+) &amp;&amp; (.+)<br />    chdir %1<br />    set %2<br /> </p></blockquote> <h4>User-defined variables</h4> <p>The configuration file can define new variables or redefine the built-in ones using the <strong>setvar</strong> statement: <br /> </p> <blockquote class="verbatim"><p>   setvar[VAR] PATTERN<br /> </p></blockquote> <p>Here, VAR is the variable name, and PATTERN is its new value. The PATTERN is subject to variable and backreference expansion. <br /> </p> <p>User-defined variables can be unset using the "unsetvar" statement: <br /> </p> <blockquote class="verbatim"><p>   unsetvar[VAR]<br /> </p></blockquote> <p>Unsetting a built-in variable, previously redefined using the <strong>setvar</strong> statement causes the user-supplied definition to be forgotten and the built-in one restored. <br /> </p> <h4>Shell-like variable expansion</h4> <p>The following shell-like notations are supported: <br /> </p> <blockquote class="verbatim"><p> ${VAR:-WORD}   Use Default Values<br /> ${VAR:=WORD}   Assign Default Values<br /> ${VAR:?WORD}   Display Error if Null or Unset<br /> ${VAR:+WORD}   Use Alternate Value<br /> </p></blockquote> <h4>New script rush-po for extracting translatable strings from the configuration</h4> <p>The script rush-po.awk that was used in prior versions has been withdrawn.<br /> </p> 2019-04-24T06:02:12+00:00 Sergey Poznyakoff remotecontrol @ Savannah: How hacking threats spurred secret U.S. blacklist http://savannah.gnu.org/forum/forum.php?forum_id=9424 <p>U.S. energy regulators are pursuing a risky plan to share with electric utilities a secret "don't buy" list of foreign technology suppliers, according to multiple sources. <br /> </p> <p><a href="https://www.eenews.net/stories/1060176111">https://www.eenews.net/stories/1060176111</a><br /> </p> 2019-04-23T21:38:53+00:00 Stephen H. Dawson DSL gnustep @ Savannah: Main development is located at http://github.com/gnustep http://savannah.gnu.org/forum/forum.php?forum_id=9423 <p>Main development is located at <a href="http://github.com/gnustep">http://github.com/gnustep</a><br /> </p> 2019-04-23T14:25:45+00:00 Gregory John Casamento parallel @ Savannah: GNU Parallel 20190422 ('Invitation') released [stable] http://savannah.gnu.org/forum/forum.php?forum_id=9422 <p>GNU Parallel 20190422 ('Invitation') [stable] has been released. It is available for download at: <a href="http://ftpmirror.gnu.org/parallel/">http://ftpmirror.gnu.org/parallel/</a> <br /> </p> <p>No new functionality was introduced so this is a good candidate for a stable release. <br /> </p> <h2>Invitation to 10 year reception</h2> <p>GNU Parallel is 10 years old in a year on 2020-04-22. You are here by invited to a reception on Friday 2020-04-17. <br /> </p> <p>The primary reception will be held in Copenhagen, DK. Please reserve the date and email <a href="mailto:happybirthdaygnuparallel@tange.dk">happybirthdaygnuparallel@tange.dk</a> if you want to join. <br /> </p> <p>If you cannot make it, you are encouraged to host a parallel party. <br /> </p> <p>So far we hope to have parallel parties at: <br /> </p> <blockquote class="verbatim"><p>   PROSA<br />   Vester Farimagsgade 37A<br />   DK-1606 København V<br />   RSVP: happybirthdaygnuparallel@tange.dk<br /> <br />   PROSA<br />   Søren Frichs Vej 38 K th<br />   DK-8230 Åbyhøj<br />   RSVP: To be determined<br />   <br />   PROSA<br />   Overgade 54<br />   DK-5000 Odense C<br />   RSVP: To be determined<br /> </p></blockquote> <p>If you want to host a party held in parallel (either in this or in a parallel universe), please let me know, so it can be announced. <br /> </p> <p>If you have parallel ideas for how to celebrate GNU Parallel, please post on the email list parallel@gnu.org. So far we have the following ideas: <br /> </p> <ul> <li>Use GNU Parallel logo (the café wall illusion) as decoration everywhere - preferably in a moving version where the bars slide. Maybe we can borrow this <a href="https://www.youtube.com/watch?v=_XFDnFLqRFE">https://www.youtube.com/watch?v=_XFDnFLqRFE</a> or make an animation in javascript based on <a href="https://bl.ocks.org/Fil/13177d3c911fb8943cb0013086469b87">https://bl.ocks.org/Fil/13177d3c911fb8943cb0013086469b87</a>? Other illusions might be fun, too. </li> <li>Only serve beverages in parallel (2 or more), which may or may not be the same kind of beverage, and may or may not be served to the same person, and may or may not be served by multiple waiters in parallel </li> <li>Let people drink in parallel with straws (2 or more straws) </li> <li>Serve popcorn as snack (funny because cores and kernels are the same word in Danish, and GNU Parallel keeps cores hot) </li> <li>Serve saltstænger and similar parallel snacks. </li> <li>Serve (snack friendly) cereal ("serial") in parallel bowls. </li> <li>Live parallel streaming from parallel parties </li> <li>Play songs in parallel that use the same 4 chords: <a href="https://www.youtube.com/watch?v=5pidokakU4I">https://www.youtube.com/watch?v=5pidokakU4I</a> </li> <li>Play songs named parallel, serial, mutex, race condition and similar </li> <li>Have RC racing cars to demonstrate race condition </li> <li>Put a counting semaphore on the toilets </li> <li>Only let people leave one at a time to simulate serialized output - UNLESS they swap some clothing (to simulate half line mixing) </li> </ul> <p>If you have interesting stories about or uses of GNU Parallel, please post them, so can be part of the anniversary update. <br /> </p> <p>Quote of the month: <br /> </p> <p>  Y'all need some GNU parallel in your lives <br />     -- ChaKu @ChaiLovesChai@twitter <br /> </p> <p>New in this release: <br /> </p> <ul> <li>Invitation to the 10 years anniversary next year. </li> </ul> <ul> <li>The Austin Linux Meetup: KVM as Hypervisor and GNU Parallel <a href="https://www.meetup.com/linuxaustin/events/jbxcnqyzgbpb/">https://www.meetup.com/linuxaustin/events/jbxcnqyzgbpb/</a> </li> </ul> <ul> <li>Bug fixes and man page updates. </li> </ul> <p>Get the book: GNU Parallel 2018 <a href="http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html">http://www.lulu.com/shop/ole-tange/gnu-parallel-2018/paperback/product-23558902.html</a> <br /> </p> <p>GNU Parallel - For people who live life in the parallel lane. <br /> </p> <h2>About GNU Parallel</h2> <p>GNU Parallel is a shell tool for executing jobs in parallel using one or more computers. A job can be a single command or a small script that has to be run for each of the lines in the input. The typical input is a list of files, a list of hosts, a list of users, a list of URLs, or a list of tables. A job can also be a command that reads from a pipe. GNU Parallel can then split the input and pipe it into commands in parallel. <br /> </p> <p>If you use xargs and tee today you will find GNU Parallel very easy to use as GNU Parallel is written to have the same options as xargs. If you write loops in shell, you will find GNU Parallel may be able to replace most of the loops and make them run faster by running several jobs in parallel. GNU Parallel can even replace nested loops. <br /> </p> <p>GNU Parallel makes sure output from the commands is the same output as you would get had you run the commands sequentially. This makes it possible to use output from GNU Parallel as input for other programs. <br /> </p> <p>You can find more about GNU Parallel at: <a href="http://www.gnu.org/s/parallel/">http://www.gnu.org/s/parallel/</a> <br /> </p> <p>You can install GNU Parallel in just 10 seconds with: <br /> (wget -O - pi.dk/3 || curl pi.dk/3/ || fetch -o - <a href="http://pi.dk/3">http://pi.dk/3</a>) | bash <br /> </p> <p>Watch the intro video on <a href="http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1">http://www.youtube.com/playlist?list=PL284C9FF2488BC6D1</a> <br /> </p> <p>Walk through the tutorial (man parallel_tutorial). Your command line will love you for it. <br /> </p> <p>When using programs that use GNU Parallel to process data for publication please cite: <br /> </p> <p>O. Tange (2018): GNU Parallel 2018, March 2018, <a href="https://doi.org/10.5281/zenodo.1146014">https://doi.org/10.5281/zenodo.1146014</a>. <br /> </p> <p>If you like GNU Parallel: <br /> </p> <ul> <li>Give a demo at your local user group/team/colleagues </li> <li>Post the intro videos on Reddit/Diaspora*/forums/blogs/ Identi.ca/Google+/Twitter/Facebook/Linkedin/mailing lists </li> <li>Get the merchandise <a href="https://gnuparallel.threadless.com/designs/gnu-parallel">https://gnuparallel.threadless.com/designs/gnu-parallel</a> </li> <li>Request or write a review for your favourite blog or magazine </li> <li>Request or build a package for your favourite distribution (if it is not already there) </li> <li>Invite me for your next conference </li> </ul> <p>If you use programs that use GNU Parallel for research: <br /> </p> <ul> <li>Please cite GNU Parallel in you publications (use --citation) </li> </ul> <p>If GNU Parallel saves you money: <br /> </p> <ul> <li>(Have your company) donate to FSF <a href="https://my.fsf.org/donate/">https://my.fsf.org/donate/</a> </li> </ul> <h2>About GNU SQL</h2> <p>GNU sql aims to give a simple, unified interface for accessing databases through all the different databases' command line clients. So far the focus has been on giving a common way to specify login information (protocol, username, password, hostname, and port number), size (database and table size), and running queries. <br /> </p> <p>The database is addressed using a DBURL. If commands are left out you will get that database's interactive shell. <br /> </p> <p>When using GNU SQL for a publication please cite: <br /> </p> <p>O. Tange (2011): GNU SQL - A Command Line Tool for Accessing Different Databases Using DBURLs, ;login: The USENIX Magazine, April 2011:29-32. <br /> </p> <h2>About GNU Niceload</h2> <p>GNU niceload slows down a program when the computer load average (or other system activity) is above a certain limit. When the limit is reached the program will be suspended for some time. If the limit is a soft limit the program will be allowed to run for short amounts of time before being suspended again. If the limit is a hard limit the program will only be allowed to run when the system is below the limit.<br /> </p> 2019-04-21T18:20:53+00:00 Ole Tange gnuastro @ Savannah: Gnuastro 0.9 released http://savannah.gnu.org/forum/forum.php?forum_id=9419 <p>The 9th release of GNU Astronomy Utilities (Gnuastro) is now available for download. Please see <a href="http://lists.gnu.org/archive/html/info-gnuastro/2019-04/msg00001.html">the announcement</a> for details.<br /> </p> 2019-04-17T17:54:52+00:00 Mohammad Akhlaghi GNU Hackers Meeting: Malfunction in ghm-planning (at) gnu.org http://savannah.gnu.org/forum/forum.php?forum_id=9417 <p>Due to a problem in the alias configuration, mails sent to ghm-planning before Sun Apr 14 8:00 CEST have been silently dropped. <br /> </p> <p>If you sent a registration email and/or a talk proposal for the GHM 2019, please resend it. <br /> </p> <p>Sorry for the inconvenience!<br /> </p> 2019-04-14T07:56:27+00:00 Jose E. Marchesi GNU Hackers Meeting: GNU Hackers' Meeting 2019 in Madrid http://savannah.gnu.org/forum/forum.php?forum_id=9415 <p>Twelve years after it's first edition in Orense, the GHM is back to Spain! This time, we will be gathering in the nice city of Madrid for hacking, learning and meeting each other. <br /> </p> <p>The event will have place from Wednesday 4 September to Friday 6 <br /> September, 2019. <br /> </p> <p>Please visit <a href="http://www.gnu.org/ghm/2019">http://www.gnu.org/ghm/2019</a> for more information on the venue and instructions on how to register and propose talks. <br /> </p> <p>The website will be updated as we complete the schedule and the organizational details, so stay tuned!<br /> </p> 2019-04-12T20:03:26+00:00 Jose E. Marchesi GNUnet News: 2019-04-04: GNUnet 0.11.2 released https://gnunet.org/#gnunet-0.11.2-release <h3> <a name="gnunet-0.11.2-release">2019-04-04: GNUnet 0.11.2 released</a> </h3> <p> We are pleased to announce the release of GNUnet 0.11.2. </p> <p> This is a bugfix release for 0.11.0, mostly fixing minor bugs, improving documentation and fixing various build issues. In terms of usability, users should be aware that there are still a large number of known open issues in particular with respect to ease of use, but also some critical privacy issues especially for mobile users. Also, the nascent network is tiny (about 200 peers) and thus unlikely to provide good anonymity or extensive amounts of interesting information. As a result, the 0.11.2 release is still only suitable for early adopters with some reasonable pain tolerance. </p> <h4>Download links</h4> <ul> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.2.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.2.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.2.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.2.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig</a></li> </ul> <p> (gnunet-gtk and gnunet-fuse were not released again, as there were no changes and the 0.11.0 versions are expected to continue to work fine with gnunet-0.11.2.) </p> <p> Note that due to mirror synchronization, not all links might be functional early after the release. For direct access try <a href="http://ftp.gnu.org/gnu/gnunet/">http://ftp.gnu.org/gnu/gnunet/</a> </p> <p> Note that GNUnet is now started using <tt>gnunet-arm -s</tt>. GNUnet should be stopped using <tt>gnunet-arm -e</tt>. </p> <h4>Noteworthy changes in 0.11.2</h4> <ul> <li>gnunet-qr was rewritten in C, removing our last dependency on Python 2.x</li> <li>REST and GNS proxy configuration options for address binding were added</li> <li>gnunet-publish by default no longer includes creation time</li> <li>Unreliable message ordering logic in CADET was fixed</li> <li>Various improvements to build system and documentation</li> </ul> <p> The above is just the short list, our bugtracker lists <a href="https://bugs.gnunet.org/changelog_page.php?version_id=312"> 14 individual issues</a> that were resolved since 0.11.0. </p> <h4>Known Issues</h4> <ul> <li>There are known major design issues in the TRANSPORT, ATS and CORE subsystems which will need to be addressed in the future to achieve acceptable usability, performance and security.</li> <li>There are known moderate implementation limitations in CADET that negatively impact performance. Also CADET may unexpectedly deliver messages out-of-order.</li> <li>There are known moderate design issues in FS that also impact usability and performance.</li> <li>There are minor implementation limitations in SET that create unnecessary attack surface for availability.</li> <li>The RPS subsystem remains experimental.</li> <li>Some high-level tests in the test-suite fail non-deterministically due to the low-level TRANSPORT issues.</li> </ul> <p> In addition to this list, you may also want to consult our bug tracker at <a href="https://bugs.gnunet.org/">bugs.gnunet.org</a> which lists about 190 more specific issues. </p> <h4>Thanks</h4> <p> This release was the work of many people. The following people contributed code and were thus easily identified: ng0, Christian Grothoff, Hartmut Goebel, Martin Schanzenbach, Devan Carpenter, Naomi Phillips and Julius Bünger. </p> 2019-04-04T13:00:00+00:00 GNUnet News GNUnet News: 2019-04-03: GNUnet 0.11.1 released https://gnunet.org/#gnunet-0.11.1-release <h3> <a name="gnunet-0.11.1-release">2019-04-03: GNUnet 0.11.1 released</a> </h3> <p> We are pleased to announce the release of GNUnet 0.11.1. </p> <p> This is a bugfix release for 0.11.0, mostly fixing minor bugs, improving documentation and fixing various build issues. In terms of usability, users should be aware that there are still a large number of known open issues in particular with respect to ease of use, but also some critical privacy issues especially for mobile users. Also, the nascent network is tiny (about 200 peers) and thus unlikely to provide good anonymity or extensive amounts of interesting information. As a result, the 0.11.1 release is still only suitable for early adopters with some reasonable pain tolerance. </p> <h4>Download links</h4> <ul> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.1.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.1.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-0.11.1.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-0.11.1.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-gtk-0.11.0.tar.gz.sig</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz</a></li> <li><a href="http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig">http://ftpmirror.gnu.org/gnunet/gnunet-fuse-0.11.0.tar.gz.sig</a></li> </ul> <p> (gnunet-gtk and gnunet-fuse were not released again, as there were no changes and the 0.11.0 versions are expected to continue to work fine with gnunet-0.11.1.) </p> <p> Note that due to mirror synchronization, not all links might be functional early after the release. For direct access try <a href="http://ftp.gnu.org/gnu/gnunet/">http://ftp.gnu.org/gnu/gnunet/</a> </p> <p> Note that GNUnet is now started using <tt>gnunet-arm -s</tt>. GNUnet should be stopped using <tt>gnunet-arm -e</tt>. </p> <h4>Noteworthy changes in 0.11.1</h4> <ul> <li>gnunet-qr was rewritten in C, removing our last dependency on Python 2.x</li> <li>REST and GNS proxy configuration options for address binding were added</li> <li>gnunet-publish by default no longer includes creation time</li> <li>Unreliable message ordering logic in CADET was fixed</li> <li>Various improvements to build system and documentation</li> </ul> <p> The above is just the short list, our bugtracker lists <a href="https://bugs.gnunet.org/changelog_page.php?version_id=312"> 14 individual issues</a> that were resolved since 0.11.0. </p> <h4>Known Issues</h4> <ul> <li>There are known major design issues in the TRANSPORT, ATS and CORE subsystems which will need to be addressed in the future to achieve acceptable usability, performance and security.</li> <li>There are known moderate implementation limitations in CADET that negatively impact performance. Also CADET may unexpectedly deliver messages out-of-order.</li> <li>There are known moderate design issues in FS that also impact usability and performance.</li> <li>There are minor implementation limitations in SET that create unnecessary attack surface for availability.</li> <li>The RPS subsystem remains experimental.</li> <li>Some high-level tests in the test-suite fail non-deterministically due to the low-level TRANSPORT issues.</li> </ul> <p> In addition to this list, you may also want to consult our bug tracker at <a href="https://bugs.gnunet.org/">bugs.gnunet.org</a> which lists about 190 more specific issues. </p> <h4>Thanks</h4> <p> This release was the work of many people. The following people contributed code and were thus easily identified: ng0, Christian Grothoff, Hartmut Goebel, Martin Schanzenbach, Devan Carpenter, Naomi Phillips and Julius Bünger. </p> 2019-04-03T16:00:00+00:00 GNUnet News GNU Guix: Connecting reproducible deployment to a long-term source code archive https://gnu.org/software/guix/blog/2019/connecting-reproducible-deployment-to-a-long-term-source-code-archive/ <p>GNU Guix can be used as a “package manager” to install and upgrade software packages as is familiar to GNU/Linux users, or as an environment manager, but it can also provision containers or virtual machines, and manage the operating system running on your machine.</p><p>One foundation that sets it apart from other tools in these areas is <em>reproducibility</em>. From a high-level view, Guix allows users to <em>declare</em> complete software environments and instantiate them. They can share those environments with others, who can replicate them or adapt them to their needs. This aspect is key to reproducible computational experiments: scientists need to reproduce software environments before they can reproduce experimental results, and this is one of the things we are focusing on in the context of the <a href="https://guix-hpc.bordeaux.inria.fr">Guix-HPC</a> effort. At a lower level, the project, along with others in the <a href="https://reproducible-builds.org">Reproducible Builds</a> community, is working to ensure that software build outputs are <a href="https://reproducible-builds.org/docs/definition/">reproducible, bit for bit</a>.</p><p>Work on reproducibility at all levels has been making great progress. Guix, for instance, allows you to <a href="https://www.gnu.org/software/guix/blog/2018/multi-dimensional-transactions-and-rollbacks-oh-my/">travel back in time</a>. That Guix can travel back in time <em>and</em> build software reproducibly is a great step forward. But there’s still an important piece that’s missing to make this viable: a stable source code archive. This is where <a href="https://www.softwareheritage.org">Software Heritage</a> (SWH for short) comes in.</p><h1>When source code vanishes</h1><p>Guix contains thousands of package definitions. Each <a href="https://www.gnu.org/software/guix/manual/en/html_node/Defining-Packages.html">package definition</a> specifies the package’s source code URL and hash, the package’s dependencies, and its build procedure. Most of the time, the package’s source code is an archive (a “tarball”) fetched from a web site, but more and more frequently the source code is a specific revision checked out directly from a version control system.</p><p>The obvious question, then, is: what happens if the source code URL becomes unreachable? The whole reproducibility endeavor collapses when source code disappears. And source code <em>does</em> disappear, or, even worse, it can be modified in place. At GNU we’re doing a good job of having stable hosting that keeps releases around “forever”, unchanged (modulo rare exceptions). But a lot of free software out there is hosted on personal web pages with a short lifetime and on commercial hosting services that come and go.</p><p>By default Guix would look up source code by hash in the caches of our build farms. This comes for free: the <a href="https://www.gnu.org/software/guix/manual/en/html_node/Substitutes.html">“substitute” mechanism</a> extends to all “build artifacts”, including downloads. However, with limited capacity, our build farms do not keep all the source code of all the packages for a long time. Thus, one could very well find oneself unable to rebuild a package months or years later, simply because its source code disappeared or moved to a different location.</p><h1>Connecting to the archive</h1><p>It quickly became clear that reproducible builds had “reproducible source code downloads”, so to speak, as a prerequisite. The Software Heritage archive is the missing piece that would finally allow us to reproduce software environments years later in spite of the volatility of code hosting sites. Software Heritage’s mission is to archive essentially “all” the source code ever published, including version control history. Its archive already periodically ingests release tarballs from the GNU servers, repositories from GitHub, packages from PyPI, and much more.</p><p><img alt="Software Heritage logo" src="https://www.gnu.org/software/guix/static/blog/img/software-heritage-logo-title.svg" /></p><p>We quickly settled on a scheme where Guix would fall back to the Software Heritage archive whenever it fails to download source code from its original location. That way, package definitions don’t need to be modified: they still refer to the original source code URL, but the downloading machinery transparently goes to Software Heritage when needed.</p><p>There are two types of source code downloads in Guix: tarball downloads, and version control checkouts. In the former case, resorting to Software Heritage is easy: Guix knows the SHA256 hash of the tarball so it can look it up by hash using <a href="https://archive.softwareheritage.org/api/1/content/raw/">the <code>/content</code> endpoint of the archive’s interface</a>.</p><p>Fetching version control checkouts is more involved. In this case, the downloader would first resolve the commit identifier to obtain a <a href="https://archive.softwareheritage.org/api/1/revision/">Software Heritage revision</a>. The actual code for that revision is then fetched through the <a href="https://docs.softwareheritage.org/devel/swh-vault/api.html"><em>vault</em></a>.</p><p>The vault conveniently allows users to fetch the tarball corresponding to a revision. However, not all revisions are readily available as tarballs (understandably), so the vault has an interface that allows you to request the “<em>cooking</em>” of a specific revision. Cooking is asynchronous and can take some time. Currently, if a revision hasn’t been cooked yet, the Guix download machinery will request it and wait until it is available. The process can take some time but will eventually succeed.</p><p>Success! At this point, we have essentially bridged the gap between the stable archive that Software Heritage provides and the reproducible software deployment pipeline of Guix. This code <a href="https://issues.guix.info/issue/33432">was integrated</a> in November 2018, making it the first free software distribution backed by a stable archive.</p><h1>The challenges ahead</h1><p>This milestone was encouraging: we had seemingly achieved our goal, but we also knew of several shortcomings. First, even though the software we package is still primarily distributed as tarballs, Software Heritage keeps relatively few of these tarballs. Software Heritage does ingest tarballs, notably those found on <a href="https://ftp.gnu.org/gnu/">the GNU servers</a>, but the primary focus is on preserving complete version control repositories rather than release tarballs.</p><p>It is not yet clear to us what to do with plain old tarballs. On one hand, they are here and cannot be ignored. Furthermore, some provide artifacts that are not in version control, such as <code>configure</code> scripts, and often enough they are accompanied by a cryptographic signature from the developers that allows recipients to <em>authenticate</em> the code—an important piece of information that’s often missing from version control history. On the other hand, version control tags are increasingly becoming the mechanism of choice to distribute software releases. It may be that tags will become the primary mechanism for software release distribution soon enough.</p><p>Version control tags turn out not to be ideal either, because they’re mutable and per-repository. Conversely, Git commit identifiers are unambiguous and repository-independent because they’re essentially content-addressed, but our package definitions often refer to tags, not commits, because that makes it clearer that we’re providing an actual release and not an arbitrary revision (this is another illustration of <a href="https://en.wikipedia.org/wiki/Zooko's_triangle">Zooko’s triangle</a>).</p><p>This leads to another limitation that stems from the mismatch between the way Guix and Software Heritage compute hashes over version control checkouts: both compute a hash over a serialized representation of the directory, but they serialize the directory in a different way (SWH serializes directories as Git trees, while Guix uses “normalized archives” or Nars, the format the build daemon manipulates, which is inherited from Nix.) That prevents Guix from looking up revisions by content hash. The solution will probably involve changing Guix to support the same method as Software Heritage, and/or adding Guix’s method to Software Heritage.</p><p>Having to wait for “cooking” completion can also be problematic. The Software Heritage team is investigating the possibility to <a href="https://forge.softwareheritage.org/T1350">automatically cook all version control tags</a>. That way, relevant revisions would almost always be readily available through the vault.</p><p>Similarly, we have no guarantee that software provided by Guix is available in the archive. Our plan is to <a href="https://forge.softwareheritage.org/T1352">extend Software Heritage</a> such that it would periodically archive the source code of software packaged by Guix.</p><h1>Going further</h1><p>In the process of adding support for Software Heritage, Guix <a href="https://issues.guix.info/issue/33432">gained Guile bindings to the Software Heritage HTTP interface</a>. Here’s a couple of things we can do:</p><pre><code class="language-scheme">(use-modules (guix swh)) ;; Check whether SWH has ever crawled our repository. (define o (lookup-origin "https://git.savannah.gnu.org/git/guix.git")) ⇒ #&lt;&lt;origin&gt; id: 86312956 …&gt; ;; It did! When was its last visit? (define last-visit (first (origin-visits o))) (date-&gt;string (visit-date last-visit)) ⇒ "Fri Mar 29 10:07:45Z 2019" ;; Does it have our “v0.15.0” Git tag? (lookup-origin-revision "https://git.savannah.gnu.org/git/guix.git" "v0.15.0") ⇒ #&lt;&lt;revision&gt; id: "359fdda40f754bbf1b5dc261e7427b75463b59be" …&gt;</code></pre><p>Guix itself is a Guile library so when we combine the two, there are interesting things we can do:</p><pre><code class="language-scheme">(use-modules (guix) (guix swh) (gnu packages base) (gnu packages golang)) ;; This is our GNU Coreutils package. coreutils ⇒ #&lt;package coreutils@8.30 gnu/packages/base.scm:342 1c67b40&gt; ;; Does SWH have its tarball? (lookup-content (origin-sha256 (package-source coreutils)) "sha256") ⇒ #&lt;&lt;content&gt; checksums: (("sha1" …)) data-url: …&gt; ;; Our package for HashiCorp’s Configuration Language (HCL) is ;; built from a Git commit. (define commit (git-reference-commit (origin-uri (package-source go-github-com-hashicorp-hcl)))) ;; Is this particular commit available in the archive? (lookup-revision commit) ⇒ #&lt;&lt;revision&gt; id: "23c074d0eceb2b8a5bfdbb271ab780cde70f05a8" …&gt;</code></pre><p>We’re currently using a subset of this interface, but there’s certainly more we could do. For example, we can compute archive coverage of the Guix packages; we can also request the archival of each package’s source code <em>via</em> the <a href="https://archive.softwareheritage.org/api/1/origin/save/">“save code” interface</a>—though all this is subject to <a href="https://archive.softwareheritage.org/api/#rate-limiting">rate limiting</a>.</p><h1>Wrap-up</h1><p>Software Heritage support in Guix creates a bridge from the stable source code archive to reproducible software deployment with complete provenance tracking. For the first time it gives us a software package distribution that can be rebuilt months or years later. This is particularly beneficial in the context of reproducible science: finally we can describe reproducible software environments, a prerequisite for reproducible computational experiments.</p><p>Going further, we can provide a complete software supply tool chain with provenance tracking that links revisions in the archive to bit-reproducible build artifacts produced by Guix. Oh and Guix itself <a href="https://archive.softwareheritage.org/api/1/origin/git/url/https://git.savannah.gnu.org/git/guix.git/">is archived</a>, so we have this meta-level where we could link Guix revisions to the revisions of packages it provides… There are still technical challenges to overcome, but that vision is shaping up.</p><h4>About GNU Guix</h4><p><a href="https://www.gnu.org/software/guix">GNU Guix</a> is a transactional package manager and an advanced distribution of the GNU system that <a href="https://www.gnu.org/distros/free-system-distribution-guidelines.html">respects user freedom</a>. Guix can be used on top of any system running the kernel Linux, or it can be used as a standalone operating system distribution for i686, x86_64, ARMv7, and AArch64 machines.</p><p>In addition to standard package management features, Guix supports transactional upgrades and roll-backs, unprivileged package management, per-user profiles, and garbage collection. When used as a standalone GNU/Linux distribution, Guix offers a declarative, stateless approach to operating system configuration management. Guix is highly customizable and hackable through <a href="https://www.gnu.org/software/guile">Guile</a> programming interfaces and extensions to the <a href="http://schemers.org">Scheme</a> language.</p> 2019-03-29T14:50:00+00:00 Ludovic Courtès osip @ Savannah: osip2 [5.1.0] & exosip2 [5.1.0] http://savannah.gnu.org/forum/forum.php?forum_id=9405 <p>I have released today newer versions for both osip2 &amp; exosip2. <br /> </p> <p>osip is very mature. There was only one tiny feature change to allow more flexible NAPTR request (such as ENUM). A very few bugs were discovered and fixed. <br /> </p> <p>eXosip is also mature. However a few bugs around PRACK and retransmissions were reported and fixed. openssl support has also been updated to support more features, be more flexible and support all openssl versions. ENUM support has been introduced this year. See the ChangeLog for more! <br /> </p> <p>In all case, upgrading is <strong>strongly</strong> recommanded. API changes are documented in the ChangeLog: there is not much!<br /> </p> 2019-03-28T19:50:43+00:00 Aymeric MOIZARD nano @ Savannah: GNU nano 4.0 was released http://savannah.gnu.org/forum/forum.php?forum_id=9404 <p>This version breaks with the close compatibility with Pico: nano no longer hard-wraps the current line by default when it becomes overlong, and uses smooth scrolling by default, plus two other minor changes. Further, in 3.0 indenting and unindenting became undoable, and now, with 4.0, also justifications have become undoable (to any depth), making that all of the user's actions are now undoable and redoable (with the M-U and M-E keystrokes).<br /> </p> 2019-03-27T18:36:29+00:00 Benno Schulenberg FSF News: FSF job opportunity: campaigns manager http://www.fsf.org/news/fsf-job-opportunity-campaigns-manager-1 <p>The Free Software Foundation (FSF), a Massachusetts 501(c)(3) charity with a worldwide mission to protect computer user freedom, seeks a motivated and talented Boston-based individual to be our full-time campaigns manager.</p> <p>Reporting to the executive director, the campaigns manager works on our campaigns team to lead, plan, carry out, evaluate, and improve the FSF's advocacy and education campaigns. The team also works closely with other FSF departments, including licensing, operations, and tech. The position will start by taking responsibility for existing campaigns in support of the GNU Project, free software adoption, free media formats, and freedom on the network; and against Digital Restrictions Management (DRM), software patents, and proprietary software.</p> <p>Examples of job responsibilities include, but are not limited to:</p> <ul> <li>Planning and participating in online and physical actions to achieve our campaign goals;<br /> </li> <li>Setting specific goals for each action and then measuring our success in achieving them;<br /> </li> <li>Doing the writing and messaging work needed to effectively explain our campaigns and motivate people to support them;<br /> </li> <li>Overseeing or doing the graphic design work to make our campaigns and their Web sites attractive;<br /> </li> <li>Supporting and attending special events, including community-building activities and our annual LibrePlanet conference;<br /> </li> <li>Assisting with annual online and mail fundraising efforts;<br /> </li> <li>Working with our tech team on the technology choices and deployments -- especially of Web publication systems like Drupal and Plone -- for our campaign sites; and</li> <li>Being an approachable, humble, and friendly representative of the FSF to our worldwide community of existing supporters and the broader public, both in person and online.<br /> </li> </ul> <p>Ideal candidates have at least three to five years of work experience in online issue advocacy and free software; proficiency and comfort with professional writing and publications preferred. Because the FSF works globally and seeks to have our materials distributed in as many languages as possible, multilingual candidates will have an advantage. With our small staff of fourteen, each person makes a clear contribution. We work hard, but offer a humane and fun work environment at an office located in the heart of downtown Boston. The FSF is a mature but growing organization that provides great potential for advancement; existing staff get the first chance at any new job openings.</p> <h2>Benefits and salary</h2> <p>This job is a union position that must be worked on-site at the FSF's downtown Boston office. The salary is fixed at $63,253/year and is non-negotiable. Other benefits include:</p> <ul> <li>Full individual or family health coverage through Blue Cross/Blue Shield's HMO Blue program;<br /> </li> <li>Subsidized dental plan;<br /> </li> <li>Four weeks of paid vacation annually;<br /> </li> <li>Seventeen paid holidays annually;<br /> </li> <li>Weekly remote work allowance;<br /> </li> <li>Public transit commuting cost reimbursement;<br /> </li> <li>403(b) program through TIAA with employer match;<br /> </li> <li>Yearly cost-of-living pay increases (based on government guidelines);<br /> </li> <li>Healthcare expense reimbursement budget;<br /> </li> <li>Ergonomic budget;<br /> </li> <li>Relocation (to Boston area) expense reimbursement;<br /> </li> <li>Conference travel and professional development opportunities; and</li> <li>Potential for an annual performance bonus.</li> </ul> <h2>Application instructions</h2> <p>Applications must be submitted via email to <a href="mailto:hiring@fsf.org">hiring@fsf.org</a>. The email must contain the subject line "Campaigns manager". A complete application should include:</p> <ul> <li>Cover letter, including a brief example of a time you motivated and organized others to take action on an issue important to you;<br /> </li> <li>Resume;<br /> </li> <li>Two recent writing samples;<br /> </li> <li>Links to any talks you have given (optional); and<br /> </li> <li>Graphic design samples (optional).</li> </ul> <p>All materials must be in a free format (such as plain text, PDF, or OpenDocument). Email submissions that do not follow these instructions will probably be overlooked. No phone calls, please.</p> <p><strong>Applications will be reviewed on a rolling basis until the position is filled. To guarantee consideration, submit your application by Sunday, April 28th.</strong><br /> </p> <p>The FSF is an equal opportunity employer and will not discriminate against any employee or application for employment on the basis of race, color, marital status, religion, age, sex, sexual orientation, national origin, handicap, or any other legally protected status recognized by federal, state or local law. We value diversity in our workplace. </p> <h3>About the Free Software Foundation</h3> <p>The Free Software Foundation, founded in 1985, is dedicated to promoting computer users' right to use, study, copy, modify, and redistribute computer programs. The FSF promotes the development and use of free (as in freedom) software -- particularly the GNU operating system and its GNU/Linux variants -- and free documentation for free software. The FSF also helps to spread awareness of the ethical and political issues of freedom in the use of software, and its Web sites, located at fsf.org and gnu.org, are an important source of information about GNU/Linux. Donations to support the FSF's work can be made at <a href="https://donate.fsf.org">https://donate.fsf.org</a>. We are based in Boston, MA, USA.</p> 2019-03-25T20:15:00+00:00 FSF News FSF News: OpenStreetMap and Deborah Nicholson win 2018 FSF Awards http://www.fsf.org/news/openstreetmap-and-deborah-nicholson-win-2018-fsf-awards <p><em>BOSTON, Massachusetts, USA -- Saturday, March 23, 2019 -- The Free Software Foundation (FSF) recognizes <a href="https://www.openstreetmap.org/">OpenStreetMap</a> with the 2018 Free Software Award for Projects of Social Benefit and Deborah Nicholson with the Award for the Advancement of Free Software. FSF president Richard M. Stallman presented the awards today in a yearly ceremony during the LibrePlanet 2019 conference at the Massachusetts Institute of Technology (MIT).</em></p> <p>The <a href="https://www.fsf.org/awards/sb-award/">Award for Projects of Social Benefit</a> is presented to a project or team responsible for applying free software, or the ideas of the free software movement, to intentionally and significantly benefit society. This award stresses the use of free software in service to humanity.</p> <p><img alt="Richard Stallman with Free Software Awards winners Deborah Nicholson and Kate Chapman" src="https://static.fsf.org/nosvn/libreplanet/2019/photos/free-software-awards/both.jpg" style="float: right; width: 250px; margin: 10px 0px 10px 10px;" /> </p> <p>This year the FSF awarded OpenStreetMap and the award was accepted by Kate Chapman, chairperson of the OpenStreetMap Foundation and co-founder of the Humanitarian OpenStreetMap Team (HOT).</p> <p>OpenStreetMap is a collaborative project to create a free editable map of the world. Founded by Steve Coast in the UK in 2004, OpenStreetMap is built by a community of over one million community members and has found its application on thousands of Web sites, mobile apps, and hardware devices. OpenStreetMap is the only truly global service without restrictions on use or availability of map information.</p> <p>Stallman emphasized the importance of OpenStreetMap in a time where geotech and geo-thinking are highly prevalent. "It has been clear for decades that map data are important. Therefore we need a free collection of map data. The name OpenStreetMap doesn't say so explicitly, but its map data is free. It is the free replacement that the Free World needs."</p> <p>Kate thanked the Free Software Foundation and the large community of contributors of OpenStreetMap. "In 2004, much of the geospatial data was either extraordinarily expensive or unavailable. Our strong community of people committed to free and open map information has changed that. Without the leadership before us from groups such as the Free Software Foundation, we would not have been able to grow and develop to the resource we are today."</p> <p>The <a href="https://www.fsf.org/awards/fs-award">Award for the Advancement of Free Software</a> goes to an individual who has made a great contribution to the progress and development of free software through activities that accord with the spirit of free software.</p> <p><img alt="Richard Stallman presenting Free Software Award to Deborah Nicholson" src="https://static.fsf.org/nosvn/libreplanet/2019/photos/free-software-awards/deb.jpg" style="float: right; width: 250px; margin: 10px 0px 10px 10px;" /> </p> <p>This year it was presented to Deborah Nicholson, who, motivated by the intersection of technology and social justice, advocates access to political information, unfettered freedom of speech and assembly, and civil liberties in our increasingly digital world. She joined the free software movement in 2006 after years of local organizing for free speech, marriage equality, government transparency and access to the political process. The Free Software Foundation recognizes her as an exceptional opinion leader, activist and community advocate.</p> <p>Deborah is the director of community operations at the <a href="https://sfconservancy.org">Software Freedom Conservancy</a>, where she supports the work of its member organizations and facilitates collaboration with the wider free software community. She has served as the membership coordinator for the <a href="https://www.fsf.org">Free Software Foundation</a>, where she created the Women's Caucus to increase recruitment and retention of women in the free software community. She has been widely recognized for her volunteer work with <a href="https://mediagoblin.org/">GNU MediaGoblin</a>, a federated media-publishing platform, and <a href="https://blog.openhatch.org/2017/celebrating-our-successes-and-winding-down-as-an-organization/">OpenHatch</a>, free software's welcoming committee. She continues her work as a founding organizer of the <a href="http://seagl.org/">Seattle GNU/Linux Conference</a>, an annual event dedicated to surfacing new voices and welcoming new people to the free software community.</p> <p>Stallman praised her body of work and her unremitting and widespread contributions to the free software community. "Deborah continuously reaches out to, and engages, new audiences with her message on the need for free software in any version of the future."</p> <p>Deborah continued: "Free software is critically important for autonomy, privacy and a healthy democracy -- but it can't achieve that if it is only accessible for some, or if it is alienating for large swathes of people. That's why it's so important that we continue surfacing new voices, making room for non-coders and welcoming new contributors into the free software community. I also find that in addition to helping us build a better, bigger movement, the work of welcoming is extremely rewarding."</p> <p>Nominations for both awards are submitted by members of the public, then evaluated by an award committee composed of previous winners and FSF founder and president Richard Stallman.</p> <p>More information about both awards, including the full list of previous winners, can be found at <a href="https://www.fsf.org/awards">https://www.fsf.org/awards</a>.</p> <h1><em>About the Free Software Foundation</em></h1> <p>The Free Software Foundation, founded in 1985, is dedicated to promoting computer users' right to use, study, copy, modify, and redistribute computer programs. The FSF promotes the development and use of free (as in freedom) software -- particularly the GNU operating system and its GNU/Linux variants -- and free documentation for free software. The FSF also helps to spread awareness of the ethical and political issues of freedom in the use of software, and its Web sites, located at <a href="https://fsf.org">https://fsf.org</a> and <a href="https://gnu.org">https://gnu.org</a>, are an important source of information about GNU/Linux. Donations to support the FSF's work can be made at <a href="https://my.fsf.org/donate">https://my.fsf.org/donate</a>. Its headquarters are in Boston, MA, USA.</p> <p>More information about the FSF, as well as important information for journalists and publishers, is at <a href="https://www.fsf.org/press">https://www.fsf.org/press</a>.</p> <h1><em>Media Contacts</em></h1> <p>John Sullivan <br /> Executive Director <br /> Free Software Foundation <br /> +1 (617) 542 5942 <br /> <a href="mailto:campaigns@fsf.org">campaigns@fsf.org</a></p> <p><em>Photo credits: Copyright Š 2019 Madi Muhlberg, photos licensed under CC-BY 4.0.</em></p> 2019-03-23T23:30:00+00:00 FSF News FSF News: OpenStreetMap and Deborah Nicholson win 2019 FSF Awards http://www.fsf.org/news/openstreetmap-and-deborah-nicholson-win-2019-fsf-awards <p><em>BOSTON, Massachusetts, USA -- Saturday, March 23, 2019-- The Free Software Foundation (FSF) recognizes <a href="https://www.openstreetmap.org/">OpenStreetMap</a> with the 2018 Free Software Award for Projects of Social Benefit and Deborah Nicholson with the Award for the Advancement of Free Software. FSF president Richard M. Stallman presented the awards today in a yearly ceremony during the LibrePlanet 2019 conference at the Massachusetts Institute of Technology (MIT).</em></p> <p>The <a href="https://www.fsf.org/awards/sb-award/">Award for Projects of Social Benefit</a> is presented to a project or team responsible for applying free software, or the ideas of the free software movement, to intentionally and significantly benefit society. This award stresses the use of free software in service to humanity.</p> <p><img alt="Richard Stallman with Free Software Awards winners Deborah Nicholson and Kate Chapman" src="https://static.fsf.org/nosvn/libreplanet/2019/photos/free-software-awards/both.jpg" style="float: right; width: 250px; margin: 10px 0px 10px 10px;" /> </p> <p>This year the FSF awarded OpenStreetMap and the award was accepted by Kate Chapman, chairperson of the OpenStreetMap Foundation and co-founder of the Humanitarian OpenStreetMap Team (HOT).</p> <p>OpenStreetMap is a collaborative project to create a free editable map of the world. Founded by Steve Coast in the UK in 2004, OpenStreetMap is built by a community of over one million community members and has found its application on thousands of Web sites, mobile apps, and hardware devices. OpenStreetMap is the only truly global service without restrictions on use or availability of map information.</p> <p>Stallman emphasized the importance of OpenStreetMap in a time where geotech and geo-thinking are highly prevalent. "It has been clear for decades that map data are important. Therefore we need a free collection of map data. The name OpenStreetMap doesn't say so explicitly, but its map data is free. It is the free replacement that the Free World needs."</p> <p>Kate thanked the Free Software Foundation and the large community of contributors of OpenStreetMap. "In 2004, much of the geospatial data was either extraordinarily expensive or unavailable. Our strong community of people committed to free and open map information has changed that. Without the leadership before us from groups such as the Free Software Foundation, we would not have been able to grow and develop to the resource we are today."</p> <p>The <a href="https://www.fsf.org/awards/fs-award">Award for the Advancement of Free Software</a> goes to an individual who has made a great contribution to the progress and development of free software through activities that accord with the spirit of free software.</p> <p><img alt="Richard Stallman presenting Free Software Award to Deborah Nicholson" src="https://static.fsf.org/nosvn/libreplanet/2019/photos/free-software-awards/deb.jpg" style="float: right; width: 250px; margin: 10px 0px 10px 10px;" /> </p> <p>This year it was presented to Deborah Nicholson, who, motivated by the intersection of technology and social justice, advocates access to political information, unfettered freedom of speech and assembly, and civil liberties in our increasingly digital world. She joined the free software movement in 2006 after years of local organizing of free speech, marriage equality, government transparency and access to the political process. The Free Software Foundation recognizes her as an exceptional opinion leader, activist and community advocate.</p> <p>Deborah is the director of community operations at the <a href="https://sfconservancy.org">Software Freedom Conservancy</a>, where she supports the work of its member organizations and facilitates collaboration with the wider free software community. She has served as the membership coordinator for the <a href="https://www.fsf.org">Free Software Foundation</a>, where she created the Women's Caucus to increase recruitment and retention of women in the free software community. She has been widely recognized for her volunteer work with <a href="https://mediagoblin.org/">GNU MediaGoblin</a>, a federated media-publishing platform, and <a href="https://blog.openhatch.org/2017/celebrating-our-successes-and-winding-down-as-an-organization/">OpenHatch</a>, free software's welcoming committee. She continues her work as a founding organizer of the <a href="http://seagl.org/">Seattle GNU/Linux Conference</a>, an annual event dedicated to surfacing new voices and welcoming new people to the free software community.</p> <p>Stallman praised her body of work and her unremitting and widespread contributions to the free software community. "Deborah continuously reaches out to, and engages, new audiences with her message on the need for free software in any version of the future."</p> <p>Deborah continued: "Free software is critically important for autonomy, privacy and a healthy democracy -- but it can't achieve that if it is only accessible for some, or if it is alienating for large swathes of people. That's why it's so important that we continue surfacing new voices, making room for non-coders and welcoming new contributors into the free software community. I also find that in addition to helping us build a better, bigger movement, the work of welcoming is extremely rewarding."</p> <p>Nominations for both awards are submitted by members of the public, then evaluated by an award committee composed of previous winners and FSF founder and president Richard Stallman.</p> <p>More information about both awards, including the full list of previous winners, can be found at <a href="https://www.fsf.org/awards">https://www.fsf.org/awards</a>.</p> <h1><em>About the Free Software Foundation</em></h1> <p>The Free Software Foundation, founded in 1985, is dedicated to promoting computer users' right to use, study, copy, modify, and redistribute computer programs. The FSF promotes the development and use of free (as in freedom) software -- particularly the GNU operating system and its GNU/Linux variants -- and free documentation for free software. The FSF also helps to spread awareness of the ethical and political issues of freedom in the use of software, and its Web sites, located at <a href="https://fsf.org">https://fsf.org</a> and <a href="https://gnu.org">https://gnu.org</a>, are an important source of information about GNU/Linux. Donations to support the FSF's work can be made at <a href="https://my.fsf.org/donate">https://my.fsf.org/donate</a>. Its headquarters are in Boston, MA, USA.</p> <p>More information about the FSF, as well as important information for journalists and publishers, is at <a href="https://www.fsf.org/press">https://www.fsf.org/press</a>.</p> <h1><em>Media Contacts</em></h1> <p>John Sullivan <br /> Executive Director <br /> Free Software Foundation <br /> +1 (617) 542 5942 <br /> <a href="mailto:campaigns@fsf.org">campaigns@fsf.org</a></p> <p><em>Photo credits: Copyright Š 2019 Madi Muhlberg, photos licensed under CC-BY 4.0.</em></p> 2019-03-23T22:59:48+00:00 FSF News