The first version of LIPS Scheme had regex based tokenizer. It was using a single regex to split the input string into tokens. In this article I will show the internals of the new Lexer in LIPS Scheme.
see the rest of the article
The first version of LIPS Scheme had regex based tokenizer. It was using a single regex to split the input string into tokens. In this article I will show the internals of the new Lexer in LIPS Scheme.
Hey all, the video of my FOSDEM talk on Whippet is up:
Slides here, if that’s your thing.
I ended the talk with some puzzling results around generational collection, which prompted yesterday’s post. I don’t have a firm answer yet. Or rather, perhaps for the splay benchmark, it is to be expected that a generational GC is not great; but there are other benchmarks that also show suboptimal throughput in generational configurations. Surely it is some tuning issue; I’ll be looking into it.
Happy hacking!
A SRFI 9-style
define-record-type
is specified which allows subtyping while preserving encapsulation, in that the field structure of supertypes remains an implementation detail with which subtypes need not concern themselves.
Today we're looking at the results from the Contributor section of the Guix User and Contributor Survey (2024). The goal was to understand how people contribute to Guix and their overall development experience. A great development experience is important because a Free Software project's sustainability depends on happy contributors to continue the work!
See Part 1 for insights about Guix adoption, and Part 2 for users overall experience. With over 900 participants there's lots of interesting insights!
The survey defined someone as a Contributor if they sent patches of any form. That includes changes to code, but also other improvements such as documentation and translations. Some Guix contributors have commit access to the Guix repository, but it's a much more extensive group than those with commit rights.
Of the survey's 943 full responses, 297 participants classified themselves as current contributors and 58 as previous contributors, so 355 participants were shown this section.
The first question was (Q22), How many patches do you estimate you've contributed to Guix in the last year?
Number of patches | Count | Percentage |
---|---|---|
1 — 5 patches | 190 | 61% |
6 — 20 patches | 60 | 19% |
21 — 100 patches | 36 | 12% |
100+ patches | 27 | 9% |
None, but I've contributed in the past | 42 | N/A |
Note that the percentages in this table, and throughout the posts, are rounded up to make them easier to refer to.
The percentage is the percentage of contributors that sent patches in the last year. That means the 42 participants who were previous contributors have been excluded.
Figure 13 shows this visually:
As we can see many contributors send a few patches (61%), perhaps updating a package that they personally care about. At the other end of the scale, there are a few contributors who send a phenomenal number of patches.
It's interesting to investigate the size of Guix's contributor community. While running the survey I did some separate research to find out the total number of contributors. I defined an Active contributor as someone who had sent a patch in the last two years, which was a total of 454 people. I deduplicated by names, but as this is a count by email address there may be some double counting.
This research also showed the actual number of patches that were sent by contributors:
Number of patches | Count | Percentage of Contributors |
---|---|---|
1 — 5 patches | 187 | 41% |
6 — 20 patches | 102 | 22% |
21 — 100 patches | 91 | 20% |
100+ patches | 74 | 16% |
Figure 14 shows this:
Together this give us an interesting picture of the contributor community:
The survey also asked contributors (Q23), How do you participate in the development of Guix?
Type of contribution | Count | Percentage |
---|---|---|
Develop new code (patches services, modules, etc) | 312 | 59% |
Review patches | 65 | 12% |
Triage, handle and test bugs | 65 | 12% |
Write documentation | 38 | 7% |
Quality Assurance (QA) and testing | 23 | 4% |
Organise the project (e.g. mailing lists, infrastructure etc) | 16 | 3% |
Localise and translate | 12 | 2% |
Graphical design and User Experience (UX) | 2 | 0.4% |
Figure 15 shows this as a pie chart (upping my game!):
Of course, the same person can contribute in multiple areas: as there were 531 responses to this question, from 355 participants, we can see that's happening.
Complex projects like Guix need a variety of contributions, not just code. Guix's web site needs visual designers who have great taste, and certainly a better sense of colour than mine! We need documentation writers to provide the variety of articles and how-tos that we've seen users asking for in the comments. The list goes on!
Unsurprisingly, Guix is code heavy with 60% of contributors focusing in this area, but it's great to see that there are people contributing across the project. Perhaps there's a role you can play? ... yes, you reading this post!
FOSS projects exist on a continuum of paid and unpaid contribution. Many projects are wholly built by volunteers. Equally, there are many large and complex projects where the reality is that they're built by paid developers — after all, everyone needs to eat!
To explore this area the survey then asked (Q24), Are you paid to contribute to Guix?
The results show:
Type of compensation | Count | Percentage |
---|---|---|
I'm an unpaid volunteer | 328 | 94% |
I'm partially paid to work on Guix (e.g. part of my employment or a small grant) | 19 | 5% |
I'm full-time paid to work on Guix | 1 | 0.3% |
No answer | 7 | N/A |
We can see this as Figure 16 :
Some thoughts:
Ensuring contributors continue to be excited and active in the project is important for it's health. Ultimately, fewer developers means less can be done. In volunteer projects there's always natural churn as contributor's lives change. But, fixing any issues that discourages contributors is important for maintaining a healthy project.
Question 25 was targeted at the 59 participants who identified themselves as Previous Contributors. It asked, You previously contributed to Guix, but stopped, why did you stop?
The detailed results are:
Category | Count | Percentage of Previous Contributors |
---|---|---|
External circumstances (e.g. other priorities, not enough time, etc) | 28 | 35% |
Response to contributions was slow and/or reviews arduous | 12 | 15% |
The contribution process (e.g. email and patch flow) | 11 | 14% |
Developing in Guix/Guile was too difficult (e.g. REPL/developer tooling) | 6 | 8% |
Guix speed and performance | 3 | 4% |
Project co-ordination, decision making and governance | 2 | 3% |
Lack of appreciation, acknowledgement and/or loneliness | 2 | 3% |
Negative interactions with other contributors (i.e. conflict) | 2 | 3% |
Burnt out from contributing to Guix | 2 | 3% |
Learning Guix internals was too complex (e.g. poor documentation) | 1 | 1% |
Social pressure of doing reviews and/or turning down contributions | 1 | 1% |
Other | 10 | 13% |
Figure 17 shows this graphically:
There were 80 answers from the 59 participants so some participants chose more than one reason.
Q26 asked contributors to grade their likelihood of contributing further, this is essentially a satisfaction score.
The question was, If you currently contribute patches to Guix, how likely are you to do so in the future?
Category | Count | Percentage |
---|---|---|
Definitely not | 7 | 2% |
Probably not | 34 | 10% |
Moderately likely | 80 | 23% |
Likely | 111 | 31% |
Certain | 123 | 35% |
Figure 18 shows this graphically:
Out of the audience of current and previous contributors, 355 in total:
The survey then explored areas of friction for contributors. Anything that reduces friction should increase overall satisfaction for existing contributors.
The question (Q27) was, What would help you contribute more to the project?
Answer | Count | Percentage |
---|---|---|
Timely reviews and actions taken on contributions | 203 | 20% |
Better read-eval-print loop (REPL) and debugging | 124 | 12% |
Better performance and tuning (e.g. faster guix pull) | 102 | 10% |
Better documentation on Guix's internals (e.g. Guix modules) | 100 | 10% |
Guidance and mentoring from more experienced contributors | 100 | 10% |
Addition of a pull request workflow like GitHub/Gitlab | 90 | 9% |
Improved documentation on the contribution process | 77 | 8% |
Nothing, the limitations to contributing are external to the project | 65 | 7% |
More acknowledgement of contributions | 40 | 4% |
More collaborative interactions (e.g. sprints) | 41 | 4% |
Other | 56 | 6% |
Figure 19 bar chart visualises this:
The 355 contributors selected 933 options for this question, so many of them selected multiple aspects that would help them to contribute more to the project.
Conclusions we can draw are:
Jumping ahead, the last question of the contributor section (Q30) was a comment box. It asked, Is there anything else that you would do to improve contributing to Guix?
The full list of comments from Q27, and Q30 are available and worth reading (or at least scanning!).
Looking across all of them I've created some common themes - picking a couple of example comments to avoid repetition:
It's common in FOSS projects to focus on the technical issues, but Free Software is a social endeavour where organisational and social aspects are just as important. Q28 focused on the social and organisational parts of contribution by asking, What organisational and social areas would you prioritise to improve Guix?
This was a ranked question where participants had to prioritise their top 3. The rationale for asking it in this way was to achieve prioritisation.
It's useful to look at the results in two ways, first the table where participants set their highest priority (Rank 1):
Category | Count | Percentage |
---|---|---|
Improve the speed and capacity of the contribution process | 213 | 63% |
Project decision making and co-ordination | 36 | 11% |
Fund raising | 22 | 7% |
Request-for-comments (RFC) process for project-wide decision making | 17 | 5% |
Regular releases (i.e. release management) | 19 | 6% |
In-person collaboration and sprints | 8 | 2% |
Promotion and advocacy | 23 | 7% |
Out of the 355 participants in this section, 338 answered this question and marked their highest priority.
Figure 20 shows it as a pie chart:
This second table shows how each category was prioritied across all positions:
Category | Rank 1 | Rank 2 | Rank 3 | Overall priority |
---|---|---|---|---|
Project decison making and co-ordination | 2 | 1 | 3 | 1 |
Promotion and advocacy | 3 | 3 | 1 | 2 |
Fund raising | 4 | 5 | 2 | 3 |
Request-for-comments (RFC) process for project-wide decision making | 6 | 2 | 4 | 4 |
Improve the speed and capacity of the contribution process | 1 | 6 | 6 | 5 |
Regular releases (i.e. release management) | 5 | 4 | 5 | 6 |
In-person collaboration and sprints | 7 | 7 | 7 | 7 |
Figure 21 shows this as a stacked bar chart. Each of the categories is the position for a rank (priority), so the smallest overall priority is the most important:
Looking at these together:
The partner question was Q29 which asked, What technical areas would you prioritise to improve Guix overall?
This was also a ranked question where participants had to prioritise their top 3.
Category | Count | Percentage |
---|---|---|
Debugging and error reporting | 63 | 18% |
Making the latest version of packages available (package freshness) | 50 | 14% |
Automate patch testing and acceptance | 42 | 12% |
Runtime performance (speed and memory use) | 36 | 10% |
Package reliability (e.g. installs and works) | 30 | 9% |
Contribution workflow (e.g. Pull Requests) | 26 | 8% |
More packages (more is better!) | 23 | 7% |
Improving Guix's modules | 20 | 6% |
Project infrastructure (e.g. continuous integration) | 20 | 6% |
Guix System services | 12 | 3% |
Guix Home services | 10 | 3% |
Stable releases (e.g. regular tested releases) | 8 | 2% |
Focused packages (fewer is better!) | 5 | 1% |
There were 345 answers for the highest priority, 327 for the second rank and 285 for the third rank — so not as significant a drop-off as for the social question. Figure 22 shows this as a bar chart:
As before I've converted them to priorities in each rank. The smallest overall score is the highest priority:
Category | Rank 1 | Rank 2 | Rank 3 | Overall priority |
---|---|---|---|---|
Automate patch testing and acceptance | 3 | 2 | 1 | 1 |
Runtime performance (speed and memory use) | 4 | 1 | 3 | 2 |
Debugging and error reporting | 1 | 4 | 7 | 3 |
Project infrastructure (e.g. continuous integration) | 9 | 3 | 2 | 4 |
Contribution workflow (e.g. Pull Requests) | 6 | 5 | 5 | 5 |
Making the latest version of packages avalable (package freshness) | 2 | 8 | 6 | 6 |
Package reliability (e.g. installs and works) | 5 | 7 | 4 | 7 |
More packages (more is better!) | 7 | 6 | 10 | 8 |
Guix Home services | 11 | 10 | 8 | 9 |
Improving Guix's modules | 8 | 12 | 9 | 10 |
Guix System services | 10 | 9 | 11 | 11 |
Stable releases (e.g. regular tested releases) | 12 | 11 | 12 | 12 |
Focused packages (fewer is better!) | 13 | 13 | 13 | 13 |
Figure 23 shows this as a stacked bar chart.
Some things that are interesting from this question:
That completes our review of the contributor section! Here are the key insights I draw:
We've really squeezed the juice from the lemon over these three posts — but maybe you'd like to dig into the data and do your own analysis? If so head over to the Guix Survey repository where you'll find all the data available to create your own plots!
This SRFI defines the procedure
generate-symbol
. Each time it is invoked, the procedure returns a new symbol whose name cannot be guessed. The returned symbol is a standard symbol for all purposes; it obeys write/read invariance and it is equal to another symbol if and only if their names are spelt the same.
Tagged procedures are procedures with boxes attached, which can be used to create applicable records and other abstractions. This SRFI proposes a variant with the notion of a tagging protocol, analogous to a record type definition, for ensuring encapsulation and security for tagged procedures.
Scheme's exception system is extended so that exception handlers gain access to the delimited continuation representing the rest of the computation of the call of the thunk guarded by the handler. Algebraic effect handlers can be directly expressed in this extended exception system. The system directly implements the
shift0
/reset0
delimited control operators. It is well known that other delimited control operators likeprompt0
/control0
orreset
/shift
are expressible inshift0
/reset0
(and vice versa).
We are thrilled to announce a long-awaited goal: Goblins in the browser!!
Hoot can now be used to compile Goblins and Goblins-using applications to WebAssembly! In fact, we even have support for our distributed programming protocol, OCapN working in the browser with Goblins-on-Hoot! Goblins now compiles to Webassembly in Hoot from the same codebase used to run Goblins in Guile's own virtual machine. This is a major step forward toward getting this software in the hands of everyday users. We hope it unlocks a new wave of innovation about what secure collaboration can look like.
As part of this release, we are introducing the websocket netlayer which will allow browser-based applications to easily connect with one another!
Also, a number of performance improvements makes this release the fastest Goblins ever!
Let's get into it!
Long-time readers may remember the goblin-chat demo we've shown off several times before:
Above you can see two Guile goblin-chat programs talking with a Racket
based goblin-chat program, demonstrating two completely different
language runtimes communicating over OCapN via Goblins. The impressive
thing about goblin-chat
is that it's only 150 lines of Goblins code
to implement both the user code and chatroom code for a peer-to-peer
chat program which authenticates messages as they come in!
Cool enough, but didn't we say Goblins works in the browser now? Wouldn't it be cool if you could try two goblin-chat programs communicating in your browser over OCapN... right here, on this page?!
Well, behold!
Try sending messages between Alice and Bob!
If you don't see anything, note that this demo requires a recent
browser supporting all the WebAssembly extensions used by Hoot,
including Wasm GC and tail call support. Firefox ought to just work.
Chrome needs the enable-experimental-web-platform-features
flag
enabled in chrome://flags
. Safari is not expected to work properly
at this time.
This is the VERY SAME 150 line goblin-chat program shown in the
previous gif, but compiled to Hoot and running in the browser!
(Source code for the running Webassembly code executing above;
only the ^chatroom
and spawn-user-controller-pair
code are
responsible for the chat protocol, the rest of the code is to provide
a user interface.)
These messages really are being delivered through OCapN too. We have a simplified abstract netlayer which simulates the network which we're using here. However, all the ordinary OCapN protocol operations are occuring with each message transmitted from one user to the other. This isn't only real Goblins in the browser, this is real OCapN in the browser too!
If you've been paying close attention, you may have noticed that this release of Goblins was directly preceded by the Hoot 0.6.0 release. (It's also no coincidence that the Hoot 0.6.0 release art showed the Goblins mascot and the Hoot mascot talking about going on an adventure and this release's release art shows them flying together in the sky!) Hoot 0.6.0 had a large amount of work put into it which is useful far beyond Goblins, but Hoot 0.6.0 and Goblins 0.15.0 were actively developed together. This has been many months of hard work from our team, and we are proud to see it pay off. Goblins in the browser is possible at last, opening the door for a future where Spritely's technology is in the hands of everyone!
Moreover, the foreign function interface feature of Hoot allows developers to access any part of the enormous javascript ecosystem within a Goblins app. That includes reactive frameworks, data processing, and visualization libraries that we think will benefit user experiences.
We are also releasing a new netlayer specifically designed for browsers and everyday use: WebSockets!
The WebSocket NetLayer is the glue between Goblins applications written for Guile and Hoot. It is currently the first NetLayer available for both and will allow communication between them!
Having two different users across two different browsers talk to each other does require an intermediary. Thankfully our prelay netlayer works well together with the websockets netlayer, allowing users across browser pages to talk to each other.
However, our prelay netlayer is called "prelay" for a reason: it's the "pre-relay" netlayer. The actual "relay" netlayer we would like to provide for Goblins' OCapN code should be properly end-to-end encrypted. The specification for how to do this still needs to be written and agreed upon by the our team and others in the OCapN group so it can be used widely across OCapN implementations.
Because the prelay is not end-to-end encrypted, prelay providers can surveil and modify communication on the wire. This is a known concern, and we are going to use this current implementation as a stepping stone to derive the correct and fully end-to-end encrypted relay netlayer we still have planned.
This release of Goblins has a major speedup: 1.2-2x performance improvements for all Goblins code! Even more performance improvements are planned for upcoming releases; this is just the beginning!
Excited about Goblins on Hoot, or any of our other projects? Consider showing your appreciation with a donation! We recently hit our initial fundraising goal of $80,000 USD and announced a stretch goal. For the stretch goal, we will use Hoot to build a learning environment for Goblins and advance Hoot’s live hacking abilities in the process.
Monthly supporters at the silver, gold, and diamond tiers will have their names featured in the credits of Cirkoban, a small web game built with Hoot, as a display of our gratitude.
Thank you to everyone who has supported us so far!
This release also includes a number of other bugfixes and minor features. See the NEWS file for more information!
As usual, if you're using Guix, you can upgrade to 0.15.0 by using:
guix pull
guix install guile-goblins
Otherwise, you can find the tarball on our release page.
As a little bonus, if you like the release artwork, you can get a 4k resolution version to use as a wallpaper if you like! The artwork is made in Blender and its Grease Pencil tool; you can also download the .blend file! (Observant readers of our blog may notice that this release art is a sequel to the Hoot 0.6.0 release art... in the previous artwork, the characters discussed going on an adventure together, and here they are!)
If you're making something with Goblins or want to contribute to Goblins itself, be sure to join our community at community.spritely.institute! Thanks for following along and hope to see you there!
by Christine Lemmer-Webber, Amy Grinn (contact@spritely.institute) at Friday, January 24, 2025
The results from the Guix User and Contributor Survey (2024) are in and we're digging into them in a series of posts! Check out the first post for the details of how users initially adopt Guix, the challenges they find while adopting it and how important it is in their environment. In this part, we're going to cover how use of Guix matures, which parts are the most loved and lots of other details.
As a reminder there were 943 full responses to the survey, of this 53% were from users and 32% were from contributors.
The middle section of the Survey explored how users relationship with Guix matured, which parts they used and where they struggled. Question 11 asked, Which parts of Guix have you used on top of another Linux distribution?
As a reminder a third (36%) of participants adopted Guix by using it as a package manager on top of another GNU/Linux distribution. The detailed results were:
Capability | Use | Stopped | Never used |
---|---|---|---|
Package manager and packages (guix package) | 48% | 26% | 24% |
Dotfiles and home environment management (guix home) | 17% | 11% | 70% |
Isolated development environments (guix shell) | 41% | 18% | 39% |
Package my own software projects | 28% | 9% | 61% |
Deployment tool (guix deploy, guix pack) | 13% | 7% | 78% |
Guix System (i.e. VM on top of your distro) | 15% | 15% | 68% |
Note that all the percentages in this table, and throughout the posts are rounded to make them easier to refer to.
The next question (Q12) asked participants, Which parts of Guix have you used on top of Guix System?
As a reminder, an earlier question (Q5) determined that 46% initially adopted Guix as a GNU/Linux distro in a graphical desktop configuration, and 5% as a GNU/Linux distro in a server configuration. The results:
Capability | Use | Stopped | Never used |
---|---|---|---|
Package manager and packages (guix package) | 64% | 17% | 17% |
Dotfiles and home environment manager (guix home) | 48% | 9% | 41% |
Isolated development environments (guix shell) | 36% | 10% | 21% |
Package my own software projects | 40% | 9% | 49% |
Deployment tool (guix deploy, guix pack) | 19% | 8% | 71% |
This gives us an interesting picture of how Guix usage develops:
The survey then asked (Q15), How have you run Guix System?
This was a multiple choice question, so in total there were 1508 answers from the 943 participants, consequently we can assume that some users deploy Guix System in multiple configurations:
Deployment type | Count | Percentage |
---|---|---|
Graphical desktop in a VM | 275 | 29% |
Graphical desktop on laptop/workstation hardware | 691 | 73% |
Server on server hardware | 223 | 24% |
Server in a VM (e.g. KVM) | 169 | 18% |
Server in a container (e.g. Docker/Singularity) | 53 | 6% |
Public Cloud (e.g. AWS) | 57 | 6% |
Other | 40 | 4% |
In the Other category there were mentions of using it on different SOC boards (e.g. RockPro64), on WSL2 and on different hosting providers (e.g. Digital Ocean, Hetzner).
Figure 7 shows the break down as a bar chart:
Some thoughts from this question:
The survey then asked (Q16), Which architectures do you use Guix on?
Again this was multiple choice, there were 1192 answers from 943 completed surveys:
Category | Count | Percentage |
---|---|---|
x86_64 (modern Intel/AMD hardware) | 925 | 98% |
IA-32 (32-bit i586 / i686 for older hardware) | 25 | 3% |
ARM v7 (armhf 32-bit devices, Raspberry Pi 1 - Zero) | 36 | 4% |
AArch64 (ARM64, Raspberry Pi Zero 2, 3 and above) | 177 | 19% |
POWER9 (powerpc64le) | 15 | 2% |
IA-32 with GNU/Hurd (i586-gnu) | 14 | 1% |
As we might expect x86_64 is the most popular, but there are quite a few AArch64 users as well. There are various comments in the survey about challenges when using different architectures (e.g substitute availability, cross-compiling challenges), see the linked comments throughout these posts for more.
Proprietary drivers is an interesting topic in the Guix community. For Q17 the survey asked, Do you use proprietary drivers in your Linux deployments?
The goal was to understand driver usage across all Linux usage, whether when using Guix or another Distribution. As this was a multiple choice question, there were 1275 answers from the 943 participants.
Category | Count | Percentage |
---|---|---|
No, I don't use proprietary drivers | 191 | 20% |
Yes, I use Nonguix as part of Guix System | 622 | 66% |
Yes, I use proprietary drivers on other GNU/Linux distributions | 462 | 49% |
Figure 8 shows it as a bar chart:
The next question was (Q18), Do you use other methods and channels to install applications?
One of the advantages of Guix is that it's a flexible system where users can create their own packages and share them with the community. Additionally, there are other methods for installing and using applications such as Flatpak. However, we already know that during adoption some users struggle to find the applications that they need. This question explores whether that changes as usage matures.
The results were:
Source | Count | Percentage |
---|---|---|
I only use applications from Guix | 234 | 25% |
Packages from my host Linux distro | 352 | 37% |
Nix service on Guix System | 124 | 13% |
Nonguix channel (proprietary apps and games) | 607 | 64% |
Guix Science channel | 127 | 14% |
My own Guix channel | 442 | 47% |
Guix channels provided by other people | 303 | 32% |
Flatpak | 334 | 35% |
Other | 111 | 12% |
Figure 9 shows this visually:
Some thoughts:
The survey asked participants (Q19), How satisfied are you with Guix as a Guix user?
This is probably the most important question in the entire survey, since happy users will continue to use and contribute to the project.
Category | Count | Percentage |
---|---|---|
Very dissatisfied | 31 | 3% |
Dissatisfied | 77 | 8% |
Neutral | 180 | 19% |
Satisfied | 463 | 49% |
Very satisfied | 192 | 20% |
The bar chart is Figure 10:
For Q20 the survey asked, Which areas limit your satisfaction with Guix?
The detailed results:
Category | Count | Percentage |
---|---|---|
Difficulties with Guix tools user experience | 192 | 20% |
Difficulties using declarative configuration | 157 | 17% |
Missing or incomplete services (whether Guix Home or Guix System) | 374 | 40% |
Overall Linux complexity (i.e. not specific to Guix) | 92 | 10% |
Hardware drivers not included | 312 | 33% |
Guix runtime performance (e.g. guix pull) | 449 | 48% |
Reference documentation (i.e. the manual) | 195 | 21% |
Shortage of informal guides, examples and videos | 369 | 39% |
Error messages and debugging | 372 | 39% |
Nothing, it's perfect! | 40 | 4% |
Other | 213 | 23% |
As a visual graph:
The first thing to note is that there were 2765 entries from our 943 survey completions, so users have challenges in multiple categories.
There were also 213 comments in the Other category, the full list of comments is available. As before I've grouped the comments — at this point we're starting to see consistency in the grouping so to avoid a lot of repetition I've only put in one example from each one:
Not all comments fit into a specific theme, I've pulled out some other interesting ones:
The survey then asked, (Q21) Which areas should Guix's developers improve so you can use Guix more?
This question was done as a ranking question where participants had to prioritise their top 3. The rationale for asking it in this way was to achieve clarity over prioritisation.
It's useful to look at this in two ways, first the table where participants ranked their highest priority:
Area — Rank 1 | Count | Percentage |
---|---|---|
Making the latest versions of packages available (package freshness) | 149 | 16% |
Performance and tuning (faster guix pull) | 112 | 12% |
Make Guix easier to learn (more docs!) | 105 | 11% |
Package reliability (e.g. installs and works) | 92 | 10% |
Hardware support (drivers) | 91 | 10% |
More packages (more is better!) | 87 | 9% |
Software developer tooling (guix shell with editors, debuggers, etc) | 58 | 6% |
Make Guix easier to use | 57 | 6% |
Guix System services | 37 | 4% |
Stable releases (e.g. regular tested releases) | 35 | 4% |
Community and communications | 33 | 4% |
Guix Home services | 24 | 3% |
Focused high-quality packages (fewer is better!) | 15 | 2% |
This second table shows how each element was ranked across all positions, reordered to show the overall prioritisation:
Area | Rank 1 | Rank 2 | Rank 3 | Overall score |
---|---|---|---|---|
Performance and tuning (faster guix pull) | 2 | 1 | 1 | 4 |
Make Guix easier to learn (more docs!) | 3 | 2 | 2 | 7 |
Making the latest versions of packages available (package freshness) | 1 | 4 | 3 | 8 |
More packages (more is better!) | 6 | 3 | 4 | 13 |
Package reliability (e.g. installs and works) | 4 | 5 | 6 | 15 |
Hardware support (drivers) | 5 | 6 | 7 | 18 |
Software developer tooling (guix shell with editors, debuggers, etc) | 7 | 7 | 5 | 19 |
Guix System services | 9 | 10 | 8 | 27 |
Make Guix easier to use | 8 | 9 | 11 | 28 |
Guix Home services | 12 | 8 | 9 | 29 |
Community and communications | 11 | 12 | 10 | 33 |
Stable releases (e.g. regular tested releases | 10 | 11 | 13 | 34 |
Focused high-quality packages (fewer is better!) | 13 | 13 | 12 | 38 |
Some thoughts on what this means:
The next section of the survey was for Contributors, we'll cover that in the third post in the series. After the contribution section Q32 asked all users, How likely are you to financially support the Guix project?
As a volunteer project, with no corporate sponsors, the rationale for asking this question is that some aspects of the project (e.g. infrastructure and sponsored work) require finance. The results were:
Category | Count | Percentage |
---|---|---|
Unable (e.g. don't have money to do so) | 280 | 30% |
Would not (e.g. have the money to do so, but would not) | 40 | 4% |
Unlikely | 145 | 15% |
Moderately likely | 341 | 36% |
Very likely | 133 | 14% |
No answer | 4 | 0.42% |
As a graphical bar chart:
The results tell us that about 50% of users would be willing and able to financially contribute to Guix. There's also a significant set of users who are unable to do so, and one of the clear benefits of Free Software is that we can all use it without charge!
Having asked lots of structured questions and ones about challenges the last question (Q33) was, What do you love about Guix?
There were 620 answers, so 65% of the participants wrote something — that's a lot of love for Guix!
There were lots of positive comments about how friendly and helpful the Guix community is; the joys of using Scheme/Lisp and Guile; the importance of user-focused Free Software; and the benefits of the declarative approach.
All the comments are available to read, and I encourage you to have a scroll through them as they're very uplifting!
A few I pulled out:
In this post we've looked at the questions the survey asked participants about their use of Guix. And as a reminder, there were over 900 participants who completed the survey.
The main conclusions I draw from this part are:
If you missed it, the first post in this series covers how users adopt Guix. And, the next post will cover how Contributors interact with the project.
An uninterned symbol is not the same as any other symbol, even one with the same name. These symbols are useful in macro programming and in other situations where guaranteed-unique names are needed. A survey of uninterned and uniquely-named symbols in Scheme is also provided.
The Daylight DC-1 just got a “Calm Tech certificatiton” but I think there’s something missing. (Hopefully fixable in software so no-one need to throw out their new plastic ewaste devices just yet.)
Apps that can stay still, that can show me one page at a time and then calmly go to the next or previous page, that’s relaxing. Discrete steps and cleary defined modes. That calms me down.
Apps that are all gradiated and fiddly and zoomy and jittery and thinks my palm means that I want to zoom and scroll, that freaks me the heck out.
E-ink’s calming nature isn’t just the screen tech in light and space; it’s also the reduced motion in time. The microperforated RLCD that the DC-1 uses can handle animation better than e-ink can, but that doesn’t mean that it should animate everything. Using that 60hz power to reduce lag on text input would’ve been awesome and there are other apps, like music making apps, where a fast display comes in handy.
As long as the UI itself is stable and knows how to chill the heck out for three seconds and isn’t hyper jittery.
Some of us broken-hearted suckers in the 21th century need to juggle a lot of data. A fast screen can help with that. A fast screen can also hinder that, if it asks us to do the juggling on a rolling table on a moving train on a tilting pinball table.
This is why epub readers are better than browsers even on the most glaring LCD of all time: it show you one page at a time instead of scrolling a few sentences here and there. I don’t get why browsers even in our modern day still can’t do that. I have EinkBro which makes page down and page up really accessible which is great but at the end of the day it’s still a browser page down that has some overlapping sentences meaning I have to reread every single page I turn, or worse, on some sites there’s elided gaps between the pagination so I still have to manually scroll up a few lines for every page. It’s a big ask of EinkBro to fix that since it’s mostly just a UI wrapper on Chrome, but it’s so strange to me that clicking on the “page to epub” button and opening it in an epub reader (like KOreader) is so much better and so much more calming.
I don’t wanna scroll scroll scroll, I want to turn between separate pages with no overlapping text; a UI design decision the printed book mastered centuries ago, thankfully or we’d still read our potboilers and smutty romance novels on scroll tubes. And then zooming and panning should be a deliberate choice, not the whim of a misplaced palm.
Inkscape is also really bad at this, for those holding out for a FOSS example. One slipped twitchy hand and I’m zoomed and panned all the way to heck.
Most writing modes in Emacs are great at this. It doesn’t move the page one line for every line I write, it consistently jumps up half a screen when I’m at the end of the previous half-screen. The fact that it’s half a screen instead of a full screen was hard to get used to but since it’s so consistent about it, that’s calming too, and it is a good thing that I can see what I just wrote so I have some context instead of just writing one word at a time in a vacuum.
by Idiomdrottning (sandra.snan@idiomdrottning.org) at Wednesday, January 22, 2025
We are excited to announce the release of Hoot 0.6.0! Hoot is a Scheme to WebAssembly compiler backend for Guile, as well as a general purpose WebAssembly toolchain. In other words, Scheme in the browser!
If you like what Spritely is doing with Hoot or any of our other projects, please consider showing your appreciation with a donation! We recently hit our initial fundraising goal of $80,000 USD and announced a stretch goal. For the stretch goal, we will use Hoot to build a learning environment for Goblins and advance Hoot’s live hacking abilities in the process.
Monthly supporters at the silver, gold, and diamond tiers will have their names featured in the credits of Cirkoban, a small web game built with Hoot, as a display of our gratitude.
Okay, back to the show!
Much improved weak hashtable support in (hoot hashtables)
. Weak
key hashtables have been reimplemented in Scheme rather than using
JavaScript’s WeakMap
and are now
iterable,
as they are in Guile. Weak key hashtables now have company: Weak
value and doubly weak hashtables have been added. The Guile legacy
hashtable API has likewise been updated to support all forms of weak
hashtables. As a bonus, we also have weak vectors thanks to a
contribution from Vivianne Langdon.
Hoot now implements enough of Guile (or provides sufficient alternatives for APIs that are not web compatible) to compile nearly all of the Goblins source code. Stay tuned for another blog post about this progress!
As of December 9th, 2024, WebKit now ships with Wasm GC and tail calls enabled by default. These were the remaining blocker issues for running Hoot programs on Safari and other WebKit-derived browsers. Previously, Hoot couldn’t run on iOS because Safari is the only browser available on that platform. That said, we think there might be an issue with WebKit’s Wasm implementation. We’d like to gather more data so please let us know how things work for you on WebKit!
Can I interest you in some eval
?
Read on for the full release notes.
Added (hoot expander)
module with a port of Guile’s psyntax
.
This was a major undertaking by Andy Wingo but we didn’t have time
to hook it up to eval
for this release. Stay tuned!
Added (hoot finalization)
module.
Added (hoot primitive-eval)
module for evaluating macro-expanded,
lowered Tree-IL.
Added (hoot environments)
module.
Added (hoot modules)
module.
Added (hoot weak-refs)
module.
Added (ice-9 weak-vector)
module. Thanks to Vivianne Langdon.
Reimplemented weak key and added weak value and doubly weak
hashtables to (hoot hashtables)
.
Added weak hashtable support to legacy Guile hashtable API.
Added initial implementation of applicable records, undocumented for the moment while we figure out what the public API should be.
File ports now track their line/column.
syntax->datum
and datum->syntax
now work on the Wasm target.
Added read-syntax
.
Added --user-imports
flag to guild compile-wasm
for user code
that defines Wasm function imports.
Added support for syntax transformers on the Wasm target.
Added vector-binary-search
to (hoot vectors)
.
Added partial, temporary SRFI-14 implementation (character sets).
Added partial implementation of inet-pton
to (guile)
.
Switched eval
to use modules as representation of environments.
Added partial implementation of while
to (guile)
.
Replaced define-inlinable
stub with real implementation.
Added string-rindex
, string-trim
, string-trim-both
,
string-trim-right
, and string-reverse
to (guile)
.
capture-stack
, stack-height
, and print-backtrace
are now
exported from (hoot error-handling)
.
Added any
, every1
, every
, filter-map
, and find
to temporary SRFI-1 module (eventually
you will just import the one from Guile).
Added &external-error
exception type.
Added const
to (guile)
.
Added issue-deprecation-warning
to (guile)
.
Added ceiling-quotient
, ceiling-remainder
, ceiling/
,
euclidean-quotient
, euclidean-remainder
, euclidean/
procedures
to (guile)
.
Added iota
to (guile)
.
Added read-string
implementation to (ice-9 rdelim)
.
Trimmed default set of imports to compiler to just (scheme base)
to reduce compilation time.
Added target-side procedure-property
scaffolding.
Added procedure-name
procedure.
Partially implement R7RS exit
procedure (it exits but doesn’t deal
with dynamic-wind
s in effect.)
map
and for-each
now support more than two lists, at last.
Added simple terminal REPL demo to the Git repository.
Fixed auxilary modules not being added to *all-instances*
table
when running Wasm in Hoot’s VM.
Guile no longer terminates when a Hoot module calls its internal quit function.
(hoot ports)
API is now usable at expansion time.
Fixed f32.copysign
and f64.copysign
instructions in (wasm vm)
.
Fixed Fix define-exception-type
when deriving exception types with
fields.
Fixed cond-expand
in define-library
forms.
Fixed parsing of br_on_cast
and br_on_cast_fail
instructions in
(wasm parse)
.
string-copy
is now usable at expansion time.
Improved hashtable size lower bound calculation to avoid some bad resizing behavior.
Fixed legacy Guile hashtable API to return the unspecified value for
hash-set!
, hash-remove!
, and hash-clear!
.
Fixed Wasm generated for s64->f64
primitive.
Fixed unbounded exception raising loop when exception handler prompt is not on the current dynamic stack. This could occur when an exception handler is established before spawning a fiber, for example.
Fix compilation of %inline-wasm
that returns 0 or 2+ values.
String comparison procedures are now usable at expansion time.
Fixed memory leak in library group expansion.
Fixed stream I/O implementation on Hoot VM.
Compatible with Firefox 121 or later.
Compatible with Google Chrome 119 or later.
Compatible with Safari/WebKit 18.2 or later. Finally!
Hoot is already available in GNU Guix:
$ guix pull
$ guix install guile-next guile-hoot
(Hoot currently requires a bleeding-edge version of Guile, hence
guile-next
above.)
Otherwise, Hoot can be built from source via our release tarball. See the Hoot homepage for a download link and GPG signature.
Documentation for Hoot 0.6.0, including build instructions, can be found here.
I (Dave) will be presenting “Minimalist web application deployment with Scheme� on Sunday, February 2nd in the Declarative and Minimalistic Computing devroom. Hoot will be a major focus of the presentation. This talk, like all FOSDEM talks, will be livestreamed and a recording will be available sometime after the conference.
For all the details about Spritely’s presence at FOSDEM, see our recent blog post.
For bug reports, pull requests, or just to follow along with development, check out the Hoot project on GitLab.
If you build something cool with Hoot, let us know on our community forum!
Thanks to Christine Lemmer-Webber for the lovely Hoot pixel art, and a special thanks to the MetaMask folks for funding this work!
Until next time, happy hooting! 🦉
by Dave Thompson (contact@spritely.institute) at Wednesday, January 22, 2025
Next week will be FOSDEM time for Guix! As in previous years, a sizable delegation of Guix community members will be in Brussels. Right before FOSDEM, about sixty of us will gather on January 30–31 for the now traditional Guix Days!
In pure unconference style, we will self-organize and discuss and/or
hack on hot topics: drawing lessons from the user & contributor
survey,
improving the contributor workflow, sustaining our infrastructure,
improving governance and processes, writing the build daemon in Guile,
optimizing guix pull
, Goblinizing the Shepherd… there’s no shortage
of topics!
This time we’ve definitely reached the maximum capacity of our venue so please do not just show up if you did not register. Next year we’ll have to find a larger venue!
As for FOSDEM itself, here’s your agenda if you want to hear about Guix and related projects, be it on-line or on-site.
On Saturday, February 1st, in the Open Research track:
On Sunday, February 2nd, do not miss the amazing Declarative & Minimalistic Computing track! It will feature many Guile- and Guix-adjacent talks, in particular:
But really, there’s a lot more to see in this track, starting with talks by our Spritely friends on web development with Guile and Hoot by David Thompson, a presentation of the Goblins distributed computing framework by Jessica Tallon, and one on Spritely’s vision by Christine Lemmer-Webber herself (Spritely will be present in other tracks too, check it out!), as well as a talk by Andy Wingo on what may become Guile’s new garbage collector.
Also on Sunday, February 2nd, jgart (Jorge Gomez) will be presenting a survey of Immutable Linux distributions at the Distributions track which will include RDE.
Good times ahead!
Guix Days graphics are copyright © 2024 Luis Felipe López Acevedo, under CC-BY-SA 4.0, available from Luis’ Guix graphics repository.
Rework of SRFI-167.
(okvs)
to
(okvs2)
;okvs-query
replace generator with a list;okvs-clear!
to okvs-remove!
Ordered Key-Value Store (OKVS) is a data storage paradigm that can support a multi-model database. An OKVS is an ordered mapping of bytes to bytes. It makes different trade-offs compared to key-value store paradigm to allow to build higher level abstractions more efficiently. An OKVS will keep the key-value pairs sorted by the key lexicographic order. OKVS systems provide different set of features and performance trade-offs. Most of them are shipped as a library without network interfaces, in order to be embedded in another process. Most OKVS support ACID guarantees. Some OKVS are distributed databases. Ordered Key-Value Store found their way into many modern database systems including NewSQL databases.
The procedures from (okvs2)
extend the legacy Ordered
Key-Value Store interface inherited from Ken Thomson’s DBM, then sleepy
cats’ BerkeleyDB, and nowadays LMDB, FoundationDB, and TiKV to make the implementation of efficient
extensions easier thanks to the ability to estimate within a range the
count of keys, and the count of bytes.
There are several databases that expose an interface similar to
(okvs2)
, and even more that use an Ordered Key-Value Store
as their backing storage.
While (okvs2)
interface is lower-level than the defacto
industry standard for data durability SQL, it also has the advantage of
having less moving pieces, and stems from a well-known data-structure,
part of every software engineering curriculum, namely binary trees, it
makes (okvs2)
a good teaching material that has immediate
useful applications, including building your own SQL database. Last but
not least, (okvs2)
pin the current practice of building
databases on top of a similar tool.
(okvs2)
is used to build many low to high-level
data-structures, called extensions, and can support a versatile
multi-model database.
Extensions of (okvs2)
are counter, bag, set, multi-set
and multi-mapping. Higher level extensions include Entity-Attribute-Value
possibly supported by datalog, Generic Tuple Store (nstore) inspired
from Resource
Description Framework that can match the query capabilities of SPARQL, and RDF-star, or the
Versioned Generic Tuple Store (vnstore), that ease the implementation of
bitemporal databases. Also, it is possible to implement a property graph
database, ranked set, leaderboard, priority queue, and full-text search.
It is possible to implement efficient geometric queries with the help of
xz-ordered curves. Vector database indices such as Hierarchical
Navigable Small World are also possible.
(make-okvs filepath)
Return a handle over an ordered key-value store stored at
filepath
.
(okvs? object)
Returns #true
if object
is an ordered
key-value store object as returned by make-okvs
. Otherwise,
returns #false
.
(okvs-error? okvs object)
Returns #true
if object
is an error
produced by (okvs2)
. Otherwise, returns
#false
.
(okvs-in-transaction okvs proc [failure [success]])
Begin a transaction against the database, and execute
PROC
. PROC
is called with first and only
argument an object that satisfy okvs-transaction?
. In case
of error, rollback the transaction and execute FAILURE
with
the error object as argument. The default value of FAILURE
re-raise the error with raise
. Otherwise, executes
SUCCESS
with the returned values of PROC
. The
default value of SUCCESS
is the procedure
values
.
When the transaction begin, okvs-in-transaction
must
call the procedures associated with okvs-begin-hook
.
Just before the transaction commit, okvs-in-transaction
must call the procedures associated with
okvs-pre-commit-hook
.
Just after the transaction commit is a success,
okvs-in-transaction
must call the procedures associated
with okvs-post-commit-hook
.
Just before calling FAILURE
,
okvs-in-transaction
must call the procedures associated
with okvs-rollback-hook
.
okvs-in-transaction
describes the extent of the atomic
property, the A in ACID, of changes against
the underlying database. A transaction will apply all database
operations in PROC
or none: all or nothing. When
okvs-in-transaction
returns successfully, the changes will
be visible for future transactions, and implement durability, D in ACID.
In case of error, changes will not be visible to other transactions in
all cases. Regarding isolation, each transactions do their change as if
those were done on separate copy of the database; when a transaction is
commited its changes are visible for all future transactions, but not
those that are still in progress.
TODO: what about read-write and write-write conflicts? https://en.wikipedia.org/wiki/Write%E2%80%93write_conflict
TODO: keep it unspecified?
(okvs-transaction? okvs object)
Returns #true
if object
is a transaction
object produced by call-with-okvs-transaction
or
call-with-okvs-transaction-read-only
.
(okvs-handle? okvs object)
Returns #true
if object
satisfy one of the
following predicate:
okvs-transaction?
okvs-cursor?
(okvs-query transaction key [other [offset [limit]]])
Rationale:
(okvs2)
droppedokvs-ref
, and the(okvs2)
range procedures to focus attention of the users on this procedure that has a name that is explicit about the intended use. That has the drawback that there is most of necessarily a dispatch based on the comparison ofKEY
andOTHER
. That is a performance vs. developper experience trade-offs which advantage is making its use more obvious, while reducing the apparent(okvs2)
surface while covering the same use-cases.
If only transaction
, and key
are provided,
returns the value associated with key
, or
#false
if key
is not paired with an
object.
If other
is provided, returns a list of all pairs
present in the database associated with transaction
between
key
, and other
in lexicographic order. If
key
is smaller than other
, the list is
produced with keys in ascending order, if key
is bigger
than other
produce the keys are in descending order.
In any case, the biggest bytevector, key
or
other
is excluded from the list.
(okvs-set! transaction key value)
Set, or update the database related to transaction
with
the association key
and value
.
The modification is only visible to other transactions when the current transaction returns successfully.
(okvs-remove! transaction key [other])
Clear the database related to transaction
with the
association, if any, that key
is part of. If
other
is provided, it can be bigger or smaller than
key
, the database associations are cleared between
key
, and other
. The biggest bytevector is
excluded from that operation.
The modification is only visible to other transactions when the current transaction returns successfully.
(okvs-close okvs)
Close the database.
(okvs-empty? okvs)
Returns #true
if the database associated with a
handle
that is empty. Otherwise, returns
#false
.
(okvs-in-transaction-read-only okvs proc [success [failure]])
(okvs-key-max-size okvs)
Returns the maximum size of a key for the related database.
(okvs-key-value-max-size okvs)
Returns the maximum size of an association of the related database.
(okvs-cursor? okvs object)
Returns #true
if object
is a cursor object
produced by call-with-okvs-cursor
.
(okvs-cursor-transaction cursor)
(make-okvs-variable default)
Returns a procedure that is a variable bound during the extent of transactions. Transaction variables protocol is the following:
When a transaction variable is called with one argument that
satisfies okvs-transaction?
, it returns the current value
associated within the transaction, that is default
at the
beginning of the transaction, and until the transaction variable is
reset for that transaction;
When a transaction variable is called with two arguments, the
first must satisfy the predicate okvs-transaction?
, the
second argument can be any scheme object; that will reset the object
associated with the transaction variable within the
transaction.
Calling a transaction variable outside a transaction is an error that
satisfy okvs-error?
.
(okvs-variable ((okvs-variables objects) ...) body ...)
Binds okvs-variables
to thei respective
objects
while evaluating body
.
(okvs-begin-hook okvs)
Returns the SRFI-172 hooks. The begin hook’s procedures are called, when a transaction is started, at the beginning of the transaction, inside the transaction.
(okvs-pre-commit-hook okvs)
Returns the SRFI-172 hooks. The pre-commit hook’s procedures are called within the transaction, at the end of the transaction.
(okvs-post-commit-hook okvs)
Returns the SRFI-172 hooks. The post-commit hook’s procedures are called outside the transaction, after the transaction was commit before a call to the success procedure.
(okvs-rollback-hook okvs)
Returns the SRFI-172 hooks. The rollback hook’s procedures are called outside the transaction, after the transaction was commit before a call to the failure procedure.
(okvs-approximate-key-count transaction [key other])
Returns an approximate count of keys inside the okvs associated with
transaction
.
(okvs-approximate-byte-count transaction [key other])
Returns an approximate count of bytes inside the okvs associated with
transaction
.
(call-with-okvs-cursor handle key proc)
(okvs-next cursor)
Try to move cursor
to the next pairing. If there is a
lexicographically a bigger key in the database, returns
#true
. Otherwise, returns #false
. It means the
cursor is at the end of the key space, and okvs-key
or
okvs-value
will return #false
.
The cursor is marked as moving forward.
(okvs-previous cursor)
Try to move cursor
to the previous pairing. If there is
a lexicographically a smaller key in the database, returns
#true
. Otherwise, returns #false
. It means the
cursor is at the beginning of the key space, and okvs-key
or okvs-value
will return #false
.
The cursor is marked as moving backward.
(okvs-key cursor)
Returns the key associated with cursor
. Returns
#false
when cursor
is at the beginning, or the
end of the key space, or when the cursor is not set.
(okvs-value cursor)
Returns the value associated with cursor
. Returns
#false
when cursor
is at the beginning, or the
end of the key space, or when the cursor is not set.
The results from the Guix User and Contributor Survey (2024) are in! This is the first time the Guix community has run this type of survey, and we're excited to share the results. The goal of the survey was to collect the views of both users and contributors, understanding how people adopt Guix, what they love and they're experiences contributing to the project.
There were 943 full responses to the survey, of this 53% were users and 32% were contributors. The table of survey participants is as follows:
Category | Count | Percentage |
---|---|---|
User | 496 | 52.60 |
Contributor | 297 | 31.50 |
Previous user | 92 | 9.76 |
Previous contributor | 58 | 6.15 |
First, thank-you to everyone who made the effort to fill out the survey. For a volunteer community project it's fantastic to see over 900 people took part. It's notable that 150 people took the survey who were previous users or contributors — it's really great that people are willing to make this effort to share their experiences — thanks so much!
With this many participants we can see the range of view points and experience across our whole community, many of the comments were enlightening and are worth reading. There are links in many of the questions so anyone that's interested can go through them.
As the results are extensive I've split them into three separate posts, in this post we'll focus on the first 10 questions of the survey which focused on how users learnt about Guix and their experiences adopting it.
The survey started by asking participants, How knowledgeable a Linux are you? (Q1).
Category | Count | Percentage |
---|---|---|
Beginner (e.g. just getting started) | 18 | 2% |
Explorer (e.g. comfortable installing it and using graphical apps) | 18 | 2% |
Intermediate (e.g. comfortable with the command-line and configuring many aspects) | 445 | 47% |
Advanced (e.g. you correct the Arch Linux Wiki!) | 248 | 26% |
Expert (e.g. able to contribute to large Free Software projects!) | 212 | 22% |
No answer | 2 | 0.21% |
Note that all the percentages in this table, and throughout the posts are rounded to make them easier to refer to.
Figure 1 shows this graphically:
The next question (Q2) was, How long have you been using Guix?
Category | Count | Percentage |
---|---|---|
Less than 1 year | 245 | 26% |
Between 1 and 2 years | 218 | 23% |
Between 2 and 4 years | 234 | 25% |
More than 4 years | 160 | 17% |
I've stopped using Guix | 83 | 9% |
No answer | 3 | 0.3% |
Figure 2 shows these results as a bar chart:
These two questions already tell us some interesting things about Guix users:
The next few questions explored how participants adopted Guix. It's important that new users have a great adoption experience so they'll keep using Guix. Conversely, if the initial experience is too difficult, they may simply move onto something else without seeing it's benefits!
The first question asked, (Q4) Why were you initially interested in Guix?
This question tells us what users had heard about Guix, and what they discovered during their initial investigation. The answers could impact how the project talks about Guix's strengths and capabilities.
For this question users could select more than one answer and many did so. The most selected choice was "Declarative configuration" where 82% of participants were interested in Guix because it had this quality. The option "Scheme, Guile, and Lisp are cool" was second, where 72% of the survey's participants were intrigued by Guix because of this aspect. The "Reproducibility" choice came third with 70% interested in this capability. The detailed results were:
Category | Count | Percentage |
---|---|---|
Reliability and transactions | 537 | 57% |
Declarative configuration | 772 | 82% |
Reproducibility | 658 | 70% |
Reproducible scientific workflows | 199 | 21% |
Fresh packages with latest versions | 207 | 22% |
Scheme, Guile and Lisp are cool | 677 | 72% |
Friendly community | 256 | 27% |
FSF certified project (100% Free Software) | 404 | 43% |
Alternative architectures (e.g. ARM) | 90 | 10% |
GNU Hurd | 122 | 13% |
Package management on another Linux distribution | 319 | 34% |
As a tool for packaging my own software | 267 | 28% |
There were 110 choices of 'Other' where participants could add their own comments, they're all available to read. Looking through them some themes came through:
The next question the survey asked was, Which aspect of Guix did you initially adopt? (Q5). This is users initial entry point into using Guix.
The detailed results were:
Category | Count | Percentage |
---|---|---|
Package manager on top of another Linux distro (guix package) | 336 | 36% |
Dotfiles and home environment management on another Linux distro (guix home) | 41 | 4% |
Isolated development and runtime environments on another Linux distro (guix shell) | 58 | 6% |
GNU/Linux distro as a graphical desktop (guix system) | 434 | 46% |
GNU/Linux distro as a server (guix system) | 47 | 5% |
As a software build and deployment tool (guix image, guix package or guix deploy) | 16 | 2% |
Other | 9 | 1% |
Figure 3 shows this as a bar chart:
The summary is that almost 50% of users initially experienced Guix as a GNU/Linux distro: 44% in a graphical desktop configuration and a further 5% in a server configuration. Just over a third of users (36%) initial experience Guix as a package manager on top of another Linux distro. I found this surprising as I'd expected most users to use Guix as a hosted package manager first, what an interesting result! We can also see there's lots of room to develop Guix Home as an adoption path.
Adopting any new technology is difficult and time-consuming, so discovering what elements users find difficult is important. Q7 delved into this by asking, What were the biggest challenges getting started with Guix?
The results were:
Category | Count | Percentage |
---|---|---|
Installing Guix as a package manager on a GNU/Linux distribution | 80 | 8% |
Installing Guix System as a full Linux distribution | 236 | 25% |
Level of Linux knowledge needed to use Guix | 102 | 11% |
Difficulties with the reference material (i.e. the manual) | 236 | 25% |
Shortage of how-to tutorials and videos | 297 | 32% |
Shortage of examples (e.g. examples of usage) | 431 | 46% |
Inexperience with Lisp syntax and/or Guile Scheme | 374 | 40% |
Differences between Guix's approach and other Linux distros | 321 | 34% |
It was so long ago I can't possibly remember! | 44 | 5% |
Other | 218 | 23% |
Figure 4 shows this as a bar chart:
As we can see the biggest challenge is a Shortage of examples (e.g examples of usage). And, if we consider shortage of how-to tutorials (32%) to be similar then overall we can see there's a clear need for focused goal-orientated documentation with examples. Inexperience with Lisp syntax and or Guile Scheme and Differences between Guix's approach and other Linux distros both speak to the unique nature of Guix and the approach it takes: perhaps there are implications for how Guix's tooling can make initial adoption as easy as possible.
There were 218 comments, which are worth reading through. I've summarised them into broad themes:
The survey asked (Q6), How satisfied were you with your experience adopting Guix?
This question explores the users overall satisfaction with the initial steps of researching, installing and initially using Guix. The question asked the participant to score their satisfaction on one of 5 levels.
Category | Count | Percentage |
---|---|---|
Very Dissatisfied | 22 | 2% |
Dissatisfied | 113 | 12% |
Neutral | 154 | 16% |
Satisfied | 408 | 43% |
Very Satisfied | 226 | 24% |
Can't remember | 20 | 2% |
See Figure 5 for a visual representation:
This is probably the most important question in the entire survey when it comes to growing the number of Guix users. Overall, it's positive with Very Satisfied (24%) and Satisfied (43%) meaning that the majority of users are happy with their initial experience. The comments above show there's lots of room to find small ways to move users initial experience from Satisfied to being overjoyed! Unfortunately, on the other end of the scale 14% of users who were unhappy and the 16% neutral show some of the bigger challenges!
As we saw earlier just over a third of users (36%) initial adopt Guix as a package manager on top of another GNU/Linux distribution. Question 8 asked, Which GNU/Linux distribution did you use Guix on top of?
The results:
Category | Count | Percentage |
---|---|---|
Alpine Linux | 9 | 0.95% |
Arch Linux | 81 | 8.59% |
Fedora Linux | 33 | 3.50% |
Gentoo Linux | 19 | 2.01% |
NixOS | 22 | 2.33% |
Ubuntu | 111 | 11.77% |
Other | 170 | 18.03% |
I errored when creating this question and somehow missed out Debian! Over 117 answers in the 'Other' category said Debian so it's the most popular distribution to use Guix on, Ubuntu is second (111) and then Arch Linux was third (81). There were also plenty of mentions of OpenSUSE, RHEL/CentOS and Void Linux.
Question 9 was targeted at those that had previously used Guix but had stopped. It asked, You previously used Guix but stopped, why?
This was a comment question and we got some fantastic answers. There were 147 comments from participants, which lines up well with the 150 people who took the survey and classed themselves as a 'Previous user' or 'Previous contributor'.
This was a free form text answer, the full comment are well worth a read through . As before I've clustered the comments into themes:
As we can see there are a wide variety of reasons why users stopped using Guix, many of them are similar to the challenges that many users find, but they're even more powerfully felt by these users. It's really useful to have these themes and comments captured, as contributors may be able to pick up some of these issues and work to resolve them!
Focusing back on all users, the next question was, (Q10) How important is Guix in your computing environment?
There was a good range of answers:
Category | Count | Percentage |
---|---|---|
Not using | 97 | 10% |
Tinkering | 156 | 17% |
Slightly important | 147 | 16% |
Moderately important | 194 | 21% |
Important | 133 | 14% |
Essential | 216 | 23% |
A visual representation:
This is an interesting mixture which is probably reflective of many new users, and how Guix is used as a package manager on top of another distribution. Over a third of users consider it to be essential/important where it would be difficult to replace, while the bottom third are tinkering or exploring it.
We've looked at the first 10 questions of the survey which covered the composition of the Guix community, initial adoption and satisfaction, and challenges that led to users moving away from Guix. The first thing to say is how fantastic the response has been to the survey, it's amazing to have over 900 participants!
Some big take-aways:
The next post will cover more of the survey — which parts of Guix are most used, what sorts of deployments are being used, architectures and drivers details, and how users view contributing to the project financially.