diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..2b367ec --- /dev/null +++ b/404.html @@ -0,0 +1,133 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + +
+
+ +
+
+ + + +
+
+

Error 404 - Page Not Found

+

The URL may be misspelled or the page you requested no longer exists.

+ Go Home +
+
+ + + + + + + + diff --git a/CNAME b/CNAME new file mode 100644 index 0000000..9dabc4c --- /dev/null +++ b/CNAME @@ -0,0 +1 @@ +vala.dev diff --git a/about/index.html b/about/index.html new file mode 100644 index 0000000..a1ef2ce --- /dev/null +++ b/about/index.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +About Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+

About Vala

+

What is Vala?# +

+

Vala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system.

+

Vala supports modern language features such as:

+
    +
  • Interfaces
  • +
  • Properties
  • +
  • Signals
  • +
  • Foreach statements
  • +
  • Lambda expressions
  • +
  • Type inferencing for local variables
  • +
  • Generics
  • +
  • Non-null types
  • +
  • Assisted memory management
  • +
  • Exception handling
  • +
  • Type modules (Plugins)
  • +
+

What kind of language is Vala?# +

+

Productive# +

+

With Vala, you can get up and running quickly, thanks to convenient features like lambda expressions, exception handling, interfaces and generics.

+

Performant# +

+

Vala code compiles down to fully native binaries.

+

Statically-Typed# +

+

Vala helps you write type-safe code without the verbosity, thanks to type inference.

+

Integrative# +

+

Vala is designed to allow access to existing C libraries, especially GObject-based libraries, without the need for runtime bindings. All that is needed to use a library with Vala is an API file, containing the class and method declarations in Vala syntax. Vala currently comes with bindings for GLib and GTK+ and many others from the GNOME Platform.

+

Vala can also be used to create C libraries too.

+

Familiar# +

+

The syntax of Vala is inspired by C# and Java, so if you have used either of those, you'll seamlessly adapt to writing Vala code.

+ + + + +
+ +
+
+ + + + + + + + + diff --git a/android-icon-144x144.png b/android-icon-144x144.png new file mode 100644 index 0000000..1d9199b Binary files /dev/null and b/android-icon-144x144.png differ diff --git a/android-icon-192x192.png b/android-icon-192x192.png new file mode 100644 index 0000000..8cd57da Binary files /dev/null and b/android-icon-192x192.png differ diff --git a/android-icon-36x36.png b/android-icon-36x36.png new file mode 100644 index 0000000..04db0d2 Binary files /dev/null and b/android-icon-36x36.png differ diff --git a/android-icon-48x48.png b/android-icon-48x48.png new file mode 100644 index 0000000..656674e Binary files /dev/null and b/android-icon-48x48.png differ diff --git a/android-icon-72x72.png b/android-icon-72x72.png new file mode 100644 index 0000000..090d502 Binary files /dev/null and b/android-icon-72x72.png differ diff --git a/android-icon-96x96.png b/android-icon-96x96.png new file mode 100644 index 0000000..b6f7e92 Binary files /dev/null and b/android-icon-96x96.png differ diff --git a/apple-icon-114x114.png b/apple-icon-114x114.png new file mode 100644 index 0000000..1b47292 Binary files /dev/null and b/apple-icon-114x114.png differ diff --git a/apple-icon-120x120.png b/apple-icon-120x120.png new file mode 100644 index 0000000..f591ae0 Binary files /dev/null and b/apple-icon-120x120.png differ diff --git a/apple-icon-144x144.png b/apple-icon-144x144.png new file mode 100644 index 0000000..1d9199b Binary files /dev/null and b/apple-icon-144x144.png differ diff --git a/apple-icon-152x152.png b/apple-icon-152x152.png new file mode 100644 index 0000000..0745e8b Binary files /dev/null and b/apple-icon-152x152.png differ diff --git a/apple-icon-180x180.png b/apple-icon-180x180.png new file mode 100644 index 0000000..bdd4693 Binary files /dev/null and b/apple-icon-180x180.png differ diff --git a/apple-icon-57x57.png b/apple-icon-57x57.png new file mode 100644 index 0000000..1a5899b Binary files /dev/null and b/apple-icon-57x57.png differ diff --git a/apple-icon-60x60.png b/apple-icon-60x60.png new file mode 100644 index 0000000..50f2ff0 Binary files /dev/null and b/apple-icon-60x60.png differ diff --git a/apple-icon-72x72.png b/apple-icon-72x72.png new file mode 100644 index 0000000..090d502 Binary files /dev/null and b/apple-icon-72x72.png differ diff --git a/apple-icon-76x76.png b/apple-icon-76x76.png new file mode 100644 index 0000000..e66443f Binary files /dev/null and b/apple-icon-76x76.png differ diff --git a/apple-icon-precomposed.png b/apple-icon-precomposed.png new file mode 100644 index 0000000..9cbcf1a Binary files /dev/null and b/apple-icon-precomposed.png differ diff --git a/apple-icon.png b/apple-icon.png new file mode 100644 index 0000000..9cbcf1a Binary files /dev/null and b/apple-icon.png differ diff --git a/atom.xml b/atom.xml new file mode 100644 index 0000000..d6ead5f --- /dev/null +++ b/atom.xml @@ -0,0 +1,432 @@ + + + Vala Programming Language + Vala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system. + + + Zola + 2024-05-09T00:00:00+00:00 + https://vala.dev/atom.xml + + ValaBot: an AI coding assistant fine-tuned for Vala + 2024-05-09T00:00:00+00:00 + 2024-05-09T00:00:00+00:00 + + + + + Unknown + + + + + + https://vala.dev/blog/valabot/ + + <h2 id="enhancing-ai-coding-assistants-for-vala-developers">Enhancing AI Coding Assistants for Vala Developers<a class="zola-anchor" href="#enhancing-ai-coding-assistants-for-vala-developers" aria-label="Anchor link for: enhancing-ai-coding-assistants-for-vala-developers">#</a> +</h2> +<p>As a programmer, I've been impressed by AI coding assistants like GitHub Copilot and Codeium, which have significantly boosted my productivity. These tools excel at reducing disruptive interruptions, saving time on typing, and often completing lines of code accurately. However, I've encountered limitations with Copilot while working with the Vala programming language. Its suggestions often get muddled with similar languages like Java and C#, and it lacks training on the more common Vala libraries.</p> +<p>Like many other developers, I'm also dissatisfied with the dominance of Github Copilot and that open source code has been monetized without attribution or consideration for the original authors (some of whom now pay for the service).</p> +<p>This challenge inspired me to enhance the Copilot concept by creating an AI coding assistant that is finely tuned to provide a viable and superior alternative that caters for the specific needs of Vala developers. I began with an open-source Large Language Model that had been trained on source code - the powerful Deepseek Coder 6.7b model. This model has been trained from scratch by Deepseek AI on 2 trillion tokens sourced from GitHub. Deepseek Coder significantly outperforms other open-source coding models, such as Codellama.</p> +<p>I chose the Deepseekcoder-6.7b-base model as the foundation for fine-tuning because of its great benchmark performance and also because it was trained on Java and C# – languages syntactically close to Vala. This allowed me to build upon its existing capabilities and adapt it to the specific needs of Vala.</p> +<h2 id="fine-tuning-for-vala">Fine-Tuning for Vala<a class="zola-anchor" href="#fine-tuning-for-vala" aria-label="Anchor link for: fine-tuning-for-vala">#</a> +</h2> +<p>I fine-tuned the model on Vala programming language datasets. This involved downloading as many Vala projects as I could find from GitHub, extracting the Vala source files, and splitting them into ~40 line segments. I then used Llama3 to create logical and predictable "holes" in each segment, which were then used to create the FIM (fill-in-the-middle) dataset. This data preparation process took 96 hours of GPU time using my quad-RX6800 machine over a weekend. The resulting dataset was cleaned to remove non-code elements, such as license headers, and personal identifiable information.</p> +<h2 id="the-training">The Training<a class="zola-anchor" href="#the-training" aria-label="Anchor link for: the-training">#</a> +</h2> +<p>The fine-tuning process took 10 hours on an RTX 3090. The result was a LoRA, which was merged back into the base model, converted to GGUF, and quantized to q8_0, which is the format required by TabbyML.</p> +<h2 id="the-result">The Result<a class="zola-anchor" href="#the-result" aria-label="Anchor link for: the-result">#</a> +</h2> +<p>The outcome was a model that is more helpful and productive for Vala-related projects. By fine-tuning Deepseek Coder, I was able to create a more accurate and effective AI coding assistant that understands the nuances of the Vala programming language. The model is hosted on Huggingface (<a href="https://huggingface.co/scowen/deepseek-coder-6.7b-vala/tree/main">https://huggingface.co/scowen/deepseek-coder-6.7b-vala/tree/main</a>). It can be used in VSCode, VIM, and other popular IDEs with TabbyML. The complete instructions, training scripts, and dataset are available on GitHub (<a href="https://github.com/supercamel/ValaBot">https://github.com/supercamel/ValaBot</a>).</p> +<h2 id="licensing-and-fair-use">Licensing and Fair Use<a class="zola-anchor" href="#licensing-and-fair-use" aria-label="Anchor link for: licensing-and-fair-use">#</a> +</h2> +<p>As a project rooted in the principles of Free and Open-Source Software (FOSS), I believe in promoting freedom, community, and sharing knowledge. To facilitate collaboration and innovation, I've made the following resources publicly available:</p> +<ul> +<li>The fine-tuned model weights are hosted on Hugging Face for anyone to access and utilize in a TabbyML or other deployment.</li> +<li>The training scripts and dataset preparation process are open-sourced on GitHub, providing a transparent and reproducible framework for others to build upon.</li> +<li>A comprehensive list of repositories used during the fine-tuning process is available on GitHub, ensuring that contributors and users can easily identify and explore the sources that made this project possible.</li> +</ul> +<p>I hope that this openness will pave the way for further advancements and refinements, ultimately benefiting the Vala developer community as a whole.</p> +<h2 id="conclusion">Conclusion<a class="zola-anchor" href="#conclusion" aria-label="Anchor link for: conclusion">#</a> +</h2> +<p>In this blog post, I've shared my experience with fine-tuning the Deepseek Coder for the Vala programming language, demonstrating how targeted adjustments can significantly enhance AI coding assistants. This project is just the beginning. I aim to continue developing models specifically optimized for Vala to support the Vala developer community. With the release of new base models, such as CodeQwen 7B, there are exciting possibilities for further advancements. Through this work, I hope to highlight the potential of AI fine-tuning in creating more effective coding assistants and inspire others to explore the possibilities of AI-assisted coding.</p> +<p>Get started with ValaBot here: <a href="https://github.com/supercamel/ValaBot">https://github.com/supercamel/ValaBot</a></p> + + + + + Vala: the smoothest C off-ramp + 2024-04-22T00:00:00+00:00 + 2024-04-22T00:00:00+00:00 + + + + + Unknown + + + + + + https://vala.dev/blog/c-off-ramp/ + + <p>Hi! I’m Reuben, a long-time free software maintainer and author. One of my specialities is taking on mature projects from their original authors and maintaining them long-term.</p> +<p>In this post, I want to talk about how I’ve rewritten entire projects in Vala, to make them easier, more productive and more fun to maintain.</p> +<p>Vala works well with C—that’s one of its primary features and design choices. But these abilities can be used for another purpose: to provide a “smooth off-ramp” for C, converting old code step-by-step to more-maintainable Vala, without an “all or nothing” rewrite, and with the ability to reimplement C libraries in Vala, so that existing C code can still call them.</p> +<p>Over the few years, I have rewritten two small–to–medium-sized C +code bases in Vala: the minimal Emacs clone <a href="https://www.gnu.org/software/zile">GNU Zile</a> and the spell-checking meta-library <a href="https://abiword.github.io/enchant/">Enchant</a>, which has been used by GNOME for years, most recently by <a href="https://gitlab.gnome.org/GNOME/libspelling">libspelling</a>, which provides spell-checking in the <a href="https://apps.gnome.org/TextEditor/">GNOME Text Editor</a>. In the rest of this post, I’ll focus on the challenges I faced doing these rewrites, how Vala helped me, and discuss whether such a drastic move (of rewriting entire code bases) was in fact a good idea.</p> +<h2 id="vala-is-good-at-talking-to-c">Vala is good at talking to C<a class="zola-anchor" href="#vala-is-good-at-talking-to-c" aria-label="Anchor link for: vala-is-good-at-talking-to-c">#</a> +</h2> +<p>Vala is designed to work well with C, and a nice consequence of this is that often one doesn’t have to think about C at all, because so many useful libraries are already conveniently bound to Vala “out of the box”. It’s impressive the degree to which some of Vala’s basic abilities, such as its “built-in” container types are “just” clever binding of GLib functions plus some syntactic sugar.</p> +<p>But Vala’s binding abilities are very powerful: it’s not just GLib and GObject APIs that it can bind successfully; it can bind almost any C API. Later I will also show some examples that test its limits.</p> +<p>Further, Vala can <em>implement</em> C APIs just as well as it can <em>consume</em> them.</p> +<h2 id="allowing-c-to-talk-back">Allowing C to talk back<a class="zola-anchor" href="#allowing-c-to-talk-back" aria-label="Anchor link for: allowing-c-to-talk-back">#</a> +</h2> +<p>Why would you want to implement C APIs in Vala? I have three answers for you. Firstly, maintaining a typical C code-base is a horrible experience. I just wanted to not have more memory management errors, especially to do with strings (which both Zile and Enchant are big on). It’s so easy to corrupt memory, to get lifetimes wrong, or simply get the wrong answer with C’s primitive string manipulation routines.</p> +<p>Secondly, implementing an existing C API in Vala gives an easier-to-maintain codebase that can be used by existing consumers, which don’t need to be C programs: they can be written in Python, Rust, JavaScript or, of course, Vala!</p> +<p>Thirdly, and perhaps less obviously, you can use this ability to rewrite a C program in Vala incrementally, one module (say) at a time. The result is a pure Vala application (no C APIs are being implemented), but at each step one has a complete working application, partly written in C and partly in Vala; and where C needs to call Vala, the Vala code must implement the right C APIs.</p> +<h2 id="before-we-start-a-sanity-check">Before we start, a sanity check<a class="zola-anchor" href="#before-we-start-a-sanity-check" aria-label="Anchor link for: before-we-start-a-sanity-check">#</a> +</h2> +<p>I’m talking about rewriting mature code-bases. Zile dates from the late 1990s, and I rewrote it into Vala in 2020. Enchant was written starting around 2003, and I rewrote it in Vala this week (in 2024). So:</p> +<ul> +<li>Isn’t that an awful lot of work?</li> +<li>Won’t it introduce lots of new bugs?</li> +</ul> +<p>In other words, is it worth it? Or am I just being quixotic?</p> +<h2 id="it-s-not-that-hard">It’s not that hard<a class="zola-anchor" href="#it-s-not-that-hard" aria-label="Anchor link for: it-s-not-that-hard">#</a> +</h2> +<p>As I said above, I rewrote Enchant in Vala this week. Actually, that’s not quite true: I rewrote the core, about 2,000 lines of C. Enchant is, as I said above, a meta-library: that is, it doesn’t do spell-checking itself, but delegates to a number of libraries that do. Each one needs an adaptor plugin, which Enchant calls a “provider”, and these providers are written in C, C++ and even Objective C. I haven’t touched those (yet!).</p> +<p>But still, 2,000 lines of code in a week is not bad.</p> +<p>GNU Zile was about 8,000 lines of C, and that took me about a month.</p> +<h2 id="avoiding-a-plague-of-new-bugs">Avoiding a plague of new bugs<a class="zola-anchor" href="#avoiding-a-plague-of-new-bugs" aria-label="Anchor link for: avoiding-a-plague-of-new-bugs">#</a> +</h2> +<h3 id="vala-is-well-matched-to-c">Vala is well matched to C<a class="zola-anchor" href="#vala-is-well-matched-to-c" aria-label="Anchor link for: vala-is-well-matched-to-c">#</a> +</h3> +<p>Any time you touch code you can introduce bugs, of course: the slightest adjustment can be risky. How much more so rewriting in another language?</p> +<p>The good news here is that because Vala is so close to C, it is relatively easy to translate code without introducing new bugs. The syntax is sufficiently similar that code can be easily translated with some search and replace (e.g. <code>NULL</code> in C becomes <code>null</code> in Vala) plus light editing (e.g. adding missing comparisons in conditions to make them boolean, so that <code>if (ptr)</code> in C becomes <code>if (ptr != null)</code> in Vala). C APIs can be used directly via Vala bindings, and C data structures can be replicated precisely. Vala’s static typing also helps.</p> +<p>Here’s an example of a struct in C from Zile:</p> +<pre data-lang="c" class="language-c z-code"><code class="language-c" data-lang="c"><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-storage z-type z-c">struct</span> <span class="z-meta z-struct z-c"><span class="z-entity z-name z-struct z-c">Region</span></span></span><span class="z-meta z-struct z-c"> +</span></span><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-begin z-c">{</span></span></span><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"> +</span></span></span><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"><span class="z-meta z-preprocessor z-macro z-c"><span class="z-keyword z-control z-import z-define z-c">#define</span></span><span class="z-meta z-preprocessor z-macro z-c"> <span class="z-entity z-name z-function z-preprocessor z-c">FIELD</span></span><span class="z-meta z-preprocessor z-macro z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span><span class="z-variable z-parameter z-c">ty</span><span class="z-punctuation z-separator z-c">,</span> <span class="z-variable z-parameter z-c">name</span><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-meta z-preprocessor z-macro z-c"> ty name<span class="z-punctuation z-terminator z-c">;</span></span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"><span class="z-meta z-preprocessor z-include z-c"><span class="z-keyword z-control z-import z-include z-c">#include</span> <span class="z-string z-quoted z-double z-include z-c"><span class="z-punctuation z-definition z-string z-begin z-c">&quot;</span>region.h<span class="z-punctuation z-definition z-string z-end z-c">&quot;</span></span> +</span></span></span></span><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"><span class="z-meta z-preprocessor z-c"><span class="z-keyword z-control z-import z-c">#undef</span> FIELD +</span></span></span></span><span class="z-source z-c"><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"></span></span><span class="z-meta z-struct z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-end z-c">}</span></span></span><span class="z-punctuation z-terminator z-c">;</span> +</span><span class="z-source z-c"> +</span><span class="z-source z-c"><span class="z-meta z-preprocessor z-macro z-c"><span class="z-keyword z-control z-import z-define z-c">#define</span></span><span class="z-meta z-preprocessor z-macro z-c"> <span class="z-entity z-name z-function z-preprocessor z-c">FIELD</span></span><span class="z-meta z-preprocessor z-macro z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span><span class="z-variable z-parameter z-c">ty</span><span class="z-punctuation z-separator z-c">,</span> <span class="z-variable z-parameter z-c">field</span><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-meta z-preprocessor z-macro z-c"> <span class="z-punctuation z-separator z-continuation z-c">\</span> +</span></span><span class="z-source z-c"><span class="z-meta z-preprocessor z-macro z-c"> <span class="z-meta z-function-call z-c"><span class="z-variable z-function z-c">GETTER</span> <span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c">Region<span class="z-punctuation z-separator z-c">,</span> region<span class="z-punctuation z-separator z-c">,</span> ty<span class="z-punctuation z-separator z-c">,</span> field</span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span> <span class="z-punctuation z-separator z-continuation z-c">\</span> +</span></span><span class="z-source z-c"><span class="z-meta z-preprocessor z-macro z-c"><span class="z-meta z-assumed-macro z-c"> <span class="z-variable z-function z-assumed-macro z-c">SETTER</span> <span class="z-punctuation z-section z-group z-begin z-c">(</span>Region<span class="z-punctuation z-separator z-c">,</span> region<span class="z-punctuation z-separator z-c">,</span> ty<span class="z-punctuation z-separator z-c">,</span> field<span class="z-punctuation z-section z-group z-end z-c">)</span></span></span> +</span><span class="z-source z-c"> +</span><span class="z-source z-c"><span class="z-meta z-preprocessor z-include z-c"><span class="z-keyword z-control z-import z-include z-c">#include</span> <span class="z-string z-quoted z-double z-include z-c"><span class="z-punctuation z-definition z-string z-begin z-c">&quot;</span>region.h<span class="z-punctuation z-definition z-string z-end z-c">&quot;</span></span> +</span></span><span class="z-source z-c"><span class="z-meta z-preprocessor z-c"><span class="z-keyword z-control z-import z-c">#undef</span> FIELD +</span></span></code></pre> +<p>The file <code>region.h</code> contained:</p> +<pre data-lang="c" class="language-c z-code"><code class="language-c" data-lang="c"><span class="z-source z-c"><span class="z-meta z-assumed-macro z-c"><span class="z-variable z-function z-assumed-macro z-c">FIELD</span><span class="z-punctuation z-section z-group z-begin z-c">(</span><span class="z-support z-type z-sys-types z-c">size_t</span><span class="z-punctuation z-separator z-c">,</span> start<span class="z-punctuation z-section z-group z-end z-c">)</span></span> +</span><span class="z-source z-c"><span class="z-meta z-assumed-macro z-c"><span class="z-variable z-function z-assumed-macro z-c">FIELD</span><span class="z-punctuation z-section z-group z-begin z-c">(</span><span class="z-support z-type z-sys-types z-c">size_t</span><span class="z-punctuation z-separator z-c">,</span> end<span class="z-punctuation z-section z-group z-end z-c">)</span></span> +</span></code></pre> +<p>Here’s the translation into Vala:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-meta z-class z-vala"><span class="z-storage z-type z-class z-vala">class</span> <span class="z-entity z-name z-class z-vala">Region </span></span><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-type z-vala">size_t</span> <span class="z-support z-type z-vala">start</span> { <span class="z-support z-type z-vala">get</span>; <span class="z-support z-type z-vala">set</span>; } +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-type z-vala">size_t</span> <span class="z-support z-type z-vala">end</span> { <span class="z-support z-type z-vala">get</span>; <span class="z-support z-type z-vala">set</span>; } +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-comment z-line z-vala"><span class="z-punctuation z-definition z-comment z-vala">//</span> …methods go here +</span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala">} +</span></span></span></code></pre> +<p>Compare and contrast: around 2009, I translated Zile into <a href="https://www.lua.org">Lua</a>. I completed the translation, but I did not release it, as I found that Lua’s lack of static type-checking made it too easy to introduce new bugs. While I was translating it I was forever finding off-by-one errors caused by Lua counting arrays and string positions from 1, while C is 0-based (as is Vala, of course). Don’t get me wrong: Lua is a great language; indeed, I have successfully written other, smaller programs from C into Lua, though I wouldn’t now recommend that; its strengths lie elsewhere.</p> +<p>With Vala, I recommend making the initial translation as “light” as possible: don’t use lots of Vala’s features to rewrite code. Translate <code>char *</code> pointers to string offsets (that is, an integer string index). Make sure the translated code works first, then start simplifying. Even the “light” translation will contain simplifications, anyway: no more <code>malloc</code> or <code>free</code>, for example.</p> +<h3 id="you-already-have-a-test-suite-of-course">You already have a test suite, of course<a class="zola-anchor" href="#you-already-have-a-test-suite-of-course" aria-label="Anchor link for: you-already-have-a-test-suite-of-course">#</a> +</h3> +<p>The other way you avoid a plague of new bugs is with a good test suite. Sorry! There’s no way around that. If you want to alter, let alone completely rewrite code, you need to have tests.</p> +<p>Fortunately, I had already added a fairly extensive test suite to Zile years ago, when I was trying to make sure that it really behaved exactly like Emacs. The situation with Enchant was even better: it has an exhaustive (and sometimes exhausting) test suite that checks every aspect of its API, added a few years after Enchant was written, by a commission from <a href="https://www.sil.org">SIL International</a>. (A big shout-out to those who commission work on libre software, especially this sort of important under-the-hood work. These tests have saved me from introducing bugs time and time again.)</p> +<p>Again, you have to be disciplined: no turning off the tests, or changing them as you go. Complete the translation without changing them, as far as possible.</p> +<h3 id="your-existing-build-tool-is-probably-supported">Your existing build tool is probably supported<a class="zola-anchor" href="#your-existing-build-tool-is-probably-supported" aria-label="Anchor link for: your-existing-build-tool-is-probably-supported">#</a> +</h3> +<p>Many Vala projects these days are using the <a href="https://mesonbuild.com">Meson</a> build system, which is very popular in the GNOME space. But Vala is also supported well by older tools, such as <a href="https://cmake.org">CMake</a> and <a href="https://en.wikipedia.org/wiki/GNU_Autotools">GNU Autotools</a>. Both of the projects I translated were using GNU Autotools, and I stuck with it, for two main reasons:</p> +<ol> +<li>I use the excellent <a href="https://www.gnu.org/software/gnulib/">gnulib</a> portability library to ensure that my POSIX-compliant code runs on most systems without problems. Unfortunately, gnulib is tied to GNU Autotools. But then, few build systems work on as many platforms as the Autotools in any case.</li> +<li><a href="https://www.gnu.org/software/automake/">Automake</a> not only has Vala support, but allows you to ship the generated C sources, so that users can build your code without a Vala compiler. This means that your translated project has exactly the same build dependencies as it had before, which can help with users and packagers who haven’t heard of Vala and don’t want to learn. With Zile, previously a pure-POSIX project, I added GLib as a build-time dependency, but of course that’s so widely used that it’s unlikely to be a problem. Enchant already used GLib.</li> +</ol> +<h2 id="the-vala-experience">The Vala experience<a class="zola-anchor" href="#the-vala-experience" aria-label="Anchor link for: the-vala-experience">#</a> +</h2> +<p>I will now describe the process of translating the two code-bases. Although they were a bit different (Zile an application, Enchant a library), and I made the translations a few years apart, I was pleasantly surprised to find the second time that the process was much the same as the first.</p> +<h3 id="add-vala-to-the-build-system">Add Vala to the build system<a class="zola-anchor" href="#add-vala-to-the-build-system" aria-label="Anchor link for: add-vala-to-the-build-system">#</a> +</h3> +<p>With Autotools, this is a matter of adding a couple of <code>configure.ac</code> lines to detect the Vala compiler and check for GNU Make (which is required to build from Vala sources), and then adding a test Vala source file to a <code>Makefile.am</code>.</p> +<h3 id="translating-the-code">Translating the code<a class="zola-anchor" href="#translating-the-code" aria-label="Anchor link for: translating-the-code">#</a> +</h3> +<p>I typically translate one file at a time. The code will of course usually call functions from other parts of the program: I add a private VAPI file with suitable bindings. You can usefully pre-populate the VAPI file with the commented-out contents of relevant C header files, then just uncomment the APIs you need in Vala, and edit them suitably. The excellent <a href="https://wiki.gnome.org/Projects/Vala/ManualBindings">Manual bindings</a> guide from the Wiki is my constant companion.</p> +<p>To translate a file, I copy <code>foo.c</code> to <code>foo_vala.vala</code>. (The <code>_vala</code> bit ensures that the Vala-generated C won’t overwrite the original file, which I will keep for reference.) I translate the code, possibly in multiple steps, commenting out the bits I have translated in <code>foo.c</code>.</p> +<p>Compile, test, fix, rinse, repeat.</p> +<p>I find that I get a nice rhythm with my translation, of doing the obvious basic syntactic stuff, as mentioned above, then finding the equivalent Vala APIs where necessary, then tackling any hard bits, such as binding third-party APIs that Vala does not yet know about.</p> +<p>For Zile I leaned heavily on the POSIX VAPI, and added a new GNU VAPI for some GNU-specific APIs, which I have also used and extended while translating Enchant. Enchant was easier on the whole, because it was already GLib-based, so I just had to search <a href="https://valadoc.org">valadoc.org</a> for the Vala versions of the GLib APIs.</p> +<p>For Zile, I found <a href="https://wiki.gnome.org/Projects/Libgee">libgee</a> invaluable, with its superior collections that are both richer than GLib’s and allows extra use cases, such as collections of unboxed simple types (e.g. <code>ArrayList&lt;int&gt;</code>). For Enchant, it so happened I didn’t need this extra functionality; Enchant’s use of collections is mostly limited to singly-linked lists of objects and hash tables with string keys.</p> +<h3 id="stumbling-blocks">Stumbling blocks…<a class="zola-anchor" href="#stumbling-blocks" aria-label="Anchor link for: stumbling-blocks">#</a> +</h3> +<h4 id="documentation-and-api-coverage">Documentation and API coverage<a class="zola-anchor" href="#documentation-and-api-coverage" aria-label="Anchor link for: documentation-and-api-coverage">#</a> +</h4> +<p>Vala is a small ecosystem, even after all these years. Hence, I found bugs, mostly in the documentation. I took the time to submit <a href="https://github.com/vala-lang/valadoc-org/pull/414">fixes</a>, and this past week reaped the rewards! Some of these fixes went as far as GLib itself; many were to the Vala wiki. As I noted above, I also made additions to the VAPIs, in particular adding a complete binding for the POSIX, GNU and BSD regex APIs (Zile only needed the GNU API, but since the GNU regex module implements all three, I thought I might as well!), as well as <code>getopt_long()</code>. I added <code>freopen</code> to the POSIX VAPI (as <code>FILE.reopen()</code>), upgraded the curses VAPI to improve its Terminfo coverage and add key-codes for function keys, and added return codes to GLib’s <code>FileStream.putc</code> and <code>puts</code>.</p> +<p>I was also able to offer my old-school expertise to the Vala project itself: I converted the test suite to use Automake’s relatively recent ability to run tests in parallel.</p> +<h4 id="falling-between-two-stools">Falling between two stools<a class="zola-anchor" href="#falling-between-two-stools" aria-label="Anchor link for: falling-between-two-stools">#</a> +</h4> +<p>Vala itself mostly insulates you from the memory-management woes that bedevil C, but mid-translation there is still C code, so you have to be careful if you want to keep a working program. It’s always tempting to just plough on with the translation and hope that crashes will disappear, but I try not to give in, as that can bury bugs deeper and make them harder to find later. So, expect to spend some time studying <code>valac</code>-generated C, and revising your knowledge of <code>owned</code> and other esoteric Vala features.</p> +<p>For me, this is particularly relevant to Enchant, as a C library whose API and ABI I want to maintain. I am happy to report that I have been mostly successful, and at the time of writing I am tracking down some problems with object lifetime management, but otherwise the Vala implementation seems to perfectly replicate the C.</p> +<p>Another area of awkwardness is strings: as I hinted above, C often uses pointers to refer to string positions, whereas in Vala it’s usual to use integer offsets. This code is fairly easy to convert once you get the hang of it. Since C <em>can</em> use offsets instead of pointers, you can always rewrite the code in two stages, first changing the C to use offsets, and then translating it into Vala.</p> +<p>Here’s an example of the translation from pointers in C to offsets in Vala. The C version refers to positions in strings with pointers:</p> +<pre data-lang="c" class="language-c z-code"><code class="language-c" data-lang="c"><span class="z-source z-c"><span class="z-storage z-type z-c">char</span> <span class="z-keyword z-operator z-c">*</span> <span class="z-meta z-function z-c"><span class="z-entity z-name z-function z-c">enchant_iso_639_from_tag</span></span><span class="z-meta z-function z-c"> </span><span class="z-meta z-function z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function z-parameters z-c"><span class="z-meta z-group z-c"><span class="z-storage z-modifier z-c">const</span> <span class="z-storage z-type z-c">char</span> <span class="z-keyword z-operator z-c">*</span> <span class="z-storage z-modifier z-c">const</span> <span class="z-variable z-parameter z-c">dict_tag</span><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-meta z-function z-c"> </span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-begin z-c">{</span></span></span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-storage z-type z-c">char</span> <span class="z-keyword z-operator z-c">*</span> new_tag <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-meta z-function-call z-c"><span class="z-variable z-function z-c">strdup</span> <span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c">dict_tag</span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-punctuation z-terminator z-c">;</span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-keyword z-control z-c">if</span> <span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span>new_tag <span class="z-keyword z-operator z-comparison z-c">==</span> <span class="z-constant z-language z-c">NULL</span><span class="z-punctuation z-section z-group z-end z-c">)</span></span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-keyword z-control z-flow z-return z-c">return</span> <span class="z-constant z-language z-c">NULL</span><span class="z-punctuation z-terminator z-c">;</span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-storage z-type z-c">char</span> <span class="z-keyword z-operator z-c">*</span> needle <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-meta z-function-call z-c"><span class="z-support z-function z-C99 z-c">strchr</span> <span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c">new_tag<span class="z-punctuation z-separator z-c">,</span> <span class="z-string z-quoted z-single z-c"><span class="z-punctuation z-definition z-string z-begin z-c">&#39;</span>_<span class="z-punctuation z-definition z-string z-end z-c">&#39;</span></span></span></span><span class="z-meta z-function-call z-c"><span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-end z-c">)</span></span></span><span class="z-punctuation z-terminator z-c">;</span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-keyword z-control z-c">if</span> <span class="z-meta z-group z-c"><span class="z-punctuation z-section z-group z-begin z-c">(</span>needle <span class="z-keyword z-operator z-comparison z-c">!=</span> <span class="z-constant z-language z-c">NULL</span><span class="z-punctuation z-section z-group z-end z-c">)</span></span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-keyword z-operator z-c">*</span>needle <span class="z-keyword z-operator z-assignment z-c">=</span> <span class="z-string z-quoted z-single z-c"><span class="z-punctuation z-definition z-string z-begin z-c">&#39;</span><span class="z-constant z-character z-escape z-c">\0</span><span class="z-punctuation z-definition z-string z-end z-c">&#39;</span></span><span class="z-punctuation z-terminator z-c">;</span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"> <span class="z-keyword z-control z-flow z-return z-c">return</span> new_tag<span class="z-punctuation z-terminator z-c">;</span> +</span></span></span><span class="z-source z-c"><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"></span></span><span class="z-meta z-function z-c"><span class="z-meta z-block z-c"><span class="z-punctuation z-section z-block z-end z-c">}</span></span></span> +</span></code></pre> +<p>In Vala, we use string offsets:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-modifier z-vala">static</span> <span class="z-storage z-type z-vala">string</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">iso_639_from_tag</span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-storage z-type z-vala">string</span> <span class="z-variable z-parameter z-vala">dict_tag</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-control z-flow z-return z-vala">return</span> <span class="z-variable z-other z-vala">dict_tag</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">substring</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">0</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">dict_tag</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">index_of_char</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-meta z-string z-vala"><span class="z-string z-quoted z-single z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&#39;</span><span class="z-constant z-character z-literal z-vala">_</span><span class="z-punctuation z-definition z-string z-end z-vala">&#39;</span></span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></code></pre> +<p>The comparison here is perhaps obscured by the simplification obtained in Vala from automatic memory management, which is nothing to do with string handling <em>per se</em>.</p> +<h4 id="binding-challenges">Binding challenges<a class="zola-anchor" href="#binding-challenges" aria-label="Anchor link for: binding-challenges">#</a> +</h4> +<p>I had a number of particular challenges. Some of them may be relevant to other developers, but I detail them here mostly to illustrate that Vala can bind just about anything if you try!</p> +<h5 id="config-h"><code>config.h</code><a class="zola-anchor" href="#config-h" aria-label="Anchor link for: config-h">#</a> +</h5> +<p>Like any Autoconf-based build system, mine produce a <code>config.h</code> header of various <code>#define</code>d symbols, some of which my C code uses. These I simply replicate in a <a href="https://gitlab.gnome.org/GNOME/vala/-/blob/main/vapi/config.vapi"><code>Config</code> module</a></p> +<p>One could imagine generating this automatically from <code>config.h</code>, but since I didn’t need more than a handful of values in my projects, I didn’t bother.</p> +<h5 id="relocate"><code>relocate</code><a class="zola-anchor" href="#relocate" aria-label="Anchor link for: relocate">#</a> +</h5> +<p>This is a GNU API that returns a string that may or may not be <code>malloc</code>ed. You can tell which easily enough: if the return value is different from the argument, then it is a newly-allocated string. The problem is getting Vala to do the right thing. Even in C, I wrote my own wrapper function that would always return a <code>malloc</code>ed string.</p> +<p>Here’s the Vala VAPI definition:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-meta z-annotation z-vala"><span class="z-punctuation z-definition z-annotation z-begin z-vala">[</span><span class="z-variable z-annotation z-vala">CCode</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-annotation z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-parameter z-vala">cheader_filename</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>relocatable.h<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-parameter z-vala">cname</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>relocate<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-meta z-annotation z-vala"><span class="z-punctuation z-definition z-annotation z-end z-vala">]</span></span> +</span><span class="z-source z-vala"><span class="z-storage z-modifier z-access z-vala">private</span> <span class="z-support z-type z-vala">unowned</span> <span class="z-variable z-other z-vala">string</span> <span class="z-variable z-other z-vala">_gnulib_relocate</span>(<span class="z-variable z-other z-vala">string</span> <span class="z-variable z-other z-vala">path</span><span class="z-invalid z-illegal z-stray z-brace z-vala">)</span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></code></pre> +<p>I use the name <code>_gnulib_relocate</code> because I am about to add a Vala wrapper which uses the original name. We tell Vala that the return value is <code>unowned</code>, to prevent Vala thinking that it must <code>free</code> it.</p> +<p>Here’s the wrapper, which I also put in the VAPI:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-meta z-annotation z-vala"><span class="z-punctuation z-definition z-annotation z-begin z-vala">[</span><span class="z-variable z-annotation z-vala">CCode</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-annotation z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-parameter z-vala">cname</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>_vala_relocate<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-meta z-annotation z-vala"><span class="z-punctuation z-definition z-annotation z-end z-vala">]</span></span> +</span><span class="z-source z-vala"><span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-type z-vala">string</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">relocate</span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-storage z-type z-vala">string</span> <span class="z-variable z-parameter z-vala">path</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-support z-type z-vala">unowned</span> <span class="z-variable z-other z-vala">string</span> <span class="z-variable z-other z-vala">newpath</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">_gnulib_relocate</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">path</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-comment z-line z-vala"><span class="z-punctuation z-definition z-comment z-vala">//</span> If relocate malloced, then return the value, defeating Vala&#39;s attempt +</span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-comment z-line z-vala"><span class="z-punctuation z-definition z-comment z-vala">//</span> to (re-)strdup it. +</span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">GLib</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">return_val_if_fail</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">newpath</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">data</span> <span class="z-keyword z-operator z-vala">==</span> <span class="z-variable z-other z-vala">path</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">data</span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">newpath</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-comment z-line z-vala"><span class="z-punctuation z-definition z-comment z-vala">//</span> Otherwise, allow Vala to strdup the non-malloced return value. +</span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-control z-flow z-return z-vala">return</span> <span class="z-variable z-other z-vala">newpath</span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></code></pre> +<p>This is tricky. First, it calls the “real” <code>relocate</code> (but using its Vala name), and stores the result in an <code>unowned</code> string. So far, <code>valac</code> will not allocate any memory.</p> +<p>We then test the value returned, and if it is unequal to the original argument, return it. Because we use the <code>return_if_fail</code> macro, <code>valac</code> will not insert memory allocation code at this point, but that’s OK, because <code>relocate</code> has already <code>malloc</code>ed in this case, so the return value is an allocated <code>string</code> as indicated.</p> +<p>Otherwise, we simply <code>return</code> the un-<code>malloc</code>ed value. In the generated C, <code>valac</code> will insert a <code>g_strdup</code> at this point, so again the return value is an allocated string.</p> +<p>Phew!</p> +<h5 id="strfreev"><code>strfreev</code><a class="zola-anchor" href="#strfreev" aria-label="Anchor link for: strfreev">#</a> +</h5> +<p>Rather surprisingly, while <code>g_strfreev</code> takes <code>char **</code> (because it frees a list of strings), <code>strfreev</code> takes <code>string **</code>. Why? Well, Vala uses one level of pointer indirection to indicate that a value is not managed by Vala. So we have the following set of equivalences:</p> +<ul> +<li><code>string</code> = <code>char *</code> (generates <code>char *</code>; as we expect, a string is a pointer to <code>char</code>)</li> +<li><code>string *</code> = <code>char *</code> (generates <code>char *</code>; this is just a <code>string</code> that Vala does not manage)</li> +<li><code>string **</code> = <code>char **</code> (generates <code>char **</code>; now we have a list of <code>string</code>)</li> +</ul> +<p>This was a problem for me because I wanted to use <code>strfreev</code> to free a “real” <code>char **</code> passed in from C. But <code>valac</code> gives a type error. I got sufficiently confused that I submitted a <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/383">merge request</a>, and Rico had to de-confuse me. In the end, all I needed was a cast:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">strfreev</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala">(<span class="z-storage z-type z-vala">string</span> <span class="z-keyword z-operator z-vala">*</span><span class="z-keyword z-operator z-vala">*</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-variable z-other z-vala">c_string_list</span><span class="z-invalid z-illegal z-stray z-brace z-vala">)</span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></code></pre> +<p>The cast placates <code>valac</code>, and the generated C ends up calling <code>g_strfreev</code>, which expected a <code>char **</code> all along.</p> +<h5 id="s-size-t-is-not-really-s-size-t"><code>[s]size_t</code> is not really <code>[s]size_t</code><a class="zola-anchor" href="#s-size-t-is-not-really-s-size-t" aria-label="Anchor link for: s-size-t-is-not-really-s-size-t">#</a> +</h5> +<p>When compiling my Vala version of Enchant on Windows, I accidentally tried compiling it in a flavour of Windows I don’t normally test, namely Mingw MSYS (I normally build for Mingw64-x86_64 and Mingw64-i686). To my surprise, I got a compilation error: GCC complained that one 8-byte signed integer type (<code>long int</code>) was incompatible with another 8-byte signed integer type (<code>long long int</code>). Yes, these are both 64-bit types on this system, and yes, they are nonetheless incompatible.</p> +<p>But why did I have this problem in the first place? I was using Vala’s <code>ssize_t</code>, and Vala maps this to GLib’s <code>gsize</code>. I don’t know why, but it’s a problem, because in some cases, like mine, these two types end up with different fundamental types in the C compiler, and an error results. I filed an <a href="https://gitlab.gnome.org/GNOME/vala/-/issues/1539">issue</a> and found a workaround, which was to copy the definition of <code>size_t</code> and <code>ssize_t</code> from <code>posix.vapi</code>, which are normally only used when <code>valac</code> is used with <code>--profile posix</code> and the GLib definitions are not used. The <code>posix.vapi</code> definitions correctly map <code>size_t</code> in Vala to <code>size_t</code> in C.</p> +<h3 id="and-helping-hands">…and helping hands<a class="zola-anchor" href="#and-helping-hands" aria-label="Anchor link for: and-helping-hands">#</a> +</h3> +<p>I mentioned above that Vala is a small ecosystem. An up-side to this is that it’s friendly and usually quick to get things done. The fixes I offered were mostly triaged and applied by the indefatigable Rico Tzschichholz, who was often able to suggest more elegant solutions, mostly for my VAPI bindings. I ended up using a pre-release of <code>valac</code> for Zile, but I could release the code, since you didn’t need <code>valac</code> to build it, and within a few months, Vala 0.52 was released with all the fixes I needed.</p> +<p>With Enchant I have had help from Rico again, and also from Lorenz Wildberg; many thanks to both of them, and to everyone else in the community to has both helped me with my projects, and welcomed my own contributions, which, I hope, improve things for everyone else.</p> +<h2 id="was-it-worth-it">Was it worth it?<a class="zola-anchor" href="#was-it-worth-it" aria-label="Anchor link for: was-it-worth-it">#</a> +</h2> +<p>With GNU Zile I can say: probably, yes. I found one “brown-paper bag” bug in the initial stable release, but that’s it: I have made only two non-alpha releases of the Vala version. On the other hand, the C version was already very stable, and I suspect it’s not widely used any more (I myself have encouraged users to migrate to Emacs for some years!). But then, it was a low-risk project to try out this new technique. And a few years on, the code still builds with no problems: unlike some language ecosystems, Vala seems very stable, and code does not rot fast.</p> +<p>For Enchant, it’s too early to say. It’s a much more widely-used package, and though it is quite mature, I have steadily improved and developed it over the past few years, and intend to continue in future. I hope that the switch to Vala will not annoy packagers (it shouldn’t, as they shouldn’t have to change their recipes at all if they don’t want to), and that developers should not notice (because the library remains API and ABI compatible), nor users (because the functionality should be identical, and the performance much the same). Certainly, I expect it will make my future work more productive and fun!</p> +<h2 id="is-this-a-good-idea">Is this a good idea?<a class="zola-anchor" href="#is-this-a-good-idea" aria-label="Anchor link for: is-this-a-good-idea">#</a> +</h2> +<p>My projects are old-school: highly portable, low-level C. This is not an area that Vala is particularly aimed at, although it does pretty well here. For projects that are firmly in the GLib world, and especially when they use related libraries such as Gtk, rewriting C in Vala seems an excellent option to me.</p> +<p>While I completely rewrote my projects before releasing them, I think I’ve shown there’s no need to do that. When I rewrote Zile in Lua, the intermediate steps had horrible performance, because the Lua/C interface I used was very inefficient (Lua has an efficient-but-complex C API; I chose to use some simple-but-slow home-grown macros instead). When I rewrote Zile in Vala, the performance was much the same at every stage of the process, and I could easily have translated just half of the code and released the project. Many projects, particularly larger ones, might benefit from such an approach.</p> +<p>After completing the translation, the code was already significantly shorter and more readable than in C. This in turn unlocked further simplifications: able to “see the wood for the trees” it was much easier to refactor and further simplify the code. With Zile, I eventually reduced 8,000 lines of C to 6,000 of Vala, a 25% reduction; in Enchant the percentage saving was more like 35%, largely because of a reduction in GLib boilerplate, such as argument validation, which Vala mostly automates.</p> +<p>One final thought: I hope that Vala will continue to flourish for many years, but if it doesn’t, then all is not lost: in the worst case, I or my successor could salvage the generated C code, which is ugly but far from impossible to read (and C, I think we can confidently say, will be around for many decades yet); and Vala is also a relatively “neutral” language that would be easy to translate again, into Rust, say; indeed, it would be easier to do that starting from Vala than from C, largely because the Vala code is easier to read and understand.</p> +<hr /> +<p>You are always invited to join our matrix chat <a href="https://matrix.to/#/#_gimpnet_#vala:gnome.org">#vala:gnome.org</a> and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!</p> +<!-- LocalWords: Vala’s GLib GObject Lua’s VAPI GLib’s Enchant’s codegen +<!-- LocalWords: Automake’s Terminfo Gtk Mingw MSYS VAPIs regex libgee ed +<!-- LocalWords: ArrayList int getopt freopen FileStream putc valac Jürg +<!-- LocalWords: config Billeter malloc vala CCode cheader cname newpath +<!-- LocalWords: malloced Vala's strdup val un strfreev Mingw64 i686 vapi +<!-- LocalWords: ssize gsize posix gimpnet se +--> + + + + + print("Hello Planet GNOME"); + 2023-10-11T00:00:00+00:00 + 2023-10-11T00:00:00+00:00 + + + + + Unknown + + + + + + https://vala.dev/blog/planet-gnome/ + + <p>Hello to all of you reading <a href="https://planet.gnome.org/">Planet GNOME</a> right now! This is the first post from the <a href="https://vala.dev/blog/">Vala Blog</a> now appearing in the big wide world of GNOME.</p> +<p>Big thanks to the Planet GNOME team and Felipe Borges for making this possible!</p> +<p>This blog is operated by the Vala project and we are posting here once in a while about new Vala releases, noteworthy changes like new features and how to use them, interesting projects using Vala and their experience with it and other stuff related to the Vala programming language.</p> +<p>If you have an idea to write about something that fits one of the categories above, reach out to us and we are sure eventually a great article will be released! (Talk to us <a href="https://vala.dev/#community">here</a>)</p> +<p>Stay tuned for the next posts coming out! :)</p> + + + + + Vala 0.56 + 2022-03-18T00:00:00+00:00 + 2022-03-18T00:00:00+00:00 + + + + + Unknown + + + + + + https://vala.dev/blog/vala-0-56/ + + <p>After 4 months of work we are proud to announce a new release of Vala. This time it contains lots of new language features and advancements and of course also the usual bug fixes and binding updates.</p> +<h2 id="asynchronous-main-function">Asynchronous Main Function<a class="zola-anchor" href="#asynchronous-main-function" aria-label="Anchor link for: asynchronous-main-function">#</a> +</h2> +<p>With the new release the main function can now be defined as <code>async</code>. This has multiple advantages. For example is it now possible to call asynchronous functions with <code>yield</code>:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-modifier z-vala">async</span> <span class="z-storage z-type z-vala">int</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">main</span> <span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-storage z-type z-vala">string</span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-begin z-vala">[</span><span class="z-punctuation z-section z-brackets z-end z-vala">]</span></span> <span class="z-variable z-parameter z-vala">args</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-type z-vala">string</span> <span class="z-variable z-other z-vala">dir</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">args</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">length</span> <span class="z-keyword z-operator z-vala">==</span> <span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">2</span></span> <span class="z-keyword z-operator z-ternary z-vala">?</span> <span class="z-variable z-other z-vala">args</span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-begin z-vala">[</span></span><span class="z-meta z-brackets z-vala"><span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">1</span></span></span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-end z-vala">]</span></span> <span class="z-keyword z-operator z-ternary z-vala">:</span> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>.<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-type z-variable z-vala">var</span> <span class="z-variable z-other z-vala">file</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">File</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">new_for_commandline_arg</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">dir</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-meta z-block z-trycatch z-vala"><span class="z-keyword z-control z-trycatch z-try z-vala">try</span> <span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-support z-type z-vala">FileEnumerator</span> <span class="z-variable z-other z-vala">enumerator</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-other z-vala">yield</span> <span class="z-variable z-other z-vala">file</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">enumerate_children_async</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>standard::*,time::*<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-variable z-other z-vala">FileQueryInfoFlags</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">NOFOLLOW_SYMLINKS</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> </span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-support z-type z-vala">List</span><span class="z-meta z-generic z-vala"><span class="z-punctuation z-definition z-generic z-begin z-vala">&lt;</span></span><span class="z-meta z-generic z-vala"><span class="z-support z-type z-vala">FileInfo</span><span class="z-meta z-generic z-vala"><span class="z-punctuation z-definition z-generic z-end z-vala">&gt;</span></span></span> <span class="z-variable z-other z-vala">children</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-other z-vala">yield</span> <span class="z-variable z-other z-vala">enumerator</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">next_files_async</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-storage z-type z-vala">int</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">MAX</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">print</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>total %lu<span class="z-constant z-character z-escape z-vala">\n</span><span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">children</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">length</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-control z-loop z-foreach z-vala">foreach</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span><span class="z-meta z-group z-vala"><span class="z-storage z-type z-variable z-vala">var</span> <span class="z-variable z-other z-vala">info</span> <span class="z-keyword z-control z-flow z-vala">in</span> <span class="z-variable z-other z-vala">children</span><span class="z-punctuation z-section z-group z-end z-vala">)</span></span> <span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"> <span class="z-comment z-line z-vala"><span class="z-punctuation z-definition z-comment z-vala">//</span> &lt;file-type&gt; &lt;access-date&gt; &lt;size&gt; &lt;name&gt; +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">print</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>%26s %24s %10<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-keyword z-operator z-vala">+</span><span class="z-storage z-type z-vala">int64</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">FORMAT</span><span class="z-keyword z-operator z-vala">+</span><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span> B %s<span class="z-constant z-character z-escape z-vala">\n</span><span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> +</span></span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-variable z-other z-vala">info</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">get_content_type</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> +</span></span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-variable z-other z-vala">info</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">get_access_date_time</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">to_string</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> +</span></span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-variable z-other z-vala">info</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">get_size</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> +</span></span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"> <span class="z-variable z-other z-vala">info</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">get_name</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span> <span class="z-keyword z-control z-trycatch z-catch z-vala">catch</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span><span class="z-meta z-group z-vala"><span class="z-support z-type z-vala">Error</span> <span class="z-variable z-other z-vala">e</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span> <span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">printerr</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>failed to enumerate files - %s<span class="z-constant z-character z-escape z-vala">\n</span><span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">e</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">message</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-control z-flow z-return z-vala">return</span> <span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">1</span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span> +</span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"> </span><span class="z-keyword z-control z-flow z-return z-vala">return</span> <span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">0</span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></code></pre> +<p>In main blocks (experimental feature that allows it to write code in a file without putting in a main function) invoking functions with <code>yield</code> is also supported by making the main block automatically asynchronous.</p> +<p>Merge Request <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/226">#226</a></p> +<h2 id="nested-functions">Nested functions<a class="zola-anchor" href="#nested-functions" aria-label="Anchor link for: nested-functions">#</a> +</h2> +<p>A simple but very useful feature is to be able to nest functions inside of other functions or methods. These functions are then only visible to the code in the function that contains the nested one. But on the other way the code in the nested function has access to variables in the upper method. Actually they are only lambdas assigned to a local variable.</p> +<p>Use cases are to structure very complicated functions into multiple smaller ones, without exposing them publicly. In this example the same asynchronous callback is used for two invocations, in which you otherwise would use lambdas:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-type z-vala">void</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">write_streams</span> <span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-support z-type z-vala">OutputStream</span> <span class="z-variable z-parameter z-vala">stream1</span><span class="z-punctuation z-separator z-parameter z-function z-vala">,</span> <span class="z-support z-type z-vala">OutputStream</span> <span class="z-variable z-parameter z-vala">stream2</span><span class="z-punctuation z-separator z-parameter z-function z-vala">,</span> <span class="z-storage z-type z-vala">uint8</span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-begin z-vala">[</span><span class="z-punctuation z-section z-brackets z-end z-vala">]</span></span> <span class="z-variable z-parameter z-vala">data</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-type z-vala">void</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">nested_function</span> <span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-support z-type z-vala">Object</span> <span class="z-variable z-parameter z-vala">object_source</span><span class="z-punctuation z-separator z-parameter z-function z-vala">,</span> <span class="z-support z-type z-vala">AsyncResult</span> <span class="z-variable z-parameter z-vala">result</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-support z-type z-vala">OutputStream</span> <span class="z-variable z-other z-vala">stream</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">object_source</span> <span class="z-keyword z-operator z-reflection z-vala">as</span> <span class="z-support z-type z-vala">OutputStream</span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-meta z-block z-trycatch z-vala"><span class="z-keyword z-control z-trycatch z-try z-vala">try</span> <span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-type z-vala">ssize_t</span> <span class="z-variable z-other z-vala">size</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">stream</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">write_async</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">finish</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">result</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">stdout</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">printf</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-raw z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">@&quot;</span>Written $size bytes\n<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span> <span class="z-keyword z-control z-trycatch z-catch z-vala">catch</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span><span class="z-meta z-group z-vala"><span class="z-support z-type z-vala">Error</span> <span class="z-variable z-other z-vala">e</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span> <span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">stderr</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">printf</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>Error writing to stream: %s<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">e</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">message</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span> +</span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-block z-trycatch z-vala"> </span><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">stream1</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">write_async</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">data</span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">nested_function</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">stream2</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">write_async</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">data</span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-variable z-other z-vala">nested_function</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span><span class="z-source z-vala"> +</span></code></pre> +<p>Merge Request <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/203">#203</a></p> +<h2 id="redesign-of-error-and-warning-output">Redesign of error and warning output<a class="zola-anchor" href="#redesign-of-error-and-warning-output" aria-label="Anchor link for: redesign-of-error-and-warning-output">#</a> +</h2> +<p>If programming errors are outputted at compile time in a pretty way and provide as much information as possible, they massively help and speed up finding the mistakes and correcting them. In the new release this part got an update. Look at the differences yourself:</p> +<p>Before Vala 0.56:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-type z-vala">int</span> <span class="z-variable z-other z-vala">foo</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">bar</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"> <span class="z-keyword z-operator z-vala">^</span><span class="z-keyword z-operator z-vala">^</span><span class="z-keyword z-operator z-vala">^</span> +</span></code></pre> +<p>Vala 0.56:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">2</span></span> <span class="z-keyword z-operator z-vala">|</span> <span class="z-storage z-type z-vala">int</span> <span class="z-variable z-other z-vala">foo</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">bar</span><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"> <span class="z-keyword z-operator z-vala">|</span> <span class="z-keyword z-operator z-vala">^</span><span class="z-keyword z-operator z-vala">~</span><span class="z-keyword z-operator z-vala">~</span> +</span><span class="z-source z-vala"> +</span></code></pre> +<p>What looks better? :)</p> +<p>Issue <a href="https://gitlab.gnome.org/GNOME/vala/-/issues/764">#764</a></p> +<h2 id="dynamic-invocation-of-signals">Dynamic invocation of Signals<a class="zola-anchor" href="#dynamic-invocation-of-signals" aria-label="Anchor link for: dynamic-invocation-of-signals">#</a> +</h2> +<p>Libraries using the GObject type system are providing usually documentation about their API so other languages can use them. However sometimes some parts are missing. With the <code>dynamic</code> keyword an object can be treated as not having all properties or signals specified and they can be accessed dynamically without checking:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-support z-type z-vala">dynamic</span> <span class="z-variable z-other z-vala">Gst</span>.<span class="z-variable z-other z-vala">Element</span> <span class="z-variable z-other z-vala">appsink</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">Gst</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">ElementFactory</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">make</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>appsink<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span><span class="z-punctuation z-separator z-argument z-vala">,</span> <span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>my_src<span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"><span class="z-variable z-other z-vala">appsink</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">max_buffers</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">0</span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"><span class="z-variable z-other z-vala">appsink</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">eos</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">connect</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-variable z-other z-vala">on_eos</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"><span class="z-support z-type z-vala">Gst</span><span class="z-punctuation z-accessor z-dot z-namespace z-vala">.</span><span class="z-support z-type z-vala">Sample</span><span class="z-storage z-type z-nullable z-vala">?</span> <span class="z-variable z-other z-vala">res</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-variable z-other z-vala">appsink</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">pull_sample</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">emit</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span><span class="z-source z-vala"> +</span></code></pre> +<p>As you can see, signals are now also callable with <code>.emit ()</code>. This is necessary to differentiate between a method or a dynamic signal. But this syntax can be also used with non-dynamic variables if wanted.</p> +<p>Merge Request <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/227">#227</a></p> +<h2 id="partial-classes">Partial classes<a class="zola-anchor" href="#partial-classes" aria-label="Anchor link for: partial-classes">#</a> +</h2> +<p>In rare cases, if a class is so huge and complex, it can be now split up into multiple pieces even into multiple files. All parts of the class only need the partial keyword in front of it.</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-modifier z-vala">partial</span> <span class="z-meta z-class z-vala"><span class="z-storage z-type z-class z-vala">class</span> <span class="z-entity z-name z-class z-vala">Foo </span><span class="z-punctuation z-separator z-type z-vala">:</span> <span class="z-entity z-other z-inherited-class z-vala">Object</span> </span><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-type z-vala">double</span> <span class="z-support z-type z-vala">bar</span> { <span class="z-support z-type z-vala">get</span>; <span class="z-support z-type z-vala">set</span>; } +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala">} +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-modifier z-vala">partial</span> <span class="z-meta z-class z-vala"><span class="z-storage z-type z-class z-vala">class</span> <span class="z-entity z-name z-class z-vala">Foo </span><span class="z-punctuation z-separator z-type z-vala">:</span> <span class="z-entity z-other z-inherited-class z-vala">Initable</span> </span><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-storage z-modifier z-access z-vala">public</span> <span class="z-storage z-modifier z-vala">virtual</span> <span class="z-storage z-type z-vala">bool</span> <span class="z-meta z-method z-constructor z-vala"><span class="z-entity z-name z-function z-constructor z-vala">init</span> <span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-begin z-vala">(</span></span></span><span class="z-meta z-method z-constructor z-vala"><span class="z-meta z-method z-parameters z-vala"><span class="z-support z-type z-vala">Cancellable</span><span class="z-storage z-type z-nullable z-vala">?</span> <span class="z-variable z-parameter z-vala">cancellable</span> <span class="z-keyword z-operator z-assignment z-default-value z-vala">=</span> <span class="z-constant z-language z-vala">null</span></span><span class="z-meta z-method z-parameters z-vala"><span class="z-punctuation z-section z-parameters z-end z-vala">)</span></span> </span><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-begin z-vala">{</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-other z-vala">stdout</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-meta z-function-call z-vala"><span class="z-variable z-function z-vala">printf</span> <span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-begin z-vala">(</span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-string z-quoted z-double z-vala"><span class="z-punctuation z-definition z-string z-begin z-vala">&quot;</span>hello!<span class="z-constant z-character z-escape z-vala">\n</span><span class="z-punctuation z-definition z-string z-end z-vala">&quot;</span></span></span></span><span class="z-meta z-function-call z-vala"><span class="z-meta z-group z-vala"><span class="z-punctuation z-section z-group z-end z-vala">)</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-variable z-language z-vala">this</span><span class="z-punctuation z-accessor z-dot z-vala">.</span><span class="z-variable z-other z-vala">bar</span> <span class="z-keyword z-operator z-assignment z-vala">=</span> <span class="z-meta z-number z-float z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">0</span><span class="z-constant z-numeric z-value z-vala"><span class="z-punctuation z-separator z-decimal z-vala">.</span>56</span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-keyword z-control z-flow z-return z-vala">return</span> <span class="z-constant z-language z-vala">true</span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></span></span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-method z-body z-vala"><span class="z-meta z-block z-vala"> <span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></span></span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"><span class="z-punctuation z-section z-block z-end z-vala">}</span></span></span> +</span></span></span><span class="z-source z-vala"><span class="z-meta z-class z-body z-vala"><span class="z-meta z-block z-vala"> +</span></span></span></code></pre> +<p>Merge Request <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/200">#200</a></p> +<h2 id="length-type-for-arrays">Length-type for Arrays<a class="zola-anchor" href="#length-type-for-arrays" aria-label="Anchor link for: length-type-for-arrays">#</a> +</h2> +<p>The length of an array is usually specified by an 32bit integer. However in some cases, especially in bindings to other libaries, sometimes the length of an array is given by a different type of integer. We now have support for that:</p> +<pre data-lang="vala" class="language-vala z-code"><code class="language-vala" data-lang="vala"><span class="z-source z-vala"><span class="z-storage z-type z-vala">string</span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-begin z-vala">[</span><span class="z-punctuation z-section z-brackets z-end z-vala">]</span></span> <span class="z-variable z-other z-vala">list</span> <span class="z-keyword z-operator z-assignment z-variable z-vala">=</span> <span class="z-meta z-instance z-vala"><span class="z-keyword z-operator z-new z-vala">new</span></span><span class="z-meta z-instance z-vala"> </span><span class="z-meta z-instance z-vala"><span class="z-storage z-type z-vala">string</span><span class="z-meta z-brackets z-vala"><span class="z-punctuation z-section z-brackets z-begin z-vala">[</span><span class="z-meta z-number z-integer z-decimal z-vala"><span class="z-constant z-numeric z-value z-vala">10</span></span>:<span class="z-storage z-type z-vala">uint8</span><span class="z-punctuation z-section z-brackets z-end z-vala">]</span></span></span><span class="z-punctuation z-terminator z-statement z-vala">;</span> +</span></code></pre> +<p>Issue <a href="https://gitlab.gnome.org/GNOME/vala/-/issues/607">#607</a></p> +<h2 id="foreach-support-on-glib-sequence-and-glib-array">Foreach support on Glib.Sequence and Glib.Array<a class="zola-anchor" href="#foreach-support-on-glib-sequence-and-glib-array" aria-label="Anchor link for: foreach-support-on-glib-sequence-and-glib-array">#</a> +</h2> +<p>This small change will be a big improvement for users of these data structures. Instead of manually looping with for, they are now ready to be used with a foreach loop over the items in the sequence or array.</p> +<p>Merge Request <a href="https://gitlab.gnome.org/GNOME/vala/-/merge_requests/234">#234</a></p> +<h2 id="new-bindings">New Bindings<a class="zola-anchor" href="#new-bindings" aria-label="Anchor link for: new-bindings">#</a> +</h2> +<p>A bunch of new bindings to libraries got added this release. Here is a list:</p> +<ul> +<li>libsoup is now also available in version 3.0 and webkit2gtk in version 4.1 and 5.0 so you can start porting you Vala apps to the new releases of these libraries</li> +<li>linux-media can now be used from Vala. There were also lots of more additions and fixes in other linux kernel interface bindings.</li> +<li>During the port of the gnome-desktop library it was splitted up into gnome-desktop-4, gnome-rr-4 and gnome-bg-4. They are all now available to use in your new app.</li> +<li>The GLib vapi was updated to version 2.72, including the new Signal- and BindingGroups and DebugController</li> +</ul> +<h2 id="gnome-getting-started-tutorial">GNOME Getting started tutorial<a class="zola-anchor" href="#gnome-getting-started-tutorial" aria-label="Anchor link for: gnome-getting-started-tutorial">#</a> +</h2> +<p>The GNOME developer documentation has besides other stuff a excellent section on getting started with GTK and app development. Most of the <a href="https://developer.gnome.org/documentation/tutorials.html">tutorials</a> there have now code examples in Vala. So read it and write your first Vala application! :)</p> +<h2 id="vala-flatpak-sdk-extension">Vala Flatpak Sdk Extension<a class="zola-anchor" href="#vala-flatpak-sdk-extension" aria-label="Anchor link for: vala-flatpak-sdk-extension">#</a> +</h2> +<p>You can find on flathub now the <code>org.freedesktop.Sdk.Extension.vala</code> Extension. It contains the Vala compiler, language server and more tooling. You can use it either for compiling your Vala app, or if you need for example the language server at runtime, like an IDE. Instructions can be found at the <a href="https://github.com/flathub/org.freedesktop.Sdk.Extension.vala">flathub repository</a>.</p> +<h2 id="google-summer-of-code">Google Summer of Code<a class="zola-anchor" href="#google-summer-of-code" aria-label="Anchor link for: google-summer-of-code">#</a> +</h2> +<p>We have proposed a project idea for the Google Summer of Code for working on Vala. If you are interested, check out the <a href="https://discourse.gnome.org/t/gsoc-2022-project-ideas/8931#add-support-for-the-latest-gir-attributes-and-gi-docgen-formatting-to-valadoc-15">project ideas page</a> on GNOME discourse.</p> +<hr /> +<p>You are always invited to join our matrix chat <a href="https://matrix.to/#/#_gimpnet_#vala:gnome.org">#vala:gnome.org</a> and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!</p> + + + + diff --git a/blog/c-off-ramp/index.html b/blog/c-off-ramp/index.html new file mode 100644 index 0000000..0b9b014 --- /dev/null +++ b/blog/c-off-ramp/index.html @@ -0,0 +1,370 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Vala: the smoothest C off-ramp + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+
+

Vala: the smoothest C off-ramp

+

Using Vala to rewrite old C code

+ + + + Reuben Thomas + + + + Blog +
+

Hi! I’m Reuben, a long-time free software maintainer and author. One of my specialities is taking on mature projects from their original authors and maintaining them long-term.

+

In this post, I want to talk about how I’ve rewritten entire projects in Vala, to make them easier, more productive and more fun to maintain.

+

Vala works well with C—that’s one of its primary features and design choices. But these abilities can be used for another purpose: to provide a “smooth off-ramp” for C, converting old code step-by-step to more-maintainable Vala, without an “all or nothing” rewrite, and with the ability to reimplement C libraries in Vala, so that existing C code can still call them.

+

Over the few years, I have rewritten two small–to–medium-sized C +code bases in Vala: the minimal Emacs clone GNU Zile and the spell-checking meta-library Enchant, which has been used by GNOME for years, most recently by libspelling, which provides spell-checking in the GNOME Text Editor. In the rest of this post, I’ll focus on the challenges I faced doing these rewrites, how Vala helped me, and discuss whether such a drastic move (of rewriting entire code bases) was in fact a good idea.

+

Vala is good at talking to C# +

+

Vala is designed to work well with C, and a nice consequence of this is that often one doesn’t have to think about C at all, because so many useful libraries are already conveniently bound to Vala “out of the box”. It’s impressive the degree to which some of Vala’s basic abilities, such as its “built-in” container types are “just” clever binding of GLib functions plus some syntactic sugar.

+

But Vala’s binding abilities are very powerful: it’s not just GLib and GObject APIs that it can bind successfully; it can bind almost any C API. Later I will also show some examples that test its limits.

+

Further, Vala can implement C APIs just as well as it can consume them.

+

Allowing C to talk back# +

+

Why would you want to implement C APIs in Vala? I have three answers for you. Firstly, maintaining a typical C code-base is a horrible experience. I just wanted to not have more memory management errors, especially to do with strings (which both Zile and Enchant are big on). It’s so easy to corrupt memory, to get lifetimes wrong, or simply get the wrong answer with C’s primitive string manipulation routines.

+

Secondly, implementing an existing C API in Vala gives an easier-to-maintain codebase that can be used by existing consumers, which don’t need to be C programs: they can be written in Python, Rust, JavaScript or, of course, Vala!

+

Thirdly, and perhaps less obviously, you can use this ability to rewrite a C program in Vala incrementally, one module (say) at a time. The result is a pure Vala application (no C APIs are being implemented), but at each step one has a complete working application, partly written in C and partly in Vala; and where C needs to call Vala, the Vala code must implement the right C APIs.

+

Before we start, a sanity check# +

+

I’m talking about rewriting mature code-bases. Zile dates from the late 1990s, and I rewrote it into Vala in 2020. Enchant was written starting around 2003, and I rewrote it in Vala this week (in 2024). So:

+
    +
  • Isn’t that an awful lot of work?
  • +
  • Won’t it introduce lots of new bugs?
  • +
+

In other words, is it worth it? Or am I just being quixotic?

+

It’s not that hard# +

+

As I said above, I rewrote Enchant in Vala this week. Actually, that’s not quite true: I rewrote the core, about 2,000 lines of C. Enchant is, as I said above, a meta-library: that is, it doesn’t do spell-checking itself, but delegates to a number of libraries that do. Each one needs an adaptor plugin, which Enchant calls a “provider”, and these providers are written in C, C++ and even Objective C. I haven’t touched those (yet!).

+

But still, 2,000 lines of code in a week is not bad.

+

GNU Zile was about 8,000 lines of C, and that took me about a month.

+

Avoiding a plague of new bugs# +

+

Vala is well matched to C# +

+

Any time you touch code you can introduce bugs, of course: the slightest adjustment can be risky. How much more so rewriting in another language?

+

The good news here is that because Vala is so close to C, it is relatively easy to translate code without introducing new bugs. The syntax is sufficiently similar that code can be easily translated with some search and replace (e.g. NULL in C becomes null in Vala) plus light editing (e.g. adding missing comparisons in conditions to make them boolean, so that if (ptr) in C becomes if (ptr != null) in Vala). C APIs can be used directly via Vala bindings, and C data structures can be replicated precisely. Vala’s static typing also helps.

+

Here’s an example of a struct in C from Zile:

+
struct Region
+{
+#define FIELD(ty, name) ty name;
+#include "region.h"
+#undef FIELD
+};
+
+#define FIELD(ty, field)                  \
+  GETTER (Region, region, ty, field)      \
+  SETTER (Region, region, ty, field)
+
+#include "region.h"
+#undef FIELD
+
+

The file region.h contained:

+
FIELD(size_t, start)
+FIELD(size_t, end)
+
+

Here’s the translation into Vala:

+
public class Region {
+    public size_t start { get; set; }
+    public size_t end { get; set; }
+    // …methods go here
+}
+
+

Compare and contrast: around 2009, I translated Zile into Lua. I completed the translation, but I did not release it, as I found that Lua’s lack of static type-checking made it too easy to introduce new bugs. While I was translating it I was forever finding off-by-one errors caused by Lua counting arrays and string positions from 1, while C is 0-based (as is Vala, of course). Don’t get me wrong: Lua is a great language; indeed, I have successfully written other, smaller programs from C into Lua, though I wouldn’t now recommend that; its strengths lie elsewhere.

+

With Vala, I recommend making the initial translation as “light” as possible: don’t use lots of Vala’s features to rewrite code. Translate char * pointers to string offsets (that is, an integer string index). Make sure the translated code works first, then start simplifying. Even the “light” translation will contain simplifications, anyway: no more malloc or free, for example.

+

You already have a test suite, of course# +

+

The other way you avoid a plague of new bugs is with a good test suite. Sorry! There’s no way around that. If you want to alter, let alone completely rewrite code, you need to have tests.

+

Fortunately, I had already added a fairly extensive test suite to Zile years ago, when I was trying to make sure that it really behaved exactly like Emacs. The situation with Enchant was even better: it has an exhaustive (and sometimes exhausting) test suite that checks every aspect of its API, added a few years after Enchant was written, by a commission from SIL International. (A big shout-out to those who commission work on libre software, especially this sort of important under-the-hood work. These tests have saved me from introducing bugs time and time again.)

+

Again, you have to be disciplined: no turning off the tests, or changing them as you go. Complete the translation without changing them, as far as possible.

+

Your existing build tool is probably supported# +

+

Many Vala projects these days are using the Meson build system, which is very popular in the GNOME space. But Vala is also supported well by older tools, such as CMake and GNU Autotools. Both of the projects I translated were using GNU Autotools, and I stuck with it, for two main reasons:

+
    +
  1. I use the excellent gnulib portability library to ensure that my POSIX-compliant code runs on most systems without problems. Unfortunately, gnulib is tied to GNU Autotools. But then, few build systems work on as many platforms as the Autotools in any case.
  2. +
  3. Automake not only has Vala support, but allows you to ship the generated C sources, so that users can build your code without a Vala compiler. This means that your translated project has exactly the same build dependencies as it had before, which can help with users and packagers who haven’t heard of Vala and don’t want to learn. With Zile, previously a pure-POSIX project, I added GLib as a build-time dependency, but of course that’s so widely used that it’s unlikely to be a problem. Enchant already used GLib.
  4. +
+

The Vala experience# +

+

I will now describe the process of translating the two code-bases. Although they were a bit different (Zile an application, Enchant a library), and I made the translations a few years apart, I was pleasantly surprised to find the second time that the process was much the same as the first.

+

Add Vala to the build system# +

+

With Autotools, this is a matter of adding a couple of configure.ac lines to detect the Vala compiler and check for GNU Make (which is required to build from Vala sources), and then adding a test Vala source file to a Makefile.am.

+

Translating the code# +

+

I typically translate one file at a time. The code will of course usually call functions from other parts of the program: I add a private VAPI file with suitable bindings. You can usefully pre-populate the VAPI file with the commented-out contents of relevant C header files, then just uncomment the APIs you need in Vala, and edit them suitably. The excellent Manual bindings guide from the Wiki is my constant companion.

+

To translate a file, I copy foo.c to foo_vala.vala. (The _vala bit ensures that the Vala-generated C won’t overwrite the original file, which I will keep for reference.) I translate the code, possibly in multiple steps, commenting out the bits I have translated in foo.c.

+

Compile, test, fix, rinse, repeat.

+

I find that I get a nice rhythm with my translation, of doing the obvious basic syntactic stuff, as mentioned above, then finding the equivalent Vala APIs where necessary, then tackling any hard bits, such as binding third-party APIs that Vala does not yet know about.

+

For Zile I leaned heavily on the POSIX VAPI, and added a new GNU VAPI for some GNU-specific APIs, which I have also used and extended while translating Enchant. Enchant was easier on the whole, because it was already GLib-based, so I just had to search valadoc.org for the Vala versions of the GLib APIs.

+

For Zile, I found libgee invaluable, with its superior collections that are both richer than GLib’s and allows extra use cases, such as collections of unboxed simple types (e.g. ArrayList<int>). For Enchant, it so happened I didn’t need this extra functionality; Enchant’s use of collections is mostly limited to singly-linked lists of objects and hash tables with string keys.

+

Stumbling blocks…# +

+

Documentation and API coverage# +

+

Vala is a small ecosystem, even after all these years. Hence, I found bugs, mostly in the documentation. I took the time to submit fixes, and this past week reaped the rewards! Some of these fixes went as far as GLib itself; many were to the Vala wiki. As I noted above, I also made additions to the VAPIs, in particular adding a complete binding for the POSIX, GNU and BSD regex APIs (Zile only needed the GNU API, but since the GNU regex module implements all three, I thought I might as well!), as well as getopt_long(). I added freopen to the POSIX VAPI (as FILE.reopen()), upgraded the curses VAPI to improve its Terminfo coverage and add key-codes for function keys, and added return codes to GLib’s FileStream.putc and puts.

+

I was also able to offer my old-school expertise to the Vala project itself: I converted the test suite to use Automake’s relatively recent ability to run tests in parallel.

+

Falling between two stools# +

+

Vala itself mostly insulates you from the memory-management woes that bedevil C, but mid-translation there is still C code, so you have to be careful if you want to keep a working program. It’s always tempting to just plough on with the translation and hope that crashes will disappear, but I try not to give in, as that can bury bugs deeper and make them harder to find later. So, expect to spend some time studying valac-generated C, and revising your knowledge of owned and other esoteric Vala features.

+

For me, this is particularly relevant to Enchant, as a C library whose API and ABI I want to maintain. I am happy to report that I have been mostly successful, and at the time of writing I am tracking down some problems with object lifetime management, but otherwise the Vala implementation seems to perfectly replicate the C.

+

Another area of awkwardness is strings: as I hinted above, C often uses pointers to refer to string positions, whereas in Vala it’s usual to use integer offsets. This code is fairly easy to convert once you get the hang of it. Since C can use offsets instead of pointers, you can always rewrite the code in two stages, first changing the C to use offsets, and then translating it into Vala.

+

Here’s an example of the translation from pointers in C to offsets in Vala. The C version refers to positions in strings with pointers:

+
char * enchant_iso_639_from_tag (const char * const dict_tag) {
+    char * new_tag = strdup (dict_tag);
+    if (new_tag == NULL)
+        return NULL;
+    char * needle = strchr (new_tag, '_');
+
+    if (needle != NULL)
+        *needle = '\0';
+
+    return new_tag;
+}
+
+

In Vala, we use string offsets:

+
static string iso_639_from_tag(string dict_tag) {
+    return dict_tag.substring(0, dict_tag.index_of_char('_'));
+}
+
+

The comparison here is perhaps obscured by the simplification obtained in Vala from automatic memory management, which is nothing to do with string handling per se.

+

Binding challenges# +

+

I had a number of particular challenges. Some of them may be relevant to other developers, but I detail them here mostly to illustrate that Vala can bind just about anything if you try!

+
config.h# +
+

Like any Autoconf-based build system, mine produce a config.h header of various #defined symbols, some of which my C code uses. These I simply replicate in a Config module

+

One could imagine generating this automatically from config.h, but since I didn’t need more than a handful of values in my projects, I didn’t bother.

+
relocate# +
+

This is a GNU API that returns a string that may or may not be malloced. You can tell which easily enough: if the return value is different from the argument, then it is a newly-allocated string. The problem is getting Vala to do the right thing. Even in C, I wrote my own wrapper function that would always return a malloced string.

+

Here’s the Vala VAPI definition:

+
[CCode (cheader_filename = "relocatable.h", cname = "relocate")]
+private unowned string _gnulib_relocate(string path);
+
+

I use the name _gnulib_relocate because I am about to add a Vala wrapper which uses the original name. We tell Vala that the return value is unowned, to prevent Vala thinking that it must free it.

+

Here’s the wrapper, which I also put in the VAPI:

+
[CCode (cname = "_vala_relocate")]
+public string relocate(string path) {
+    unowned string newpath = _gnulib_relocate(path);
+    // If relocate malloced, then return the value, defeating Vala's attempt
+    // to (re-)strdup it.
+    GLib.return_val_if_fail(newpath.data == path.data, newpath);
+    // Otherwise, allow Vala to strdup the non-malloced return value.
+    return newpath;
+}
+
+

This is tricky. First, it calls the “real” relocate (but using its Vala name), and stores the result in an unowned string. So far, valac will not allocate any memory.

+

We then test the value returned, and if it is unequal to the original argument, return it. Because we use the return_if_fail macro, valac will not insert memory allocation code at this point, but that’s OK, because relocate has already malloced in this case, so the return value is an allocated string as indicated.

+

Otherwise, we simply return the un-malloced value. In the generated C, valac will insert a g_strdup at this point, so again the return value is an allocated string.

+

Phew!

+
strfreev# +
+

Rather surprisingly, while g_strfreev takes char ** (because it frees a list of strings), strfreev takes string **. Why? Well, Vala uses one level of pointer indirection to indicate that a value is not managed by Vala. So we have the following set of equivalences:

+
    +
  • string = char * (generates char *; as we expect, a string is a pointer to char)
  • +
  • string * = char * (generates char *; this is just a string that Vala does not manage)
  • +
  • string ** = char ** (generates char **; now we have a list of string)
  • +
+

This was a problem for me because I wanted to use strfreev to free a “real” char ** passed in from C. But valac gives a type error. I got sufficiently confused that I submitted a merge request, and Rico had to de-confuse me. In the end, all I needed was a cast:

+
strfreev((string **)c_string_list);
+
+

The cast placates valac, and the generated C ends up calling g_strfreev, which expected a char ** all along.

+
[s]size_t is not really [s]size_t# +
+

When compiling my Vala version of Enchant on Windows, I accidentally tried compiling it in a flavour of Windows I don’t normally test, namely Mingw MSYS (I normally build for Mingw64-x86_64 and Mingw64-i686). To my surprise, I got a compilation error: GCC complained that one 8-byte signed integer type (long int) was incompatible with another 8-byte signed integer type (long long int). Yes, these are both 64-bit types on this system, and yes, they are nonetheless incompatible.

+

But why did I have this problem in the first place? I was using Vala’s ssize_t, and Vala maps this to GLib’s gsize. I don’t know why, but it’s a problem, because in some cases, like mine, these two types end up with different fundamental types in the C compiler, and an error results. I filed an issue and found a workaround, which was to copy the definition of size_t and ssize_t from posix.vapi, which are normally only used when valac is used with --profile posix and the GLib definitions are not used. The posix.vapi definitions correctly map size_t in Vala to size_t in C.

+

…and helping hands# +

+

I mentioned above that Vala is a small ecosystem. An up-side to this is that it’s friendly and usually quick to get things done. The fixes I offered were mostly triaged and applied by the indefatigable Rico Tzschichholz, who was often able to suggest more elegant solutions, mostly for my VAPI bindings. I ended up using a pre-release of valac for Zile, but I could release the code, since you didn’t need valac to build it, and within a few months, Vala 0.52 was released with all the fixes I needed.

+

With Enchant I have had help from Rico again, and also from Lorenz Wildberg; many thanks to both of them, and to everyone else in the community to has both helped me with my projects, and welcomed my own contributions, which, I hope, improve things for everyone else.

+

Was it worth it?# +

+

With GNU Zile I can say: probably, yes. I found one “brown-paper bag” bug in the initial stable release, but that’s it: I have made only two non-alpha releases of the Vala version. On the other hand, the C version was already very stable, and I suspect it’s not widely used any more (I myself have encouraged users to migrate to Emacs for some years!). But then, it was a low-risk project to try out this new technique. And a few years on, the code still builds with no problems: unlike some language ecosystems, Vala seems very stable, and code does not rot fast.

+

For Enchant, it’s too early to say. It’s a much more widely-used package, and though it is quite mature, I have steadily improved and developed it over the past few years, and intend to continue in future. I hope that the switch to Vala will not annoy packagers (it shouldn’t, as they shouldn’t have to change their recipes at all if they don’t want to), and that developers should not notice (because the library remains API and ABI compatible), nor users (because the functionality should be identical, and the performance much the same). Certainly, I expect it will make my future work more productive and fun!

+

Is this a good idea?# +

+

My projects are old-school: highly portable, low-level C. This is not an area that Vala is particularly aimed at, although it does pretty well here. For projects that are firmly in the GLib world, and especially when they use related libraries such as Gtk, rewriting C in Vala seems an excellent option to me.

+

While I completely rewrote my projects before releasing them, I think I’ve shown there’s no need to do that. When I rewrote Zile in Lua, the intermediate steps had horrible performance, because the Lua/C interface I used was very inefficient (Lua has an efficient-but-complex C API; I chose to use some simple-but-slow home-grown macros instead). When I rewrote Zile in Vala, the performance was much the same at every stage of the process, and I could easily have translated just half of the code and released the project. Many projects, particularly larger ones, might benefit from such an approach.

+

After completing the translation, the code was already significantly shorter and more readable than in C. This in turn unlocked further simplifications: able to “see the wood for the trees” it was much easier to refactor and further simplify the code. With Zile, I eventually reduced 8,000 lines of C to 6,000 of Vala, a 25% reduction; in Enchant the percentage saving was more like 35%, largely because of a reduction in GLib boilerplate, such as argument validation, which Vala mostly automates.

+

One final thought: I hope that Vala will continue to flourish for many years, but if it doesn’t, then all is not lost: in the worst case, I or my successor could salvage the generated C code, which is ugly but far from impossible to read (and C, I think we can confidently say, will be around for many decades yet); and Vala is also a relatively “neutral” language that would be easy to translate again, into Rust, say; indeed, it would be easier to do that starting from Vala than from C, largely because the Vala code is easier to read and understand.

+
+

You are always invited to join our matrix chat #vala:gnome.org and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!

+ + +
+ +
+
+ + + + + + + + + diff --git a/blog/index.html b/blog/index.html new file mode 100644 index 0000000..22508e1 --- /dev/null +++ b/blog/index.html @@ -0,0 +1,219 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Blog + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+

Blog

+ +
+ + + + +
+
+ + + + + + + + + diff --git a/blog/page/1/index.html b/blog/page/1/index.html new file mode 100644 index 0000000..28dd82e --- /dev/null +++ b/blog/page/1/index.html @@ -0,0 +1,6 @@ + + + + +Redirect +

Click here to be redirected.

diff --git a/blog/planet-gnome/index.html b/blog/planet-gnome/index.html new file mode 100644 index 0000000..471617d --- /dev/null +++ b/blog/planet-gnome/index.html @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +print("Hello Planet GNOME"); + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+
+

print("Hello Planet GNOME");

+

Posts from the Vala blog are now appearing on Planet GNOME!

+ + + + Lorenz Wildberg + + + + Blog +
+

Hello to all of you reading Planet GNOME right now! This is the first post from the Vala Blog now appearing in the big wide world of GNOME.

+

Big thanks to the Planet GNOME team and Felipe Borges for making this possible!

+

This blog is operated by the Vala project and we are posting here once in a while about new Vala releases, noteworthy changes like new features and how to use them, interesting projects using Vala and their experience with it and other stuff related to the Vala programming language.

+

If you have an idea to write about something that fits one of the categories above, reach out to us and we are sure eventually a great article will be released! (Talk to us here)

+

Stay tuned for the next posts coming out! :)

+ +
+ +
+
+ + + + + + + + + diff --git a/blog/vala-0-56/index.html b/blog/vala-0-56/index.html new file mode 100644 index 0000000..975bb6a --- /dev/null +++ b/blog/vala-0-56/index.html @@ -0,0 +1,309 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Vala 0.56 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+
+

Vala 0.56

+

Here's what's new in Vala release version 0.56

+ + + + Lorenz Wildberg + + + + Blog +
+

After 4 months of work we are proud to announce a new release of Vala. This time it contains lots of new language features and advancements and of course also the usual bug fixes and binding updates.

+

Asynchronous Main Function# +

+

With the new release the main function can now be defined as async. This has multiple advantages. For example is it now possible to call asynchronous functions with yield:

+
async int main (string[] args) {
+    string dir = args.length == 2 ? args[1] : ".";
+    var file = File.new_for_commandline_arg (dir);
+    try {
+        FileEnumerator enumerator =
+            yield file.enumerate_children_async (
+                "standard::*,time::*",
+                FileQueryInfoFlags.NOFOLLOW_SYMLINKS
+            );
+        List<FileInfo> children =
+            yield enumerator.next_files_async (int.MAX);
+        print ("total %lu\n", children.length ());
+        foreach (var info in children) {
+            // <file-type> <access-date> <size> <name>
+            print ("%26s %24s %10"+int64.FORMAT+" B %s\n",
+            info.get_content_type (),
+            info.get_access_date_time ().to_string (),
+            info.get_size (),
+            info.get_name ());
+        }
+    } catch (Error e) {
+        printerr ("failed to enumerate files - %s\n", e.message);
+        return 1;
+    }
+    return 0;
+}
+
+

In main blocks (experimental feature that allows it to write code in a file without putting in a main function) invoking functions with yield is also supported by making the main block automatically asynchronous.

+

Merge Request #226

+

Nested functions# +

+

A simple but very useful feature is to be able to nest functions inside of other functions or methods. These functions are then only visible to the code in the function that contains the nested one. But on the other way the code in the nested function has access to variables in the upper method. Actually they are only lambdas assigned to a local variable.

+

Use cases are to structure very complicated functions into multiple smaller ones, without exposing them publicly. In this example the same asynchronous callback is used for two invocations, in which you otherwise would use lambdas:

+
void write_streams (OutputStream stream1, OutputStream stream2, uint8[] data) {
+    void nested_function (Object object_source, AsyncResult result) {
+        OutputStream stream = object_source as OutputStream;
+        try {
+            ssize_t size = stream.write_async.finish (result);
+            stdout.printf (@"Written $size bytes\n");
+        } catch (Error e) {
+            stderr.printf ("Error writing to stream: %s", e.message);
+        }
+    }
+
+    stream1.write_async (data, nested_function);
+    stream2.write_async (data, nested_function);
+}
+
+
+

Merge Request #203

+

Redesign of error and warning output# +

+

If programming errors are outputted at compile time in a pretty way and provide as much information as possible, they massively help and speed up finding the mistakes and correcting them. In the new release this part got an update. Look at the differences yourself:

+

Before Vala 0.56:

+
int foo = bar();
+          ^^^
+
+

Vala 0.56:

+
2 | int foo = bar();
+  |           ^~~
+
+
+

What looks better? :)

+

Issue #764

+

Dynamic invocation of Signals# +

+

Libraries using the GObject type system are providing usually documentation about their API so other languages can use them. However sometimes some parts are missing. With the dynamic keyword an object can be treated as not having all properties or signals specified and they can be accessed dynamically without checking:

+
dynamic Gst.Element appsink = Gst.ElementFactory.make ("appsink", "my_src");
+appsink.max_buffers = 0;
+appsink.eos.connect (on_eos);
+Gst.Sample? res = appsink.pull_sample.emit ();
+
+
+

As you can see, signals are now also callable with .emit (). This is necessary to differentiate between a method or a dynamic signal. But this syntax can be also used with non-dynamic variables if wanted.

+

Merge Request #227

+

Partial classes# +

+

In rare cases, if a class is so huge and complex, it can be now split up into multiple pieces even into multiple files. All parts of the class only need the partial keyword in front of it.

+
public partial class Foo : Object {
+    public double bar { get; set; }
+}
+
+public partial class Foo : Initable {
+    public virtual bool init (Cancellable? cancellable = null) {
+        stdout.printf ("hello!\n");
+        this.bar = 0.56;
+        return true;
+    }
+}
+
+
+

Merge Request #200

+

Length-type for Arrays# +

+

The length of an array is usually specified by an 32bit integer. However in some cases, especially in bindings to other libaries, sometimes the length of an array is given by a different type of integer. We now have support for that:

+
string[] list = new string[10:uint8];
+
+

Issue #607

+

Foreach support on Glib.Sequence and Glib.Array# +

+

This small change will be a big improvement for users of these data structures. Instead of manually looping with for, they are now ready to be used with a foreach loop over the items in the sequence or array.

+

Merge Request #234

+

New Bindings# +

+

A bunch of new bindings to libraries got added this release. Here is a list:

+
    +
  • libsoup is now also available in version 3.0 and webkit2gtk in version 4.1 and 5.0 so you can start porting you Vala apps to the new releases of these libraries
  • +
  • linux-media can now be used from Vala. There were also lots of more additions and fixes in other linux kernel interface bindings.
  • +
  • During the port of the gnome-desktop library it was splitted up into gnome-desktop-4, gnome-rr-4 and gnome-bg-4. They are all now available to use in your new app.
  • +
  • The GLib vapi was updated to version 2.72, including the new Signal- and BindingGroups and DebugController
  • +
+

GNOME Getting started tutorial# +

+

The GNOME developer documentation has besides other stuff a excellent section on getting started with GTK and app development. Most of the tutorials there have now code examples in Vala. So read it and write your first Vala application! :)

+

Vala Flatpak Sdk Extension# +

+

You can find on flathub now the org.freedesktop.Sdk.Extension.vala Extension. It contains the Vala compiler, language server and more tooling. You can use it either for compiling your Vala app, or if you need for example the language server at runtime, like an IDE. Instructions can be found at the flathub repository.

+

Google Summer of Code# +

+

We have proposed a project idea for the Google Summer of Code for working on Vala. If you are interested, check out the project ideas page on GNOME discourse.

+
+

You are always invited to join our matrix chat #vala:gnome.org and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!

+ +
+ +
+
+ + + + + + + + + diff --git a/blog/valabot/index.html b/blog/valabot/index.html new file mode 100644 index 0000000..d8ac3df --- /dev/null +++ b/blog/valabot/index.html @@ -0,0 +1,211 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +ValaBot: an AI coding assistant fine-tuned for Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+
+

ValaBot: an AI coding assistant fine-tuned for Vala

+

An AI coding assistant fine-tuned for Vala and Gtk

+ + + + Sam Cowen + + + + Blog +
+

Enhancing AI Coding Assistants for Vala Developers# +

+

As a programmer, I've been impressed by AI coding assistants like GitHub Copilot and Codeium, which have significantly boosted my productivity. These tools excel at reducing disruptive interruptions, saving time on typing, and often completing lines of code accurately. However, I've encountered limitations with Copilot while working with the Vala programming language. Its suggestions often get muddled with similar languages like Java and C#, and it lacks training on the more common Vala libraries.

+

Like many other developers, I'm also dissatisfied with the dominance of Github Copilot and that open source code has been monetized without attribution or consideration for the original authors (some of whom now pay for the service).

+

This challenge inspired me to enhance the Copilot concept by creating an AI coding assistant that is finely tuned to provide a viable and superior alternative that caters for the specific needs of Vala developers. I began with an open-source Large Language Model that had been trained on source code - the powerful Deepseek Coder 6.7b model. This model has been trained from scratch by Deepseek AI on 2 trillion tokens sourced from GitHub. Deepseek Coder significantly outperforms other open-source coding models, such as Codellama.

+

I chose the Deepseekcoder-6.7b-base model as the foundation for fine-tuning because of its great benchmark performance and also because it was trained on Java and C# – languages syntactically close to Vala. This allowed me to build upon its existing capabilities and adapt it to the specific needs of Vala.

+

Fine-Tuning for Vala# +

+

I fine-tuned the model on Vala programming language datasets. This involved downloading as many Vala projects as I could find from GitHub, extracting the Vala source files, and splitting them into ~40 line segments. I then used Llama3 to create logical and predictable "holes" in each segment, which were then used to create the FIM (fill-in-the-middle) dataset. This data preparation process took 96 hours of GPU time using my quad-RX6800 machine over a weekend. The resulting dataset was cleaned to remove non-code elements, such as license headers, and personal identifiable information.

+

The Training# +

+

The fine-tuning process took 10 hours on an RTX 3090. The result was a LoRA, which was merged back into the base model, converted to GGUF, and quantized to q8_0, which is the format required by TabbyML.

+

The Result# +

+

The outcome was a model that is more helpful and productive for Vala-related projects. By fine-tuning Deepseek Coder, I was able to create a more accurate and effective AI coding assistant that understands the nuances of the Vala programming language. The model is hosted on Huggingface (https://huggingface.co/scowen/deepseek-coder-6.7b-vala/tree/main). It can be used in VSCode, VIM, and other popular IDEs with TabbyML. The complete instructions, training scripts, and dataset are available on GitHub (https://github.com/supercamel/ValaBot).

+

Licensing and Fair Use# +

+

As a project rooted in the principles of Free and Open-Source Software (FOSS), I believe in promoting freedom, community, and sharing knowledge. To facilitate collaboration and innovation, I've made the following resources publicly available:

+
    +
  • The fine-tuned model weights are hosted on Hugging Face for anyone to access and utilize in a TabbyML or other deployment.
  • +
  • The training scripts and dataset preparation process are open-sourced on GitHub, providing a transparent and reproducible framework for others to build upon.
  • +
  • A comprehensive list of repositories used during the fine-tuning process is available on GitHub, ensuring that contributors and users can easily identify and explore the sources that made this project possible.
  • +
+

I hope that this openness will pave the way for further advancements and refinements, ultimately benefiting the Vala developer community as a whole.

+

Conclusion# +

+

In this blog post, I've shared my experience with fine-tuning the Deepseek Coder for the Vala programming language, demonstrating how targeted adjustments can significantly enhance AI coding assistants. This project is just the beginning. I aim to continue developing models specifically optimized for Vala to support the Vala developer community. With the release of new base models, such as CodeQwen 7B, there are exciting possibilities for further advancements. Through this work, I hope to highlight the potential of AI fine-tuning in creating more effective coding assistants and inspire others to explore the possibilities of AI-assisted coding.

+

Get started with ValaBot here: https://github.com/supercamel/ValaBot

+ +
+ +
+
+ + + + + + + + + diff --git a/browserconfig.xml b/browserconfig.xml new file mode 100644 index 0000000..c554148 --- /dev/null +++ b/browserconfig.xml @@ -0,0 +1,2 @@ + +#ffffff \ No newline at end of file diff --git a/cs/about/index.html b/cs/about/index.html new file mode 100644 index 0000000..26d348b --- /dev/null +++ b/cs/about/index.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +O jazyce Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Přejít k hlavnímu obsahu + + + + + + + +
+
+ +
+
+ + + + +
+
+ +
+

O jazyce Vala

+

Co je Vala?# +

+

Vala je objektově orientovaný programovací jazyk s vlastním kompilátorem, který generuje kód v jazyce C a používá typový systém GObject.

+

Vala podporuje moderní jazykové funkce, jako jsou:

+
    +
  • Rozhraní
  • +
  • Vlastnosti
  • +
  • Signály
  • +
  • Konstrukce Foreach
  • +
  • Výrazy lambda
  • +
  • Odvozování typu pro místní proměnné
  • +
  • Generické typy
  • +
  • Ne-nullové typy
  • +
  • Asistovanou správu paměti
  • +
  • Zacházení s výjimkami
  • +
  • Typové moduly (pluginy)
  • +
+

Jakým jazykem je Vala?# +

+

Produktivní# +

+

S Valou můžete začít pracovat rychle díky praktickým funkcím, jako jsou lambda výrazy, zpracování výjimek, rozhraní a generika.

+

Výkonný# +

+

Kód Vala se zkompiluje na plně nativní binární soubory.

+

Staticky typovaný# +

+

Vala vám pomůže psát typově bezpečný kód bez zbytečných slov, a to díky odvozování typů.

+

Integrativní# +

+

Vala je navržena tak, aby umožňovala přístup k existujícím knihovnám jazyka C, zejména ke knihovnám založeným na GObject, bez nutnosti runtime vazeb. Vše, co je potřeba k použití knihovny s Valou, je soubor API obsahující deklarace tříd a metod v syntaxi Vala. Vala v současné době obsahuje vazby pro GLib a GTK+ a mnoho dalších z platformy GNOME.

+

Vala lze použít k vytváření knihoven také v jazyce C.

+

Známý# +

+

Syntaxe jazyka Vala je inspirována jazyky C# a Java, takže pokud jste některý z nich používali, snadno se přizpůsobíte psaní kódu jazyka Vala.

+ + + + +
+ +
+
+ + + + + + + + + diff --git a/cs/index.html b/cs/index.html new file mode 100644 index 0000000..bb4700a --- /dev/null +++ b/cs/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Programovací jazyk Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Přejít k hlavnímu obsahu + + + + + + + + + + +
+
+ +

Známý způsob vývoje aplikací

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + + + + +
+

Proč Vala?

+
+
+
+
+ + + + + Produktivita +
+
+
Můžete pohodlně psát kód objektově orientovaným způsobem s abstrakcemi na vysoké úrovni a zároveň mít přístup k hluboké integraci s technologiemi GNOME, jako GObject, GTK a další!
+
+
+
+
+ + + + + Výkon +
+
+
Vala zkompiluje kód na bleskurychlé, plně nativní binární soubory. V programech Vala můžete také znovu použít existující kód C a generovat kód C z programu Vala.
+
+
+
+
+ + + + + Open-Source +
+
+
Vala je svobodný software s otevřeným zdrojovým kódem. Má skvělou komunitu, která do kompilátoru přispívá a vyvíjí spoustu nástrojů.
+
Dokumentace k nástrojům
+
+
+Zjistěte více o jazyce Vala + +
+ +
+

Co všechno můžete vytvořit?

+
+
+
+
+ + + + + Grafické aplikace +
+
+
Díky dokonalé integraci GTK, Libadwaita a Granite je vývoj velmi jednoduchý. Snadno publikujte své aplikace na Flathubu bez zbytečně velkých balíčků.
+
+ +
+
+
+
+
+ + + + + Konzolové programy + +
+
+
Používejte rozsáhlou standardní knihovnu a spoustu dalších knihoven, které jsou k dispozici pro použití ve Vale.
+
+
+
+
+ + + + + Knihovny +
+
+
Vala poskytuje vazby pro mnoho dalších jazyků a dokumentace API bez ruční práce. Podporováno je také dynamické i statické linkování.
+
+
+ +
+ +
+ + + + +

Co je nového?

+
+ + + + + Fialové pozadí s bílým textem uprostřed s nápisem "Vala". +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + Fialové pozadí s bílým textem uprostřed s nápisem "Vala". +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + Fialové pozadí s bílým textem uprostřed s nápisem "Vala". +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+Zobrazit Blog + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

Ukázka projektů

+ +Zobrazit další projekty ve Vale + +
+ +
+

Komunita

+
+
+
+
+ + + + + Fóra +
+
+
Ptejte se na otázky týkající se Valy ve fóru GNOME Discourse pod tagem „vala“.
+
Fóra Discourse
+
+
+
+
+ + + + + Interní chat +
+
+
Popovídejte si s vývojáři nebo se zeptejte na to, jak přispět do Valy, v Matrix kanálu Valy. K dispozici je také most na IRC.
+
Místnost na Matrixu
+
+
+
+
+ + + + + Komunitní server +
+
+
Spojte se s komunitou na Discord serveru.
+
Discord server
+
+
+ +

Sociální sítě

+
+

Sledujte projekt Vala na těchto platformách

+ +
+ +
+ + + + + + +
+
+ + + + + + + + + + diff --git a/cs/vala-hero.png b/cs/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/cs/vala-hero.png differ diff --git a/css/blog-post.css b/css/blog-post.css new file mode 100644 index 0000000..42aad57 --- /dev/null +++ b/css/blog-post.css @@ -0,0 +1 @@ +article.blog-post>header{margin-bottom:1.5rem}article.blog-post>header h1{margin-bottom:0}article.blog-post>header p{margin-top:0;margin-bottom:.5rem;font-size:1.25rem}article.blog-post>header span{font-weight:500;display:block} \ No newline at end of file diff --git a/css/blog.css b/css/blog.css new file mode 100644 index 0000000..308b9c6 --- /dev/null +++ b/css/blog.css @@ -0,0 +1 @@ +.blog-posts li{margin-top:2rem}.blog-posts li:first-child{margin-top:0}.blog-posts h2{margin-top:0;margin-bottom:0}.blog-posts p{margin-top:1rem;margin-bottom:0}.blog-posts .author{font-weight:500} \ No newline at end of file diff --git a/css/global.css b/css/global.css new file mode 100644 index 0000000..a4d33e3 --- /dev/null +++ b/css/global.css @@ -0,0 +1 @@ +@font-face{font-family:"Inter";font-style:normal;font-weight:100;font-display:swap;src:url("/fonts/Inter-Thin.woff2") format("woff2"),url("/fonts/Inter-Thin.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:200;font-display:swap;src:url("/fonts/Inter-ExtraLight.woff2") format("woff2"),url("/fonts/Inter-ExtraLight.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:300;font-display:swap;src:url("/fonts/Inter-Light.woff2") format("woff2"),url("/fonts/Inter-Light.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:400;font-display:swap;src:url("/fonts/Inter-Regular.woff2") format("woff2"),url("/fonts/Inter-Regular.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:500;font-display:swap;src:url("/fonts/Inter-Medium.woff2") format("woff2"),url("/fonts/Inter-Medium.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:600;font-display:swap;src:url("/fonts/Inter-SemiBold.woff2") format("woff2"),url("/fonts/Inter-SemiBold.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:700;font-display:swap;src:url("/fonts/Inter-Bold.woff2") format("woff2"),url("/fonts/Inter-Bold.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:800;font-display:swap;src:url("/fonts/Inter-ExtraBold.woff2") format("woff2"),url("/fonts/Inter-ExtraBold.woff") format("woff")}@font-face{font-family:"Inter";font-style:normal;font-weight:900;font-display:swap;src:url("/fonts/Inter-Black.woff2") format("woff2"),url("/fonts/Inter-Black.woff") format("woff")}@font-face{font-family:"Inter Variable";font-weight:100 900;font-display:swap;font-style:normal;font-named-instance:"Regular";src:url("/fonts/Inter-roman.var.woff2") format("woff2")}/*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::before,::after{box-sizing:border-box}html{line-height:1.15;-webkit-text-size-adjust:100%;-moz-tab-size:4;tab-size:4;}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";}hr{height:0;color:inherit;}abbr[title]{text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;font-size:1em;}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0;}button,select{text-transform:none}button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button}::-moz-focus-inner{border-style:none;padding:0}:-moz-focusring{outline:1px dotted ButtonText}:-moz-ui-invalid{box-shadow:none}legend{padding:0}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px;}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit;}summary{display:list-item}:root{--accent-color: #a56de2;--accent-color-light-2: #e4c6fa;--accent-color-light-1: #cd9ef7;--accent-color-dark-1: #7239b3;--accent-color-dark-2: #452981;--brim-background-color: var(--accent-color-dark-1);--brim-link-color: white;--brim-link-hover-color: var(--accent-color-light-2);--card-border-color: #d4d4d4;--secondary-cta-background: #fafafa;--label-text-color: #555761;--foreground-color: #1a1a1a;--background-color: white;--inline-code-background-color: #d4d4d4;--focus-outline-color: var(--accent-color);--code-block-copy-button-color: #1a1a1a}html{scroll-behavior:smooth}:focus{outline:solid 2px var(--focus-outline-color)}:focus:not(:focus-visible){outline:none}:focus-visible{outline:solid 2px var(--focus-outline-color)}body{display:flex;flex-direction:column;background-color:var(--background-color);color:var(--foreground-color);font-family:"Inter",Arial,Helvetica,sans-serif;height:100%;min-height:calc(100vh + env(safe-area-inset-bottom));line-height:1.4;font-size:16px}@supports (font-variation-settings: normal){body{font-family:"Inter Variable",Arial,Helvetica,sans-serif}}body>div{flex:1 1 0%}.container.error-404{display:flex;align-items:center;justify-content:center;padding-top:4rem;padding-bottom:4rem}main{display:flex;overflow-x:auto;text-align:center;flex-direction:column}article,section{width:100%;text-align:left;max-width:43.75rem}section{padding:2rem 0}section .prose{max-width:700px;text-align:left;margin:0 auto}section:last-of-type{padding-bottom:0}section>section{max-width:43.75rem;margin:0 auto;text-align:left;padding:.25rem 0}section>section:last-of-type{padding-bottom:1rem}section>a:last-child{margin-top:2rem;display:inline-block;text-align:center}section.standalone{padding-top:0;padding-bottom:0}h1,h2,h3,.features dt,h4,h5,h6{color:var(--foreground-color);margin-top:.85em;margin-bottom:1rem}h1 .zola-anchor,h2 .zola-anchor,h3 .zola-anchor,.features dt .zola-anchor,h4 .zola-anchor,h5 .zola-anchor,h6 .zola-anchor{visibility:hidden}h1:hover .zola-anchor,h1:focus .zola-anchor,h2:hover .zola-anchor,h2:focus .zola-anchor,h3:hover .zola-anchor,.features dt:hover .zola-anchor,h3:focus .zola-anchor,.features dt:focus .zola-anchor,h4:hover .zola-anchor,h4:focus .zola-anchor,h5:hover .zola-anchor,h5:focus .zola-anchor,h6:hover .zola-anchor,h6:focus .zola-anchor{visibility:visible}h1{font-size:3rem;letter-spacing:-.04rem;font-weight:600;font-variation-settings:"wght" 600}h2{font-size:2rem;font-weight:600;letter-spacing:-.05rem;font-variation-settings:"wght" 600}h3,.features dt{font-size:1.5rem;font-weight:500;letter-spacing:-.003125rem}p{margin-top:1rem;margin-bottom:1rem}ul{list-style-type:none;padding:0}a{transition:color .3s ease;color:var(--accent-color-dark-1);word-wrap:break-word}a:hover,a:focus,a:active{color:var(--accent-color-dark-2)}.zola-anchor{margin-left:.5rem}ul li a{display:inline-flex;align-items:center}time{display:block}.social-links{margin-bottom:0}.social-links li{margin-top:.5rem}.social-links li:first-child{margin-top:0}ul li a svg{transition:fill .3s ease;width:1.25rem;height:1.25rem;margin-right:.5rem;fill:var(--accent-color-dark-1)}ul li a:hover svg,ul li a:focus svg{fill:var(--accent-color-dark-2)}article ul{list-style-type:disc;padding-left:2rem}article ul li{margin-top:.5rem}article ul li:first-child{margin-top:0}article img,iframe,picture{width:100%;height:auto}iframe{min-height:200px}pre{padding:1rem;border-radius:4px;overflow:auto;text-align:left;border:1px solid #d4d4d4}pre[data-linenos]{padding-top:1rem;padding-bottom:1rem;padding-right:1rem;padding-left:0}pre table td{padding:0}pre table td:nth-of-type(1){text-align:center;user-select:none;padding-left:2rem;padding-right:1rem;text-align:left}pre mark{display:block;background-color:rgba(254,252,232,.9)}pre table{width:100%;border-collapse:collapse}code{border-radius:4px;background-color:var(--inline-code-background-color);padding:.125rem .25rem}pre code{border-radius:0;background:none;padding:0}.code-block-wrapper{position:relative;max-width:45rem}.code-copier{display:flex;border:0;justify-content:center;align-items:center;position:absolute;padding:1rem;bottom:0;right:0;width:auto;height:auto;background:rgba(0,0,0,0)}main>.code-block-wrapper .code-copier{bottom:1rem}.code-copier svg{transition:opacity .3s ease;width:1.5rem;height:1.5rem;fill:var(--code-block-copy-button-color);opacity:.3}.code-copier:hover svg{opacity:1}.code-copier:active svg{opacity:.3}#bypass-block{--focus-outline-color: white;transition:none;position:absolute;word-wrap:normal;top:0;left:-999px;width:1px;height:1px;text-align:center;font-size:2rem;z-index:-2;background:var(--vala-gradient);color:#000;padding:1rem}#bypass-block:focus,#bypass-block:focus-visible{opacity:1;z-index:999;display:block;width:100%;height:auto;left:auto;background:var(--accent-color-dark-1);color:#fff}@media (prefers-color-scheme: dark){:root{--foreground-color: white;--background-color: #1a1a1a;--card-border-color: #333333;--inline-code-background-color: #333333;--secondary-cta-background: #333333;--code-block-copy-button-color: #fafafa;--label-text-color: #d4d4d4}#bypass-block{color:#fff}a{color:var(--accent-color-light-1)}a:hover,a:focus,a:active{color:var(--accent-color)}ul li a svg{fill:var(--accent-color-light-1)}ul li a:hover svg,ul li a:focus svg{fill:var(--accent-color)}pre{border:1px solid #333}}@media (prefers-reduced-motion: reduce){html{scroll-behavior:auto}}@media (min-width: 500px){iframe{min-height:300px}}@media (min-width: 740px){section>section:last-of-type{padding-bottom:2rem}}@media (min-width: 800px){main{align-items:center}}.container,body>header>div{display:block;margin:0 auto;padding-left:1rem;padding-right:1rem;max-width:76.25rem;width:100%}@supports (padding: env(safe-area-inset-left)){.container,body>header>div{padding-left:calc(1rem + env(safe-area-inset-left));padding-right:calc(1rem + env(safe-area-inset-right))}}@supports (padding: max(0px)){.container,body>header>div{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right))}}@media (min-width: 700px){.container,body>header>div{padding-left:2rem;padding-right:2rem}@supports (padding: env(safe-area-inset-left)){.container,body>header>div{padding-left:calc(2rem + env(safe-area-inset-left));padding-right:calc(2rem + env(safe-area-inset-right))}}@supports (padding: max(0)){.container,body>header>div{padding-left:max(2rem, env(safe-area-inset-left));padding-right:max(2rem, env(safe-area-inset-right))}}}body>header{--foreground-color: white;--focus-outline-color: white;width:100%;background:var(--brim-background-color);display:block;color:var(--foreground-color)}body>header>div{padding-top:1.5rem;padding-bottom:1.5rem}body>header nav{display:grid;align-items:center;grid-template-columns:1fr auto auto}body>header nav ul,body>header nav>:last-child{margin-left:.25rem}body>header nav ul{grid-area:2/1/auto/-1;flex:1 0 auto;display:flex;gap:1rem;flex-wrap:wrap;text-align:center;justify-content:center;margin-block:0;margin-left:.25rem}body>header nav>:first-child svg{transition:fill .3s ease;fill:#fff;width:4rem;height:1.6rem}body>header nav>:first-child a:hover svg,body>header nav>:first-child a:focus svg{fill:var(--accent-color-light-1)}body>header a{display:block;color:var(--brim-link-color);text-decoration:none}body>header a:hover,body>header a:focus{color:var(--brim-link-hover-color)}body>header nav>:last-child{grid-row:1;grid-column-end:-2}.menu-toggle{display:none;grid-column-end:-1;padding:.3rem;aspect-ratio:1;align-items:center;justify-content:center;background:none;border:none;cursor:pointer}.hamburger{--hamburger-color: var(--brim-link-color);display:block;position:relative;height:.125rem;width:1.5rem;background-color:var(--hamburger-color);transition:all .2s ease}.hamburger::before,.hamburger::after{content:"";position:absolute;inset:0;background-color:var(--hamburger-color);transition:all .2s ease}.hamburger::before{transform:translateY(-300%)}.hamburger::after{transform:translateY(300%)}.hamburger.open{background-color:rgba(0,0,0,0)}.hamburger.open::before{transform:rotate(45deg)}.hamburger.open::after{transform:rotate(-45deg)}.menu-toggle:hover,.menu-toggle:focus{border-color:var(--brim-link-hover-color)}.menu-toggle:hover .hamburger,.menu-toggle:focus .hamburger{--hamburger-color: var(--brim-link-hover-color)}.navbar-button{display:inline-block;background-image:linear-gradient(180deg, #8c57c8 0%, #7c4bb5 100%);border-radius:100vmax;box-shadow:0 .125em .3em rgba(0,0,0,.2);padding:.3em 1.2em}@media (max-width: 56.25rem){body>header nav>:last-child{margin-inline:1rem}body:not(.js-enabled)>header nav ul{margin:2rem 0 0 0}body.js-enabled>header nav ul{display:block;text-align:left;margin-block:0px;overflow-y:hidden;max-height:0;transition:max-height .2s ease}body.js-enabled>header nav ul li{margin-top:1rem}body.js-enabled>header nav ul li:first-child{margin-top:2rem}body.js-enabled>header nav ul:not(.open):focus,body.js-enabled>header nav ul:not(.open):focus-visible{outline:none}body.js-enabled .menu-toggle{display:flex}}@media (min-width: 56.25rem){body>header{margin:auto 0}body>header a{display:inline-block}body>header>div{padding-top:.75rem;padding-bottom:.75rem}body>header nav{display:flex;align-items:center}body>header nav>:first-child,body>header nav>:last-child{flex:0 1 20%}body>header nav>:last-child{text-align:right}body>header nav ul,body>header nav :last-child{margin-left:0rem}}.features{display:flex;flex-direction:column;align-items:center;max-width:500px;margin-left:auto;margin-right:auto}.features>div{border:1px solid var(--card-border-color);border-radius:.75rem;padding:1.5rem 1.25rem 2.5rem 1.25rem;text-align:left;width:100%}.features>:first-child{margin-top:0}.features>*{margin-top:2rem}.features dt{margin-top:0}.features dt>div{display:flex;align-items:center;flex-direction:row}.features dt svg{height:1.5rem;width:1.5rem;fill:var(--accent-color-dark-1);margin-right:.75rem}.features dd{margin-left:0;margin-top:1rem}@media (min-width: 1000px){.features{flex-direction:row;justify-content:center;align-items:stretch;max-width:none}.features>:first-child{margin-left:0}.features>div{width:375px}.features>*{margin-top:0;margin-left:1.5rem;max-width:25rem}}@media (prefers-color-scheme: dark){.features dt svg{fill:var(--accent-color)}}.cta-stack{display:flex;flex-direction:column;width:100%;text-align:center;justify-content:center;padding:2rem 0}.cta-stack a{--focus-outline-color: black;transition:background .3s ease;display:inline-flex;align-items:center;justify-content:center;background:var(--accent-color-dark-1);font-weight:500;font-size:1.25rem;text-align:center;color:#fff;border-radius:8px;padding:1.5rem 1rem;text-decoration:none;margin-top:1rem;flex:1 1 0%;width:100%}.cta-stack a:hover,.cta-stack a:focus{background:#8b55c9}.cta-stack a:first-child{margin-top:0}.cta-stack a:last-child{--focus-outline-color: var(--accent-color);background:var(--secondary-cta-background);color:var(--foreground-color);border:solid 2px var(--card-border-color)}.cta-stack a:last-child:hover,.cta-stack a:last-child:focus{background:#eee}@media (min-width: 800px){.cta-stack{flex-direction:row}.cta-stack a{margin-top:0;margin-left:1.5rem;flex:0 1 auto;width:100%;max-width:20rem}.cta-stack a:first-child{margin-left:0}}@media (prefers-color-scheme: dark){.cta-stack a{--focus-outline-color: white}.cta-stack a:last-child:hover,.cta-stack a:last-child:focus{background:#4d4d4d}}footer{--foreground-color: white;--focus-outline-color: white;position:sticky;color:var(--foreground-color);background:var(--brim-background-color);padding-top:1.5rem;padding-bottom:1rem;padding-left:1rem;padding-right:1rem}@supports (padding: env(safe-area-inset-left)){footer{padding-left:calc(1rem + env(safe-area-inset-left));padding-right:calc(1rem + env(safe-area-inset-right));padding-bottom:calc(1rem + env(safe-area-inset-bottom))}}@supports (padding: max(0px)){footer{padding-left:max(1rem, env(safe-area-inset-left));padding-right:max(1rem, env(safe-area-inset-right));padding-bottom:max(1rem, env(safe-area-inset-bottom))}}footer>div{max-width:43.75rem}footer a{display:inline-block;color:var(--brim-link-color)}footer a:hover,footer a:focus{color:var(--brim-link-hover-color)}@media (min-width: 700px){footer{padding-top:2rem;padding-left:2rem;padding-right:2rem;padding-bottom:1.5rem}@supports (padding: env(safe-area-inset-left)){footer{padding-left:calc(2rem + env(safe-area-inset-left));padding-right:calc(2rem + env(safe-area-inset-right));padding-bottom:calc(1.5rem + env(safe-area-inset-bottom))}}@supports (padding: max(0)){footer{padding-left:max(2rem, env(safe-area-inset-left));padding-right:max(2rem, env(safe-area-inset-right));padding-bottom:max(1.5rem, env(safe-area-inset-bottom))}}} \ No newline at end of file diff --git a/css/index.css b/css/index.css new file mode 100644 index 0000000..6be852c --- /dev/null +++ b/css/index.css @@ -0,0 +1 @@ +body>header.extended{clip-path:polygon(0 0, 100% 0, 100% calc(100% - 4vw), 0 100%);padding:0 0 30vh 0}body>header.extended h1{text-align:center;margin-top:5rem;display:block}main{margin-top:-40vh;padding-top:10vh}main>pre,main>pre+p{max-width:45rem}main>pre{position:relative}section{text-align:center;max-width:none}h1{font-weight:300;font-variation-settings:"wght" 300}@media (min-width: 800px){main>pre{border:0;box-shadow:0px 4px 20px 10px rgba(0,0,0,.12)}}@media (min-width: 800px) and (prefers-color-scheme: dark){main>pre{box-shadow:0px 4px 20px 10px rgba(0,0,0,.3)}}.post-previews{display:flex;text-align:left;flex-direction:column;margin:0 auto}.post-preview{width:100%;border:1px solid var(--card-border-color);border-radius:.75rem;margin-top:2rem;text-decoration:none;color:var(--foreground-color)}.post-preview:hover,.post-preview:focus{color:var(--accent-color-dark-1)}.post-preview:first-child{margin-top:0}.post-preview img{width:100%;border-radius:.75rem .75rem 0 0}.post-preview>div{padding:.5rem .75rem 1rem .75rem}.post-preview>div>div{font-weight:500;font-size:1.25rem;letter-spacing:-.003125rem}.post-preview date{display:block;margin-top:.5rem;color:var(--label-text-color);font-size:1rem}@media (min-width: 400px){.post-previews{align-items:center}.post-preview{max-width:25rem}}@media (min-width: 900px){.post-previews{flex-direction:row;justify-content:center;align-items:stretch}.post-preview{margin-top:0;margin-left:1.5rem}}@media (prefers-color-scheme: dark){.post-preview:hover,.post-preview:focus{color:var(--accent-color)}}.showcase{display:grid;grid-template-columns:1f;max-width:43.75rem;margin:0 auto;row-gap:2.5rem}.showcase li{display:inline-flex;flex-direction:column;flex:1 1 0%}.showcase .image-frame{display:flex;justify-content:center;align-items:center;height:auto;background-color:#f2f2f2;border-radius:4px}.showcase .image-frame img{width:100%;height:100%;max-width:100%;max-height:25rem;border-radius:4px;object-fit:contain}.showcase li a,.showcase .title{transition:color .3s ease}.showcase .title{font-weight:500;font-variation-settings:"wght" 500;font-size:1.5rem;color:var(--foreground-color)}.showcase li a{display:block;flex:1 1 0%;flex-direction:column;text-decoration:none;color:var(--label-text-color);font-size:1rem;width:100%;border-radius:4px}.showcase li a:hover,.showcase li a:focus,.showcase li a:hover .title,.showcase li a:focus .title{color:var(--accent-color-dark-1)}.showcase li a img{width:5rem;height:5rem;margin-right:0;border-radius:4px;flex:none}.showcase .info{display:flex;margin-top:2rem}.showcase .text-info{display:flex;flex-direction:column;text-align:left;margin-left:1rem}.showcase .text-info p{margin-top:.5rem;margin-bottom:0}@media (prefers-color-scheme: dark){.showcase li a:hover,.showcase li a:focus,.showcase li a:hover .title,.showcase li a:focus .title{color:var(--accent-color)}.showcase .image-frame{background-color:#2a2a2a}} \ No newline at end of file diff --git a/css/syntax-theme-dark.css b/css/syntax-theme-dark.css new file mode 100644 index 0000000..b694d94 --- /dev/null +++ b/css/syntax-theme-dark.css @@ -0,0 +1,151 @@ +/* + * theme "OneHalfLight" generated by syntect + */ + +.z-code { + color: #dcdfe4; + background-color: #282c34; +} + +.z-comment { + color: #5c6370; +} +.z-variable.z-parameter.z-function { + color: #dcdfe4; +} +.z-keyword { + color: #c678dd; +} +.z-variable { + color: #e06c75; +} +.z-entity.z-name.z-function, .z-meta.z-require, .z-support.z-function.z-any-method { + color: #61afef; +} +.z-support.z-class, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class { + color: #e5c07b; +} +.z-meta.z-class { + color: #e5c07b; +} +.z-keyword.z-other.z-special-method { + color: #61afef; +} +.z-storage { + color: #c678dd; +} +.z-support.z-function { + color: #61afef; +} +.z-string { + color: #98c379; +} +.z-constant.z-numeric { + color: #e5c07b; +} +.z-none { + color: #e5c07b; +} +.z-none { + color: #e5c07b; +} +.z-constant { + color: #e5c07b; +} +.z-entity.z-name.z-tag { + color: #e06c75; +} +.z-entity.z-other.z-attribute-name { + color: #e5c07b; +} +.z-entity.z-other.z-attribute-name.z-id, .z-punctuation.z-definition.z-entity { + color: #e5c07b; +} +.z-meta.z-selector { + color: #c678dd; +} +.z-markup.z-heading .z-punctuation.z-definition.z-heading, .z-entity.z-name.z-section { + color: #61afef; +} +.z-markup.z-bold, .z-punctuation.z-definition.z-bold { + color: #c678dd; +} +.z-markup.z-italic, .z-punctuation.z-definition.z-italic { + color: #c678dd; +} +.z-markup.z-raw.z-inline { + color: #98c379; +} +.z-meta.z-link { + color: #98c379; +} +.z-markup.z-quote { + color: #98c379; +} +.z-source.z-java .z-meta.z-class.z-java .z-meta.z-method.z-java { + color: #dcdfe4; +} +.z-source.z-java .z-meta.z-class.z-java .z-meta.z-class.z-body.z-java { + color: #dcdfe4; +} +.z-source.z-js .z-meta.z-function.z-js .z-variable.z-parameter.z-function.z-js { + color: #e06c75; +} +.z-source.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e06c75; +} +.z-source.z-js .z-variable.z-other.z-object.z-js { + color: #dcdfe4; +} +.z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e06c75; +} +.z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e06c75; +} +.z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-object.z-js { + color: #dcdfe4; +} +.z-source.z-js .z-meta.z-block.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { + color: #dcdfe4; +} +.z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-function.z-js { + color: #dcdfe4; +} +.z-source.z-js .z-meta.z-property.z-object.z-js .z-entity.z-name.z-function.z-js { + color: #61afef; +} +.z-source.z-js .z-support.z-constant.z-prototype.z-js { + color: #dcdfe4; +} +.z-markup.z-inserted { + color: #98c379; +} +.z-markup.z-deleted { + color: #e06c75; +} +.z-markup.z-changed { + color: #e5c07b; +} +.z-string.z-regexp { + color: #98c379; +} +.z-constant.z-character.z-escape { + color: #56b6c2; +} +.z-invalid.z-illegal { + color: #dcdfe4; + background-color: #e06c75; +} +.z-invalid.z-broken { + color: #dcdfe4; + background-color: #e5c07b; +} +.z-invalid.z-deprecated { + color: #dcdfe4; + background-color: #e5c07b; +} +.z-invalid.z-unimplemented { + color: #dcdfe4; + background-color: #c678dd; +} diff --git a/css/syntax-theme-light.css b/css/syntax-theme-light.css new file mode 100644 index 0000000..b6b5163 --- /dev/null +++ b/css/syntax-theme-light.css @@ -0,0 +1,151 @@ +/* + * theme "OneHalfLight" generated by syntect + */ + +.z-code { + color: #383a42; + background-color: #fafafa; +} + +.z-comment { + color: #a0a1a7; +} +.z-variable.z-parameter.z-function { + color: #383a42; +} +.z-keyword { + color: #a626a4; +} +.z-variable { + color: #e45649; +} +.z-entity.z-name.z-function, .z-meta.z-require, .z-support.z-function.z-any-method { + color: #0184bc; +} +.z-support.z-class, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class { + color: #c18401; +} +.z-meta.z-class { + color: #c18401; +} +.z-keyword.z-other.z-special-method { + color: #0184bc; +} +.z-storage { + color: #a626a4; +} +.z-support.z-function { + color: #0184bc; +} +.z-string { + color: #50a14f; +} +.z-constant.z-numeric { + color: #c18401; +} +.z-none { + color: #c18401; +} +.z-none { + color: #c18401; +} +.z-constant { + color: #c18401; +} +.z-entity.z-name.z-tag { + color: #e45649; +} +.z-entity.z-other.z-attribute-name { + color: #c18401; +} +.z-entity.z-other.z-attribute-name.z-id, .z-punctuation.z-definition.z-entity { + color: #c18401; +} +.z-meta.z-selector { + color: #a626a4; +} +.z-markup.z-heading .z-punctuation.z-definition.z-heading, .z-entity.z-name.z-section { + color: #0184bc; +} +.z-markup.z-bold, .z-punctuation.z-definition.z-bold { + color: #a626a4; +} +.z-markup.z-italic, .z-punctuation.z-definition.z-italic { + color: #a626a4; +} +.z-markup.z-raw.z-inline { + color: #50a14f; +} +.z-meta.z-link { + color: #50a14f; +} +.z-markup.z-quote { + color: #50a14f; +} +.z-source.z-java .z-meta.z-class.z-java .z-meta.z-method.z-java { + color: #383a42; +} +.z-source.z-java .z-meta.z-class.z-java .z-meta.z-class.z-body.z-java { + color: #383a42; +} +.z-source.z-js .z-meta.z-function.z-js .z-variable.z-parameter.z-function.z-js { + color: #e45649; +} +.z-source.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e45649; +} +.z-source.z-js .z-variable.z-other.z-object.z-js { + color: #383a42; +} +.z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e45649; +} +.z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-readwrite.z-js { + color: #e45649; +} +.z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-object.z-js { + color: #383a42; +} +.z-source.z-js .z-meta.z-block.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { + color: #383a42; +} +.z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-function.z-js { + color: #383a42; +} +.z-source.z-js .z-meta.z-property.z-object.z-js .z-entity.z-name.z-function.z-js { + color: #0184bc; +} +.z-source.z-js .z-support.z-constant.z-prototype.z-js { + color: #383a42; +} +.z-markup.z-inserted { + color: #98c379; +} +.z-markup.z-deleted { + color: #e06c75; +} +.z-markup.z-changed { + color: #e5c07b; +} +.z-string.z-regexp { + color: #50a14f; +} +.z-constant.z-character.z-escape { + color: #0997b3; +} +.z-invalid.z-illegal { + color: #fafafa; + background-color: #e06c75; +} +.z-invalid.z-broken { + color: #fafafa; + background-color: #e5c07b; +} +.z-invalid.z-deprecated { + color: #fafafa; + background-color: #e5c07b; +} +.z-invalid.z-unimplemented { + color: #fafafa; + background-color: #c678dd; +} diff --git a/elasticlunr.min.js b/elasticlunr.min.js new file mode 100644 index 0000000..79dad65 --- /dev/null +++ b/elasticlunr.min.js @@ -0,0 +1,10 @@ +/** + * elasticlunr - http://weixsong.github.io + * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.6 + * + * Copyright (C) 2017 Oliver Nightingale + * Copyright (C) 2017 Wei Song + * MIT Licensed + * @license + */ +!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();o + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +À propos de Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Menu principal + + + + + + + +
+ +
+ + + + +
+
+ +
+

À propos de Vala

+

Qu'est-ce que Vala ?# +

+

Vala est un langage de programmation orienté objet avec un compilateur qui génère du code C et utilise le système de type GObject.

+

Vala prend en charge les fonctionnalités de langage moderne telles que :

+
    +
  • Interfaces
  • +
  • Properties
  • +
  • Signals
  • +
  • Foreach statements
  • +
  • Lambda expressions
  • +
  • Type inferencing for local variables
  • +
  • Generics
  • +
  • Non-null types
  • +
  • Assisted memory management
  • +
  • Exception handling
  • +
  • Type modules (Plugins)
  • +
+

Quel genre de langue est Vala?# +

+

Productif# +

+

Avec Vala, vous pouvez être opérationnel rapidement, grâce à des fonctionnalités pratiques telles que les expressions lambda, la gestion des exceptions, les interfaces et les génériques.

+

Performant# +

+

Le code Vala se compile en binaires entièrement natifs.

+

Statically-Typed# +

+

Vala vous aide à écrire du code de type sécurisé sans verbosité, grâce à l'inférence de type.

+

Integrative# +

+

Vala est conçu pour permettre l'accès aux bibliothèques C existantes, en particulier les bibliothèques basées sur GObject, sans avoir besoin de liaisons d'exécution. Tout ce qui est nécessaire pour utiliser une bibliothèque avec Vala est un fichier vapi, contenant les déclarations de classe et de méthode dans la syntaxe Vala. Vala est actuellement livré avec des liaisons pour GLib et GTK + et bien d'autres de la plate-forme GNOME.

+

Vala peut également être utilisé pour créer des bibliothèques C.

+

Familiar# +

+

La syntaxe de Vala est inspirée de C # et Java, donc si vous avez utilisé l'un ou l'autre, vous vous adapterez de manière transparente à l'écriture de code Vala.

+ + + + +
+ +
+
+ + + + + + + + + diff --git a/fr/index.html b/fr/index.html new file mode 100644 index 0000000..4cfae04 --- /dev/null +++ b/fr/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Vala Programming Language + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Menu principal + + + + + + + + + + +
+
+ +

Développer des applications de manière naturelle et efficace

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + + + + +
+

Pourquoi Vala?

+
+
+
+
+ + + + + Productivité +
+
+
Écrivez confortablement votre code de manière orientée objet avec des abstractions de haut niveau, tout en ayant accès à des intégrations profondes avec les technologies GNOME telles que : GObject, GTK et plus encore !
+
+
+
+
+ + + + + Performance +
+
+
Vala est un langage de programmation polyvalent qui permet de créer des programmes performants facilement. Il offre également la possibilité de réutiliser du code C existant et de générer du code C à partir de Vala.
+
+
+
+
+ + + + + Open-Source +
+
+
Vala est un logiciel gratuit et open-source. Il a une grande communauté qui contribue au compilateur et développe de nombreux outils.
+
Documentation des outils vala
+
+
+En savoir plus sur Vala + +
+ +
+

Que voulez-vous coder ?

+
+
+
+
+ + + + + Applications Graphique +
+
+
L'intégration parfaite de GTK, Libadwaita et Granite rend le développement super simple. Publiez facilement vos applications sur Flathub sans paquets trop lourd.
+
+ +
+
+
+
+
+ + + + + Programmes CLI/TUI + +
+
+
Utilisez une grande bibliothèque standard et utilisez des charges d'autres bibliothèques disponibles pour une utilisation dans Vala.
+
+
+
+
+ + + + + Librairies +
+
+
Fournir des liaisons pour d'autres langages et de la documentation API sans travail manuel. Ainsi que les liaisons dynamiques et statiques des libs sont prises en charge
+
+
+ +
+ +
+ + + + +

Quoi de neuf?

+
+ + + + + un fond violet avec du texte blanc centré c'est signé 'Vala'. +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + un fond violet avec du texte blanc centré c'est signé 'Vala'. +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + un fond violet avec du texte blanc centré c'est signé 'Vala'. +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+Blog + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

Vitrine

+ +Voir plus de projets Vala + +
+ +
+

communauté

+
+
+
+
+ + + + + Forums +
+
+
Posez des questions relatives à Vala dans les forums GNOME sous l'etiquette vala
+
Discourse Forums
+
+
+
+
+ + + + + Internals Chat +
+
+
Parlez aux développeurs ou posez des questions sur la façon de contribuer à Vala, Il dispose également d'un canal IRC.
+
Canal Matrix
+
+
+
+
+ + + + + Serveur communautaire +
+
+
Connectez-vous avec la communauté sur le serveur Discord.
+
Discord Serveur
+
+
+ +

Réseau sociaux

+
+

Suivez le projet Vala sur ces plateformes

+ +
+ +
+ + + + + + +
+
+ + + + + + + + + + diff --git a/fr/vala-hero.png b/fr/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/fr/vala-hero.png differ diff --git a/humans.txt b/humans.txt new file mode 100644 index 0000000..36d11b9 --- /dev/null +++ b/humans.txt @@ -0,0 +1,35 @@ +/* TEAM */ + Project Lead: Colin Kiama + Contact: colinkiama [at] gmail.com + Twitter: @colinkiama + GitHub: @colinkiama + + Designer: Radjeep Signha + Contact: rajdeepsingha [at] icloud.com + Mastodon: @Suzie97@mastodon.social + +/* THANKS */ + FR Translator: Hydral, Jordan Nathan + GitLab: https://gitlab.com/hydrasho + + CS Translator: Vojtěch Perník + GitLab: https://gitlab.com/pervoj + + RU Translator: Neagiry, Ivan Repyakh + Discord: KanaSenpai#2026 + Telegram: @neagiry + + PT_BR Translator: Cárlisson Galdino + Github: @carlisson + + Code Contributor: Marko Sivrić (Marki) + Contact: markosivric3 [at] gmail.com + Github: @Marki2019 + Twitter: @marki2019 + From: Čapljina, Bosnia & Herzegovina + +/* SITE */ + Last update: 2022/09/17 + Language: English / French / Russian / Czech + Doctype: HTML5 + IDE: Sublime Text, Visual Studio Code, Vim, Figma diff --git a/icons/showcase/dino.svg b/icons/showcase/dino.svg new file mode 100644 index 0000000..b62f8c3 --- /dev/null +++ b/icons/showcase/dino.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/icons/showcase/monitor.svg b/icons/showcase/monitor.svg new file mode 100644 index 0000000..44ddd1e --- /dev/null +++ b/icons/showcase/monitor.svg @@ -0,0 +1,1712 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/showcase/textsnatcher.svg b/icons/showcase/textsnatcher.svg new file mode 100644 index 0000000..a7a5c14 --- /dev/null +++ b/icons/showcase/textsnatcher.svg @@ -0,0 +1,489 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Textsn. + 999-999-999-009 + 555-555-555-005 + No, 99, Some City,Some Country + TextxxxxxxxSnatcherxxxused to xxxread text &numbers inximages xxxx using xxxxxtesseract xOCR programsupports mu-ltiple lan-guage :) + + + diff --git a/icons/showcase/timeshift.png b/icons/showcase/timeshift.png new file mode 100644 index 0000000..39f2272 Binary files /dev/null and b/icons/showcase/timeshift.png differ diff --git a/icons/showcase/tuba.svg b/icons/showcase/tuba.svg new file mode 100644 index 0000000..24af5d9 --- /dev/null +++ b/icons/showcase/tuba.svg @@ -0,0 +1,251 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/showcase/workbench.svg b/icons/showcase/workbench.svg new file mode 100644 index 0000000..b6579e2 --- /dev/null +++ b/icons/showcase/workbench.svg @@ -0,0 +1,138 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/icons/spritemap.svg b/icons/spritemap.svg new file mode 100644 index 0000000..800ab8d --- /dev/null +++ b/icons/spritemap.svg @@ -0,0 +1,35 @@ + + + + > + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/img/showcase/dino.png b/img/showcase/dino.png new file mode 100644 index 0000000..68b89ae Binary files /dev/null and b/img/showcase/dino.png differ diff --git a/img/showcase/monitor.png b/img/showcase/monitor.png new file mode 100644 index 0000000..23c6766 Binary files /dev/null and b/img/showcase/monitor.png differ diff --git a/img/showcase/textsnatcher.png b/img/showcase/textsnatcher.png new file mode 100644 index 0000000..1e2c568 Binary files /dev/null and b/img/showcase/textsnatcher.png differ diff --git a/img/showcase/timeshift.png b/img/showcase/timeshift.png new file mode 100644 index 0000000..286b31b Binary files /dev/null and b/img/showcase/timeshift.png differ diff --git a/img/showcase/tuba.png b/img/showcase/tuba.png new file mode 100644 index 0000000..fa132e3 Binary files /dev/null and b/img/showcase/tuba.png differ diff --git a/img/showcase/workbench.png b/img/showcase/workbench.png new file mode 100644 index 0000000..f28825c Binary files /dev/null and b/img/showcase/workbench.png differ diff --git a/img/vala-hero-wide.png b/img/vala-hero-wide.png new file mode 100644 index 0000000..d1e0bbd Binary files /dev/null and b/img/vala-hero-wide.png differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..e71259b --- /dev/null +++ b/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Vala Programming Language + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Skip to main content + + + + + + + + + + +
+
+ +

A Familiar Way To Develop Applications

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + + + + +
+

Why Vala?

+
+
+
+
+ + + + + Productivity +
+
+
Comfortably write your code in an object-oriented way with high level abstractions, while having access to deep integrations with GNOME technologies such as: GObject, GTK and more!
+
+
+
+
+ + + + + Performance +
+
+
Vala compiles code down to blazingly fast, fully native binaries. You're also able to reuse existing C Code in your Vala programs as well as generate C Code from Vala.
+
+
+
+
+ + + + + Open-Source +
+
+
Vala is free and open-source software. It has a great community that contributes to the compiler and develops lots of tooling.
+
Tooling Documentation
+
+
+Learn more about Vala + +
+ +
+

What can you build?

+
+
+
+
+ + + + + GUI Applications +
+
+
Perfect integration of GTK, Libadwaita and Granite makes development super simple. Easily publish your apps on Flathub without bloated packages.
+
+ +
+
+
+
+
+ + + + + Command Line Programs + +
+
+
Use a large standard library and many third-party libraries available for use in Vala.
+
+
+
+
+ + + + + Libraries +
+
+
Provide bindings for many other languages and API documentation without manual work. Also, dynamic and static linking are both supported.
+
+
+ +
+ +
+ + + + +

What's new?

+
+ + + + + Purple background with white text on center that says 'Vala'. +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + Purple background with white text on center that says 'Vala'. +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + Purple background with white text on center that says 'Vala'. +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+View Blog + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

Showcase

+ +View More Vala Projects + +
+ +
+

Community

+
+
+
+
+ + + + + Forums +
+
+
Ask questions related to Vala in the GNOME Discourse forums under the 'vala' tag.
+
Discourse Forums
+
+
+
+
+ + + + + Internals Chat +
+
+
Talk to the developers or ask questions about how to contribute to Vala, use the Vala Matrix channel.
+
Matrix Room
+
+
+
+
+ + + + + Community Server +
+
+
Connect with the community on the Discord server.
+
Discord Server
+
+
+ +

Social Media

+
+

Follow the Vala project across these platforms

+ +
+ +
+ + + + + + +
+
+ + + + + + + + + + diff --git a/js/global.js b/js/global.js new file mode 100644 index 0000000..f36c53f --- /dev/null +++ b/js/global.js @@ -0,0 +1,106 @@ +// add class to tell CSS that JS is enabled +document.body.classList.add('js-enabled'); + +// Nav bar logic +const toggle = document.querySelector('.menu-toggle'); +const hamburger = toggle.querySelector('.hamburger'); +const menu = document.querySelector('body > header nav ul'); + +toggle.addEventListener('click', () => { + menu.classList.toggle('open'); + if (menu.classList.contains('open')) { + menu.style.maxHeight = menu.scrollHeight + 'px'; + hamburger.classList.add('open'); + } else { + menu.style.maxHeight = null; + hamburger.classList.remove('open'); + } +}); + +let codeBlocks = document.body.querySelectorAll('pre[class^="language"]'); + +for (let i = 0; i < codeBlocks.length; i++) { + let wrapperDiv = document.createElement('div') + wrapperDiv.classList.add('code-block-wrapper'); + + let codeBlock = codeBlocks[i]; + let codeBlockParent = codeBlock.parentElement; + codeBlockParent.replaceChild(wrapperDiv, codeBlock); + + wrapperDiv.appendChild(codeBlock); + + let copyButton = createCopyButton(); + wrapperDiv.insertAdjacentElement('beforeend', copyButton); + + copyButton.addEventListener('click', (e) => { + let stringToCopy = ""; + + let codeLines = codeBlock.querySelectorAll('table tr td:nth-child(2)'); + if (codeLines.length > 0) { + for (let j = 0; j < codeLines.length; j++) { + let codeLine = codeLines[j].textContent; + stringToCopy += codeLine; + } + } else { + // There are no line numbers. Just copy the text content from the + // `` element. + let codeElement = codeBlock.querySelector('code'); + if (!codeElement) { + return; + } + + stringToCopy += codeElement.textContent; + } + + copyTextToClipboard(stringToCopy); + }); +} + +function createCopyButton() { + let useElement = document.createElement('USE'); + useElement.setAttribute("href", "/icons/spritemap.svg#sprite-copy"); + + let svgElement = document.createElement('SVG'); + svgElement.appendChild(useElement); + + let copyButton = document.createElement('button'); + copyButton.classList.add('code-copier'); + copyButton.setAttribute('aria-label', 'Copy'); + copyButton.setAttribute('title', 'Copy'); + copyButton.innerHTML = svgElement.outerHTML; + + return copyButton; +} + +// Async + Fallback method of copying to the clipboard +// Source: https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript/30810322#30810322 +function fallbackCopyTextToClipboard(text) { + var textArea = document.createElement("textarea"); + textArea.value = text; + document.body.appendChild(textArea); + textArea.focus(); + textArea.select(); + + try { + document.execCommand("copy"); + } catch (err) { + console.error("Fallback: Oops, unable to copy", err); + } + + document.body.removeChild(textArea); +} + +function copyTextToClipboard(text) { + if (!navigator.clipboard) { + fallbackCopyTextToClipboard(text); + return; + } + + navigator.clipboard.writeText(text).then( + function() { + }, + function(err) { + console.error("Async: Could not copy text: ", err); + } + ); +} diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..acda829 --- /dev/null +++ b/manifest.json @@ -0,0 +1,42 @@ +{ + "name": "Vala", + "theme_color": "#7239b3", + "icons": [ + { + "src": "\/android-icon-36x36.png", + "sizes": "36x36", + "type": "image\/png", + "density": "0.75" + }, + { + "src": "\/android-icon-48x48.png", + "sizes": "48x48", + "type": "image\/png", + "density": "1.0" + }, + { + "src": "\/android-icon-72x72.png", + "sizes": "72x72", + "type": "image\/png", + "density": "1.5" + }, + { + "src": "\/android-icon-96x96.png", + "sizes": "96x96", + "type": "image\/png", + "density": "2.0" + }, + { + "src": "\/android-icon-144x144.png", + "sizes": "144x144", + "type": "image\/png", + "density": "3.0" + }, + { + "src": "\/android-icon-192x192.png", + "sizes": "192x192", + "type": "image\/png", + "density": "4.0" + } + ] +} diff --git a/ms-icon-144x144.png b/ms-icon-144x144.png new file mode 100644 index 0000000..4740d48 Binary files /dev/null and b/ms-icon-144x144.png differ diff --git a/ms-icon-150x150.png b/ms-icon-150x150.png new file mode 100644 index 0000000..d7f94d0 Binary files /dev/null and b/ms-icon-150x150.png differ diff --git a/ms-icon-310x310.png b/ms-icon-310x310.png new file mode 100644 index 0000000..48dce6a Binary files /dev/null and b/ms-icon-310x310.png differ diff --git a/ms-icon-70x70.png b/ms-icon-70x70.png new file mode 100644 index 0000000..28522fe Binary files /dev/null and b/ms-icon-70x70.png differ diff --git a/processed_images/dino.8d105749f739e8e0.png b/processed_images/dino.8d105749f739e8e0.png new file mode 100644 index 0000000..26e395b Binary files /dev/null and b/processed_images/dino.8d105749f739e8e0.png differ diff --git a/processed_images/dino.df6bf1856311f7f6.png b/processed_images/dino.df6bf1856311f7f6.png new file mode 100644 index 0000000..7eb1a70 Binary files /dev/null and b/processed_images/dino.df6bf1856311f7f6.png differ diff --git a/processed_images/monitor.3a1b6d01834c25b7.png b/processed_images/monitor.3a1b6d01834c25b7.png new file mode 100644 index 0000000..8fd2fbb Binary files /dev/null and b/processed_images/monitor.3a1b6d01834c25b7.png differ diff --git a/processed_images/monitor.fb35e2a5ac300df1.png b/processed_images/monitor.fb35e2a5ac300df1.png new file mode 100644 index 0000000..a8a67aa Binary files /dev/null and b/processed_images/monitor.fb35e2a5ac300df1.png differ diff --git a/processed_images/textsnatcher.394325ae8c65c222.png b/processed_images/textsnatcher.394325ae8c65c222.png new file mode 100644 index 0000000..2fbcd42 Binary files /dev/null and b/processed_images/textsnatcher.394325ae8c65c222.png differ diff --git a/processed_images/textsnatcher.8ae2b60321ed0a4a.png b/processed_images/textsnatcher.8ae2b60321ed0a4a.png new file mode 100644 index 0000000..b2f57b5 Binary files /dev/null and b/processed_images/textsnatcher.8ae2b60321ed0a4a.png differ diff --git a/processed_images/timeshift.0c93e88769a287be.png b/processed_images/timeshift.0c93e88769a287be.png new file mode 100644 index 0000000..fccf775 Binary files /dev/null and b/processed_images/timeshift.0c93e88769a287be.png differ diff --git a/processed_images/timeshift.37674251bf830d9f.png b/processed_images/timeshift.37674251bf830d9f.png new file mode 100644 index 0000000..f6f7028 Binary files /dev/null and b/processed_images/timeshift.37674251bf830d9f.png differ diff --git a/processed_images/tuba.7a1c7aac49ae2923.png b/processed_images/tuba.7a1c7aac49ae2923.png new file mode 100644 index 0000000..7ad5f80 Binary files /dev/null and b/processed_images/tuba.7a1c7aac49ae2923.png differ diff --git a/processed_images/tuba.da9198ab70f554c6.png b/processed_images/tuba.da9198ab70f554c6.png new file mode 100644 index 0000000..bc249a6 Binary files /dev/null and b/processed_images/tuba.da9198ab70f554c6.png differ diff --git a/processed_images/vala-hero.dd48a5dee00a3fe8.png b/processed_images/vala-hero.dd48a5dee00a3fe8.png new file mode 100644 index 0000000..b3f2d5c Binary files /dev/null and b/processed_images/vala-hero.dd48a5dee00a3fe8.png differ diff --git a/processed_images/workbench.8c3b3fa5950aed35.png b/processed_images/workbench.8c3b3fa5950aed35.png new file mode 100644 index 0000000..15e0516 Binary files /dev/null and b/processed_images/workbench.8c3b3fa5950aed35.png differ diff --git a/processed_images/workbench.9949eab6a62a9842.png b/processed_images/workbench.9949eab6a62a9842.png new file mode 100644 index 0000000..7af3214 Binary files /dev/null and b/processed_images/workbench.9949eab6a62a9842.png differ diff --git a/pt_BR/about/index.html b/pt_BR/about/index.html new file mode 100644 index 0000000..39d8a92 --- /dev/null +++ b/pt_BR/about/index.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Sobre o Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ir para o conteúdo principal + + + + + + + +
+ +
+ + + + +
+
+ +
+

Sobre o Vala

+

O que é Vala?# +

+

Vala é uma linguagem de programação orientada a objetos com compilador embutido, que gera código C e usa o sistema de tipos GObject.

+

Vala suporta funcionalidades de linguagens de programação moderna, como:

+
    +
  • Interfaces
  • +
  • Propriedades
  • +
  • Sinais
  • +
  • Declaração Foreach
  • +
  • Expressões Lambda
  • +
  • Inferência de tipo para variáveis locais
  • +
  • Programação genérica
  • +
  • Tipos Non-null
  • +
  • Gerenciamento de memória assistido
  • +
  • Tratamento de exceção
  • +
  • Módulos (Plugins)
  • +
+

Que tipo de linguagem é Vala?# +

+

Produtiva# +

+

Com Vala, você pode entrar em operação rapidamente, graças a funcionalidades convenientes como expressões lambda, tratamento de exceção, interfaces e programação genérica.

+

Performante# +

+

Código Vala compila para binários inteiramente nativos.

+

Estaticamente-Tipada# +

+

Vala te ajuda a escrever código de tipagem segura, sem verbosidade, graças à inferência de tipos.

+

Integrativo# +

+

Vala é projetada para permitir acesso a bibliotecas C existentes, especialmente bibliotecas baseadas em GObject, sem a necessidade de bindings em tempo de execução. Tudo o que é necessário para usar uma biblioteca com Vala é um arquivo API, contendo as declarações de classe e método na sintaxe Vala. Vala atualmente vem com bindings para GLib e GTK+ e muitos outros para a Plataforma GNOME.

+

Vala também pode ser utilizada para criar bibliotecas C.

+

Familiar# +

+

A sintaxe de Vala é inspirada em C# e Java, de modo que se você já usou alguma delas, você se adaptará perfeitamente à escrita de código Vala.

+ + + + +
+ +
+
+ + + + + + + + + diff --git a/pt_BR/index.html b/pt_BR/index.html new file mode 100644 index 0000000..b05cc91 --- /dev/null +++ b/pt_BR/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +A Linguagem de Programação Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Ir para o conteúdo principal + + + + + + + + + + +
+
+ +

Uma forma familiar de desenvolver aplicações

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + + + + +
+

Por que Vala?

+
+
+
+
+ + + + + Produtividade +
+
+
Escreva confortavelmente seu código de forma orientada a objetos com abstrações de alto nível, enquanto tem acesso a integrações profundas com as tecnologias do GNOME, bem como: GObject, GTK e mais!
+
+
+
+
+ + + + + Desempenho +
+
+
Vala compila o código para binários completamente nativos e incrivelmente rápidos. Você também pode reusar código C existente em seus programas Vala, bem como gerar código C a partir do Vala.
+
+
+
+
+ + + + + Código Aberto +
+
+
Vala é um software gratuito e de código aberto. Tem uma comunidade ótima que contribui para o compilador e desenvolve várias ferramentas.
+
Documentação das ferramentas Vala
+
+
+Aprenda mais sobre Vala + +
+ +
+

O que você pode criar?

+
+
+
+
+ + + + + Aplicações GUI +
+
+
Integração perfeita do GTK, Libadwaita e Granite tornam o desenvolvimento super simples. Publique facilmente seus apps no Flathub sem pacotes inchados.
+
+ +
+
+
+
+
+ + + + + Programas de Linha de Comando + +
+
+
Use uma vasta biblioteca padrão e muitas outras bibliotecas disponíveis para Vala.
+
+
+
+
+ + + + + Bibliotecas +
+
+
Forneça bindings para muitas outras linguagens e documentação da API sem trabalho manual. Ademais, linkagem dinâmica e estática são suportadas.
+
+
+ +
+ +
+ + + + +

O que há de novo?

+
+ + + + + Fundo púrpura com texto branco no centro, escrito 'Vala'. +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + Fundo púrpura com texto branco no centro, escrito 'Vala'. +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + Fundo púrpura com texto branco no centro, escrito 'Vala'. +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+Veja o Blog + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

Vitrine

+ +Veja mais projetos Vala + +
+ +
+

Comunidade

+
+
+
+
+ + + + + Fóruns +
+
+
Faça perguntas relacionadas ao Vala nos fóruns do GNOME Discourse com a tag 'vala'.
+
Fóruns de Discussão
+
+
+
+
+ + + + + Chats Internos +
+
+
Fale com os desenvolvedores ou faça perguntas sobre como contribuir com o Vala, use o canal Vala na Matrix. Também tem uma ponte IRC.
+
Sala na Matrix
+
+
+
+
+ + + + + Servidor da Comunidade +
+
+
Conecte-se com a comunidade no servidor Discord.
+
Servidor Discord
+
+
+ +

Mídias Sociais

+
+

Siga o projeto Vala atráves dessas plataformas

+ +
+ +
+ + + + + + +
+
+ + + + + + + + + + diff --git a/pt_BR/vala-hero.png b/pt_BR/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/pt_BR/vala-hero.png differ diff --git a/robots.txt b/robots.txt new file mode 100644 index 0000000..12b2a25 --- /dev/null +++ b/robots.txt @@ -0,0 +1,4 @@ +User-agent: * +Disallow: +Allow: / +Sitemap: https://vala.dev/sitemap.xml diff --git a/ru/about/index.html b/ru/about/index.html new file mode 100644 index 0000000..f9a5730 --- /dev/null +++ b/ru/about/index.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +О Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Основное меню + + + + + + + +
+ +
+ + + + +
+
+ +
+

О Vala

+

Что такое Vala?# +

+

Vala - это объектно-ориентированный язык программирования с самодостаточным компилятором, который генерирует код Cи и использует систему типов GObject.

+

Vala поддерживает современные языковые функции, такие как:

+
    +
  • Интерфейсы
  • +
  • Свойства
  • +
  • Сигналы
  • +
  • Foreach
  • +
  • Лямбда-выражения
  • +
  • Вывод типа для локальных переменных
  • +
  • Дженерики
  • +
  • Ненулевые типы
  • +
  • Лёгкое управление памятью
  • +
  • Обработка исключений
  • +
  • Типы модулей (плагины)
  • +
+

Почему Vala?# +

+

Производительный# +

+

С Vala вы можете быстро приступить к работе благодаря таким удобным функциям, как лямбда-выражения, обработка исключений, интерфейсы и дженерики.

+

Быстрый# +

+

Код Vala компилируется в полностью нативные двоичные файлы.

+

Статически типизированный# +

+

Vala помогает вам писать безопасный код без хлопот, благодаря выводу типов.

+

Интегрированный# +

+

Vala предназначен для обеспечения доступа к существующим библиотекам Cи, особенно к библиотекам на основе GObject, без необходимости привязок во время выполнения. Все, что необходимо для использования библиотеки Vala - это файл API, содержащий объявления классов и методов в синтаксисе Vala. В настоящее время Vala поставляется с привязками для GLib и GTK+ и многими другими библиотеками с платформы GNOME.

+

Vala также можно использовать для создания библиотек языка Си.

+

Знакомый# +

+

Синтаксис Vala вдохновлен C# и Java, поэтому, если вы использовали любой из них, вы с легкостью адаптируетесь к написанию кода на Vala.

+ + + + +
+ +
+
+ + + + + + + + + diff --git a/ru/index.html b/ru/index.html new file mode 100644 index 0000000..5addc7f --- /dev/null +++ b/ru/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Язык программирования Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Основное меню + + + + + + + + + + +
+
+ +

Знакомый способ разработки приложений

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + + + + +
+

Почему Vala?

+
+
+
+
+ + + + + Производительный +
+
+
Удобно пишите свой объектно-ориентированный код с высокоуровневыми абстракциями, имея при этом глубокую интеграцию с технологиями GNOME, это такие как: GObject и GTK!
+
+
+
+
+ + + + + Эффективный +
+
+
Vala компилируется в невероятно быстрые полностью нативные двоичные файлы. Вы также можете использовать существующий Cи-код в своих программах Vala, а также генерировать Cи-код из Vala.
+
+
+
+
+ + + + + С открытым кодом +
+
+
Vala - это бесплатное и открытое программное обеспечение с отличным сообществом, которое вносит свой вклад в компилятор и разрабатывает множество удобных инструментов.
+
Документация инструментария
+
+
+Узнайте больше о Vala + +
+ +
+

Что вы можете сделать?

+
+
+
+
+ + + + + Графические приложения +
+
+
Идеальная интеграция с GTK, Libadwaita и Granite делает разработку очень простой. Так же с легкостью публикуйте свои приложения во Flathub без лишних хлопот.
+
+ +
+
+
+
+
+ + + + + Консольные приложения + +
+
+
Используйте огромную стандартную библиотеку и множество других библиотек, доступных для использования в Vala.
+
+
+
+
+ + + + + Библиотеки +
+
+
Предоставляйте привязки для большинства языков и документацию по API без ручной работы. Кроме того, поддерживаются как динамические, так и статические привязки.
+
+
+ +
+ +
+ + + + +

Что нового?

+
+ + + + + Фиолетовый фон с белым текстом 'Vala' в центре +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + Фиолетовый фон с белым текстом 'Vala' в центре +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + Фиолетовый фон с белым текстом 'Vala' в центре +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+Блог + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

Демонстрация

+ +Показать больше Vala проектов + +
+ +
+

Сообщество

+
+
+
+
+ + + + + Форум +
+
+
Задавайте вопросы, связанные с Vala, на форумах GNOME Discourse под тегом „vala“.
+
Discourse Форум
+
+
+
+
+ + + + + Внутренний чат +
+
+
Обращайтесь к разработчикам или задайте вопросы о том, как внести свой вклад в Vala. У нас также есть IRC-сервер.
+
Чат Matrix
+
+
+
+
+ + + + + Сервер сообщества +
+
+
Присоединяйтесь к сообществу Vala на Discord сервере
+
Сервер Discord
+
+
+ +

Социальные сети

+
+

Следите за проектом Vala на этих платформах

+ +
+ +
+ + + + + + +
+
+ + + + + + + + + + diff --git a/ru/vala-hero.png b/ru/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/ru/vala-hero.png differ diff --git a/search_index.en.js b/search_index.en.js new file mode 100644 index 0000000..488c89c --- /dev/null +++ b/search_index.en.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer","stopWordFilter","stemmer"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,"2":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"6":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":1}}}},"1":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"0":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"9":{"docs":{},"df":0,"9":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"2":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1,",":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"2":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"0":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1,"3":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"9":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"4":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"3":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"2":{"docs":{},"df":0,"6":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1},"7":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,"4":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"5":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"3":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"0":{"docs":{},"df":0,"9":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"2":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"5":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":1,".":{"docs":{},"df":0,"1":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"0":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"5":{"docs":{},"df":0,".":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"6":{"docs":{},"df":0,",":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},".":{"docs":{},"df":0,"7":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":1}}},"0":{"docs":{},"df":0,"7":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"4":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"7":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"b":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"8":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,",":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"9":{"docs":{},"df":0,"6":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"_":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"_":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1}},"o":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"j":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}}},"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://vala.dev/blog/valabot/":{"tf":3.0}},"df":1,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1},"w":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}},"s":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":4.58257569495584},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3},"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":2,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":2,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,";":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"&":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":2.8284271247461903}},"df":2}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1,"h":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":1}}}}}}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":2}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"k":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":3},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}}},"g":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"d":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":3.4641016151377544},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":3,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}},"g":{"docs":{"https://vala.dev/blog/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.605551275463989},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"c":{"docs":{"https://vala.dev/about/":{"tf":2.0},"https://vala.dev/blog/c-off-ramp/":{"tf":7.937253933193772},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}},"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.3166247903554}},"df":1},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":2.23606797749979},"https://vala.dev/blog/c-off-ramp/":{"tf":5.916079783099616},"https://vala.dev/blog/vala-0-56/":{"tf":2.449489742783178},"https://vala.dev/blog/valabot/":{"tf":3.605551275463989}},"df":4,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"q":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.23606797749979}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":2}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":3}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2},"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,".":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":3}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"p":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.0}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":2.23606797749979}},"df":2}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"—":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.23606797749979}},"df":1}}}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}}}},"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.23606797749979}},"df":1,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":2}}},"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":2.449489742783178}},"df":3}}}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":2,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":1}}}}},"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1}},"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}}}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":4.242640687119285}},"df":1,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"t":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"y":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"x":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":2}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3},"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951}},"df":1}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}},"r":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":4}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":3.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4,".":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,".":{"docs":{},"df":0,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}},"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3},"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":3.3166247903554}},"df":1}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1},"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"_":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,".":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}},"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}},"e":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":3.4641016151377544}},"df":2}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"g":{"docs":{},"df":0,"_":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"c":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.7320508075688772},"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795}},"df":2}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{},"df":0,"_":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}},"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.6457513110645907}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3,".":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/planet-gnome/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.6457513110645907}},"df":4}}},"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.605551275463989}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}}}},"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1},"g":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}},"p":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}}},"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"l":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":2}},"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"p":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}},"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}}}},"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}},"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2}},"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,":":{"docs":{},"df":0,"/":{"docs":{},"df":0,"/":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"/":{"docs":{},"df":0,"s":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"/":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"h":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"/":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"/":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"u":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1,"e":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}}},"i":{"docs":{},"df":0,"'":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"v":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.0}},"df":1}},"6":{"docs":{},"df":0,"8":{"docs":{},"df":0,"6":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":3},"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"o":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1},"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}}},"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.4641016151377544}},"df":1}},"’":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"d":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/":{"tf":1.0},"https://vala.dev/about/":{"tf":1.7320508075688772},"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":2.6457513110645907}},"df":6}}}}},"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":2.0},"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2},"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"3":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}},"o":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1},"p":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"z":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1,"/":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2}},"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":2,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}}}}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":2}},"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3,"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":2}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2}}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"d":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"g":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"6":{"docs":{},"df":0,"4":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":3.4641016151377544}},"df":1},"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":2}}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.605551275463989},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":2.0}},"df":3}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"d":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":2}}}}}},"y":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":3.4641016151377544},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":4}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":2.0}},"df":1}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":3.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"x":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}},"r":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"w":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}}}},"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":3.3166247903554},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":2}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1}}}}},"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"l":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.7416573867739413},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":3,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.449489742783178}},"df":1},"r":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,".":{"docs":{},"df":0,"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"k":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"p":{"docs":{},"df":0,".":{"docs":{},"df":0,"s":{"docs":{},"df":0,"d":{"docs":{},"df":0,"k":{"docs":{},"df":0,".":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,".":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2,"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3,"w":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"w":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}},"g":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}},"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.7320508075688772}},"df":1}}},"t":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":2}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":2}}}}},"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}}}}},"p":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1},"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1,".":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":4}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"w":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}},"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"(":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":2.0}},"df":2}}}},"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/":{"tf":1.0},"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":2.0}},"df":6,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.872983346207417},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":2.23606797749979}},"df":4}}}},"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3}}}}},"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"8":{"docs":{},"df":0,"_":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1},"x":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,".":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}},"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"o":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}}}},"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":2}}},"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":2}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795}},"df":1,"_":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"_":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795}},"df":1,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907}},"df":1}}}}},"h":{"docs":{},"df":0,"y":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}}},"n":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1},"t":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":2,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"x":{"docs":{},"df":0,"6":{"docs":{},"df":0,"8":{"docs":{},"df":0,"0":{"docs":{},"df":0,"0":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"]":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}}},"a":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}}}},"d":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"g":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}}}},"l":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"v":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"i":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":2.23606797749979}},"df":2}},"i":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":2}}}}}}}}}}},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"p":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"z":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"_":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"o":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"–":{"docs":{},"df":0,"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"–":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"u":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}},"o":{"docs":{},"df":0,"f":{"docs":{},"df":0,"t":{"docs":{},"df":0,"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"l":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1},"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}}}},"r":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":3.0}},"df":3}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":2,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}},"e":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"z":{"docs":{},"df":0,"e":{"docs":{},"df":0,"_":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":2}}},"y":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}},"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}},"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"f":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":5.0}},"df":1}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2}}}}}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"d":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"f":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}},"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"b":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"h":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903},"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":3}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"i":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}}}}},"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"y":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"x":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":3}}}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"b":{"docs":{},"df":0,"y":{"docs":{},"df":0,"m":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.7320508075688772}},"df":1}}}},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"k":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"l":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"n":{"docs":{},"df":0,"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"m":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.7416573867739413}},"df":1}},"x":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":3}},"t":{"docs":{},"df":0,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1},"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1}},"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":2}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}}},"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.4641016151377544},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3}}},"o":{"docs":{},"df":0,"k":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":2},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":2.6457513110645907}},"df":1}},"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":5.385164807134504}},"df":1}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"c":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":3.3166247903554}},"df":2}},"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"t":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}}},"w":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.6457513110645907},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"y":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":2.6457513110645907},"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4},"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"z":{"docs":{},"df":0,"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"z":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}}}}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}}}}}}}},"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"w":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}},"p":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":3,"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":1}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"s":{"docs":{"https://vala.dev/about/":{"tf":2.0},"https://vala.dev/blog/c-off-ramp/":{"tf":6.164414002968976},"https://vala.dev/blog/planet-gnome/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":3.3166247903554},"https://vala.dev/blog/valabot/":{"tf":2.449489742783178}},"df":5,"e":{"docs":{},"df":0,"f":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2}}}},"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/":{"tf":1.0},"https://vala.dev/about/":{"tf":4.0},"https://vala.dev/blog/c-off-ramp/":{"tf":9.219544457292887},"https://vala.dev/blog/planet-gnome/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":3.7416573867739413},"https://vala.dev/blog/valabot/":{"tf":4.123105625617661}},"df":6,"/":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"e":{"docs":{},"df":0,"/":{"docs":{},"df":0,"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}}},":":{"docs":{},"df":0,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,".":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}}}}}}}}}},"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":1}}},"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.0}},"df":1},"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,".":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"’":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979}},"df":1}},"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.8284271247461903}},"df":1}},"p":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2}}},"o":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":2},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772}},"df":2}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}},"m":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"w":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":2}},"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}},"y":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":3}},"e":{"docs":{},"df":0,"b":{"docs":{},"df":0,"k":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"2":{"docs":{},"df":0,"g":{"docs":{},"df":0,"t":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.0}},"df":1,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"g":{"docs":{},"df":0,"h":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"c":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"l":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.0}},"df":1}},"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}},"k":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}},"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"b":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"o":{"docs":{},"df":0,"w":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}}},"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":2.23606797749979},"https://vala.dev/blog/vala-0-56/":{"tf":1.7320508075688772},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":4}}}}}},"o":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1},"k":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951},"https://vala.dev/blog/valabot/":{"tf":1.4142135623730951}},"df":3,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"l":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":2}},"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}},"t":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.4142135623730951}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{},"df":0,"n":{"docs":{},"df":0,"’":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}}}}},"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/about/":{"tf":1.4142135623730951},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/planet-gnome/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":4},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":2.449489742783178}},"df":1}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1}},"t":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{},"df":0,"8":{"docs":{},"df":0,"6":{"docs":{},"df":0,"_":{"docs":{},"df":0,"6":{"docs":{},"df":0,"4":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}},"y":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.7320508075688772}},"df":1,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":3.1622776601683795}},"df":1}}},"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.4142135623730951}},"df":1}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/about/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"s":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}}}}}},"z":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":4.123105625617661}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"0":{"docs":{},"df":0,".":{"docs":{},"df":0,"5":{"docs":{},"df":0,"6":{"docs":{"https://vala.dev/blog/vala-0-56/":{"tf":1.0}},"df":1}}}},"a":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}},"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/blog/":{"tf":1.0}},"df":1}}}},"c":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1,"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/":{"tf":1.0}},"df":1}}}}}}},"p":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"(":{"docs":{},"df":0,"\"":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"o":{"docs":{"https://vala.dev/blog/planet-gnome/":{"tf":1.0}},"df":1}}}}}}}}}},"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/":{"tf":1.0}},"df":1}}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}},"s":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/c-off-ramp/":{"tf":1.0}},"df":1}}}}}}}}},"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{"https://vala.dev/":{"tf":1.0},"https://vala.dev/about/":{"tf":1.0},"https://vala.dev/blog/c-off-ramp/":{"tf":1.0},"https://vala.dev/blog/vala-0-56/":{"tf":1.0},"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":5,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/blog/valabot/":{"tf":1.0}},"df":1}}}}}}}}}},"documentStore":{"save":true,"docs":{"https://vala.dev/":{"body":"","id":"https://vala.dev/","title":"Vala Programming Language"},"https://vala.dev/about/":{"body":"About Vala\nWhat is Vala?#\n\nVala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system.\nVala supports modern language features such as:\n\nInterfaces\nProperties\nSignals\nForeach statements\nLambda expressions\nType inferencing for local variables\nGenerics\nNon-null types\nAssisted memory management\nException handling\nType modules (Plugins)\n\nWhat kind of language is Vala?#\n\nProductive#\n\nWith Vala, you can get up and running quickly, thanks to convenient features like lambda expressions, exception handling, interfaces and generics.\nPerformant#\n\nVala code compiles down to fully native binaries.\nStatically-Typed#\n\nVala helps you write type-safe code without the verbosity, thanks to type inference.\nIntegrative#\n\nVala is designed to allow access to existing C libraries, especially GObject-based libraries, without the need for runtime bindings. All that is needed to use a library with Vala is an API file, containing the class and method declarations in Vala syntax. Vala currently comes with bindings for GLib and GTK+ and many others from the GNOME Platform.\nVala can also be used to create C libraries too.\nFamiliar#\n\nThe syntax of Vala is inspired by C# and Java, so if you have used either of those, you'll seamlessly adapt to writing Vala code.\n\n\n Get Started\n\n \n View Source Code\n \n\n\n","id":"https://vala.dev/about/","title":"About Vala"},"https://vala.dev/blog/":{"body":"","id":"https://vala.dev/blog/","title":"Blog"},"https://vala.dev/blog/c-off-ramp/":{"body":"Hi! I’m Reuben, a long-time free software maintainer and author. One of my specialities is taking on mature projects from their original authors and maintaining them long-term.\nIn this post, I want to talk about how I’ve rewritten entire projects in Vala, to make them easier, more productive and more fun to maintain.\nVala works well with C—that’s one of its primary features and design choices. But these abilities can be used for another purpose: to provide a “smooth off-ramp” for C, converting old code step-by-step to more-maintainable Vala, without an “all or nothing” rewrite, and with the ability to reimplement C libraries in Vala, so that existing C code can still call them.\nOver the few years, I have rewritten two small–to–medium-sized C\ncode bases in Vala: the minimal Emacs clone GNU Zile and the spell-checking meta-library Enchant, which has been used by GNOME for years, most recently by libspelling, which provides spell-checking in the GNOME Text Editor. In the rest of this post, I’ll focus on the challenges I faced doing these rewrites, how Vala helped me, and discuss whether such a drastic move (of rewriting entire code bases) was in fact a good idea.\nVala is good at talking to C#\n\nVala is designed to work well with C, and a nice consequence of this is that often one doesn’t have to think about C at all, because so many useful libraries are already conveniently bound to Vala “out of the box”. It’s impressive the degree to which some of Vala’s basic abilities, such as its “built-in” container types are “just” clever binding of GLib functions plus some syntactic sugar.\nBut Vala’s binding abilities are very powerful: it’s not just GLib and GObject APIs that it can bind successfully; it can bind almost any C API. Later I will also show some examples that test its limits.\nFurther, Vala can implement C APIs just as well as it can consume them.\nAllowing C to talk back#\n\nWhy would you want to implement C APIs in Vala? I have three answers for you. Firstly, maintaining a typical C code-base is a horrible experience. I just wanted to not have more memory management errors, especially to do with strings (which both Zile and Enchant are big on). It’s so easy to corrupt memory, to get lifetimes wrong, or simply get the wrong answer with C’s primitive string manipulation routines.\nSecondly, implementing an existing C API in Vala gives an easier-to-maintain codebase that can be used by existing consumers, which don’t need to be C programs: they can be written in Python, Rust, JavaScript or, of course, Vala!\nThirdly, and perhaps less obviously, you can use this ability to rewrite a C program in Vala incrementally, one module (say) at a time. The result is a pure Vala application (no C APIs are being implemented), but at each step one has a complete working application, partly written in C and partly in Vala; and where C needs to call Vala, the Vala code must implement the right C APIs.\nBefore we start, a sanity check#\n\nI’m talking about rewriting mature code-bases. Zile dates from the late 1990s, and I rewrote it into Vala in 2020. Enchant was written starting around 2003, and I rewrote it in Vala this week (in 2024). So:\n\nIsn’t that an awful lot of work?\nWon’t it introduce lots of new bugs?\n\nIn other words, is it worth it? Or am I just being quixotic?\nIt’s not that hard#\n\nAs I said above, I rewrote Enchant in Vala this week. Actually, that’s not quite true: I rewrote the core, about 2,000 lines of C. Enchant is, as I said above, a meta-library: that is, it doesn’t do spell-checking itself, but delegates to a number of libraries that do. Each one needs an adaptor plugin, which Enchant calls a “provider”, and these providers are written in C, C++ and even Objective C. I haven’t touched those (yet!).\nBut still, 2,000 lines of code in a week is not bad.\nGNU Zile was about 8,000 lines of C, and that took me about a month.\nAvoiding a plague of new bugs#\n\nVala is well matched to C#\n\nAny time you touch code you can introduce bugs, of course: the slightest adjustment can be risky. How much more so rewriting in another language?\nThe good news here is that because Vala is so close to C, it is relatively easy to translate code without introducing new bugs. The syntax is sufficiently similar that code can be easily translated with some search and replace (e.g. NULL in C becomes null in Vala) plus light editing (e.g. adding missing comparisons in conditions to make them boolean, so that if (ptr) in C becomes if (ptr != null) in Vala). C APIs can be used directly via Vala bindings, and C data structures can be replicated precisely. Vala’s static typing also helps.\nHere’s an example of a struct in C from Zile:\n\nThe file region.h contained:\n\nHere’s the translation into Vala:\n\nCompare and contrast: around 2009, I translated Zile into Lua. I completed the translation, but I did not release it, as I found that Lua’s lack of static type-checking made it too easy to introduce new bugs. While I was translating it I was forever finding off-by-one errors caused by Lua counting arrays and string positions from 1, while C is 0-based (as is Vala, of course). Don’t get me wrong: Lua is a great language; indeed, I have successfully written other, smaller programs from C into Lua, though I wouldn’t now recommend that; its strengths lie elsewhere.\nWith Vala, I recommend making the initial translation as “light” as possible: don’t use lots of Vala’s features to rewrite code. Translate char * pointers to string offsets (that is, an integer string index). Make sure the translated code works first, then start simplifying. Even the “light” translation will contain simplifications, anyway: no more malloc or free, for example.\nYou already have a test suite, of course#\n\nThe other way you avoid a plague of new bugs is with a good test suite. Sorry! There’s no way around that. If you want to alter, let alone completely rewrite code, you need to have tests.\nFortunately, I had already added a fairly extensive test suite to Zile years ago, when I was trying to make sure that it really behaved exactly like Emacs. The situation with Enchant was even better: it has an exhaustive (and sometimes exhausting) test suite that checks every aspect of its API, added a few years after Enchant was written, by a commission from SIL International. (A big shout-out to those who commission work on libre software, especially this sort of important under-the-hood work. These tests have saved me from introducing bugs time and time again.)\nAgain, you have to be disciplined: no turning off the tests, or changing them as you go. Complete the translation without changing them, as far as possible.\nYour existing build tool is probably supported#\n\nMany Vala projects these days are using the Meson build system, which is very popular in the GNOME space. But Vala is also supported well by older tools, such as CMake and GNU Autotools. Both of the projects I translated were using GNU Autotools, and I stuck with it, for two main reasons:\n\nI use the excellent gnulib portability library to ensure that my POSIX-compliant code runs on most systems without problems. Unfortunately, gnulib is tied to GNU Autotools. But then, few build systems work on as many platforms as the Autotools in any case.\nAutomake not only has Vala support, but allows you to ship the generated C sources, so that users can build your code without a Vala compiler. This means that your translated project has exactly the same build dependencies as it had before, which can help with users and packagers who haven’t heard of Vala and don’t want to learn. With Zile, previously a pure-POSIX project, I added GLib as a build-time dependency, but of course that’s so widely used that it’s unlikely to be a problem. Enchant already used GLib.\n\nThe Vala experience#\n\nI will now describe the process of translating the two code-bases. Although they were a bit different (Zile an application, Enchant a library), and I made the translations a few years apart, I was pleasantly surprised to find the second time that the process was much the same as the first.\nAdd Vala to the build system#\n\nWith Autotools, this is a matter of adding a couple of configure.ac lines to detect the Vala compiler and check for GNU Make (which is required to build from Vala sources), and then adding a test Vala source file to a Makefile.am.\nTranslating the code#\n\nI typically translate one file at a time. The code will of course usually call functions from other parts of the program: I add a private VAPI file with suitable bindings. You can usefully pre-populate the VAPI file with the commented-out contents of relevant C header files, then just uncomment the APIs you need in Vala, and edit them suitably. The excellent Manual bindings guide from the Wiki is my constant companion.\nTo translate a file, I copy foo.c to foo_vala.vala. (The _vala bit ensures that the Vala-generated C won’t overwrite the original file, which I will keep for reference.) I translate the code, possibly in multiple steps, commenting out the bits I have translated in foo.c.\nCompile, test, fix, rinse, repeat.\nI find that I get a nice rhythm with my translation, of doing the obvious basic syntactic stuff, as mentioned above, then finding the equivalent Vala APIs where necessary, then tackling any hard bits, such as binding third-party APIs that Vala does not yet know about.\nFor Zile I leaned heavily on the POSIX VAPI, and added a new GNU VAPI for some GNU-specific APIs, which I have also used and extended while translating Enchant. Enchant was easier on the whole, because it was already GLib-based, so I just had to search valadoc.org for the Vala versions of the GLib APIs.\nFor Zile, I found libgee invaluable, with its superior collections that are both richer than GLib’s and allows extra use cases, such as collections of unboxed simple types (e.g. ArrayList<int>). For Enchant, it so happened I didn’t need this extra functionality; Enchant’s use of collections is mostly limited to singly-linked lists of objects and hash tables with string keys.\nStumbling blocks…#\n\nDocumentation and API coverage#\n\nVala is a small ecosystem, even after all these years. Hence, I found bugs, mostly in the documentation. I took the time to submit fixes, and this past week reaped the rewards! Some of these fixes went as far as GLib itself; many were to the Vala wiki. As I noted above, I also made additions to the VAPIs, in particular adding a complete binding for the POSIX, GNU and BSD regex APIs (Zile only needed the GNU API, but since the GNU regex module implements all three, I thought I might as well!), as well as getopt_long(). I added freopen to the POSIX VAPI (as FILE.reopen()), upgraded the curses VAPI to improve its Terminfo coverage and add key-codes for function keys, and added return codes to GLib’s FileStream.putc and puts.\nI was also able to offer my old-school expertise to the Vala project itself: I converted the test suite to use Automake’s relatively recent ability to run tests in parallel.\nFalling between two stools#\n\nVala itself mostly insulates you from the memory-management woes that bedevil C, but mid-translation there is still C code, so you have to be careful if you want to keep a working program. It’s always tempting to just plough on with the translation and hope that crashes will disappear, but I try not to give in, as that can bury bugs deeper and make them harder to find later. So, expect to spend some time studying valac-generated C, and revising your knowledge of owned and other esoteric Vala features.\nFor me, this is particularly relevant to Enchant, as a C library whose API and ABI I want to maintain. I am happy to report that I have been mostly successful, and at the time of writing I am tracking down some problems with object lifetime management, but otherwise the Vala implementation seems to perfectly replicate the C.\nAnother area of awkwardness is strings: as I hinted above, C often uses pointers to refer to string positions, whereas in Vala it’s usual to use integer offsets. This code is fairly easy to convert once you get the hang of it. Since C can use offsets instead of pointers, you can always rewrite the code in two stages, first changing the C to use offsets, and then translating it into Vala.\nHere’s an example of the translation from pointers in C to offsets in Vala. The C version refers to positions in strings with pointers:\n\nIn Vala, we use string offsets:\n\nThe comparison here is perhaps obscured by the simplification obtained in Vala from automatic memory management, which is nothing to do with string handling per se.\nBinding challenges#\n\nI had a number of particular challenges. Some of them may be relevant to other developers, but I detail them here mostly to illustrate that Vala can bind just about anything if you try!\nconfig.h#\n\nLike any Autoconf-based build system, mine produce a config.h header of various #defined symbols, some of which my C code uses. These I simply replicate in a Config module\nOne could imagine generating this automatically from config.h, but since I didn’t need more than a handful of values in my projects, I didn’t bother.\nrelocate#\n\nThis is a GNU API that returns a string that may or may not be malloced. You can tell which easily enough: if the return value is different from the argument, then it is a newly-allocated string. The problem is getting Vala to do the right thing. Even in C, I wrote my own wrapper function that would always return a malloced string.\nHere’s the Vala VAPI definition:\n\nI use the name _gnulib_relocate because I am about to add a Vala wrapper which uses the original name. We tell Vala that the return value is unowned, to prevent Vala thinking that it must free it.\nHere’s the wrapper, which I also put in the VAPI:\n\nThis is tricky. First, it calls the “real” relocate (but using its Vala name), and stores the result in an unowned string. So far, valac will not allocate any memory.\nWe then test the value returned, and if it is unequal to the original argument, return it. Because we use the return_if_fail macro, valac will not insert memory allocation code at this point, but that’s OK, because relocate has already malloced in this case, so the return value is an allocated string as indicated.\nOtherwise, we simply return the un-malloced value. In the generated C, valac will insert a g_strdup at this point, so again the return value is an allocated string.\nPhew!\nstrfreev#\n\nRather surprisingly, while g_strfreev takes char ** (because it frees a list of strings), strfreev takes string **. Why? Well, Vala uses one level of pointer indirection to indicate that a value is not managed by Vala. So we have the following set of equivalences:\n\nstring = char * (generates char *; as we expect, a string is a pointer to char)\nstring * = char * (generates char *; this is just a string that Vala does not manage)\nstring ** = char ** (generates char **; now we have a list of string)\n\nThis was a problem for me because I wanted to use strfreev to free a “real” char ** passed in from C. But valac gives a type error. I got sufficiently confused that I submitted a merge request, and Rico had to de-confuse me. In the end, all I needed was a cast:\n\nThe cast placates valac, and the generated C ends up calling g_strfreev, which expected a char ** all along.\n[s]size_t is not really [s]size_t#\n\nWhen compiling my Vala version of Enchant on Windows, I accidentally tried compiling it in a flavour of Windows I don’t normally test, namely Mingw MSYS (I normally build for Mingw64-x86_64 and Mingw64-i686). To my surprise, I got a compilation error: GCC complained that one 8-byte signed integer type (long int) was incompatible with another 8-byte signed integer type (long long int). Yes, these are both 64-bit types on this system, and yes, they are nonetheless incompatible.\nBut why did I have this problem in the first place? I was using Vala’s ssize_t, and Vala maps this to GLib’s gsize. I don’t know why, but it’s a problem, because in some cases, like mine, these two types end up with different fundamental types in the C compiler, and an error results. I filed an issue and found a workaround, which was to copy the definition of size_t and ssize_t from posix.vapi, which are normally only used when valac is used with --profile posix and the GLib definitions are not used. The posix.vapi definitions correctly map size_t in Vala to size_t in C.\n…and helping hands#\n\nI mentioned above that Vala is a small ecosystem. An up-side to this is that it’s friendly and usually quick to get things done. The fixes I offered were mostly triaged and applied by the indefatigable Rico Tzschichholz, who was often able to suggest more elegant solutions, mostly for my VAPI bindings. I ended up using a pre-release of valac for Zile, but I could release the code, since you didn’t need valac to build it, and within a few months, Vala 0.52 was released with all the fixes I needed.\nWith Enchant I have had help from Rico again, and also from Lorenz Wildberg; many thanks to both of them, and to everyone else in the community to has both helped me with my projects, and welcomed my own contributions, which, I hope, improve things for everyone else.\nWas it worth it?#\n\nWith GNU Zile I can say: probably, yes. I found one “brown-paper bag” bug in the initial stable release, but that’s it: I have made only two non-alpha releases of the Vala version. On the other hand, the C version was already very stable, and I suspect it’s not widely used any more (I myself have encouraged users to migrate to Emacs for some years!). But then, it was a low-risk project to try out this new technique. And a few years on, the code still builds with no problems: unlike some language ecosystems, Vala seems very stable, and code does not rot fast.\nFor Enchant, it’s too early to say. It’s a much more widely-used package, and though it is quite mature, I have steadily improved and developed it over the past few years, and intend to continue in future. I hope that the switch to Vala will not annoy packagers (it shouldn’t, as they shouldn’t have to change their recipes at all if they don’t want to), and that developers should not notice (because the library remains API and ABI compatible), nor users (because the functionality should be identical, and the performance much the same). Certainly, I expect it will make my future work more productive and fun!\nIs this a good idea?#\n\nMy projects are old-school: highly portable, low-level C. This is not an area that Vala is particularly aimed at, although it does pretty well here. For projects that are firmly in the GLib world, and especially when they use related libraries such as Gtk, rewriting C in Vala seems an excellent option to me.\nWhile I completely rewrote my projects before releasing them, I think I’ve shown there’s no need to do that. When I rewrote Zile in Lua, the intermediate steps had horrible performance, because the Lua/C interface I used was very inefficient (Lua has an efficient-but-complex C API; I chose to use some simple-but-slow home-grown macros instead). When I rewrote Zile in Vala, the performance was much the same at every stage of the process, and I could easily have translated just half of the code and released the project. Many projects, particularly larger ones, might benefit from such an approach.\nAfter completing the translation, the code was already significantly shorter and more readable than in C. This in turn unlocked further simplifications: able to “see the wood for the trees” it was much easier to refactor and further simplify the code. With Zile, I eventually reduced 8,000 lines of C to 6,000 of Vala, a 25% reduction; in Enchant the percentage saving was more like 35%, largely because of a reduction in GLib boilerplate, such as argument validation, which Vala mostly automates.\nOne final thought: I hope that Vala will continue to flourish for many years, but if it doesn’t, then all is not lost: in the worst case, I or my successor could salvage the generated C code, which is ugly but far from impossible to read (and C, I think we can confidently say, will be around for many decades yet); and Vala is also a relatively “neutral” language that would be easy to translate again, into Rust, say; indeed, it would be easier to do that starting from Vala than from C, largely because the Vala code is easier to read and understand.\n\nYou are always invited to join our matrix chat #vala:gnome.org and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!\n\n","id":"https://vala.dev/blog/c-off-ramp/","title":"Vala: the smoothest C off-ramp"},"https://vala.dev/blog/planet-gnome/":{"body":"Hello to all of you reading Planet GNOME right now! This is the first post from the Vala Blog now appearing in the big wide world of GNOME.\nBig thanks to the Planet GNOME team and Felipe Borges for making this possible!\nThis blog is operated by the Vala project and we are posting here once in a while about new Vala releases, noteworthy changes like new features and how to use them, interesting projects using Vala and their experience with it and other stuff related to the Vala programming language.\nIf you have an idea to write about something that fits one of the categories above, reach out to us and we are sure eventually a great article will be released! (Talk to us here)\nStay tuned for the next posts coming out! :)\n","id":"https://vala.dev/blog/planet-gnome/","title":"print(\"Hello Planet GNOME\");"},"https://vala.dev/blog/vala-0-56/":{"body":"After 4 months of work we are proud to announce a new release of Vala. This time it contains lots of new language features and advancements and of course also the usual bug fixes and binding updates.\nAsynchronous Main Function#\n\nWith the new release the main function can now be defined as async. This has multiple advantages. For example is it now possible to call asynchronous functions with yield:\n\nIn main blocks (experimental feature that allows it to write code in a file without putting in a main function) invoking functions with yield is also supported by making the main block automatically asynchronous.\nMerge Request #226\nNested functions#\n\nA simple but very useful feature is to be able to nest functions inside of other functions or methods. These functions are then only visible to the code in the function that contains the nested one. But on the other way the code in the nested function has access to variables in the upper method. Actually they are only lambdas assigned to a local variable.\nUse cases are to structure very complicated functions into multiple smaller ones, without exposing them publicly. In this example the same asynchronous callback is used for two invocations, in which you otherwise would use lambdas:\n\nMerge Request #203\nRedesign of error and warning output#\n\nIf programming errors are outputted at compile time in a pretty way and provide as much information as possible, they massively help and speed up finding the mistakes and correcting them. In the new release this part got an update. Look at the differences yourself:\nBefore Vala 0.56:\n\nVala 0.56:\n\nWhat looks better? :)\nIssue #764\nDynamic invocation of Signals#\n\nLibraries using the GObject type system are providing usually documentation about their API so other languages can use them. However sometimes some parts are missing. With the dynamic keyword an object can be treated as not having all properties or signals specified and they can be accessed dynamically without checking:\n\nAs you can see, signals are now also callable with .emit (). This is necessary to differentiate between a method or a dynamic signal. But this syntax can be also used with non-dynamic variables if wanted.\nMerge Request #227\nPartial classes#\n\nIn rare cases, if a class is so huge and complex, it can be now split up into multiple pieces even into multiple files. All parts of the class only need the partial keyword in front of it.\n\nMerge Request #200\nLength-type for Arrays#\n\nThe length of an array is usually specified by an 32bit integer. However in some cases, especially in bindings to other libaries, sometimes the length of an array is given by a different type of integer. We now have support for that:\n\nIssue #607\nForeach support on Glib.Sequence and Glib.Array#\n\nThis small change will be a big improvement for users of these data structures. Instead of manually looping with for, they are now ready to be used with a foreach loop over the items in the sequence or array.\nMerge Request #234\nNew Bindings#\n\nA bunch of new bindings to libraries got added this release. Here is a list:\n\nlibsoup is now also available in version 3.0 and webkit2gtk in version 4.1 and 5.0 so you can start porting you Vala apps to the new releases of these libraries\nlinux-media can now be used from Vala. There were also lots of more additions and fixes in other linux kernel interface bindings.\nDuring the port of the gnome-desktop library it was splitted up into gnome-desktop-4, gnome-rr-4 and gnome-bg-4. They are all now available to use in your new app.\nThe GLib vapi was updated to version 2.72, including the new Signal- and BindingGroups and DebugController\n\nGNOME Getting started tutorial#\n\nThe GNOME developer documentation has besides other stuff a excellent section on getting started with GTK and app development. Most of the tutorials there have now code examples in Vala. So read it and write your first Vala application! :)\nVala Flatpak Sdk Extension#\n\nYou can find on flathub now the org.freedesktop.Sdk.Extension.vala Extension. It contains the Vala compiler, language server and more tooling. You can use it either for compiling your Vala app, or if you need for example the language server at runtime, like an IDE. Instructions can be found at the flathub repository.\nGoogle Summer of Code#\n\nWe have proposed a project idea for the Google Summer of Code for working on Vala. If you are interested, check out the project ideas page on GNOME discourse.\n\nYou are always invited to join our matrix chat #vala:gnome.org and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala!\n","id":"https://vala.dev/blog/vala-0-56/","title":"Vala 0.56"},"https://vala.dev/blog/valabot/":{"body":"Enhancing AI Coding Assistants for Vala Developers#\n\nAs a programmer, I've been impressed by AI coding assistants like GitHub Copilot and Codeium, which have significantly boosted my productivity. These tools excel at reducing disruptive interruptions, saving time on typing, and often completing lines of code accurately. However, I've encountered limitations with Copilot while working with the Vala programming language. Its suggestions often get muddled with similar languages like Java and C#, and it lacks training on the more common Vala libraries.\nLike many other developers, I'm also dissatisfied with the dominance of Github Copilot and that open source code has been monetized without attribution or consideration for the original authors (some of whom now pay for the service).\nThis challenge inspired me to enhance the Copilot concept by creating an AI coding assistant that is finely tuned to provide a viable and superior alternative that caters for the specific needs of Vala developers. I began with an open-source Large Language Model that had been trained on source code - the powerful Deepseek Coder 6.7b model. This model has been trained from scratch by Deepseek AI on 2 trillion tokens sourced from GitHub. Deepseek Coder significantly outperforms other open-source coding models, such as Codellama.\nI chose the Deepseekcoder-6.7b-base model as the foundation for fine-tuning because of its great benchmark performance and also because it was trained on Java and C# – languages syntactically close to Vala. This allowed me to build upon its existing capabilities and adapt it to the specific needs of Vala.\nFine-Tuning for Vala#\n\nI fine-tuned the model on Vala programming language datasets. This involved downloading as many Vala projects as I could find from GitHub, extracting the Vala source files, and splitting them into ~40 line segments. I then used Llama3 to create logical and predictable \"holes\" in each segment, which were then used to create the FIM (fill-in-the-middle) dataset. This data preparation process took 96 hours of GPU time using my quad-RX6800 machine over a weekend. The resulting dataset was cleaned to remove non-code elements, such as license headers, and personal identifiable information.\nThe Training#\n\nThe fine-tuning process took 10 hours on an RTX 3090. The result was a LoRA, which was merged back into the base model, converted to GGUF, and quantized to q8_0, which is the format required by TabbyML.\nThe Result#\n\nThe outcome was a model that is more helpful and productive for Vala-related projects. By fine-tuning Deepseek Coder, I was able to create a more accurate and effective AI coding assistant that understands the nuances of the Vala programming language. The model is hosted on Huggingface (https://huggingface.co/scowen/deepseek-coder-6.7b-vala/tree/main). It can be used in VSCode, VIM, and other popular IDEs with TabbyML. The complete instructions, training scripts, and dataset are available on GitHub (https://github.com/supercamel/ValaBot).\nLicensing and Fair Use#\n\nAs a project rooted in the principles of Free and Open-Source Software (FOSS), I believe in promoting freedom, community, and sharing knowledge. To facilitate collaboration and innovation, I've made the following resources publicly available:\n\nThe fine-tuned model weights are hosted on Hugging Face for anyone to access and utilize in a TabbyML or other deployment.\nThe training scripts and dataset preparation process are open-sourced on GitHub, providing a transparent and reproducible framework for others to build upon.\nA comprehensive list of repositories used during the fine-tuning process is available on GitHub, ensuring that contributors and users can easily identify and explore the sources that made this project possible.\n\nI hope that this openness will pave the way for further advancements and refinements, ultimately benefiting the Vala developer community as a whole.\nConclusion#\n\nIn this blog post, I've shared my experience with fine-tuning the Deepseek Coder for the Vala programming language, demonstrating how targeted adjustments can significantly enhance AI coding assistants. This project is just the beginning. I aim to continue developing models specifically optimized for Vala to support the Vala developer community. With the release of new base models, such as CodeQwen 7B, there are exciting possibilities for further advancements. Through this work, I hope to highlight the potential of AI fine-tuning in creating more effective coding assistants and inspire others to explore the possibilities of AI-assisted coding.\nGet started with ValaBot here: https://github.com/supercamel/ValaBot\n","id":"https://vala.dev/blog/valabot/","title":"ValaBot: an AI coding assistant fine-tuned for Vala"}},"docInfo":{"https://vala.dev/":{"body":0,"title":3},"https://vala.dev/about/":{"body":145,"title":1},"https://vala.dev/blog/":{"body":0,"title":1},"https://vala.dev/blog/c-off-ramp/":{"body":2024,"title":4},"https://vala.dev/blog/planet-gnome/":{"body":72,"title":3},"https://vala.dev/blog/vala-0-56/":{"body":443,"title":2},"https://vala.dev/blog/valabot/":{"body":439,"title":7}},"length":7},"lang":"English"} \ No newline at end of file diff --git a/search_index.fr.js b/search_index.fr.js new file mode 100644 index 0000000..af96eda --- /dev/null +++ b/search_index.fr.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer-fr","stopWordFilter-fr","stemmer-fr"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"d":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"f":{"docs":{},"df":0,"f":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}},"v":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"b":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"i":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"e":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/fr/about/":{"tf":2.0}},"df":1}}}}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":2.23606797749979}},"df":1},"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}},"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"ç":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"r":{"docs":{},"df":0,"é":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"d":{"docs":{},"df":0,"'":{"docs":{},"df":0,"a":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"e":{"docs":{},"df":0,"x":{"docs":{},"df":0,"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"x":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"p":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}},"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}}},"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}},"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1,"e":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"h":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"m":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"b":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"n":{"docs":{},"df":0,"o":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}},"r":{"docs":{},"df":0,"â":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}},"t":{"docs":{},"df":0,"k":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"é":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}},"h":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"c":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}}},"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"j":{"docs":{},"df":0,"a":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"'":{"docs":{},"df":0,"a":{"docs":{},"df":0,"c":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"f":{"docs":{},"df":0,"é":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}},"u":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"t":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}},"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"b":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}},"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}},"u":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/":{"tf":1.0}},"df":1}}}}}},"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}},"v":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"m":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"i":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"e":{"docs":{},"df":0,"m":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"u":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"é":{"docs":{},"df":0,"t":{"docs":{},"df":0,"h":{"docs":{},"df":0,"o":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"f":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"o":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"s":{"docs":{},"df":0,"a":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}}},"o":{"docs":{},"df":0,"b":{"docs":{},"df":0,"j":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"p":{"docs":{},"df":0,"é":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"o":{"docs":{},"df":0,"n":{"docs":{},"df":0,"n":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}}}}},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"f":{"docs":{},"df":0,"o":{"docs":{},"df":0,"r":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"m":{"docs":{},"df":0,"e":{"docs":{},"df":0,"t":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}},"u":{"docs":{},"df":0,"g":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"v":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"q":{"docs":{},"df":0,"u":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"d":{"docs":{},"df":0,"u":{"docs":{},"df":0,"c":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/":{"tf":1.0}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}},"q":{"docs":{},"df":0,"u":{"docs":{},"df":0,"'":{"docs":{},"df":0,"e":{"docs":{},"df":0,"s":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"p":{"docs":{},"df":0,"i":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"s":{"docs":{},"df":0,"i":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1,"g":{"docs":{},"df":0,"n":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"c":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1,"i":{"docs":{},"df":0,"c":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{},"df":0,"l":{"docs":{},"df":0,"y":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}}},"y":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{},"df":0,"a":{"docs":{},"df":0,"x":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}},"s":{"docs":{},"df":0,"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"m":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"u":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}},"t":{"docs":{},"df":0,"e":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}},"o":{"docs":{},"df":0,"u":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}},"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"s":{"docs":{},"df":0,"p":{"docs":{},"df":0,"a":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{},"df":0,"n":{"docs":{},"df":0,"t":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}}}}}},"y":{"docs":{},"df":0,"p":{"docs":{"https://vala.dev/fr/about/":{"tf":2.449489742783178}},"df":1,"e":{"docs":{},"df":0,"d":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}},"u":{"docs":{},"df":0,"t":{"docs":{},"df":0,"i":{"docs":{},"df":0,"l":{"docs":{},"df":0,"i":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":2.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/":{"tf":1.0},"https://vala.dev/fr/about/":{"tf":4.0}},"df":2},"p":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1},"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"a":{"docs":{},"df":0,"b":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"e":{"docs":{},"df":0,"r":{"docs":{},"df":0,"b":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"é":{"docs":{},"df":0,"c":{"docs":{},"df":0,"r":{"docs":{},"df":0,"i":{"docs":{},"df":0,"r":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"g":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}},"ê":{"docs":{},"df":0,"t":{"docs":{},"df":0,"r":{"docs":{},"df":0,"e":{"docs":{"https://vala.dev/fr/about/":{"tf":1.4142135623730951}},"df":1}}}}}},"title":{"root":{"docs":{},"df":0,"l":{"docs":{},"df":0,"a":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{},"df":0,"u":{"docs":{},"df":0,"a":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/":{"tf":1.0}},"df":1}}}}}}},"p":{"docs":{},"df":0,"r":{"docs":{},"df":0,"o":{"docs":{},"df":0,"g":{"docs":{},"df":0,"r":{"docs":{},"df":0,"a":{"docs":{},"df":0,"m":{"docs":{},"df":0,"m":{"docs":{},"df":0,"i":{"docs":{},"df":0,"n":{"docs":{},"df":0,"g":{"docs":{"https://vala.dev/fr/":{"tf":1.0}},"df":1}}}}}}}},"p":{"docs":{},"df":0,"o":{"docs":{},"df":0,"s":{"docs":{"https://vala.dev/fr/about/":{"tf":1.0}},"df":1}}}}}},"v":{"docs":{},"df":0,"a":{"docs":{},"df":0,"l":{"docs":{"https://vala.dev/fr/":{"tf":1.0},"https://vala.dev/fr/about/":{"tf":1.0}},"df":2}}}}}},"documentStore":{"save":true,"docs":{"https://vala.dev/fr/":{"body":"","id":"https://vala.dev/fr/","title":"Vala Programming Language"},"https://vala.dev/fr/about/":{"body":"À propos de Vala\nQu'est-ce que Vala ?#\n\nVala est un langage de programmation orienté objet avec un compilateur qui génère du code C et utilise le système de type GObject.\nVala prend en charge les fonctionnalités de langage moderne telles que :\n\nInterfaces\nProperties\nSignals\nForeach statements\nLambda expressions\nType inferencing for local variables\nGenerics\nNon-null types\nAssisted memory management\nException handling\nType modules (Plugins)\n\nQuel genre de langue est Vala?#\n\nProductif#\n\nAvec Vala, vous pouvez être opérationnel rapidement, grâce à des fonctionnalités pratiques telles que les expressions lambda, la gestion des exceptions, les interfaces et les génériques.\nPerformant#\n\nLe code Vala se compile en binaires entièrement natifs.\nStatically-Typed#\n\nVala vous aide à écrire du code de type sécurisé sans verbosité, grâce à l'inférence de type.\nIntegrative#\n\nVala est conçu pour permettre l'accès aux bibliothèques C existantes, en particulier les bibliothèques basées sur GObject, sans avoir besoin de liaisons d'exécution. Tout ce qui est nécessaire pour utiliser une bibliothèque avec Vala est un fichier vapi, contenant les déclarations de classe et de méthode dans la syntaxe Vala. Vala est actuellement livré avec des liaisons pour GLib et GTK + et bien d'autres de la plate-forme GNOME.\nVala peut également être utilisé pour créer des bibliothèques C.\nFamiliar#\n\nLa syntaxe de Vala est inspirée de C # et Java, donc si vous avez utilisé l'un ou l'autre, vous vous adapterez de manière transparente à l'écriture de code Vala.\n\n\n Commencer\n\n \n Afficher le code source\n \n\n\n","id":"https://vala.dev/fr/about/","title":"À propos de Vala"}},"docInfo":{"https://vala.dev/fr/":{"body":0,"title":3},"https://vala.dev/fr/about/":{"body":151,"title":2}},"length":2},"lang":"French"} \ No newline at end of file diff --git a/search_index.ru.js b/search_index.ru.js new file mode 100644 index 0000000..4f4e109 --- /dev/null +++ b/search_index.ru.js @@ -0,0 +1 @@ +window.searchIndex = {"fields":["title","body"],"pipeline":["trimmer-ru","stopWordFilter-ru","stemmer-ru"],"ref":"id","version":"0.9.5","index":{"body":{"root":{"docs":{},"df":0,"а":{"docs":{},"df":0,"д":{"docs":{},"df":0,"а":{"docs":{},"df":0,"п":{"docs":{},"df":0,"т":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"у":{"docs":{},"df":0,"е":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}},"б":{"docs":{},"df":0,"е":{"docs":{},"df":0,"з":{"docs":{},"df":0,"о":{"docs":{},"df":0,"п":{"docs":{},"df":0,"а":{"docs":{},"df":0,"с":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"и":{"docs":{},"df":0,"б":{"docs":{},"df":0,"л":{"docs":{},"df":0,"и":{"docs":{},"df":0,"о":{"docs":{},"df":0,"т":{"docs":{},"df":0,"е":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":2.23606797749979}},"df":1}}}}}}}},"л":{"docs":{},"df":0,"а":{"docs":{},"df":0,"г":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"а":{"docs":{},"df":0,"р":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}},"ы":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"р":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}},"в":{"docs":{},"df":0,"д":{"docs":{},"df":0,"о":{"docs":{},"df":0,"х":{"docs":{},"df":0,"н":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"л":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"ы":{"docs":{},"df":0,"в":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}},"п":{"docs":{},"df":0,"о":{"docs":{},"df":0,"л":{"docs":{},"df":0,"н":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"ж":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}},"г":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{},"df":0,"е":{"docs":{},"df":0,"р":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"д":{"docs":{},"df":0,"в":{"docs":{},"df":0,"о":{"docs":{},"df":0,"и":{"docs":{},"df":0,"ч":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"ж":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{},"df":0,"е":{"docs":{},"df":0,"р":{"docs":{},"df":0,"и":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}},"о":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"у":{"docs":{},"df":0,"п":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"р":{"docs":{},"df":0,"у":{"docs":{},"df":0,"г":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"з":{"docs":{},"df":0,"н":{"docs":{},"df":0,"а":{"docs":{},"df":0,"к":{"docs":{},"df":0,"о":{"docs":{},"df":0,"м":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"и":{"docs":{},"df":0,"н":{"docs":{},"df":0,"т":{"docs":{},"df":0,"е":{"docs":{},"df":0,"г":{"docs":{},"df":0,"р":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"р":{"docs":{},"df":0,"ф":{"docs":{},"df":0,"е":{"docs":{},"df":0,"й":{"docs":{},"df":0,"с":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}}},"с":{"docs":{},"df":0,"к":{"docs":{},"df":0,"л":{"docs":{},"df":0,"ю":{"docs":{},"df":0,"ч":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}},"п":{"docs":{},"df":0,"о":{"docs":{},"df":0,"л":{"docs":{},"df":0,"ь":{"docs":{},"df":0,"з":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}},"х":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"к":{"docs":{},"df":0,"л":{"docs":{},"df":0,"а":{"docs":{},"df":0,"с":{"docs":{},"df":0,"с":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"о":{"docs":{},"df":0,"д":{"docs":{"https://vala.dev/ru/about/":{"tf":2.23606797749979}},"df":1},"м":{"docs":{},"df":0,"п":{"docs":{},"df":0,"и":{"docs":{},"df":0,"л":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}},"я":{"docs":{},"df":0,"т":{"docs":{},"df":0,"о":{"docs":{},"df":0,"р":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}},"л":{"docs":{},"df":0,"е":{"docs":{},"df":0,"г":{"docs":{},"df":0,"к":{"docs":{},"df":0,"о":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"о":{"docs":{},"df":0,"к":{"docs":{},"df":0,"а":{"docs":{},"df":0,"л":{"docs":{},"df":0,"ь":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"ю":{"docs":{},"df":0,"б":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}},"я":{"docs":{},"df":0,"м":{"docs":{},"df":0,"б":{"docs":{},"df":0,"д":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}},"ё":{"docs":{},"df":0,"г":{"docs":{},"df":0,"к":{"docs":{},"df":0,"о":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"м":{"docs":{},"df":0,"е":{"docs":{},"df":0,"т":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"н":{"docs":{},"df":0,"о":{"docs":{},"df":0,"г":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"у":{"docs":{},"df":0,"л":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"ж":{"docs":{},"df":0,"е":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"н":{"docs":{},"df":0,"а":{"docs":{},"df":0,"п":{"docs":{},"df":0,"и":{"docs":{},"df":0,"с":{"docs":{},"df":0,"а":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"о":{"docs":{},"df":0,"я":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"т":{"docs":{},"df":0,"и":{"docs":{},"df":0,"в":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"ч":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"е":{"docs":{},"df":0,"н":{"docs":{},"df":0,"у":{"docs":{},"df":0,"л":{"docs":{},"df":0,"е":{"docs":{},"df":0,"в":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"о":{"docs":{},"df":0,"б":{"docs":{},"df":0,"х":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"и":{"docs":{},"df":0,"м":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}}}},"о":{"docs":{},"df":0,"б":{"docs":{},"df":0,"е":{"docs":{},"df":0,"с":{"docs":{},"df":0,"п":{"docs":{},"df":0,"е":{"docs":{},"df":0,"ч":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"б":{"docs":{},"df":0,"о":{"docs":{},"df":0,"т":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}},"ъ":{"docs":{},"df":0,"е":{"docs":{},"df":0,"к":{"docs":{},"df":0,"т":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"я":{"docs":{},"df":0,"в":{"docs":{},"df":0,"л":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"р":{"docs":{},"df":0,"и":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{},"df":0,"т":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}},"с":{"docs":{},"df":0,"н":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"п":{"docs":{},"df":0,"а":{"docs":{},"df":0,"м":{"docs":{},"df":0,"я":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"е":{"docs":{},"df":0,"р":{"docs":{},"df":0,"е":{"docs":{},"df":0,"м":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"и":{"docs":{},"df":0,"с":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"л":{"docs":{},"df":0,"а":{"docs":{},"df":0,"г":{"docs":{},"df":0,"и":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"т":{"docs":{},"df":0,"ф":{"docs":{},"df":0,"о":{"docs":{},"df":0,"р":{"docs":{},"df":0,"м":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"д":{"docs":{},"df":0,"е":{"docs":{},"df":0,"р":{"docs":{},"df":0,"ж":{"docs":{},"df":0,"и":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}},"к":{"docs":{},"df":0,"а":{"docs":{},"df":0,"з":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"л":{"docs":{},"df":0,"н":{"docs":{},"df":0,"о":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"м":{"docs":{},"df":0,"о":{"docs":{},"df":0,"г":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"а":{"docs":{},"df":0,"в":{"docs":{},"df":0,"л":{"docs":{},"df":0,"я":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"э":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"р":{"docs":{},"df":0,"е":{"docs":{},"df":0,"д":{"docs":{},"df":0,"н":{"docs":{},"df":0,"а":{"docs":{},"df":0,"з":{"docs":{},"df":0,"н":{"docs":{},"df":0,"а":{"docs":{},"df":0,"ч":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}},"и":{"docs":{},"df":0,"в":{"docs":{},"df":0,"я":{"docs":{},"df":0,"з":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1},"о":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"у":{"docs":{},"df":0,"п":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"о":{"docs":{},"df":0,"г":{"docs":{},"df":0,"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"м":{"docs":{},"df":0,"м":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/":{"tf":1.0},"https://vala.dev/ru/about/":{"tf":1.0}},"df":2}}}}}}}}}}},"и":{"docs":{},"df":0,"з":{"docs":{},"df":0,"в":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"и":{"docs":{},"df":0,"т":{"docs":{},"df":0,"е":{"docs":{},"df":0,"л":{"docs":{},"df":0,"ь":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"б":{"docs":{},"df":0,"о":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"с":{"docs":{},"df":0,"а":{"docs":{},"df":0,"м":{"docs":{},"df":0,"о":{"docs":{},"df":0,"д":{"docs":{},"df":0,"о":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"а":{"docs":{},"df":0,"т":{"docs":{},"df":0,"о":{"docs":{},"df":0,"ч":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}}}},"в":{"docs":{},"df":0,"о":{"docs":{},"df":0,"й":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"в":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"и":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1,"г":{"docs":{},"df":0,"н":{"docs":{},"df":0,"а":{"docs":{},"df":0,"л":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"н":{"docs":{},"df":0,"т":{"docs":{},"df":0,"а":{"docs":{},"df":0,"к":{"docs":{},"df":0,"с":{"docs":{},"df":0,"и":{"docs":{},"df":0,"с":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}}}},"с":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}},"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"р":{"docs":{},"df":0,"е":{"docs":{},"df":0,"м":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"д":{"docs":{},"df":0,"е":{"docs":{},"df":0,"р":{"docs":{},"df":0,"ж":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"з":{"docs":{},"df":0,"д":{"docs":{},"df":0,"а":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}},"т":{"docs":{},"df":0,"а":{"docs":{},"df":0,"т":{"docs":{},"df":0,"и":{"docs":{},"df":0,"ч":{"docs":{},"df":0,"е":{"docs":{},"df":0,"с":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}},"у":{"docs":{},"df":0,"щ":{"docs":{},"df":0,"е":{"docs":{},"df":0,"с":{"docs":{},"df":0,"т":{"docs":{},"df":0,"в":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}},"т":{"docs":{},"df":0,"а":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}},"и":{"docs":{},"df":0,"п":{"docs":{"https://vala.dev/ru/about/":{"tf":2.23606797749979}},"df":1,"и":{"docs":{},"df":0,"з":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}}}},"у":{"docs":{},"df":0,"д":{"docs":{},"df":0,"о":{"docs":{},"df":0,"б":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}},"п":{"docs":{},"df":0,"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"в":{"docs":{},"df":0,"л":{"docs":{},"df":0,"е":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}},"ф":{"docs":{},"df":0,"а":{"docs":{},"df":0,"й":{"docs":{},"df":0,"л":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}},"у":{"docs":{},"df":0,"н":{"docs":{},"df":0,"к":{"docs":{},"df":0,"ц":{"docs":{"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":1}}}}},"х":{"docs":{},"df":0,"л":{"docs":{},"df":0,"о":{"docs":{},"df":0,"п":{"docs":{},"df":0,"о":{"docs":{},"df":0,"т":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}},"я":{"docs":{},"df":0,"з":{"docs":{},"df":0,"ы":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/":{"tf":1.0},"https://vala.dev/ru/about/":{"tf":1.4142135623730951}},"df":2,"о":{"docs":{},"df":0,"в":{"docs":{"https://vala.dev/ru/about/":{"tf":1.0}},"df":1}}}}}}}},"title":{"root":{"docs":{},"df":0,"п":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"г":{"docs":{},"df":0,"р":{"docs":{},"df":0,"а":{"docs":{},"df":0,"м":{"docs":{},"df":0,"м":{"docs":{},"df":0,"и":{"docs":{},"df":0,"р":{"docs":{},"df":0,"о":{"docs":{},"df":0,"в":{"docs":{},"df":0,"а":{"docs":{},"df":0,"н":{"docs":{"https://vala.dev/ru/":{"tf":1.0}},"df":1}}}}}}}}}}}}}},"я":{"docs":{},"df":0,"з":{"docs":{},"df":0,"ы":{"docs":{},"df":0,"к":{"docs":{"https://vala.dev/ru/":{"tf":1.0}},"df":1}}}}}}},"documentStore":{"save":true,"docs":{"https://vala.dev/ru/":{"body":"","id":"https://vala.dev/ru/","title":"Язык программирования Vala"},"https://vala.dev/ru/about/":{"body":"О Vala\nЧто такое Vala?#\n\nVala - это объектно-ориентированный язык программирования с самодостаточным компилятором, который генерирует код Cи и использует систему типов GObject.\nVala поддерживает современные языковые функции, такие как:\n\nИнтерфейсы\nСвойства\nСигналы\nForeach\nЛямбда-выражения\nВывод типа для локальных переменных\nДженерики\nНенулевые типы\nЛёгкое управление памятью\nОбработка исключений\nТипы модулей (плагины)\n\nПочему Vala?#\n\nПроизводительный#\n\nС Vala вы можете быстро приступить к работе благодаря таким удобным функциям, как лямбда-выражения, обработка исключений, интерфейсы и дженерики.\nБыстрый#\n\nКод Vala компилируется в полностью нативные двоичные файлы.\nСтатически типизированный#\n\nVala помогает вам писать безопасный код без хлопот, благодаря выводу типов.\nИнтегрированный#\n\nVala предназначен для обеспечения доступа к существующим библиотекам Cи, особенно к библиотекам на основе GObject, без необходимости привязок во время выполнения. Все, что необходимо для использования библиотеки Vala - это файл API, содержащий объявления классов и методов в синтаксисе Vala. В настоящее время Vala поставляется с привязками для GLib и GTK+ и многими другими библиотеками с платформы GNOME.\nVala также можно использовать для создания библиотек языка Си.\nЗнакомый#\n\nСинтаксис Vala вдохновлен C# и Java, поэтому, если вы использовали любой из них, вы с легкостью адаптируетесь к написанию кода на Vala.\n\n\n Начать\n\n \n Показать исходный код\n \n\n\n","id":"https://vala.dev/ru/about/","title":"О Vala"}},"docInfo":{"https://vala.dev/ru/":{"body":0,"title":2},"https://vala.dev/ru/about/":{"body":113,"title":0}},"length":2},"lang":"Russian"} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..d253293 --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,61 @@ + + + + https://vala.dev/ + + + https://vala.dev/about/ + + + https://vala.dev/blog/ + + + https://vala.dev/blog/c-off-ramp/ + 2024-04-22 + + + https://vala.dev/blog/page/1/ + + + https://vala.dev/blog/planet-gnome/ + 2023-10-11 + + + https://vala.dev/blog/vala-0-56/ + 2022-03-18 + + + https://vala.dev/blog/valabot/ + 2024-05-09 + + + https://vala.dev/cs/ + + + https://vala.dev/cs/about/ + + + https://vala.dev/fr/ + + + https://vala.dev/fr/about/ + + + https://vala.dev/pt_BR/ + + + https://vala.dev/pt_BR/about/ + + + https://vala.dev/ru/ + + + https://vala.dev/ru/about/ + + + https://vala.dev/zh_CN/ + + + https://vala.dev/zh_CN/about/ + + diff --git a/vala-hero.png b/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/vala-hero.png differ diff --git a/zh_CN/about/index.html b/zh_CN/about/index.html new file mode 100644 index 0000000..664f92c --- /dev/null +++ b/zh_CN/about/index.html @@ -0,0 +1,241 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +关于 Vala + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 跳到主要内容 + + + + + + + +
+ +
+ + + + +
+
+ +
+

关于 Vala

+

什么是 Vala?# +

+

Vala 是一种面向对象的编程语言,具有自托管编译器,可生成 C 代码并使用 GObject 类型系统。

+

Vala 支持现代语言特性,例如:

+
    +
  • 接口
  • +
  • 属性
  • +
  • 信号
  • +
  • Foreach 语句
  • +
  • Lambda 表达式
  • +
  • 局部变量的类型推断
  • +
  • 泛型
  • +
  • 非空(Non-null)类型
  • +
  • 辅助内存管理
  • +
  • 异常处理
  • +
  • 类型模块(插件)
  • +
+

Vala 是什么语言?# +

+

高效# +

+

使用 Vala,您可以快速启动并运行,这要归功于 lambda 表达式、异常处理、接口和泛型等方便的功能。

+

高性能# +

+

Vala 代码编译成完全原生的二进制文件。

+

静态类型# +

+

由于类型推断,Vala 可以帮助您编写类型安全的代码而不会冗长。

+

整合# +

+

Vala 旨在允许访问现有的 C 库,尤其是基于 GObject 的库,而无需运行时绑定。 使用带有 Vala 的库所需的全部是一个 API 文件,其中包含 Vala 语法中的类和方法声明。 Vala 当前附带了 GLib 和 GTK+ 以及 GNOME 平台的许多其他绑定。

+

Vala 也可以用来创建 C 库。

+

熟悉# +

+

Vala 的语法受到 C# 和 Java 的启发,因此如果您使用过其中任何一个,您将无缝地适应编写 Vala 代码。

+ +
+ 入门 + + + 查看源代码 + +
+ + +
+ +
+
+ + + + + + + + + diff --git a/zh_CN/index.html b/zh_CN/index.html new file mode 100644 index 0000000..58894e0 --- /dev/null +++ b/zh_CN/index.html @@ -0,0 +1,692 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +Vala编程语言 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 跳到主要内容 + + + + + + + + + + +
+
+ +

开发应用程序的熟悉方式

+ +
+
+ + + + +
+
+ +
// ExampleApp.vala
+
+public class ExampleApp : Gtk.Application {
+  public ExampleApp () {
+    Object (application_id: "com.example.App");
+  }
+
+  public override void activate () {
+    var win = new Gtk.ApplicationWindow (this);
+
+    var btn = new Gtk.Button.with_label ("Hello World");
+    btn.clicked.connect (win.close);
+
+    win.child = btn;
+    win.present ();
+  }
+
+  public static int main (string[] args) {
+    var app = new ExampleApp ();
+    return app.run (args);
+  }
+}
+
+// Compile command (requires gtk4 package to be installed):
+// valac --pkg gtk4 ExampleApp.vala
+
+ + + +
+ 入门 + + + 查看源代码 + +
+ + +
+

为什么选择 Vala?

+
+
+
+
+ + + + + 生产率 +
+
+
以高级抽象的方式舒适地编写面向对象代码,同时可以与诸如 GObject, GTK 及更多的 GNOME 技术深度集成!
+
+
+
+
+ + + + + 性能 +
+
+
Vala 将代码编译成极快的、完全原生的二进制文件。 您还可以在 Vala 程序中重用现有的 C 代码,以及从 Vala 生成 C 代码。
+
+
+
+
+ + + + + 开放源代码 +
+
+
Vala 是免费的开源软件。它有一个很棒的社区,可以为编译器做出贡献并开发大量工具。
+
工具文档
+
+
+了解有关 Vala 的更多信息 + +
+ +
+

你能开发什么?

+
+
+
+
+ + + + + 图形用户界面应用程序 +
+
+
GTK、Libadwaita 和 Granite 的完美集成让开发变得超级简单。轻松在 Flathub 上发布您的应用程序,而无需臃肿的包。
+
+ +
+
+
+
+
+ + + + + 命令行应用程序 + +
+
+
使用大型标准库并使用可在 Vala 中使用的大量其他库。
+
+
+
+
+ + + + + 库 +
+
+
无需手工处理即可为许多其他语言和 API 文档提供绑定。 此外,还支持动态和静态链接。
+
+
+ +
+ +
+ + + + +

有什么新鲜事?

+
+ + + + + 紫色背景,中间有白色文字,上面写着'Vala'。 +
+
ValaBot: an AI coding assistant fine-tuned for Vala
+ + + + Sam Cowen + + + +
+
+ + + + + 紫色背景,中间有白色文字,上面写着'Vala'。 +
+
Vala: the smoothest C off-ramp
+ + + + Reuben Thomas + + + +
+
+ + + + + 紫色背景,中间有白色文字,上面写着'Vala'。 +
+
print("Hello Planet GNOME");
+ + + + Lorenz Wildberg + + + +
+
+ + + +
+查看博客 + +
+ +
+

Current Versions

+ +How to install + +
+ +
+ + +

作品展示

+ +查看更多 Vala 项目 + +
+ +
+

社区

+
+
+
+
+ + + + + 论坛 +
+
+
在 GNOME Discourse 论坛的 'vala' 标签下提出与 Vala 相关的问题。
+
Discourse 论坛
+
+
+
+
+ + + + + 内部聊天 +
+
+
与开发人员交谈或询问有关如何为 Vala 做出贡献的问题,使用 Vala Matrix 频道。它还有一个 IRC 桥。
+
Matrix 房间
+
+
+
+
+ + + + + 社区服务器 +
+
+
在 Discord 服务器上连接社区。
+
Discord 服务器
+
+
+ +

社交媒体

+ + +
+ + +
+ 入门 + + + 查看源代码 + +
+ + + +
+
+ + + + + + + + + + diff --git a/zh_CN/vala-hero.png b/zh_CN/vala-hero.png new file mode 100644 index 0000000..2ec271e Binary files /dev/null and b/zh_CN/vala-hero.png differ