port website to zola

This commit is contained in:
Terts Diepraam
2024-01-28 15:47:29 +01:00
parent 8e77b54fed
commit 6db6c19532
12 changed files with 652 additions and 484 deletions
+14
View File
@@ -0,0 +1,14 @@
# The URL the site will be built for
base_url = "https://uutils.github.io"
title = "uutils"
description = ""
default_language = "en"
paginate_by = 10
[markdown]
highlight_code = true
highlight_theme = "OneHalfLight"
+59
View File
@@ -0,0 +1,59 @@
+++
+++
<header>
<img src="logo.svg" alt="uutils" class="logo" />
<h1 class="title">uutils</h1>
</header>
The uutils project reimplements ubiquitous command line utilities in
Rust. Our goal is to modernize the utils, while retaining full
compatibility with the existing utilities.
## Projects
<div class="projects">
<a class="project" href="/coreutils">
<span aria-hidden="true">&gt;</span>
coreutils
</a>
<a class="project" href="/findutils">
<span aria-hidden="true">&gt;</span>
findutils
</a>
<a class="project" href="/diffutils">
<span aria-hidden="true">&gt;</span>
diffutils
</a>
</div>
## Crates
We maintain a variety of public crates to support our projects,
which are published on [crates.io](https://crates.io/).
- [`platform-info`](https://github.com/uutils/platform-info)
- [`parse_datetime`](https://github.com/uutils/parse_datetime)
- [`uutils-term-grid`](https://github.com/uutils/uutils-term-grid)
## Contributing
You can help us out by:
- Contributing code
- Contributing documentation
- Reporting bugs (e.g. incompatibilities with GNU utilities)
- Triaging bugs
- [Sponsoring uutils on GitHub](https://github.com/sponsors/uutils)
You can join our [Discord server](https://discord.gg/wQVJbvJ) to discuss or ask anything concerning uutils. We're happy to help you get started with contributing!
## Friends of uutils
We collaborate with and build upon many other projects in the Rust
community, either by using or providing crates. We highly recommend
giving these projects a look!
- [`nushell`](https://www.nushell.sh/)
- [`ripgrep`](https://github.com/burntsushi/ripgrep)
- [`eza`](https://github.com/eza-community/eza)
+219
View File
@@ -0,0 +1,219 @@
+++
title = "GSOC"
+++
# Uutils at GSOC
Google summer of code is:
> Google Summer of Code is a global, online program focused on bringing
> new contributors into open source software development. GSoC
> Contributors work with an open source organization on a 12+ week
> programming project under the guidance of mentors.
If you want to know more about how it works, check out the links below.
**Useful links**:
* [GSOC Contributor Guide](https://google.github.io/gsocguides/student/)
* [GSOC FAQ](https://developers.google.com/open-source/gsoc/faq)
* [GSOC Timeline](https://developers.google.com/open-source/gsoc/timeline) (important for deadlines!)
# What is it about?
The [uutils project](https://github.com/uutils/) is aiming at rewriting key Linux utilities in Rust, targeting [coreutils](https://github.com/uutils/coreutils), [findutils](https://github.com/uutils/findutils), [diffutils](https://github.com/uutils/diffutils), [procps](https://github.com/uutils/procps), [util-linux](https://github.com/uutils/util-linux), and [bsdutils](https://github.com/uutils/bsdutils). Their goal is to create fully compatible, high-performance drop-in replacements, ensuring reliability through upstream test suites. Significant progress has been made with coreutils, diffutils, and findutils, while the other utilities are in the early stages of development.
# How to get started
Here are some steps to follow if you want to apply for a GSOC project
with uutils.
1. **Check the requirements.** You have to meet
[Google's requirements](https://developers.google.com/open-source/gsoc/faq#what_are_the_eligibility_requirements_for_participation) to apply. Specifically for uutils, it's best if you at
least know some Rust and have some familiarity with using the
coreutils and the other tools.
1. **Reach out to us!** We are happy to discuss potential projects and help you find a meaningful project for uutils. Tell us what interests you about the project and what experience you have and we can find a suitable project together. You can talk to the uutils maintainers on the [Discord server](https://discord.gg/wQVJbvJ). In particular, you can contact:
* Sylvestre Ledru (@sylvestre on GitHub and Discord)
* Terts Diepraam (@tertsdiepraam on GitHub and @terts on Discord)
2. **Get comfortable with uutils.** To find a good project you need to understand the codebase. We recommend that you take a look at the code, the issue tracker and maybe try to tackle some [good-first-issues](https://github.com/uutils/coreutils/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22). Also take a look at our [contributor guidelines](https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md).
3. **Find a project and a mentor.** We have a [list of potential projects](https://github.com/uutils/coreutils/wiki/GSOC-Project-Ideas) you can adapt or use as inspiration. Make sure discuss your ideas with the maintainers! Some project ideas below have suggested mentors you could contact.
4. **Write the application.** You can do this with your mentor. The application has to go through Google, so make sure to follow all the advice in Google's [Contributor Guide](https://google.github.io/gsocguides/student/writing-a-proposal).
# Tips
- Make sure the project is concrete and well-defined.
- Communication is super important!
- Try to tackle some simple issues to get familiar with uutils.
# Project Ideas
This page contains project ideas for the Google Summer of Code for
uutils. Feel free to suggest project ideas of your own.
[Guidelines for the project list](https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list)
Summarizing that page, each project should include:
- Title
- Description
- Expected outputs
- Skills required/preferred
- Possible mentors
- Size (either ~175 or ~350 hours)
- Difficulty (easy, medium or hard)
## Implement `stty`
The `stty` utility is currently only partially implemented and should be expanded.
See issues: [#3859](https://github.com/uutils/coreutils/issues/3859), [#3860](https://github.com/uutils/coreutils/issues/3860), [#3861](https://github.com/uutils/coreutils/issues/3861), [#3862](https://github.com/uutils/coreutils/issues/3862), [#3863](https://github.com/uutils/coreutils/issues/3863).
- Difficulty: Medium
- Size: 175 or 350 depending on the scope
- Mentors: Terts Diepraam
- Required skills:
- Rust
- Basic knowledge about the terminal
## Localization
Support for localization for formatting, quoting & sorting in various utilities, like `date`, `ls` and `sort`. For this project, we need to figure out how to deal with locale data. The first option is to use the all-Rust `icu4x` library, which has a different format than what distributions usually provide. In this case a solution _could_ be to write a custom `localedef`-like command. The second option is to use a wrapper around the C `icu` library, which comes with the downside of being a C dependency.
This is described in detail in [issue #3997](https://github.com/uutils/coreutils/issues/3997).
And was also discussed in [#1919](https://github.com/uutils/coreutils/issues/1919#issuecomment-846471073), [#3584](https://github.com/uutils/coreutils/issues/3584).
- Difficulty: Hard
- Size: TBD
- Mentors: TBD
- Required skills:
- Rust
## `procps`: Development of Process Management and Information Tools in Rust
This project focuses on creating Rust-based implementations of process management and information tools: `ps`, `pgrep`, `pidwait`, `pkill`, `skill`, and `snice`. The goal is to ensure full compatibility with all options and successful passing of GNU tests, maintaining the functionality and reliability of these essential tools.
- **Description:** Develop Rust-based versions of key process management and information tools, ensuring compatibility with all options and GNU tests.
- **Expected Outputs:** Efficient, reliable tools with full option compatibility and passing GNU tests.
- **Skills Required/Preferred:** Proficiency in Rust, understanding of Linux process management, experience with GNU testing methodologies.
- **Possible Mentors:** [To be determined]
- **Size:** ~350 hours.
- **Difficulty:** Medium.
## `procps`: Development of System Monitoring and Statistics Tools in Rust
This project involves the Rust-based development of system monitoring and statistics tools: `top`, `vmstat`, `tload`, `w`, and `watch`. The objective is to achieve full compatibility with all options and to pass GNU tests, ensuring these tools provide accurate and reliable system insights.
- **Description:**: Create Rust versions of system monitoring and statistics tools, with a focus on full option compatibility and passing GNU tests.
- **Expected Outputs:**: Robust tools for system monitoring and statistics, fully compatible with existing options and verified by GNU tests.
- **Skills Required/Preferred:**: Rust expertise, knowledge of system performance metrics, familiarity with GNU testing frameworks.
- **Possible Mentors:**: [To be determined]
- **Size:**: ~350 hours.
- **Difficulty:**: Medium.
## `procps`: Development of Memory and Resource Analysis Tools in Rust
The aim of this project is to develop Rust-based versions of memory and resource analysis tools: `pmap` and `slabtop`. The project will focus on ensuring full compatibility with all options and passing GNU tests, providing in-depth and reliable analysis of memory usage and kernel resources.
- **Description:**: Implement Rust versions of memory and resource analysis tools, with emphasis on option compatibility and passing GNU tests.
- **Expected Outputs:**: Advanced tools for memory and resource analysis, fully compatible with existing options and validated by GNU tests.
- **Skills Required/Preferred:**: Proficiency in Rust, deep understanding of memory management and kernel resources, experience with GNU testing methodologies.
- **Possible Mentors:**: [To be determined]
- **Size:**: ~175 hours.
- **Difficulty:**: Medium.
## Code refactoring for `procps`, `util-linux`, and `bsdutils`
Refactoring the Rust-based versions of procps, util-linux, and bsdutils to reduce code duplication.
- **Title:**: Code Optimization and Refactoring for procps, util-linux, and bsdutils in Rust
- **Description:**: This project involves optimizing and refactoring the Rust-based versions of procps, util-linux, and bsdutils. The focus will be on eliminating duplicated code across these utilities, particularly in areas like uudoc, the test framework, and support for single/multicall binaries.
- **Expected outputs:**: A streamlined codebase with reduced duplication, improved maintainability for procps, util-linux, and bsdutils.
- **Skills required/preferred:**: Proficiency in Rust programming, understanding of Linux utilities, experience with code optimization and refactoring.
- **Possible mentors:**: Sylvestre
- **Size:**: 175 hours
- **Difficulty:**: Medium
## A multicall binary and core library for `findutils`
`findutils` currently exists of a few unconnected binaries. It would be nice to have a multicall binary (like
`coreutils`) and a library of shared functions (like `uucore`).
This also might require thinking about sharing code between coreutils and findutils.
- **Difficulty**: Medium
- **Size**: 175 hours
- **Mentors**: TBD
- Required skills:
- Rust
## Implementation of GNU Test Execution for `procps`, `util-linux`, `diffutils`, and `bsdutils`
The project aims at integrating the GNU test suite execution using the Rust-based versions of `procps`, `util-linux`, `diffutils`, and `bsdutils`, ensuring compatibility, crucial for seamless drop-in replacement integration. We have been doing such operation successfully for the Coreutils using [GitHub Actions](https://github.com/uutils/coreutils/blob/main/.github/workflows/GnuTests.yml), a [build script](https://github.com/uutils/coreutils/blob/main/util/build-gnu.sh) and a [run script](https://github.com/uutils/coreutils/blob/main/util/run-gnu-test.sh).
- **Description:**: Run the GNU test suite on the Rust-based versions of procps, util-linux, diffutils, and bsdutils
- **Expected Outputs:**: The GNU test suite execution for each utility, ensuring functionality meets expected standards
- **Skills Required/Preferred:**: GitHub action understanding, Proficiency in Rust, experience with GNU testing methodologies, familiarity with Linux system utilities, and understanding of software testing principles.
- **Possible Mentors:**: Sylvestre
- **Size:**: ~175 hours
- **Difficulty:**: Medium
## Refactoring `factor`
The uutils `factor` is currently significantly slower than
GNU `factor` and only supports numbers up to 2^64-1. See [issue 1559](https://github.com/uutils/coreutils/issues/1559)
and [issue 1456](https://github.com/uutils/coreutils/issues/1456) for more information.
- Difficulty: Hard
- Size: 175 hours
- Mentors: TBD
- Required skills:
- Rust
- Optimization techniques
- Mathematics
## Symbolic/Fuzz Testing and Formal Verification of Tool Grammars
See [Using Lightweight Formal Methods to Validate a Key Value Storage Node In Amazon S3](https://www.amazon.science/publications/using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3).
Most KLEE scaffolding was done for [KLEE 2021](https://project-oak.github.io/rust-verification-tools/2021/07/14/coreutils.html).
Start with `wc`, formalize the command line grammar. Get it working under AFL++ and Klee. Add several proofs of resource use and correctness - especially proofs about operating system calls and memory/cache usage. Generalize to other tools. Try to unify the seeds for the fuzzer and KLEE so they can help each other find new paths. Use QEMU to test several operating systems and architectures. Automate detection of performance regressions - try to hunt for [accidentally quadratic](https://accidentallyquadratic.tumblr.com) behavior.
Specific to `wc` - formalize the inner loop over a UTF-8 buffer into a finite state automata with counters that can generalize into SIMD width operations like [simdjson](https://simdjson.org). Further generalize into a monoid so K processors can combine results.
- Difficulty: Mixed
- Size: Mixed
- Mentors: TBD - informally @chadbrewbaker
- Required skills:
- Rust
- KLEE
- Fuzzers like AFL++
- Grammar testing frameworks like [LARK](https://github.com/ligurio/lark-grammars/tree/master/lark_grammars/grammars)
- /usr/bin/time -v (and similar tools for Widows/OSX).
- Alloy, TLA+, [P](https://github.com/p-org/P)
- System call tracing with [strace](https://jvns.ca/blog/2014/02/17/spying-on-ssh-with-strace/), [uftrace](https://github.com/namhyung/uftrace) etc.
- SMT solvers like [Z3](https://www.philipzucker.com/programming-and-interactive-proving-with-z3py/) and CVC5 for superoptimization and proofs of automata equivalence.
- [SOUPER](https://github.com/google/souper) and [CompilerExplorer](https://godbolt.org)
- Basic statistics on quantiles (histograms) for outlier detection. The math is simple as generalizing from one to k medians but the formal notation is [complex](https://aakinshin.net/posts/thdqe-hdi/).
- [MPI-IO](https://wgropp.cs.illinois.edu/courses/cs598-s16/lectures/lecture32.pdf), just enough to read a file into k parts and combine "wc" outputs to understand multicore scaling.
## Development of advanced terminal session recording and replay tools in Rust
This project involves creating Rust-based implementations of `/usr/bin/script`, `/usr/bin/scriptlive`, and `/usr/bin/scriptreplay`. The `/usr/bin/script` command will record terminal sessions, `/usr/bin/scriptlive` will offer real-time recording features, and `/usr/bin/scriptreplay` will be used to replay recorded sessions.
The work will happen in https://github.com/uutils/bsdutils.
- **Description:**: Develop Rust-based versions of `/usr/bin/script`, `/usr/bin/scriptlive`, and `/usr/bin/scriptreplay` for terminal session recording and replaying.
- **Expected Outputs:**: Robust and cross-platform terminal session recording and replay tools, with real-time features in `scriptlive`.
- **Skills Required/Preferred:**: Proficiency in Rust, understanding of terminal emulation, experience with cross-platform development.
- **Possible Mentors:**: [To be determined]
- **Size:**: ~175 hours
- **Difficulty:**: Medium
## Official Redox support</h2>
We want to support the Redox operating system, but are not actively testing against it. Since the last round of fixes in [#2550](https://github.com/uutils/coreutils/pull/2550), many changes have probably been introduced that break Redox support. This project would involve setting up Redox in the CI and fixing any issues that arise and porting features over.
- Difficulty: Medium
- Size: 175 hours
- Mentors: TBD
- Required skills:
- Rust
-390
View File
@@ -1,390 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>uutils - gsoc</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="style.css" rel="stylesheet">
</head>
<body>
<h1 id="what-is-google-summer-of-code">Uutils at the gsoc</h1>
<p>Google summer of code is:</p>
<blockquote>
<p>Google Summer of Code is a global, online program focused on bringing
new contributors into open source software development. GSoC
Contributors work with an open source organization on a 12+ week
programming project under the guidance of mentors.
</p>
</blockquote>
<p>If you want to know more about how it works, check out the links
below.
</p>
<strong>Useful links</strong>:
<ul>
<li> <a
href="https://google.github.io/gsocguides/student/">GSOC Contributor
Guide</a>
</li>
<li> <a
href="https://developers.google.com/open-source/gsoc/faq">GSOC FAQ</a></li>
<li>
<a href="https://developers.google.com/open-source/gsoc/timeline">GSOC
Timeline</a> (important for deadlines!)
</li>
</ul>
<h1 id="what">What is it about?</h1>
<p>The <a href="https://github.com/uutils/">uutils project</a> is aiming at rewriting key Linux utilities in Rust, targeting <a href="https://github.com/uutils/coreutils">coreutils</a>, <a href="https://github.com/uutils/findutils">findutils</a>, <a href="https://github.com/uutils/diffutils">diffutils</a>, <a href="https://github.com/uutils/procps">procps</a>, <a href="https://github.com/uutils/util-linux">util-linux</a>, and <a href="https://github.com/uutils/bsdutils">bsdutils</a>. Their goal is to create fully compatible, high-performance drop-in replacements, ensuring reliability through upstream test suites. Significant progress has been made with coreutils, diffutils, and findutils, while the other utilities are in the early stages of development.</p>
</p>
</h1>
<h1 id="how-to-get-started">How to get started</h1>
<p>Here are some steps to follow if you want to apply for a GSOC project
with uutils.
</p>
<ol start="0" type="1">
<li><strong>Check the requirements.</strong> You have to meet <a
href="https://developers.google.com/open-source/gsoc/faq#what_are_the_eligibility_requirements_for_participation">Google's
requirements</a> to apply. Specifically for uutils, it's best if you at
least know some Rust and have some familiarity with using the
coreutils and the other tools.
</li>
<li>
<strong>Reach out to us!</strong> We are happy to discuss potential
projects and help you find a meaningful project for uutils. Tell us what
interests you about the project and what experience you have and we can
find a suitable project together. You can talk to the uutils maintainers
on the <a href="https://discord.gg/wQVJbvJ">Discord server</a>. In
particular, you can contact:
<ul>
<li>Sylvestre Ledru (<span class="citation"
data-cites="sylvestre">@sylvestre</span> on GitHub and Discord)</li>
<li>Terts Diepraam (<span class="citation"
data-cites="tertsdiepraam">@tertsdiepraam</span> on GitHub and <span
class="citation" data-cites="terts">@terts</span> on Discord)</li>
</ul>
</li>
<li><strong>Get comfortable with uutils.</strong> To find a good project
you need to understand the codebase. We recommend that you take a look
at the code, the issue tracker and tackle some <a
href="https://github.com/uutils/coreutils/issues?q=is%3Aopen+is%3Aissue+label%3A%22good+first+issue%22">good-first-issues</a>.
Also take a look at our <a
href="https://github.com/uutils/coreutils/blob/main/CONTRIBUTING.md">contributor
guidelines</a>.<br />We expect you to <b>fix a few good first bugs</b> to be selected.
</li>
<li><strong>Find a project and a mentor.</strong> In this page, we have a list
of potential projects you can adapt or use as inspiration. Make sure
discuss your ideas with the maintainers! Some project ideas below have
suggested mentors you could contact.
</li>
<li><strong>Write the application.</strong> You can do this with your
mentor. The application has to go through Google, so make sure to follow
all the advice in Google's <a
href="https://google.github.io/gsocguides/student/writing-a-proposal">Contributor
Guide</a>.
</li>
</ol>
<h1 id="tips">Tips</h1>
<ul>
<li>Make sure the project is concrete and well-defined.</li>
<li>Communication is super important!</li>
<li>Try to tackle some simple issues to get familiar with uutils.</li>
</ul>
<h1 id="project-ideas">Project Ideas</h1>
<p>This page contains project ideas for the Google Summer of Code for
uutils. Feel free to suggest project ideas of your own.
</p>
<p><a
href="https://google.github.io/gsocguides/mentor/defining-a-project-ideas-list">Guidelines
for the project list</a>
</p>
<p>Summarizing that page, each project should include:
<ul>
<li><strong>Title</strong></li>
<li><strong>Description</strong></li>
<li><strong>Expected outputs</strong></li>
<li><strong>Skills required/preferred</strong></li>
<li><strong>Possible mentors</strong></li>
<li><strong>Size</strong> (either ~175 or ~350 hours)</li>
<li><strong>Difficulty</strong> (easy, medium, or hard)</li>
</ul>
</p>
<h2 id="implement-stty">Implement <code>stty</code></h2>
<p>The <code>stty</code> utility is currently only partially implemented
and should be expanded.
</p>
<p>See issues: <a
href="https://github.com/uutils/coreutils/issues/3859">#3859</a>, <a
href="https://github.com/uutils/coreutils/issues/3860">#3860</a>, <a
href="https://github.com/uutils/coreutils/issues/3861">#3861</a>.</p>
<ul>
<li>Difficulty: Medium</li>
<li>Size: 175 or 350 depending on the scope</li>
<li>Mentors: Terts Diepraam</li>
<li>
Required skills:
<ul>
<li>Rust</li>
<li>Basic knowledge about the terminal</li>
</ul>
</li>
</ul>
<h2 id="localization">Localization</h2>
<p>Support for localization for formatting, quoting &amp; sorting in
various utilities, like <code>date</code>, <code>ls</code> and
<code>sort</code>. For this project, we need to figure out how to deal
with locale data. The first option is to use the all-Rust
<code>icu4x</code> library, which has a different format than what
distributions usually provide. In this case a solution <em>could</em> be
to write a custom <code>localedef</code>-like command. The second option
is to use a wrapper around the C <code>icu</code> library, which comes
with the downside of being a C dependency.
</p>
<p>This is described in detail in <a
href="https://github.com/uutils/coreutils/issues/3997">issue
#3997</a>.
</p>
<p>And was also discussed in <a
href="https://github.com/uutils/coreutils/issues/1919#issuecomment-846471073">#1919</a>,
<a href="https://github.com/uutils/coreutils/issues/3584">#3584</a>.
</p>
<ul>
<li>Difficulty: Hard</li>
<li>Size: TBD</li>
<li>Mentors: TBD</li>
<li>
Required skills:
<ul>
<li>Rust</li>
</ul>
</li>
</ul>
<h2 id="process-management">procps: Development of Process Management and Information Tools in Rust</h2>
<p>This project focuses on creating Rust-based implementations of process management and information tools: <b>ps</b>, <b>pgrep</b>, <b>pidwait</b>, <b>pkill</b>, <b>skill</b>, and <b>snice</b>. The goal is to ensure full compatibility with all options and successful passing of GNU tests, maintaining the functionality and reliability of these essential tools.</p>
<ul>
<li><strong>Description:</strong> Develop Rust-based versions of key process management and information tools, ensuring compatibility with all options and GNU tests.</li>
<li><strong>Expected Outputs:</strong> Efficient, reliable tools with full option compatibility and passing GNU tests.</li>
<li><strong>Skills Required/Preferred:</strong> Proficiency in Rust, understanding of Linux process management, experience with GNU testing methodologies.</li>
<li><strong>Possible Mentors:</strong> [To be determined]</li>
<li><strong>Size:</strong> ~350 hours.</li>
<li><strong>Difficulty:</strong> Medium.</li>
</ul>
<h2 id="system-monitoring">procps: Development of System Monitoring and Statistics Tools in Rust</h2>
<p>This project involves the Rust-based development of system monitoring and statistics tools: <b>top</b>, <b>vmstat</b>, <b>tload</b>, <b>w</b>, and <b>watch</b>. The objective is to achieve full compatibility with all options and to pass GNU tests, ensuring these tools provide accurate and reliable system insights.</p>
<ul>
<li><strong>Description:</strong> Create Rust versions of system monitoring and statistics tools, with a focus on full option compatibility and passing GNU tests.</li>
<li><strong>Expected Outputs:</strong> Robust tools for system monitoring and statistics, fully compatible with existing options and verified by GNU tests.</li>
<li><strong>Skills Required/Preferred:</strong> Rust expertise, knowledge of system performance metrics, familiarity with GNU testing frameworks.</li>
<li><strong>Possible Mentors:</strong> [To be determined]</li>
<li><strong>Size:</strong> ~350 hours.</li>
<li><strong>Difficulty:</strong> Medium.</li>
</ul>
<h2 id="memory-resource-analysis">procps: Development of Memory and Resource Analysis Tools in Rust</h2>
<p>The aim of this project is to develop Rust-based versions of memory and resource analysis tools: <b>pmap</b> and <b>slabtop</b>. The project will focus on ensuring full compatibility with all options and passing GNU tests, providing in-depth and reliable analysis of memory usage and kernel resources.</p>
<ul>
<li><strong>Description:</strong> Implement Rust versions of memory and resource analysis tools, with emphasis on option compatibility and passing GNU tests.</li>
<li><strong>Expected Outputs:</strong> Advanced tools for memory and resource analysis, fully compatible with existing options and validated by GNU tests.</li>
<li><strong>Skills Required/Preferred:</strong> Proficiency in Rust, deep understanding of memory management and kernel resources, experience with GNU testing methodologies.</li>
<li><strong>Possible Mentors:</strong> [To be determined]</li>
<li><strong>Size:</strong> ~175 hours.</li>
<li><strong>Difficulty:</strong> Medium.</li>
</ul>
<h2 id="better-gnu-test-reports">Code refactoring for procps, util-linux, and bsdutils</h2>
<p>Refactoring the Rust-based versions of procps, util-linux, and bsdutils to reduce code duplication.
</p>
<ul>
<li><strong>Title:</strong> Code Optimization and Refactoring for procps, util-linux, and bsdutils in Rust</li>
<li><strong>Description:</strong> This project involves optimizing and refactoring the Rust-based versions of procps, util-linux, and bsdutils. The focus will be on eliminating duplicated code across these utilities, particularly in areas like uudoc, the test framework, and support for single/multicall binaries.</li>
<li><strong>Expected outputs:</strong> A streamlined codebase with reduced duplication, improved maintainability for procps, util-linux, and bsdutils.</li>
<li><strong>Skills required/preferred:</strong> Proficiency in Rust programming, understanding of Linux utilities, experience with code optimization and refactoring.</li>
<li><strong>Possible mentors:</strong> Sylvestre</li>
<li><strong>Size:</strong> 175 hours</li>
<li><strong>Difficulty:</strong> Medium</li>
</ul>
</ul>
<h2 id="a-multicall-binary-and-core-library-for-findutils">A multicall
binary and core library for <code>findutils</code>
</h2>
<p><code>findutils</code> currently exists of a few unconnected
binaries. It would be nice to have a multicall binary (like
<code>coreutils</code>) and a library of shared functions (like
<code>uucore</code>).
</p>
<p>This also might require thinking about sharing code between coreutils
and findutils.
</p>
<ul>
<li>Difficulty: Medium</li>
<li>Size: 175 hours</li>
<li>Mentors: TBD</li>
<li>
Required skills:
<ul>
<li>Rust</li>
</ul>
</li>
</ul>
<h2 id="test-exec">Implementation of GNU Test Execution for procps, util-linux, diffutils, and bsdutils</h2>
<p>The project aims at integrating the GNU test suite execution using the Rust-based versions of procps, util-linux, diffutils, and bsdutils, ensuring compatibility, crucial for seamless drop-in replacement integration. We have been doing such operation successfully for the Coreutils using <a href="https://github.com/uutils/coreutils/blob/main/.github/workflows/GnuTests.yml">GitHub Actions</a>, a <a href="https://github.com/uutils/coreutils/blob/main/util/build-gnu.sh">build script</a> and a <a href="https://github.com/uutils/coreutils/blob/main/util/run-gnu-test.sh">run script</a>.
</p>
<ul>
<li><strong>Description:</strong> Run the GNU test suite on the Rust-based versions of procps, util-linux, diffutils, and bsdutils</li>
<li><strong>Expected Outputs:</strong> The GNU test suite execution for each utility, ensuring functionality meets expected standards</li>
<li><strong>Skills Required/Preferred:</strong> GitHub action understanding, Proficiency in Rust, experience with GNU testing methodologies, familiarity with Linux system utilities, and understanding of software testing principles.</li>
<li><strong>Possible Mentors:</strong> Sylvestre</li>
<li><strong>Size:</strong> ~175 hours</li>
<li><strong>Difficulty:</strong> Medium</li>
</ul>
<h2 id="refactoring-factor">Refactoring <code>factor</code></h2>
<p>The uutils <code>factor</code> is currently significantly slower than
GNU <code>factor</code> and only supports numbers up to 2^64-1. See <a
href="https://github.com/uutils/coreutils/issues/1559">issue 1559</a>
and <a href="https://github.com/uutils/coreutils/issues/1456">issue
1456</a> for more information.
</p>
<ul>
<li>Difficulty: Hard</li>
<li>Size: 175 hours</li>
<li>Mentors: TBD</li>
<li>
Required skills:
<ul>
<li>Rust</li>
<li>Optimization techniques</li>
<li>Mathematics</li>
</ul>
</li>
</ul>
<h2
id="symbolicfuzz-testing-and-formal-verification-of-tool-grammars">Symbolic/Fuzz
Testing and Formal Verification of Tool Grammars
</h2>
<p>See <a
href="https://www.amazon.science/publications/using-lightweight-formal-methods-to-validate-a-key-value-storage-node-in-amazon-s3">Using
Lightweight Formal Methods to Validate a Key Value Storage Node In
Amazon S3</a>.
</p>
<p>Most KLEE scaffolding was done for <a
href="https://project-oak.github.io/rust-verification-tools/2021/07/14/coreutils.html">KLEE
2021</a>.
</p>
<p>Start with <code>wc</code>, formalize the command line grammar. Get
it working under AFL++ and Klee. Add several proofs of resource use and
correctness - especially proofs about operating system calls and
memory/cache usage. Generalize to other tools. Try to unify the seeds
for the fuzzer and KLEE so they can help each other find new paths. Use
QEMU to test several operating systems and architectures. Automate
detection of performance regressions - try to hunt for <a
href="https://accidentallyquadratic.tumblr.com">accidentally
quadratic</a> behavior.
</p>
<p>Specific to <code>wc</code> - formalize the inner loop over a UTF-8
buffer into a finite state automata with counters that can generalize
into SIMD width operations like <a
href="https://simdjson.org">simdjson</a>. Further generalize into a
monoid so K processors can combine results.
</p>
<ul>
<li>Difficulty: Mixed</li>
<li>Size: Mixed</li>
<li>Mentors: TBD - informally <span class="citation"
data-cites="chadbrewbaker">@chadbrewbaker</span></li>
<li>
Required skills:
<ul>
<li>Rust</li>
<li>KLEE</li>
<li>Fuzzers like AFL++</li>
<li>Grammar testing frameworks like <a
href="https://github.com/ligurio/lark-grammars/tree/master/lark_grammars/grammars">LARK</a></li>
<li>/usr/bin/time -v (and similar tools for Widows/OSX).</li>
<li>Alloy, TLA+, <a href="https://github.com/p-org/P">P</a></li>
<li>System call tracing with <a
href="https://jvns.ca/blog/2014/02/17/spying-on-ssh-with-strace/">strace</a>,
<a href="https://github.com/namhyung/uftrace">uftrace</a> etc.
</li>
<li>SMT solvers like <a
href="https://www.philipzucker.com/programming-and-interactive-proving-with-z3py/">Z3</a>
and CVC5 for superoptimization and proofs of automata equivalence.
</li>
<li><a href="https://github.com/google/souper">SOUPER</a> and <a
href="https://godbolt.org">CompilerExplorer</a></li>
<li>Basic statistics on quantiles (histograms) for outlier detection.
The math is simple as generalizing from one to k medians but the formal
notation is <a
href="https://aakinshin.net/posts/thdqe-hdi/">complex</a>.
</li>
<li><a
href="https://wgropp.cs.illinois.edu/courses/cs598-s16/lectures/lecture32.pdf">MPI-IO</a>,
just enough to read a file into k parts and combine 'wc' outputs to
understand multicore scaling.
</li>
</ul>
</li>
</ul>
<h2 id="terminal-recording">Development of advanced terminal session recording and replay tools in Rust</h2>
<p>This project involves creating Rust-based implementations of <code>/usr/bin/script</code>, <code>/usr/bin/scriptlive</code>, and <code>/usr/bin/scriptreplay</code>. The <code>/usr/bin/script</code> command will record terminal sessions, <code>/usr/bin/scriptlive</code> will offer real-time recording features, and <code>/usr/bin/scriptreplay</code> will be used to replay recorded sessions.</p>
<p>The work will happen in https://github.com/uutils/bsdutils.
</p>
<ul>
<li><strong>Description:</strong> Develop Rust-based versions of <code>/usr/bin/script</code>, <code>/usr/bin/scriptlive</code>, and <code>/usr/bin/scriptreplay</code> for terminal session recording and replaying.</li>
<li><strong>Expected Outputs:</strong> Robust and cross-platform terminal session recording and replay tools, with real-time features in <code>scriptlive</code>.</li>
<li><strong>Skills Required/Preferred:</strong> Proficiency in Rust, understanding of terminal emulation, experience with cross-platform development.</li>
<li><strong>Possible Mentors:</strong> [To be determined]</li>
<li><strong>Size:</strong> ~175 hours</li>
<li><strong>Difficulty:</strong> Medium</li>
</ul>
<h2 id="official-redox-support">Official Redox support</h2>
<p>We want to support the Redox operating system, but are not actively
testing against it. Since the last round of fixes in <a
href="https://github.com/uutils/coreutils/pull/2550">#2550</a>, many
changes have probably been introduced that break Redox support. This
project would involve setting up Redox in the CI and fixing any issues
that arise and porting features over.
</p>
<ul>
<li>Difficulty: Medium</li>
<li>Size: 175 hours</li>
<li>Mentors: TBD</li>
<li>
Required skills:
<ul>
<li>Rust</li>
</ul>
</li>
</ul>
<h2 id="port-gnus-parse_datetime">Port GNU's
<code>parse_datetime</code>
</h2>
<p>GNU coreutils has a particularly complex function called
<code>parse_datetime</code>, which parses absolute and relative date and
time according to the rules specified <a
href="https://www.gnu.org/software/coreutils/manual/html_node/Date-input-formats.html">in
the documentation</a>. We currently only support a small subset of the
formats that GNU's <code>parse_datetime</code> supports. This function
is used for the <code>-d</code> option of <code>touch</code> and as
input to <code>date</code>.
</p>
<p>At the end of the project, there should be a module (or crate) with a
fully compatible datetime parser with an extensive test suite.
</p>
<p>See <a href="https://github.com/uutils/coreutils/pull/4193">PR
4193</a> and <a
href="https://github.com/uutils/coreutils/blob/6a9660f9f64c44db85ee2c130d892946d78781ab/src/uu/touch/src/touch.rs#L334"><code>parse_date</code>
in <code>touch</code></a>
</p>
<ul>
<li>Difficulty: Hard</li>
<li>Size: ~175 hours</li>
<li>Mentors: TBD</li>
<li>
Required skills:
<ul>
<li>Rust</li>
<li>Parsing</li>
</ul>
</li>
</ul>
</body>
</html>
-94
View File
@@ -1,94 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<title>uutils</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="style.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="page-body">
<div class="repo_banner">
<a href="https://github.com/uutils">
<div class="github-icon" aria-hidden="true"></div>
Check out our GitHub!
</a>
</div>
<main>
<header>
<img src="logo.svg" alt="uutils" class="logo" />
<h1 class="title">uutils</h1>
</header>
<p>
The uutils project reimplements ubiquitous command line utilities in
Rust. Our goal is to modernize the utils, while retaining full
compatibility with the existing utilities.
</p>
<h2>Projects</h2>
<div class="projects">
<a class="project" href="/coreutils">
<span aria-hidden="true">&gt;</span>
coreutils
</a>
<a class="project" href="/findutils">
<span aria-hidden="true">&gt;</span>
findutils
</a>
<a class="project" href="/diffutils">
<span aria-hidden="true">&gt;</span>
diffutils
</a>
</div>
<h2>Crates</h2>
<p>
We maintain a variety of public crates to support our projects,
which are published on <a href="https://crates.io/">crates.io</a>.
</p>
<ul>
<li>
<a href="https://github.com/uutils/platform-info"
>platform-info</a
>
</li>
<li>
<a href="https://github.com/uutils/parse_datetime"
>parse_datetime</a
>
</li>
<li>
<a href="https://github.com/uutils/uutils-term-grid">uutils-term-grid</a>
</li>
</ul>
<h2>Contributing</h2>
<p>You can help us out by:</p>
<ul>
<li>Contributing code</li>
<li>Contributing documentation</li>
<li>Reporting bugs (e.g. incompatibilities with GNU utilities)</li>
<li>Triaging bugs</li>
<li><a href="https://github.com/sponsors/uutils">Sponsoring uutils on GitHub</a></li>
</ul>
<p>You can join our <a href="https://discord.gg/wQVJbvJ">Discord server</a> to discuss or ask anything concerning uutils. We're happy to help you get started with contributing!</p>
<h2>Friends of uutils</h2>
<p>
We collaborate with and build upon many other projects in the Rust
community, either by using or providing crates. We highly recommend
giving these projects a look!
</p>
<ul>
<li><a href="https://www.nushell.sh/">nushell</a></li>
<li><a href="https://github.com/burntsushi/ripgrep">ripgrep</a></li>
<li><a href="https://github.com/eza-community/eza">eza</a></li>
</ul>
</main>
</div>
<footer>
<a href="https://github.com/uutils">
<div class="github-icon" aria-hidden="true"></div>
</a>
<span>uutils, MIT</span>
</footer>
</div>
</body>
</html>

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

+61
View File
@@ -0,0 +1,61 @@
<svg height="106" width="106" viewbox="0 0 106 106" id="logo"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<g id="logo" transform="translate(53, 53)">
<g id="gear" mask="url(#holes)">
<circle r="43" fill="none" stroke="black" stroke-width="9" />
<g id="cogs">
<polygon id="cog" stroke="black" stroke-width="3" stroke-linejoin="round" points="46,3 51,0 46,-3" />
<use xlink:href="#cog" transform="rotate(11.25)" />
<use xlink:href="#cog" transform="rotate(22.50)" />
<use xlink:href="#cog" transform="rotate(33.75)" />
<use xlink:href="#cog" transform="rotate(45.00)" />
<use xlink:href="#cog" transform="rotate(56.25)" />
<use xlink:href="#cog" transform="rotate(67.50)" />
<use xlink:href="#cog" transform="rotate(78.75)" />
<use xlink:href="#cog" transform="rotate(90.00)" />
<use xlink:href="#cog" transform="rotate(101.25)" />
<use xlink:href="#cog" transform="rotate(112.50)" />
<use xlink:href="#cog" transform="rotate(123.75)" />
<use xlink:href="#cog" transform="rotate(135.00)" />
<use xlink:href="#cog" transform="rotate(146.25)" />
<use xlink:href="#cog" transform="rotate(157.50)" />
<use xlink:href="#cog" transform="rotate(168.75)" />
<use xlink:href="#cog" transform="rotate(180.00)" />
<use xlink:href="#cog" transform="rotate(191.25)" />
<use xlink:href="#cog" transform="rotate(202.50)" />
<use xlink:href="#cog" transform="rotate(213.75)" />
<use xlink:href="#cog" transform="rotate(225.00)" />
<use xlink:href="#cog" transform="rotate(236.25)" />
<use xlink:href="#cog" transform="rotate(247.50)" />
<use xlink:href="#cog" transform="rotate(258.75)" />
<use xlink:href="#cog" transform="rotate(270.00)" />
<use xlink:href="#cog" transform="rotate(281.25)" />
<use xlink:href="#cog" transform="rotate(292.50)" />
<use xlink:href="#cog" transform="rotate(303.75)" />
<use xlink:href="#cog" transform="rotate(315.00)" />
<use xlink:href="#cog" transform="rotate(326.25)" />
<use xlink:href="#cog" transform="rotate(337.50)" />
<use xlink:href="#cog" transform="rotate(348.75)" />
</g>
<g id="mounts">
<polygon id="mount" stroke="black" stroke-width="6" stroke-linejoin="round" points="-7,-42 0,-35 7,-42" />
<use xlink:href="#mount" transform="rotate(72)" />
<use xlink:href="#mount" transform="rotate(144)" />
<use xlink:href="#mount" transform="rotate(216)" />
<use xlink:href="#mount" transform="rotate(288)" />
</g>
</g>
<mask id="holes">
<rect x="-60" y="-60" width="120" height="120" fill="white" />
<circle id="hole" cy="-40" r="3" />
<use xlink:href="#hole" transform="rotate(72)" />
<use xlink:href="#hole" transform="rotate(144)" />
<use xlink:href="#hole" transform="rotate(216)" />
<use xlink:href="#hole" transform="rotate(288)" />
</mask>
</g>
<path aria-label="U" transform="matrix(1.1188958,0,0,1.3531467,106.90401,-3.0479991)" style="fill:#c04828"
d="m -30.914582,47.152116 c 0,-6.410851 0,-27.142255 0,-27.142255 h -9.981735 c 0,0 0,22.706465 0,27.142255 0,4.43579 -0.989404,8.475308 -7.250584,8.492265 -6.26118,0.01696 -7.308935,-4.147055 -7.308935,-8.492265 V 20.009861 h -9.981735 v 27.142255 c 0,6.425292 2.643496,15.679002 17.261495,15.679002 14.617999,0 17.261494,-9.268151 17.261494,-15.679002 z" />
</svg>

After

Width:  |  Height:  |  Size: 3.5 KiB

+250
View File
@@ -0,0 +1,250 @@
/* All these styles are adapted from oranda to match their look */
@import url("https://fonts.googleapis.com/css2?family=Fira+Sans:wght@400;700;900&display=swap");
:root {
--dark-fg-color: #fff;
--light-fg-color: #141414;
--light-bg-color: var(--dark-fg-color);
--dark-bg-color: var(--light-fg-color);
--fg-color: var(--light-fg-color);
--bg-color: var(--light-bg-color);
--light-link-color: #0284c7;
--dark-link-color: #8bb9fe;
--link-color: var(--light-link-color);
--light-highlight-bg-color: #ededed;
--light-highlight-fg-color: #595959;
--dark-highlight-bg-color: #27272a;
--dark-highlight-fg-color: #ededed;
--highlight-fg-color: var(--light-highlight-fg-color);
--highlight-bg-color: var(--light-highlight-bg-color);
--font-face: "Fira Sans", sans-serif;
}
*,
::after,
::before {
border: 0 solid #e5e7eb;
box-sizing: border-box;
}
html {
font-feature-settings: normal;
font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont,
Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif,
Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji;
font-variation-settings: normal;
line-height: 1.5;
tab-size: 4;
}
blockquote,
dd,
dl,
figure,
h1,
h2,
h3,
h4,
h5,
h6,
hr,
p,
pre {
margin: 0;
}
a {
color: var(--link-color);
text-decoration: inherit;
}
/* PAGE LAYOUT */
html,
body {
font-family: var(--font-face);
height: 100%;
scroll-behavior: smooth;
}
body {
line-height: inherit;
margin: 0;
}
.container {
display: flex;
flex-direction: column;
min-height: 100%;
}
.page-body {
flex-grow: 1;
}
/* REPO BANNER */
.repo_banner {
background-color: var(--fg-color);
color: var(--bg-color);
padding-bottom: 0.375rem;
padding-top: 0.375rem;
}
.repo_banner > a {
align-items: flex-start;
display: flex;
gap: 0.5rem;
height: 20px;
justify-content: center;
}
.repo_banner > a,
.repo_banner > a:hover {
color: rgb(248 250 252);
}
.repo_banner > a:hover {
text-decoration-color: #f8fafc;
text-decoration-line: underline;
text-underline-offset: 1px;
}
/* HEADER */
.logo {
display: block;
height: 170px;
margin: auto;
}
.title {
font-size: 3.75rem;
line-height: 1;
text-align: center;
padding-bottom: 0.5rem;
}
@media (min-width: 640px) {
.title {
font-size: 6rem;
line-height: 1;
}
}
/* MAIN */
main {
margin: 6rem auto;
max-width: 80%;
}
@media (min-width: 1024px) {
main {
max-width: 56rem;
}
}
h1 {
font-size: 1.875rem;
font-weight: 900;
line-height: 2.25rem;
line-height: 1.25;
margin-bottom: 2rem;
}
p {
font-size: 1rem;
line-height: 1.5rem;
line-height: 1.625;
margin-bottom: 2rem;
}
@media (min-width: 640px) {
h1 {
font-size: 3.75rem;
line-height: 1;
}
p {
font-size: 1.125rem;
line-height: 1.75rem;
}
}
h2 {
font-size: 1.5rem;
font-weight: 700;
line-height: 2rem;
line-height: 1.25;
margin-bottom: 1.5rem;
}
@media (min-width: 640px) {
h2 {
font-size: 3rem;
line-height: 1;
}
}
h2,
h3 {
margin-top: 3rem;
}
@media (min-width: 640px) {
li {
font-size: 1.125rem;
line-height: 1.75rem;
}
}
ul {
margin-top: 0;
margin-bottom: 2rem;
}
/* FOOTER */
footer {
align-items: center;
background-color: var(--fg-color);
color: var(--bg-color);
display: flex;
flex-grow: 0;
flex-shrink: 1;
font-size: 0.75rem;
justify-content: space-between;
line-height: 1rem;
padding: 0.5rem 1rem;
width: 100%;
}
.github-icon {
background-image: url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath fill='%23fff' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E");
height: 1.25rem;
width: 1.25rem;
}
.projects {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
width: 100%;
gap: 1rem;
}
.project {
flex-basis: 20rem;
flex-grow: 1;
border: 3px solid #888;
border-radius: 6px;
padding: 2rem;
text-decoration: none;
color: var(--fg-color);
font-size: 2rem;
font-weight: 700;
transition: text-decoration 0.3s;
transition: border-color 0.3s;
}
.project > span {
color: transparent;
transition: color 0.3s;
}
.project:hover > span {
color: black;
}
.project:hover {
border-color: black;
}
+35
View File
@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html>
<head>
<title>
{%- block title -%}
{{ config.title }}
{%- endblock title -%}
</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="/style.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="page-body">
<div class="repo_banner">
<a href="https://github.com/uutils">
<div class="github-icon" aria-hidden="true"></div>
Check out our GitHub!
</a>
</div>
<main>
{%- block main -%}
{%- endblock main -%}
</main>
</div>
<footer>
<a href="https://github.com/uutils">
<div class="github-icon" aria-hidden="true"></div>
</a>
<span>uutils, MIT</span>
</footer>
</div>
</body>
</html>
+5
View File
@@ -0,0 +1,5 @@
{%- extends "base.html" -%}
{%- block main -%}
{{ section.content | safe }}
{%- endblock main -%}
+9
View File
@@ -0,0 +1,9 @@
{%- extends "base.html" -%}
{%- block title -%}
{{ page.title }} | uutils
{%- endblock title -%}
{%- block main -%}
{{ page.content | safe }}
{%- endblock main -%}