<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<link href="https://rust.code-maven.com/atom" rel="self" />
<title>Rust programming language</title>
<id>https://rust.code-maven.com</id>
<updated>2026-02-12T11:30:01</updated>

  <entry>
    <title>Zed - enable inlay type hints for Rust projects</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-12T11:30:01Z</updated>
    <pubDate>2026-02-12T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/zed-enable-inlay-type-hints-for-rust" />
    <id>https://rust.code-maven.com/zed-enable-inlay-type-hints-for-rust</id>
    <content type="html"><![CDATA[<p>Inlay hints or inline type hints allow you to see the derived types of a variable.</p>
<p>For example when you assign the return value of a function to a variable but you don't explicitely write the type of the variable,
Rust will derive (deduct) the type based on the function signature.</p>
<p>If you declare a variable <code>let x = 2;</code>, Rust will derived that it is an <code>i32</code> and the inlay type hints will show <code>let x: i32 = 2;</code>.</p>
<p>In another case if add together two variables holding numbers (that default to <code>i32</code>) and declare the resulting variable to be <code>i8</code>
then Rust will derived that the original two variables also must be <code>i8</code>.</p>
<p>So</p>
<pre><code class="language-rust">    let x = 2;
    let y = 3;
</code></pre>
<p>is understood as</p>
<pre><code class="language-rust">    let x: i32 = 2;
    let y: i32 = 3;
</code></pre>
<p>but</p>
<pre><code class="language-rust">    let x = 2;
    let y = 3;
    let z: i8 = x +y;
</code></pre>
<p>is understood as</p>
<pre><code class="language-rust">    let x: i8 = 2;
    let y: i8 = 3;
    let z: i8 = x +y;
</code></pre>
<p>The inlay type hints will help you understand this.</p>
<h2 class="title is-4">Inline (inlay) type hints:</h2>
<p>I configured the following to make it work. I am not sure everything is really needed.</p>
<ul>
<li>Installed rust-analyzers</li>
</ul>
<pre><code>rustup component add rust-analyzer
</code></pre>
<ul>
<li>settings.json</li>
</ul>
<p>In the <code>settings.json</code> file I added the following:</p>
<pre><code class="language-json">  &quot;inlay_hints&quot;: {
    &quot;enabled&quot;: true,
  },
  &quot;enable_language_server&quot;: true,
  &quot;lsp&quot;: {
    &quot;rust-analyzer&quot;: {
      &quot;binary&quot;: {
        &quot;path&quot;: &quot;/home/gabor/.cargo/bin/rust-analyzer&quot;
      },
      &quot;initialization_options&quot;: {
        &quot;inlayHints&quot;: {
          &quot;maxLength&quot;: null,
          &quot;lifetimeElisionHints&quot;: {
            &quot;enable&quot;: &quot;always&quot;,
            &quot;useParameterNames&quot;: true,
          },
          &quot;closureReturnTypeHints&quot;: {
            &quot;enable&quot;: &quot;always&quot;,
          },
        },
      },
    },
  },
</code></pre>
<ul>
<li>Trusted code</li>
</ul>
<p>Opened the crate I was working on as a &quot;project&quot; and then in the top-left corner of the IDE I clicked on &quot;Trusted project&quot;.</p>
<p>Then I could also use <code>Crtl-:</code> to toggle the inline hint.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Embed time of compilation and other build-time information in a rust binary</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-06T09:30:01Z</updated>
    <pubDate>2026-02-06T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/embed-compile-time-data" />
    <id>https://rust.code-maven.com/embed-compile-time-data</id>
    <content type="html"><![CDATA[<p>Sometimes it is useful to be able to show information about the compilation of a rust crate.</p>
<p>For example the date and time when it was compiled.</p>
<h2 class="title is-4">Cargo.toml</h2>
<p>We need to add the <a href="https://crates.io/crates/built">built</a> crate as a build-time dependency.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/Cargo.toml">examples/embed-build-time-data/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;embed-build-time-data&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]

[build-dependencies]
built = { version = &quot;0.8&quot;, features = [&quot;cargo-lock&quot;, &quot;dependency-tree&quot;, &quot;chrono&quot;, &quot;git2&quot;, &quot;semver&quot;] }


</code></pre>
<h2 class="title is-4">build.rs</h2>
<p>We need to create <code>build.rs</code> in the root of the crate.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/build.rs">examples/embed-build-time-data/build.rs</a></strong></p>
<pre><code class="language-rust">fn main() {
    built::write_built_file().expect(&quot;Failed to acquire build-time information&quot;)
}

</code></pre>
<h2 class="title is-4">main.rs</h2>
<p>We can then access the data in our code during run-time.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/embed-build-time-data/src/main.rs">examples/embed-build-time-data/src/main.rs</a></strong></p>
<pre><code class="language-rust">mod built_info {
    include!(concat!(env!(&quot;OUT_DIR&quot;), &quot;/built.rs&quot;));
}

fn main() {
    println!(&quot;TARGET                {:?}&quot;, built_info::TARGET);
    println!(&quot;PKG_VERSION           {:?}&quot;, built_info::PKG_VERSION);
    println!(&quot;RUSTC_VERSION         {:?}&quot;, built_info::RUSTC_VERSION);

    println!(&quot;GIT_VERSION           {:?}&quot;, built_info::GIT_VERSION);
    println!(&quot;GIT_DIRTY             {:?}&quot;, built_info::GIT_DIRTY);
    println!(&quot;GIT_COMMIT_HASH       {:?}&quot;, built_info::GIT_COMMIT_HASH);
    println!(
        &quot;GIT_COMMIT_HASH_SHORT {:?}&quot;,
        built_info::GIT_COMMIT_HASH_SHORT
    );

    println!(&quot;BUILT_TIME_UTC        {:?}&quot;, built_info::BUILT_TIME_UTC);

    println!(&quot;CI_PLATFORM           {:?}&quot;, built_info::CI_PLATFORM);
}

</code></pre>
<h2 class="title is-4">Output</h2>
<pre><code>$cargo run

TARGET                &quot;x86_64-unknown-linux-gnu&quot;
PKG_VERSION           &quot;0.1.0&quot;
RUSTC_VERSION         &quot;rustc 1.93.0 (254b59607 2026-01-19)&quot;
GIT_VERSION           Some(&quot;9c6447a&quot;)
GIT_DIRTY             Some(true)
GIT_COMMIT_HASH       Some(&quot;9c6447a01046142ccf471a597f21d2c08c67c2cd&quot;)
GIT_COMMIT_HASH_SHORT Some(&quot;9c6447a&quot;)
BUILT_TIME_UTC        &quot;Fri, 6 Feb 2026 10:42:50 +0000&quot;
CI_PLATFORM           None
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Adding the repository field to Cargo.toml</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-27T08:30:01Z</updated>
    <pubDate>2026-01-27T08:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/adding-repository-to-cargo-toml-video" />
    <id>https://rust.code-maven.com/adding-repository-to-cargo-toml-video</id>
    <content type="html"><![CDATA[<ul>
<li><a href="https://osdc.code-maven.com/rust">OSDC Rust</a></li>
</ul>
<iframe width="560" height="315" src="https://www.youtube.com/embed/MPnaIxOTbLA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction</li>
<li>00:30 Open source contributors are volunteers</li>
<li>01:15 How to select an open source project to contribute to?</li>
<li>03:30 Select a recently updated project on GitHub.</li>
<li>05:08 <a href="https://rust-digger.code-maven.com/">Rust Digger</a></li>
<li>06:33 A crate that has no repository link... and one that has.</li>
<li>09:40 Check the <a href="https://github.com/hoodie/dvb-rs/pull/8">previous Pull-Request</a> adding the repository field to <a href="https://crates.io/crates/dvb">dvb</a></li>
<li>11:05 Picking the <a href="https://rust-digger.code-maven.com/crates/spyne-syntax">spyne-syntax</a> crate.</li>
<li>12:40 The GitHub account of <a href="https://github.com/ZA1815/">Zaid Ahmed</a>, finding the repository of spyne-syntax</li>
<li>15:45 Making the change to Cargo.toml, fork the repository</li>
<li>17:55 Commit the change, decide on the commit message.</li>
<li>20:50 Explain the change on the trailing line.</li>
<li>21:50 The <a href="https://github.com/szabgab/rust-digger/issues/89">issue</a> where I collect the PRs.</li>
<li>25:00 We finished the Pull-Request.</li>
<li>25:10 Some PRs take time to get accepted.</li>
<li>27:40 Offering driver-navigator pair-programming.</li>
<li>29:05 Radek: Is there some automatic evaluation of the PR?</li>
<li>30:00 GitHub Actions, tests, co-pilot integration.</li>
<li>34:45 Karol is volunteering to do a PR.</li>
<li>35:50 Karol start sharing his screen.</li>
<li>36:54 Picking the <a href="https://crates.io/crates/kftray-helper">kftray-helper</a> crate to work on.</li>
<li>38:50 A <a href="https://github.com/hcavarsan/kftray">repository</a> with multiple creates.</li>
<li>46:05 CodeRabbit skipped the review.</li>
<li>46:30 Google CLA - The legal issues.</li>
<li>51:10 Baby steps! <a href="https://osdc.code-maven.com/rust#chat">Chat with us</a></li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Testing registration with email verification process</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-12-25T16:30:01Z</updated>
    <pubDate>2025-12-25T16:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/testing-registration-process" />
    <id>https://rust.code-maven.com/testing-registration-process</id>
    <content type="html"><![CDATA[<p>In many web-based application the process of registration includes a step of email verification.
The process is more or less this:</p>
<ol>
<li>The user types in an email address (and some other date)</li>
<li>The system checks that the looks ok, including the format of the email address. (e.g. that it is not empty)</li>
<li>Then it generates a unique code and stores all the received data and the unique code in the database.</li>
<li>Then it send an email to the given address containing a URL with the unique code.</li>
<li>When the user receives the email and clicks on the link the web system receives this verification request and can update the records marking the email as verified.</li>
</ol>
<p>There can and probably should be a number of extra things in the process.</p>
<ul>
<li>For example the database should contain an expiration date for the code.</li>
</ul>
<p>The question though, how do you test this code? Do you let the system send out real emails on every run? That would be slow and the test would need to rely an external service that will receive the email from where the test can download it for verification.</p>
<p>One solution for this is to save the email message in a file during the tests and make the tests read that file.</p>
<p>This is what you can see in this similified example.</p>
<h2 class="title is-4">Cargo.toml</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/testing-email-sending/Cargo.toml">examples/testing-email-sending/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;mail-sender&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
anyhow = &quot;1.0.100&quot;
clap = { version = &quot;4.5.53&quot;, features = [&quot;derive&quot;] }
lettre = { version = &quot;0.11.19&quot;, features = [&quot;file-transport&quot;, &quot;sendmail-transport&quot;] }
uuid = &quot;1.19.0&quot;

</code></pre>
<h2 class="title is-4">main.rs</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/testing-email-sending/src/main.rs">examples/testing-email-sending/src/main.rs</a></strong></p>
<pre><code class="language-rust">use clap::Parser;
use lettre::{FileTransport, Message, SendmailTransport, Transport, message::header::ContentType};

#[derive(Parser)]
struct Cli {
    #[arg(long)]
    from: String,

    #[arg(long)]
    to: String,
}

fn main() {
    let args = Cli::parse();

    // We get this from the command line.
    // In a real application it would come from a config file.
    let from = &amp;args.from;

    // This is what the user entered when registering.
    let user_email = args.to.clone();

    register(from, &amp;user_email);
}

fn register(admin_email: &amp;str, user_email: &amp;str) -&gt; String {
    // This code is saved to the database and emailed to the user.
    let code = uuid::Uuid::new_v4().to_string();

    let subject = String::from(&quot;Email sent to confirm registration&quot;);
    let body = format!(&quot;Welcome! Use this code {code} to verify your email address.&quot;);

    let email = Message::builder()
        .from(admin_email.parse().unwrap())
        .to(user_email.parse().unwrap())
        .subject(subject)
        .header(ContentType::TEXT_PLAIN)
        .body(body)
        .unwrap();

    if cfg!(test) {
        let dirname = &quot;.&quot;;
        let sender = FileTransport::new(dirname);
        let filename = sender.send(&amp;email).unwrap();
        format!(&quot;{filename}.eml&quot;)
    } else {
        println!(&quot;Sending email to {}&quot;, user_email);
        let sender = SendmailTransport::new();
        sender.send(&amp;email).unwrap();
        String::new()
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_register_creates_valid_email() {
        let filename = register(&quot;admin@example.com&quot;, &quot;user@example.com&quot;);
        let content = std::fs::read_to_string(filename).unwrap();

        assert!(content.contains(&quot;From: admin@example.com&quot;));
        assert!(content.contains(&quot;To: user@example.com&quot;));
        assert!(content.contains(&quot;Subject: Email sent to confirm registration&quot;));
        assert!(content.contains(&quot;Welcome! Use this code&quot;));

        let code_start =
            content.find(&quot;Welcome! Use this code &quot;).unwrap() + &quot;Welcome! Use this code &quot;.len();
        let code_end = content.find(&quot; to verify your&quot;).unwrap();
        let _code = &amp;content[code_start..code_end];

        // We can then use the code to verify the user in the test.
    }
}

</code></pre>
<h2 class="title is-4">Config test</h2>
<p>We can either use</p>
<pre><code class="language-rust">#[cfg(test)]
</code></pre>
<p>and</p>
<pre><code class="language-rust">#[cfg(not(test))]
</code></pre>
<p>or we can use</p>
<pre><code class="language-rust">if cfg!(test) {
    ...
} else {
    ...
}
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Mail sender using the lettre crate</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-12-25T13:30:01Z</updated>
    <pubDate>2025-12-25T13:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/mail-sender" />
    <id>https://rust.code-maven.com/mail-sender</id>
    <content type="html"><![CDATA[<p><a href="https://crates.io/crates/lettre">lettre</a></p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/mail-sender/Cargo.toml">examples/mail-sender/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;mail-sender&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
anyhow = &quot;1.0.100&quot;
clap = { version = &quot;4.5.53&quot;, features = [&quot;derive&quot;] }
lettre = { version = &quot;0.11.19&quot;, features = [&quot;file-transport&quot;, &quot;sendmail-transport&quot;] }

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/mail-sender/src/main.rs">examples/mail-sender/src/main.rs</a></strong></p>
<pre><code class="language-rust">use clap::Parser;
use lettre::{FileTransport, Message, SendmailTransport, Transport, message::header::ContentType};
use std::io::Read;

#[derive(Parser)]
struct Cli {
    #[arg(long)]
    from: String,

    #[arg(long)]
    to: String,

    #[arg(long)]
    subject: String,

    #[arg(long)]
    dir: Option&lt;String&gt;,
}

fn main() {
    let args = Cli::parse();
    let mut body = String::new();
    std::io::stdin().read_to_string(&amp;mut body).unwrap();

    let email = Message::builder()
        .from(args.from.parse().unwrap())
        .to(args.to.parse().unwrap())
        .subject(args.subject)
        .header(ContentType::TEXT_PLAIN)
        .body(body)
        .unwrap();

    match args.dir {
        Some(dirname) =&gt; {
            let sender = FileTransport::new(dirname);
            let filename = sender.send(&amp;email).unwrap();
            println!(&quot;{filename}.eml&quot;);
        }
        None =&gt; {
            let sender = SendmailTransport::new();
            sender.send(&amp;email).unwrap();
        }
    }
}

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Generate (hash) a password using Argon2</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-11-19T11:30:01Z</updated>
    <pubDate>2025-11-19T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/hash-a-password" />
    <id>https://rust.code-maven.com/hash-a-password</id>
    <content type="html"><![CDATA[<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/hash-password/Cargo.toml">examples/hash-password/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;hash-password&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
argon2 = { version = &quot;0.5.3&quot;, features = [&quot;std&quot;] }

</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/hash-password/src/main.rs">examples/hash-password/src/main.rs</a></strong></p>
<pre><code class="language-rust">use argon2::{
    Argon2,
    password_hash::{PasswordHash, PasswordHasher, PasswordVerifier, SaltString, rand_core::OsRng},
};
use std::io::{self, Write};

fn main() {
    // Get password from user input
    print!(&quot;Enter password to hash: &quot;);
    io::stdout().flush().unwrap();

    let mut input = String::new();
    io::stdin().read_line(&amp;mut input).unwrap();
    let password = input.trim().as_bytes();

    // Generate a random salt
    let salt = SaltString::generate(&amp;mut OsRng);

    // Initialize Argon2 with default configuration
    let argon2 = Argon2::default();

    // Hash the password
    let password_hash = argon2.hash_password(password, &amp;salt).unwrap();

    println!(&quot;\nPassword hash: {}&quot;, password_hash);

    // Demonstrate verification
    println!(&quot;\nVerifying the password...&quot;);
    let hash_string = password_hash.to_string();
    println!(&quot;\nPassword hash: {}&quot;, hash_string);
    let parsed_hash = PasswordHash::new(&amp;hash_string).unwrap();

    match argon2.verify_password(password, &amp;parsed_hash) {
        Ok(_) =&gt; println!(&quot;✓ Password verification successful!&quot;),
        Err(_) =&gt; println!(&quot;✗ Password verification failed!&quot;),
    }
}

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>GitHub Actions for Rust projects</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-07-06T12:30:01Z</updated>
    <pubDate>2025-07-06T12:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/github-actions" />
    <id>https://rust.code-maven.com/github-actions</id>
    <content type="html"><![CDATA[<p>Using <code>ubuntu-latests</code>, <code>macos-latest</code>, or <code>windows-latests</code> will automatically bring you the most recent stable version of the Rust compiler. <a href="/default-github-workflow-for-rust-on-linux">see this example</a>.</p>
<p>This is nice as you won't need to worry about updating it, but it has the obvious disadvantage that the rust compiler automatically changes without you making any change in the configuration.</p>
<p>Many projects use the <a href="https://github.com/actions-rs/toolchain">actions-rs/toolchain</a>, but it has been deprecated on October 13, 2023.</p>
<p>Many use <a href="https://github.com/dtolnay/rust-toolchain">dtolnay/rust-toolchain</a> to set the toolchain(s) explicitely. You can either set a specific version number or you can use the words:
<code>stable</code> for the most recent stable version, <code>beta</code> for the next version, <code>nightly</code> for wilde development efforts.</p>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/github-workflows/matrix.yml">examples/github-workflows/matrix.yml</a></strong></p>
<pre><code class="language-yaml">name: Matrix
on:
  - pull_request
  - push
jobs:
  main:
    strategy:
      matrix:
        rust:
          - stable
          - beta
          - nightly
          - 1.78
          - 1.88
    name: ${{matrix.rust}}
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dtolnay/rust-toolchain@v1
        with:
          toolchain: ${{matrix.rust}}
          components: rustfmt, clippy
      - run: rustup --version
      - run: rustc -vV

      - run: cargo clippy -- --deny clippy::pedantic
      - run: cargo fmt --all -- --check
      - run: cargo test
        #      - run: cargo install cargo-tarpaulin &amp;&amp; cargo tarpaulin --out Xml
        #      - uses: codecov/codecov-action@v1


</code></pre>
<h2 class="title is-4">GitHub Actions</h2>
<p>Popular GitHub Actions used by Rust Crates.</p>
<ul>
<li>
<p><a href="https://github.com/dtolnay/rust-toolchain">dtolnay/rust-toolchain</a> to install the right toolchain(s),  target(s), and component(s).</p>
</li>
<li>
<p><a href="https://github.com/bnjbvr/cargo-machete">bnjbvr/cargo-machete</a> to remove unused Rust dependencies</p>
</li>
<li>
<p><a href="https://github.com/Swatinem/rust-cache">Swatinem/rust-cache</a> smart caching for rust/cargo projects with sensible defaults to reduce compilation time.</p>
</li>
</ul>
<h2 class="title is-4">Cargo commands</h2>
<p>Various cargo commands I saw in the GitHub Workflows</p>
<pre><code>cargo build --verbose
</code></pre>
<pre><code>cargo test --verbose
</code></pre>
<pre><code>cargo fmt
cargo fmt -- --check
cargo fmt -- --all --check
</code></pre>
<pre><code>cargo clippy
cargo clippy -- --deny clippy::pedantic
cargo clippy --all-targets ${{ matrix.feature }} -- -D warnings
    // where the matrix.feature field can be ['', '--no-default-features', '--all-features']
</code></pre>
<pre><code>cargo doc --no-deps --all-features
</code></pre>
<h2 class="title is-4">GitHub Workflow elements</h2>
<pre><code class="language-yaml">env:
  CARGO_TERM_COLOR: always
</code></pre>
<h2 class="title is-4">Caching with the generic cache action</h2>
<p>Using <a href="https://github.com/actions/cache">actions/cache</a> (but see the rust-cachec above)</p>
<pre><code class="language-yaml">      - name: Cache cargo registry
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
          restore-keys: |
            ${{ runner.os }}-cargo-
</code></pre>
<h2 class="title is-4">Verify git tag matches Cargo.toml version</h2>
<pre><code>      - name: Verify tag matches Cargo.toml version
        run: |
          TAG_VERSION=${GITHUB_REF#refs/tags/v}
          CARGO_VERSION=$(grep '^version = ' Cargo.toml | sed 's/version = &quot;\(.*\)&quot;/\1/')
          echo &quot;Tag version: $TAG_VERSION&quot;
          echo &quot;Cargo.toml version: $CARGO_VERSION&quot;
          if [ &quot;$TAG_VERSION&quot; != &quot;$CARGO_VERSION&quot; ]; then
            echo &quot;Error: Tag version ($TAG_VERSION) does not match Cargo.toml version ($CARGO_VERSION)&quot;
            exit 1
          fi
</code></pre>
<h2 class="title is-4">Publish to crates.io</h2>
<pre><code>      - name: Publish to crates.io
        run: cargo publish
        env:
          CARGO_REGISTRY_TOKEN: ${{ secrets.CRATES_IO_TOKEN }}
</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust in Hebrew</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-18T11:30:01Z</updated>
    <pubDate>2025-06-18T11:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-in-hebrew" />
    <id>https://rust.code-maven.com/rust-in-hebrew</id>
    <content type="html"><![CDATA[<p>I already collected all the resource related to <a href="https://rust.org.il/">Rust in Israel</a> including our <a href="https://rust.org.il/community">communities</a> so for now I won't duplicate that
information here, but at least there is a page now.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust in Spanish - Rust en Español</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-18T09:50:01Z</updated>
    <pubDate>2025-06-18T09:50:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-in-spanish" />
    <id>https://rust.code-maven.com/rust-in-spanish</id>
    <content type="html"><![CDATA[<p>Everything about Rust in Spanish.</p>
<h2 class="title is-4">Rust en Castellano, en todo de mundo:</h2>
<ul>
<li><a href="https://rustlang-es.org/">Rust Lang En Español</a></li>
</ul>
<hr />
<ul>
<li><a href="https://github.com/RustLangES">GitHub: RustLang en Español - Comunidad de Rustlang en Español</a></li>
<li><a href="https://www.linkedin.com/company/rustlanges">LinkedIn company: Comunidad de RustLang en Español</a></li>
<li><a href="https://www.linkedin.com/groups/12917518/">LinkedIn group: RustLang en Español</a></li>
<li><a href="https://t.me/rust_es">Telegram: Programación Rust</a></li>
<li><a href="https://reddit.com/r/rustlanges">Reddit: r/rustlanges</a></li>
<li><a href="https://www.instagram.com/rustlanges/">Instagram: rustlanges</a></li>
<li><a href="https://x.com/rust_lang_es">X/Twitter</a></li>
<li><a href="https://mastodon.social/@rustlanges">Mastodon</a></li>
<li><a href="https://www.youtube.com/@RustLangEnEspa%C3%B1ol">YouTube: RustLang en Español</a></li>
<li><a href="https://www.twitch.tv/rustlanges">Twitch: RustLangES</a></li>
</ul>
<h2 class="title is-4">Libros</h2>
<ul>
<li><a href="https://book.rustlang-es.org/">El Lenguaje de Programación Rust</a></li>
<li><a href="https://google.github.io/comprehensive-rust/es/index.html">Comprehensive Rust</a></li>
<li><a href="https://embedded-book.rustlang-es.org/">Rust en Embedidos</a></li>
<li><a href="https://dotnet-book.rustlang-es.org/">Rust para C#/.NET Developers</a></li>
<li><a href="https://go-book.rustlang-es.org/es/">Rust para Go Developers</a></li>
</ul>
<h2 class="title is-4">Grupos de Meetup</h2>
<ul>
<li>
<p><a href="/user-groups-by-country">Busca para los paises hispanohablantes</a></p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust meetup and user groups by country</title>
    <summary type="html"><![CDATA[There are many Rust user groups around the world. Here is the full list by country, state, and city along with the number of members.]]></summary>
    <updated>2025-06-18T08:30:01Z</updated>
    <pubDate>2025-06-18T08:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/user-groups-by-country" />
    <id>https://rust.code-maven.com/user-groups-by-country</id>
    <content type="html"><![CDATA[<p>There are many Rust user groups around the world. Here is the full list by country, state, and city along with the number of members.</p>
<h2 class="title is-4">Argentina</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-argentina/">Rust Argentina</a> (1,135 members) - Buenos Aires</p>
</li>
</ul>
<h2 class="title is-4">Australia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Melbourne/">Rust Melbourne</a> (1,170 members) - Melbourne</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Sydney/">Rust Sydney</a> (934 members) - Sydney</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Brisbane/">Rust Brisbane</a> (450 members) - Brisbane</p>
</li>
<li>
<p><a href="https://www.meetup.com/perth-rust-meetup-group/">Rust Perth Meetup Group</a> (128 members) - Perth</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-canberra/">Canberra Rust User Group</a> (109 members) - Canberra</p>
</li>
</ul>
<h2 class="title is-4">Austria</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/de-DE/rust-linz/">Rust Linz</a> (1,176 members) - Linz</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-vienna/">Rust Vienna</a> (619 members) - Vienna</p>
</li>
</ul>
<h2 class="title is-4">Belgium</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/belgium-rust-user-group/">Belgium Rust user group</a> (238 members) - Brussels</p>
</li>
</ul>
<h2 class="title is-4">Brazil</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Sao-Paulo-Meetup/">Rust São Paulo Meetup</a> (1,314 members) - São Paulo</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Rio/">Rust Rio</a> (109 members) - Rio de Janeiro</p>
</li>
</ul>
<h2 class="title is-4">Canada</h2>
<h3 class="title is-5">AB</h3>
<ul>
<li><a href="https://www.eventbrite.ca/o/rust-calgary-63449860593">Calgary Rust</a> (30 members) - Calgary</li>
</ul>
<h3 class="title is-5">BC</h3>
<ul>
<li><a href="https://www.meetup.com/vancouver-rust/">Vancouver Rust</a> (1,351 members) - Vancouver</li>
</ul>
<h3 class="title is-5">ON</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Toronto/">Rust Toronto</a> (648 members) - Toronto</li>
<li><a href="https://www.meetup.com/Rust-KW/">Rust KW</a> (315 members) - Kitchener</li>
</ul>
<h3 class="title is-5">QC</h3>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Montreal/">Rust Montréal</a> (335 members) - Montréal</p>
</li>
</ul>
<h2 class="title is-4">China</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/wasm-rust-meetup">WebAssembly and Rust Meetup (Wasm Empowering AI)</a> (421 members) - Beijing</p>
</li>
<li>
<p><a href="https://github.com/RPG-Alex/rust-chengdu">Chengdu</a> (0 members) - Chengdu</p>
</li>
</ul>
<h2 class="title is-4">Colombia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-medellin/">Rust Medellin</a> (318 members) - Medellin</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-colombia/">Rust Colombia</a> (155 members) - Medellín</p>
</li>
</ul>
<h2 class="title is-4">Croatia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/zagreb-rust-meetup/">impl Zagreb for Rust</a> (226 members) - Zagreb</p>
</li>
</ul>
<h2 class="title is-4">Czech Republic</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-prague/">Rust Prague</a> (448 members) - Prague</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-czech-republic/">Rust Czech Republic</a> (260 members) - Prague</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-moravia">Rust Moravia</a> (98 members) - Olomouc</p>
</li>
</ul>
<h2 class="title is-4">Denmark</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/copenhagen-rust-community/">Copenhagen Rust Community</a> (865 members) - Copenhagen</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-aarhus/">Rust Aarhus</a> (467 members) - Aarhus</p>
</li>
</ul>
<h2 class="title is-4">France</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Paris/">Rust Paris</a> (1,799 members) - Paris</p>
</li>
<li>
<p><a href="https://www.meetup.com/Montpellier-Rust-Meetup/">Montpellier Rust Meetup</a> (315 members) - Montpellier</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-lyon/">Rust Lyon</a> (315 members) - Lyon</p>
</li>
<li>
<p><a href="https://www.meetup.com/meetup-group-zgphbyet/">Rust Lille</a> (299 members) - Lille</p>
</li>
</ul>
<h2 class="title is-4">Georgia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/tbilisi-rustaceans/">Rust Tbilisi</a> (151 members) - Tbilisi</p>
</li>
</ul>
<h2 class="title is-4">Germany</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-berlin/">Rust Berlin</a> (3,435 members) - Berlin</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-munich/">Rust Munich</a> (1,546 members) - München</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-noris/">Rust Nuremberg</a> (967 members) - Nürnberg</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustcologne/">Rust Cologne</a> (796 members) - Köln</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Meetup-Hamburg/">Rust Meetup Hamburg</a> (763 members) - Hamburg</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-rhein-main/">Rust Rhein-Main</a> (296 members) - Darmstadt</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Hack-Learn-Karlsruhe/">Rust Hack &amp; Learn Karlsruhe</a> (233 members) - Karlsruhe</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-modern-systems-programming-in-leipzig/">Rust - Modern Systems Programming in Leipzig</a> (168 members) - Leipzig</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-frankfurt">Rust Frankfurt</a> (117 members) - Frankfurt</p>
</li>
<li>
<p><a href="https://www.meetup.com/paessler-rust-camp-2024/">Paessler Rust Camp 2024</a> (62 members) - Nürnbert</p>
</li>
</ul>
<h2 class="title is-4">India</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rustox/">Rust India</a> (2,700 members) - Bangalore</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustdelhi/">Rust Delhi</a> (<a href="https://rustdelhi.in/">web</a>) (1,446 members) - Delhi</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Hyderabad/">Rust Language Hyderabad</a> (1,106 members) - Hyderabad</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-pune">Rust Pune</a> (565 members) - Pune</p>
</li>
</ul>
<h2 class="title is-4">Indonesia</h2>
<ul>
<li>
<p><a href="https://github.com/rustid/meetup">Rust Indonesia</a> (0 members) - Jakarta ?</p>
</li>
</ul>
<h2 class="title is-4">Ireland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-dublin/">Rust Dublin</a> (1,086 members) - Dublin</p>
</li>
</ul>
<h2 class="title is-4">Israel</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-tlv/">Rust TLV</a> (<a href="https://rust.org.il/">web</a>) (1,343 members) - Tel Aviv-Yafo</p>
</li>
</ul>
<h2 class="title is-4">Italy</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-lang-Milano/">Rust Language Milano</a> (636 members) - Milano</p>
</li>
<li>
<p><a href="https://www.meetup.com/it-IT/Rust-Roma/">Rust Roma</a> (425 members) - Roma</p>
</li>
</ul>
<h2 class="title is-4">Japan</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/tokyo-rust-meetup/">Tokyo Rust Meetup</a> (801 members) - Tokyo</p>
</li>
</ul>
<h2 class="title is-4">Lithuania</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/vilnius-rust-go-meetup-group/">Vilnius Rust and Go Meetup Group</a> (292 members) - Vilnius</p>
</li>
</ul>
<h2 class="title is-4">Malaysia</h2>
<ul>
<li>
<p><a href="https://rust-malaysia.github.io/meetup/">Rust Malaysia</a> (0 members) - Kuala Lumpur</p>
</li>
</ul>
<h2 class="title is-4">Mexico</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-MX/">Rust MX</a> (1,192 members) - México City</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustlangmx/">Rust Lang Comunidad Mexico</a> (107 members) - Guadalajara</p>
</li>
</ul>
<h2 class="title is-4">Netherlands</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-nederland/">Rust Nederland</a> (1,883 members) - Amsterdam</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-getting-started">Rust, Getting Started</a> (87 members) - Tiel</p>
</li>
<li>
<p><a href="https://www.meetup.com/dutch-rust-meetup/">Dutch Rust Meetup</a> (74 members) - Enschede</p>
</li>
</ul>
<h2 class="title is-4">New Zealand</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Wellington-Rust-Meetup/">Rust Wellington</a> (304 members) - Wellington</p>
</li>
<li>
<p><a href="https://www.meetup.com/christchurch-rustlang-meetup-group/">Christchurch Rust Meetup Group</a> (179 members) - Christchurch</p>
</li>
</ul>
<h2 class="title is-4">Nigeria</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-meetup-group/">Rust Nigeria</a> (448 members) - Lagos</p>
</li>
</ul>
<h2 class="title is-4">Norway</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Oslo/">Rust Oslo</a> (1,059 members) - Oslo</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-trondheim/">Rust Trondheim</a> (143 members) - Trondheim</p>
</li>
</ul>
<h2 class="title is-4">Peru</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/peru-rust-user-group/">Perú Rust User Group</a> (58 members) - Lima</p>
</li>
</ul>
<h2 class="title is-4">Poland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-wroclaw">Rust Wroclaw</a> (887 members) - Wroclaw</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Warsaw/">Rust Warsaw</a> (668 members) - Warsaw</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-gdansk/">Rust Gdansk</a> (271 members) - Gdansk</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-poland-meetup/">Rust Poland</a> (17 members) - Poznan</p>
</li>
</ul>
<h2 class="title is-4">Russia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-%D0%B2-%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B5/">Rust Moscow</a> (1,519 members) - Moscow</p>
</li>
</ul>
<h2 class="title is-4">Serbia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/belgrade-rust-meetup-group">Belgrade Rust Meetup Froup</a> (140 members) - Belgrade</p>
</li>
</ul>
<h2 class="title is-4">Singapore</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-singapore">Rust Singapore</a> (309 members) - Singapore</p>
</li>
</ul>
<h2 class="title is-4">Slovakia</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/bratislava-rust-meetup-group">Bratislava Rust Meetup Group</a> (191 members) - Bratislava</p>
</li>
</ul>
<h2 class="title is-4">South Africa</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/johannesburg-rust-meetup">Johannesburg Rust Meetup</a> (953 members) - Johannesburg</p>
</li>
</ul>
<h2 class="title is-4">South Korea</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Seoul/">Rust Seoul</a> (70 members) - Seoul</p>
</li>
</ul>
<h2 class="title is-4">Spain</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/bcnrust/">BcnRust</a> (890 members) - Barcelona</p>
</li>
<li>
<p><a href="https://www.meetup.com/MadRust/">MadRust</a> (597 members) - Madrid</p>
</li>
</ul>
<h2 class="title is-4">Sweden</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/stockholm-rust/">Stockholm Rust</a> (1,043 members) - Stockholm</p>
</li>
<li>
<p><a href="https://www.meetup.com/ruststhlm/">Rust Sthlm</a> (673 members) - Stockholm</p>
</li>
<li>
<p><a href="https://www.meetup.com/rustgbg">Rust Göteborg</a> (489 members) - Göteborg</p>
</li>
</ul>
<h2 class="title is-4">Switzerland</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-zurich/">Rust Zurich</a> (1,141 members) - Zürich</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-basel/">Rust Basel</a> (303 members) - Basel</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-bern/">Rust Bern</a> (269 members) - Bern</p>
</li>
</ul>
<h2 class="title is-4">Taiwan</h2>
<ul>
<li>
<p><a href="https://github.com/rust-tw/meetup">Rust Taiwan Community</a> (61 members) - Taipei</p>
</li>
</ul>
<h2 class="title is-4">USA</h2>
<h3 class="title is-5">AZ</h3>
<ul>
<li><a href="https://www.meetup.com/Desert-Rustaceans/">Desert Rust</a> (301 members) - Phoenix</li>
</ul>
<h3 class="title is-5">CA</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Bay-Area/">Rust Bay Area</a> (2,932 members) - San Francisco</li>
<li><a href="https://www.meetup.com/san-francisco-rust-study-group/">San Francisco Rust Study Group</a> (601 members) - San Francisco</li>
<li><a href="https://www.meetup.com/Rust-Los-Angeles/">Rust Los Angeles</a> (546 members) - Los Angeles</li>
<li><a href="https://www.meetup.com/San-Diego-Rust/">San Diego Rust</a> (493 members) - San Diego</li>
<li><a href="https://www.meetup.com/mv-rust-meetup/">Mountain View  Rust Meetup</a> (257 members) - Mountain View</li>
<li><a href="https://www.meetup.com/thursday-go/">Pasadena Thursday Go / Rust</a> (165 members) - Pasadena</li>
<li><a href="https://www.meetup.com/rust-breakfast-learn">Rust Silicon Valley Community</a> (135 members) - San Jose</li>
</ul>
<h3 class="title is-5">CO</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-Boulder-Denver/">Rust Denver</a> (860 members) - Denver</li>
<li><a href="https://www.meetup.com/boulder-rust-meetup/">Boulder Rust Meetup</a> (169 members) - Boulder</li>
</ul>
<h3 class="title is-5">DC</h3>
<ul>
<li><a href="https://www.meetup.com/RustDC/">Rust DC</a> (979 members) - Washington</li>
</ul>
<h3 class="title is-5">GA</h3>
<ul>
<li><a href="https://www.meetup.com/Rust-ATL/">Rust Atlanta</a> (377 members) - Atlanta</li>
</ul>
<h3 class="title is-5">IL</h3>
<ul>
<li><a href="https://www.meetup.com/Chicago-Rust-Meetup/">Chicago Rust Meetup</a> (509 members) - Chicago</li>
</ul>
<h3 class="title is-5">IN</h3>
<ul>
<li><a href="https://www.meetup.com/indyrs/">Indy Rust</a> (403 members) - Indianapolis</li>
</ul>
<h3 class="title is-5">MA</h3>
<ul>
<li><a href="https://www.meetup.com/bostonrust/">Boston Rust Meetup</a> (1,321 members) - Boston</li>
</ul>
<h3 class="title is-5">MI</h3>
<ul>
<li><a href="https://www.meetup.com/detroitrust/">Detroit Rust</a> (187 members) - Detroit</li>
</ul>
<h3 class="title is-5">MN</h3>
<ul>
<li><a href="https://www.meetup.com/minneapolis-rust-meetup/">Minneapolis Rust Meetup</a> (542 members) - Minneapolis</li>
</ul>
<h3 class="title is-5">MO</h3>
<ul>
<li><a href="https://www.meetup.com/stl-rust/events/">STL Rust</a> (335 members) - Saint Louis</li>
</ul>
<h3 class="title is-5">NY</h3>
<ul>
<li><a href="https://www.meetup.com/rust-nyc/">Rust NYC</a> (<a href="https://rust.nyc/">web</a>) (3,523 members) - New York</li>
<li><a href="https://www.meetup.com/buffalo-rust-meetup/">Buffalo Rust Meetup</a> (475 members) - Buffalo</li>
</ul>
<h3 class="title is-5">OH</h3>
<ul>
<li><a href="https://www.meetup.com/columbus-rs/">Columbus Rust Society</a> (559 members) - Columbus</li>
</ul>
<h3 class="title is-5">OR</h3>
<ul>
<li><a href="https://www.meetup.com/PDXRust/">PDXRust</a> (826 members) - Portland</li>
</ul>
<h3 class="title is-5">TX</h3>
<ul>
<li><a href="https://www.meetup.com/dallasrust/">Dallas Rust User Meetup</a> (937 members) - Dallas</li>
<li><a href="https://www.meetup.com/rust-atx/">Rust ATX</a> (674 members) - Austin</li>
</ul>
<h3 class="title is-5">UT</h3>
<ul>
<li><a href="https://www.meetup.com/utah-rust/">Utah Rust</a> (567 members) - Lehi</li>
</ul>
<h3 class="title is-5">VA</h3>
<ul>
<li><a href="https://www.meetup.com/charlottesville-rust-meetup/">Charlottesville Rust Meetup</a> (584 members) - Charlottesville</li>
</ul>
<h3 class="title is-5">WA</h3>
<ul>
<li>
<p><a href="https://www.meetup.com/seattle-rust-user-group/">Seattle Rust User Group</a> (1,939 members) - Seattle</p>
</li>
<li>
<p><a href="https://www.meetup.com/spokane-rust/">Spokane</a> (78 members) - Spokane</p>
</li>
</ul>
<h2 class="title is-4">Uganda</h2>
<ul>
<li>
<p><a href="https://www.eventbrite.com/o/rust-circle-kampala-65249289033">Rust Circle Kampala</a> (53 members) - Online</p>
</li>
</ul>
<h2 class="title is-4">United Kingdom</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/rust-london-user-group/">Rust London User Group</a> (3,493 members) - London, 17</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-and-c-plus-plus-in-cardiff/">Rust and C++ Cardiff</a> (1,147 members) - Cardiff</p>
</li>
<li>
<p><a href="https://www.meetup.com/Cambridge-Rust-Meetup/">Cambridge Rust meetup</a> (491 members) - Cambridge, C3</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-edi">Rust and Friends</a> (457 members) - Edinburgh</p>
</li>
<li>
<p><a href="https://www.meetup.com/rust-manchester">Rust Manchester</a> (415 members) - Manchester</p>
</li>
<li>
<p><a href="https://www.meetup.com/women-in-rust/">Women in Rust</a> (285 members) - London</p>
</li>
<li>
<p><a href="https://www.meetup.com/oxford-rust-meetup-group/">Oxford Rust Meetup Group</a> (262 members) - Oxford, K2</p>
</li>
<li>
<p><a href="https://www.meetup.com/reading-rust-workshop">Reading Rust Workshop</a> (200 members) - Reading</p>
</li>
<li>
<p><a href="https://www.meetup.com/Rust-Belfast-Meetup/">Rust Belfast Meetup</a> (127 members) - Belfast, R3</p>
</li>
</ul>
<h2 class="title is-4">Uruguay</h2>
<ul>
<li>
<p><a href="https://www.meetup.com/Rust-Uruguay/">Rust Meetup Uruguay</a> (453 members) - Montevideo</p>
</li>
</ul>
<h2 class="title is-4">Worldwide</h2>
<ul>
<li>
<p><a href="https://rustlang-es.org">RustLang en Español</a> (2,305 members) - Online</p>
</li>
</ul>
<p>For this page even the Markdown file is generated. See the <code>preprocessing</code> in the <a href="https://github.com/szabgab/rust.code-maven.com/">repository</a> and the <code>examples/meetups.yaml</code> file.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust social status update 2025.06</title>
    <summary type="html"><![CDATA[How many member do various Rust social groups have?]]></summary>
    <updated>2025-06-17T20:30:01Z</updated>
    <pubDate>2025-06-17T20:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-update-2025-06-17" />
    <id>https://rust.code-maven.com/rust-update-2025-06-17</id>
    <content type="html"><![CDATA[<p>While the technical capabilities of a programming language are very important, the social acceptance of the language also has a huge
impact on the ecosystem around the language.</p>
<p>It is also a good (or at least reasonable) measurement of the popularity of the language.</p>
<p>The <a href="/user-groups">Rust user groups</a> page was updated exactly 6 months ago so today, December 17 is the day I share the new report.</p>
<ul>
<li>The <a href="/rust-update-2024-12-17">report on 2024.12.17</a>.</li>
<li>The <a href="/rust-update-2024-06-17">report on 2024.06.17</a>.</li>
</ul>
<h2 class="title is-4">Rust User Groups</h2>
<p>There are mostly Meetup groups in <a href="/user-groups">the list</a>, though some use different platforms. In some cases the number of members cannot be determined.</p>
<p>Overall:</p>
<table>
<thead>
<tr>
<th>date</th>
<th>no. groups</th>
<th>members</th>
<th>change</th>
</tr>
</thead>
<tbody>
<tr>
<td>2023.12.11</td>
<td>99</td>
<td>59,629</td>
<td></td>
</tr>
<tr>
<td>2024.03.17</td>
<td>113</td>
<td>65,200</td>
<td>5,571</td>
</tr>
<tr>
<td>2024.06.17</td>
<td>116</td>
<td>68,126</td>
<td>2,926</td>
</tr>
<tr>
<td>2024.12.17</td>
<td>132</td>
<td>77,688</td>
<td>9,562</td>
</tr>
<tr>
<td>2025.06.17</td>
<td>120</td>
<td>79,588</td>
<td>1,900</td>
</tr>
</tbody>
</table>
<p>In the last 6 months several groups closed down. Probably due to the price-hike of Meetup (the new price is 3 times of the old one). Some might use another platform, but I don't know where.
If you do, please let me know!</p>
<p>These are the groups that were closed:</p>
<ul>
<li>Rust Chennai in Chennai, India. 1,204</li>
<li>Rust AKL in Auckland, New Zealand. 672</li>
<li>Finland Rust-lang Group in Helsinki, Finland. 602</li>
<li>Rust-Saar in Saarbrücken, Germany. 425</li>
<li>Rust Chinese Community in Beijing, China. 163</li>
<li>Ottawa Rust Language Meetup in Ottawa, ON, Canada. 154</li>
<li>Hack-away with Rust in Espoo, Finland. 125</li>
<li>RustSchool Rotterdam in Rotterdam, Netherlands. 104</li>
<li>Rust Bordeaux in Bordeaux, France. 95</li>
<li>Rust Triangle in Durham, NC, USA. 89</li>
<li>Rust Bristol in Bristol, United Kingdom. 86</li>
<li>Orange County Rust in Irvine, CA, USA. 72</li>
<li>TOTAL: 3791</li>
</ul>
<p>the number of members grew only by 2%, but 3,791 were in the closed groups. If we only count the groups that remained open then the growth is 7%. Less than in the previous 6 months, but still impressive.</p>
<ul>
<li>In the previous 6 months the number of members grew by 14%. Thats over 30% annually.</li>
<li>In the 3 months before that the growth was 4.4% or roughly 20% annually.</li>
</ul>
<p>The three largest Rust groups are:</p>
<ul>
<li><a href="https://www.meetup.com/rust-nyc/">Rust NYC</a> (3,523 members. It had 3,192)</li>
<li><a href="https://www.meetup.com/rust-london-user-group/">Rust London User Group</a> (3,493 members. It had 3,357)</li>
<li><a href="https://www.meetup.com/rust-berlin/">Rust Berlin</a> (4,435 members. It had 3,123).</li>
</ul>
<p>These are also the only groups with more than 3,000 members.</p>
<p>My <a href="https://www.meetup.com/code-mavens/"><strong>Code-Mavens</strong></a> group has 3,841 members (up from 3,213). I use it to organize virtual events in English about Rust, Python, and Perl.
I did not include it in the list.</p>
<p>The <a href="https://www.meetup.com/rust-tlv/">Rust Tel Aviv</a> group that I organize has 1,343 members (up from 1,011 6 months ago and up from 950 members from when I inherited it).</p>
<p>For full details, see of <a href="/user-groups">Rust User Groups</a>.</p>
<p>I updated the figures in several commit that will allow someone to check the changes more easily. Here are the commits.</p>
<table>
<thead>
<tr>
<th>action</th>
<th>no. groups</th>
<th>members</th>
<th>commit</th>
</tr>
</thead>
<tbody>
<tr>
<td>Before</td>
<td>132</td>
<td>77,688</td>
<td></td>
</tr>
<tr>
<td>Update members</td>
<td>132</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/5c0fe32e2af01d7b39c52ddcd1d106985596ed02">commit</a></td>
</tr>
<tr>
<td>Add group I did not know about earlier</td>
<td>120</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/3bfae81a1c9e4a46fbe77434bac5c28d752805e8">commit</a></td>
</tr>
<tr>
<td>Sort groups</td>
<td>120</td>
<td>79,588</td>
<td><a href="https://github.com/szabgab/rust.code-maven.com/commit/d4258bba98b9aad3cff83d540799228f8e5b4279">commit</a></td>
</tr>
</tbody>
</table>
<h2 class="title is-4">Rust on LinkedIn</h2>
<table>
<thead>
<tr>
<th>group</th>
<th>2024.04.08</th>
<th>2024.06.17</th>
<th>change (2 months)</th>
<th>2024.12.17</th>
<th>change (6 month)</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.linkedin.com/groups/4973032/">Rust Programming Language</a></td>
<td>23,261</td>
<td>24,139</td>
<td>3.7 %</td>
<td>26,186</td>
<td>8.4%</td>
<td>27,539</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/12537155/">Rust Developer Community (Rust Lang)</a></td>
<td>3,668</td>
<td>4,048</td>
<td>10.3 %</td>
<td>5,068</td>
<td>25.1%</td>
<td>6,202</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/6931877/">Rust Developers</a></td>
<td>1,311</td>
<td>1,365</td>
<td>4.1 %</td>
<td>1,455</td>
<td>6.5%</td>
<td>1,538</td>
</tr>
<tr>
<td><a href="https://www.linkedin.com/groups/12566531/">Rust (Programming Language)</a></td>
<td>1,308</td>
<td>1,489</td>
<td>13.8 %</td>
<td>2,025</td>
<td>35.9%</td>
<td>2,509</td>
</tr>
</tbody>
</table>
<p><a href="/rust-on-linkedin">Rust on LinkedIn</a></p>
<h2 class="title is-4">Rust on Facebook</h2>
<table>
<thead>
<tr>
<th>Group</th>
<th>2024.04.08</th>
<th>2024.07.19</th>
<th>change</th>
<th>2024.12.17</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.facebook.com/groups/1412062792318164/">Rust Developers (inactive)</a></td>
<td>8.8K</td>
<td>9.0K</td>
<td>2.27%</td>
<td>9.5K</td>
<td>9.8 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/872919370237098/"><strong>Rust Programming Language</strong></a></td>
<td>3.0K</td>
<td>3.4K</td>
<td>13%</td>
<td>4.1K</td>
<td>4.7 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/rust.tw/">Rust-lang.tw</a></td>
<td>2.5K</td>
<td>2.6K</td>
<td>4%</td>
<td>2.7K</td>
<td>2.8 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/programming.rust/">Programming Rust</a></td>
<td>1.9K</td>
<td>2.0K</td>
<td>5%</td>
<td>2.3K</td>
<td>2.5 K</td>
</tr>
<tr>
<td><a href="https://www.facebook.com/groups/rustdevelopersvietnam/">Rust Developers Vietnam</a></td>
<td>1.8K</td>
<td>2.2K</td>
<td>22%</td>
<td>2.7K</td>
<td>2.9 K</td>
</tr>
</tbody>
</table>
<p>The first group listed is inactive, but still people become members.</p>
<p>Full report on <a href="/rust-on-facebook">Rust on Facebook</a></p>
<h2 class="title is-4">Rust on Reddit</h2>
<p>Subredit members</p>
<table>
<thead>
<tr>
<th>subredit</th>
<th>2024.04.08</th>
<th>2024.06.19</th>
<th>change (2 month)</th>
<th>2024.12.16</th>
<th>change (6 month)</th>
<th>2025.06.17</th>
<th>change</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.reddit.com/r/rust/">/r/rust</a></td>
<td>286K</td>
<td>297K</td>
<td>3.8%</td>
<td>325K</td>
<td>9.4%</td>
<td>351K</td>
<td>8%</td>
</tr>
<tr>
<td><a href="https://www.reddit.com/r/learnrust/">/r/learnrust</a></td>
<td>25K</td>
<td>27K</td>
<td>8%</td>
<td>32K</td>
<td>18.5%</td>
<td>38K</td>
<td>18.7%</td>
</tr>
<tr>
<td><a href="https://www.reddit.com/r/rust_gamedev/">/r/rust_gamedev</a></td>
<td>38K</td>
<td>38K</td>
<td></td>
<td>40K</td>
<td>5.2%</td>
<td>42K</td>
<td>5%</td>
</tr>
</tbody>
</table>
<p>All 3 groups grow nicely.</p>
<p>See <a href="/rust-on-reddit">Rust on Reddit</a></p>
<h2 class="title is-4">X Twitter</h2>
<p>Counting followers</p>
<table>
<thead>
<tr>
<th>account</th>
<th>2024.01.06</th>
<th>2024.06.19</th>
<th>2024.12.16</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://x.com/rustlang">Rustlang</a></td>
<td>136.9K</td>
<td>143.9K</td>
<td>148.9K</td>
<td>152.1K</td>
</tr>
<tr>
<td><a href="https://x.com/m_ou_se">Mara Bos</a></td>
<td>41.3K</td>
<td>43.3K</td>
<td>44.7K</td>
<td>45.2K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_foundation">rust_foundation</a></td>
<td>35.6K</td>
<td>37.7K</td>
<td>39.0K</td>
<td>39.8K</td>
</tr>
<tr>
<td><a href="https://x.com/RustTrending">RustTrending</a></td>
<td>29.5K</td>
<td>32.4K</td>
<td>34.8K</td>
<td>36.0K</td>
</tr>
<tr>
<td><a href="https://x.com/ThisWeekInRust">ThisWeekInRust</a></td>
<td>31.9K</td>
<td>32.3K</td>
<td>32.3K</td>
<td>32.4K</td>
</tr>
<tr>
<td><a href="https://x.com/rustconf">RustConf</a></td>
<td>15.3K</td>
<td>16.4K</td>
<td>17.4K</td>
<td>17.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_analyzer">rust_analyzer</a></td>
<td>13.5K</td>
<td>13.5K</td>
<td>13.1K</td>
<td>12.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rustembedded">rustembedded</a></td>
<td>11.2K</td>
<td>11.9K</td>
<td>12.3K</td>
<td>11.9K</td>
</tr>
<tr>
<td><a href="https://x.com/tokio_rs">tokio_rs</a></td>
<td>11.6K</td>
<td>11.8K</td>
<td>11.6K</td>
<td>11.3K</td>
</tr>
<tr>
<td><a href="https://x.com/SurrealDB">SurrealDB</a></td>
<td>7,498</td>
<td>8,345</td>
<td>8,524</td>
<td>8,718</td>
</tr>
<tr>
<td><a href="https://x.com/RustFest">RustFest</a></td>
<td>7,825</td>
<td>7,742</td>
<td>7,505</td>
<td>7,261</td>
</tr>
<tr>
<td><a href="https://x.com/rustjobs_dev">rustjobs_dev</a></td>
<td>4,499</td>
<td>5,568</td>
<td>6,035</td>
<td>6,491</td>
</tr>
<tr>
<td><a href="https://x.com/cratesiostatus">crates.io status</a></td>
<td>5.039</td>
<td>5,543</td>
<td>5,665</td>
<td>5,715</td>
</tr>
<tr>
<td><a href="https://x.com/AstraKernel">AstraKernel</a></td>
<td>1,925</td>
<td>3,611</td>
<td>4,436</td>
<td>5,300</td>
</tr>
<tr>
<td><a href="https://x.com/orhundev">Orhun Parmaksız</a></td>
<td></td>
<td>3,336</td>
<td>4,200</td>
<td>4,954</td>
</tr>
<tr>
<td><a href="https://x.com/rustlab_conf">rustlab_conf</a></td>
<td>3,816</td>
<td>4,163</td>
<td>4,674</td>
<td>4,721</td>
</tr>
<tr>
<td><a href="https://x.com/RustDiscussions">Rust Weekly</a></td>
<td>2,549</td>
<td>3,285</td>
<td>3,808</td>
<td>4,200</td>
</tr>
<tr>
<td><a href="https://x.com/RustSecurity">RustSecurity</a></td>
<td>3,964</td>
<td>4,611</td>
<td>3,885</td>
<td>3,774</td>
</tr>
<tr>
<td><a href="https://x.com/RustNationUK">RustNationUK</a></td>
<td>2,157</td>
<td>2,738</td>
<td>3,215</td>
<td>3,684</td>
</tr>
<tr>
<td><a href="https://x.com/letsgetrusty">letsgetrusty</a></td>
<td>1,418</td>
<td>2,387</td>
<td>3,029</td>
<td>3,286</td>
</tr>
<tr>
<td><a href="https://x.com/euro_rust">euro_rust</a></td>
<td>2,201</td>
<td>2,503</td>
<td>2,915</td>
<td>3,092</td>
</tr>
<tr>
<td><a href="https://x.com/rustoftheday">Daily Rust</a></td>
<td>482</td>
<td>1,513</td>
<td>1,806</td>
<td>3,020</td>
</tr>
<tr>
<td><a href="https://x.com/RustLondon_">RustLondon_</a></td>
<td>2,522</td>
<td>2,699</td>
<td>2,838</td>
<td>2,991</td>
</tr>
<tr>
<td><a href="https://x.com/imperioworld_">Guillaume Gomez</a></td>
<td></td>
<td></td>
<td></td>
<td>2,774</td>
</tr>
<tr>
<td><a href="https://x.com/ratatui_rs">ratatui_rs</a></td>
<td>79</td>
<td>839</td>
<td>1,586</td>
<td>2,195</td>
</tr>
<tr>
<td><a href="https://x.com/RustMaven"><strong>RustMaven</strong></a></td>
<td>1</td>
<td>48</td>
<td>31</td>
<td>40</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p>Orhun Parmaksız is the maintainer of <a href="https://ratatui.rs/">Ratatui.rs</a>.</p>
</li>
<li>
<p>Guillaume Gomez, rustdoc team leader, <a href="https://rust-lang.github.io/mdBook/">mdbook</a> contributor, Rust Paris organizer.</p>
</li>
</ul>
<h2 class="title is-4">Instagram</h2>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,520</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,356</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>677</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>333</td>
<td>430</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>106</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>62</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>See <a href="/rust-in-instagram">Rust on Instagram</a>.</p>
<h2 class="title is-4">Rust on Telegram</h2>
<p>There might be other groups, but I am not aware of them and I've just created the Rust Maven telegram group so let me put it here:</p>
<p>Number of members.</p>
<table>
<thead>
<tr>
<th>group</th>
<th>2024.06.19</th>
<th>2024.12.16</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://t.me/+5P2gCQIWFaBkYmI0">Rust Maven</a></td>
<td>0</td>
<td>16</td>
<td>17</td>
</tr>
</tbody>
</table>
<p>And you are invited to join!</p>
<p>If you know of other groups, let me know so I can list them here.</p>
<h2 class="title is-4">WhatsApp</h2>
<p>Are there any Rust groups on WhatsApp that you would like me to include in my report?</p>
<h2 class="title is-4">The popularity of Rust</h2>
<p>The <a href="https://survey.stackoverflow.co/2024/">Stack Overflow  survey 2024</a> indicates that Rust is the most admired language by a large gap at 82.2%  (the next is Elixir at 76.8%). That is a lot of people love Rust. However this gap was much bigger last year.</p>
<p>On the other hand it is only 6th most desired language with 28.7%. Ahead of it are SQL and HTML/CSS that are, well, different. Also TypeScript, Python, and JavaScript. As I understand this indicates how many job openings are.</p>
<p>In a nutshell, this seem to indicate that many people will want to use Rust, but the number of open positions are relatively low.</p>
<p>However, being on the 6th place is also extremely good.</p>
<p><a href="https://pypl.github.io/PYPL.html">PYPL -  PopularitY of Programming Language</a></p>
<p>Indicates that Rust is number 8 with 2.97% share and +0.4% trend (up from 9 with 2.66% share and +0.5% 1-year trend six month ago) (up from number 10  twelve months ago)</p>
<p>Python is number 1 with 30.63% share and 1.1% trend. (was 1 with 29.71% share and 1.5% 1-year trend six month ago)</p>
<p>C/C++ (bundled together) is number 4 with 7.02% with +0.7% trend (was number 4 with 7.06%  with 0.3% 1-year trend six month ago). (up from number 5 twelve months ago)</p>
<p><a href="https://www.tiobe.com/tiobe-index/">TIOBE</a></p>
<p>Rust is number 18 (dowm from 14 six month ago) (up from number 18 a year ago) with 1.29% ratings and +0.48% change.</p>
<p>Python is number 1 25.87% +10.48% (was 1 with 23.84% ratings and +9.98% change).</p>
<p>C++ is number 2 10.68%, +0.65%  (was 2 with 10.82% ratings and 0.81% change.)</p>
<p>C is number 9.47% +0.24% (was 4 with 9.10% ratings and -2.34% change.)</p>
<p>Java is number 4 8.84% +0.44% (was 3 with 9.72% ratings and 1.73% change).</p>
<p>Also on TIOBE:</p>
<ul>
<li>ADA jumped from 25 to 11 in 1 year</li>
<li>Perl jumped from 17 to 13 in 1 year</li>
<li>R jumped from 21 to 14 in 1 year</li>
</ul>
<p>Even if earlier you thought that TIOBE is real this can show you that it has some very serious flaws. I doubt ADA and R would jump that much in a year, but I know that nothing in the Perl world explains this surge in Perl. I think I can say that as I am the editor of the <a href="https://perlweekly.com/">Perl Weekly newsletter</a> so I think I have some undertanding about the popularity of Perl.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust on X Twitter</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-17T19:30:01Z</updated>
    <pubDate>2025-06-17T19:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-on-twitter" />
    <id>https://rust.code-maven.com/rust-on-twitter</id>
    <content type="html"><![CDATA[<p>Counting followers</p>
<table>
<thead>
<tr>
<th>account</th>
<th>2025.06.17</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://x.com/rustlang">Rustlang</a></td>
<td>152.1K</td>
</tr>
<tr>
<td><a href="https://x.com/m_ou_se">Mara Bos</a></td>
<td>45.2K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_foundation">rust_foundation</a></td>
<td>39.8K</td>
</tr>
<tr>
<td><a href="https://x.com/RustTrending">RustTrending</a></td>
<td>36.0K</td>
</tr>
<tr>
<td><a href="https://x.com/ThisWeekInRust">ThisWeekInRust</a></td>
<td>32.4K</td>
</tr>
<tr>
<td><a href="https://x.com/rustconf">RustConf</a></td>
<td>17.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rust_analyzer">rust_analyzer</a></td>
<td>12.7K</td>
</tr>
<tr>
<td><a href="https://x.com/rustembedded">rustembedded</a></td>
<td>11.9K</td>
</tr>
<tr>
<td><a href="https://x.com/tokio_rs">tokio_rs</a></td>
<td>11.3K</td>
</tr>
<tr>
<td><a href="https://x.com/SurrealDB">SurrealDB</a></td>
<td>8,718</td>
</tr>
<tr>
<td><a href="https://x.com/RustFest">RustFest</a></td>
<td>7,261</td>
</tr>
<tr>
<td><a href="https://x.com/rustjobs_dev">rustjobs_dev</a></td>
<td>6,491</td>
</tr>
<tr>
<td><a href="https://x.com/cratesiostatus">crates.io status</a></td>
<td>5,715</td>
</tr>
<tr>
<td><a href="https://x.com/AstraKernel">AstraKernel</a></td>
<td>5,300</td>
</tr>
<tr>
<td><a href="https://x.com/orhundev">Orhun Parmaksız</a></td>
<td>4,954</td>
</tr>
<tr>
<td><a href="https://x.com/rustlab_conf">rustlab_conf</a></td>
<td>4,721</td>
</tr>
<tr>
<td><a href="https://x.com/RustDiscussions">Rust Weekly</a></td>
<td>4,200</td>
</tr>
<tr>
<td><a href="https://x.com/RustSecurity">RustSecurity</a></td>
<td>3,774</td>
</tr>
<tr>
<td><a href="https://x.com/RustNationUK">RustNationUK</a></td>
<td>3,684</td>
</tr>
<tr>
<td><a href="https://x.com/letsgetrusty">letsgetrusty</a></td>
<td>3,286</td>
</tr>
<tr>
<td><a href="https://x.com/euro_rust">euro_rust</a></td>
<td>3,092</td>
</tr>
<tr>
<td><a href="https://x.com/rustoftheday">Daily Rust</a></td>
<td>3,020</td>
</tr>
<tr>
<td><a href="https://x.com/RustLondon_">RustLondon_</a></td>
<td>2,991</td>
</tr>
<tr>
<td><a href="https://x.com/imperioworld_">Guillaume Gomez</a></td>
<td>2,774</td>
</tr>
<tr>
<td><a href="https://x.com/ratatui_rs">ratatui_rs</a></td>
<td>2,195</td>
</tr>
<tr>
<td><a href="https://x.com/RustMaven"><strong>RustMaven</strong></a></td>
<td>40</td>
</tr>
</tbody>
</table>
<ul>
<li>
<p>Orhun Parmaksız is the maintainer of <a href="https://ratatui.rs/">Ratatui.rs</a>.</p>
</li>
<li>
<p>Guillaume Gomez, rustdoc team leader, <a href="https://rust-lang.github.io/mdBook/">mdbook</a> contributor, Rust Paris organizer.</p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust on Instagram</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-17T09:30:01Z</updated>
    <pubDate>2025-06-17T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-on-instagram" />
    <id>https://rust.code-maven.com/rust-on-instagram</id>
    <content type="html"><![CDATA[<p>2023.12.07</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>12</td>
<td>2,374</td>
<td>16</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,223</td>
<td>0</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>576</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>283</td>
<td>434</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>75</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>0</td>
<td>3</td>
<td>0</td>
</tr>
</tbody>
</table>
<p>2024.06.19</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>21</td>
<td>2,709</td>
<td>5</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,245</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>624</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>330</td>
<td>434</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>93</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>34</td>
<td>64</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>2024.12.16</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,203</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,273</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>652</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>335</td>
<td>432</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>100</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>59</td>
<td>6</td>
</tr>
</tbody>
</table>
<p>2025.06.17</p>
<table>
<thead>
<tr>
<th>account</th>
<th>posts</th>
<th>followers</th>
<th>following</th>
</tr>
</thead>
<tbody>
<tr>
<td><a href="https://www.instagram.com/rust_programming_language/">rust_programming_language</a></td>
<td>24</td>
<td>4,520</td>
<td>3</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustlanguage/">rustlanguage</a></td>
<td>7</td>
<td>1,356</td>
<td>1</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rustacean.dev/">rustacean.dev</a></td>
<td>14</td>
<td>677</td>
<td>9</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_language_/">rust_language_</a></td>
<td>19</td>
<td>333</td>
<td>430</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_lang_/">rust_lang_</a></td>
<td>1</td>
<td>106</td>
<td>6</td>
</tr>
<tr>
<td><a href="https://www.instagram.com/rust_maven/">Rust Maven on Instagram</a></td>
<td>36</td>
<td>62</td>
<td>6</td>
</tr>
</tbody>
</table>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust at Work - conversation with Herbert Wolverson of Ardan Labs &amp; LibreQoS</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-06-03T09:30:01Z</updated>
    <pubDate>2025-06-03T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-at-work-ardan-labs-libreqos" />
    <id>https://rust.code-maven.com/rust-at-work-ardan-labs-libreqos</id>
    <content type="html"><![CDATA[<p><a class="button is-primary" href="https://www.meetup.com/code-mavens/events/308234298/">register</a></p>
<ul>
<li>
<p>Guest: <a href="https://www.linkedin.com/in/herbert-wolverson-98523346/">Herbert Wolverson</a> Rust Trainer/Consultant at <a href="https://www.ardanlabs.com/">Ardan Labs</a> and Chief Product Officer at <a href="https://libreqos.io/">LibreQoS</a>.</p>
</li>
<li>
<p>Host: <a href="https://szabgab.com/">Gabor Szabo</a> Rust and Python trainer and consultant.</p>
</li>
<li>
<p>Language: English</p>
</li>
<li>
<p>Location: Zoom</p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust at Work</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-05-20T09:30:01Z</updated>
    <pubDate>2025-05-20T09:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-at-work" />
    <id>https://rust.code-maven.com/rust-at-work</id>
    <content type="html"><![CDATA[<p>Live online conversation about the use of Rust at Work. The recordings are then published on <a href="https://rustacean-station.org/">The Rustacean Station Podcast</a> as podcast.</p>
<p>Trying to understand how people use Rust at their companies.</p>
<h2 class="title is-4">Planned events</h2>
<table>
<thead>
<tr>
<th>When</th>
<th>event</th>
<th>who</th>
<th>register</th>
</tr>
</thead>
<tbody>
<tr>
<td>2025.06.11</td>
<td><a href="https://rust.code-maven.com/rust-at-work-ardan-labs-libreqos">Rust at Work at Ardan Labs &amp; LibreQoS</a></td>
<td>Herbert Wolverson</td>
<td><a href="https://www.meetup.com/code-mavens/events/308234298/">register</a></td>
</tr>
</tbody>
</table>
<h2 class="title is-4">Previous recordings</h2>
<table>
<thead>
<tr>
<th>When</th>
<th>event</th>
<th>who</th>
</tr>
</thead>
<tbody>
<tr>
<td>2025.05.20</td>
<td><a href="https://rust.code-maven.com/rust-at-work-flarion">Rust at Work at Flarion</a></td>
<td>Ran Reichman</td>
</tr>
<tr>
<td>2025.05.27</td>
<td><a href="https://rust.code-maven.com/rust-at-work-eureka-labs">Rust at Work at Eureka Labs</a></td>
<td>Eli Shalom &amp; Igal Tabachnik</td>
</tr>
</tbody>
</table>
<h2 class="title is-4">Process</h2>
<ul>
<li>
<p>We schedule an event (in the <a href="https://www.meetup.com/code-mavens/">Code-Mavens Meetup group</a>) and let anyone register and attend the online event.</p>
</li>
<li>
<p>During the event the audience can ask questions in the chat room that can enhance the whole conversation.</p>
</li>
</ul>
<h2 class="title is-4">Topics</h2>
<p>(not all of them might be relevant to you, and we might cover more.)</p>
<ul>
<li>
<p>Please introduce yourself.</p>
</li>
<li>
<p>Please introduce the company you work for. The products and services of your company.</p>
</li>
<li>
<p>What was  your entry point to Rust?</p>
</li>
<li>
<p>Why do you use Rust?</p>
</li>
<li>
<p>How did you introduce Rust to this company?</p>
</li>
<li>
<p>Are you porting some software from some other language?</p>
<ul>
<li>Why?</li>
<li>From which language?</li>
<li>What is the process?</li>
</ul>
</li>
<li>
<p>Are you writing a greenfield process in Rust?</p>
<ul>
<li>What were the alternatives?</li>
<li>Why did you pick Rust?</li>
</ul>
</li>
<li>
<p>How do you select your dependencies?</p>
<ul>
<li>Do you have a well defined process maybe even a selected team to accept new dependencies or is it up to the individual developer to add a new dependency?</li>
</ul>
</li>
<li>
<p>How much can you rely on open source crates?</p>
<ul>
<li>How do you interact with the wider Rust community?</li>
<li>How do you ensure that the crates you rely on directly and all their dependencies are secure and well maintained?</li>
</ul>
</li>
<li>
<p>How do you fix issue in dependencies?</p>
<ul>
<li>Locally?</li>
<li>Is it easy to have your changes accepted upstream?</li>
</ul>
</li>
<li>
<p>Do you allocate time to your developers to contribute to open source projects?</p>
</li>
<li>
<p>Have you experienced with sponsoring certain open source Rust (or other) developers or bug bounties?</p>
</li>
<li>
<p>What is your branching and development process?</p>
<ul>
<li>Branches and pull-request?</li>
<li>Code-reviews?</li>
<li>Pair-programming?</li>
</ul>
</li>
<li>
<p>Are you looking for Rust developers? What is the hiring process?</p>
</li>
<li>
<p>Is it easy/difficult to find Rust developers?</p>
</li>
<li>
<p>What can people do  to increase their chances to get picked and maybe even hired by your company?</p>
</li>
<li>
<p>Time-travel: What would be the answer if someone has the time to plan 1-2 years ahead?</p>
</li>
<li>
<p>What would you recommend to other engineering decision makers, CTOs, VP R&amp;Ds, VP of Engineering, tech founders, etc. how to evaluate the feasibility of Rust for their projects and goals?</p>
</li>
<li>
<p>How to adopt rust?</p>
</li>
<li>
<p>What is the ROI switching to rust? How can we measure it?</p>
</li>
<li>
<p>How do you evaluate the decision to switch to / use Rust?</p>
</li>
<li>
<p>What are the parts of the Rust ecosystem that you found less than perfect? What do you miss from the language or from the ecosystem?</p>
</li>
<li>
<p>What is your experience using AI tools to write Rust code? How do you think will impact the market share of programming languages?</p>
</li>
</ul>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust at Work - conversation with Eli Shalom and Igal Tabachnik of Eureka Labs</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-05-15T07:30:01Z</updated>
    <pubDate>2025-05-15T07:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-at-work-eureka-labs" />
    <id>https://rust.code-maven.com/rust-at-work-eureka-labs</id>
    <content type="html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/X4ka4Q1AHTs" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>Guests: <a href="https://www.linkedin.com/in/elishalom/">Eli Shalom</a> &amp; <a href="https://www.linkedin.com/in/igaltabachnik/">Igal Tabachnik</a> of <a href="https://eurekalabs.xyz/">Eureka Labs</a></li>
<li>Host: <a href="https://szabgab.com/">Gabor Szabo</a></li>
<li>Language: English</li>
<li>Location: Zoom</li>
</ul>
<p>In this episode, we explore how Rust is powering infrastructure at Eureka Labs - a blockchain company operating in a low-latency, high-throughput environment.</p>
<p>Eureka Labs is pioneering next-generation block building on Ethereum. Their work focuses on advancing the logic of block construction to support more efficient execution and expand the functionality that can be packed into each block’s limited timeframe.</p>
<p>Eli and Igal will discuss how Rust has been instrumental in developing their high-performance block builder. Before founding Eureka, the team tackled large-scale engineering and algorithmic problems across industries.</p>
<p>If you have questions to Eli and Igal, please send it to <a href="https://szabgab.com/contact">Gabor Szabo</a></p>
<ol>
<li>
<p>Concepts from functional languages: immutability, green/virtual threads (tokio), lambdas, iterators, type classes (derive)</p>
</li>
<li>
<p>Libraries: Clap (CLI parser), Reth (Ethereum protocol implemented in Rust)</p>
</li>
<li>
<p>Inspirations: <a href="https://www.youtube.com/watch?v=1zOd52_tUWg">Grayden Hoare's async/await retrospective</a>, &quot;<a href="https://www.youtube.com/watch?v=GqmsQeSzMdw">Constraints Liberate, Liberties Constrain</a>&quot; talk by Runar Bjarnason.</p>
</li>
<li>
<p>Learning Rust: <a href="https://doc.rust-lang.org/book/">The Rust Book</a> Live coding streams by <a href="https://www.youtube.com/c/JonGjengset">Jon Gjengset</a> &quot;<a href="https://rust-for-rustaceans.com/">Rust for Rustaceans</a>&quot; book by Jon Gjengset.</p>
</li>
<li>
<p>AI tools: Claude Code, Amp by Sourcegraph</p>
</li>
</ol>
<h2 class="title is-4">Transcript</h2>
<p>1
00:00:02.390 --&gt; 00:00:19.680
Gabor Szabo: Hello and welcome to the code. Meet Maven meeting and podcast on the raw station. If you're listening to us, this is going to be a live recording, meaning that there are going to be. There are a few guests beyond or guest speakers.</p>
<p>2
00:00:19.690 --&gt; 00:00:33.920
Gabor Szabo: There are a few guests who listen and can ask questions in the chat room. They can't speak, because that's only the 3 of us. And but those people who are present here, you're welcome to ask questions there.</p>
<p>3
00:00:35.060 --&gt; 00:00:47.139
Gabor Szabo: Welcome, Ellie and Igal. So our guest this time is Ali Shalom, the CEO of Euray collapse, and Igal Tabachnik right.</p>
<p>4
00:00:47.140 --&gt; 00:00:48.369
Igal Tabachnik: That's exactly right.</p>
<p>5
00:00:48.920 --&gt; 00:00:51.712
Gabor Szabo: Okay, senior developer and</p>
<p>6
00:00:52.670 --&gt; 00:01:17.559
Gabor Szabo: we are going to talk about your your company and rust, and how you use rust. So I think the 1st thing that I mean the 1st thing I think I should just say myself that I my name is Gabor Sabo, and I'm helping companies with rust and python, and then that's about me, that's enough. And now please introduce yourself. Let's start with Ellie, and then Igar, and please let's see.</p>
<p>7
00:01:18.010 --&gt; 00:01:41.370
Eli Shalom: So thank you very much, Gabo, for inviting us to this. Podcast and even though you gave me the credits for being the CEO and the CTO. And we have another person as the CEO of the company, and my background is very technological. I come from. I spent most of my career in engineering roles. I did a lot of languages and not rust, and started from</p>
<p>8
00:01:41.550 --&gt; 00:01:58.149
Eli Shalom: things like C sharp and C plus plus, and ended as a python developer, mostly for data science purposes and a lot of my career I did in analyzing code. I work for companies who analyze code both for quality and for security. So</p>
<p>9
00:01:58.310 --&gt; 00:02:12.739
Eli Shalom: code and coding languages are a very great passion of mine, and the way we get to rust is very different from code analysis, and we'll get to it today. But it's a great passion of me and most of the people in the in the R. And D.</p>
<p>10
00:02:15.480 --&gt; 00:02:16.260
Igal Tabachnik: Great.</p>
<p>11
00:02:16.370 --&gt; 00:02:36.870
Igal Tabachnik: And I'll introduce myself. So also thank you very much for inviting us to the podcast so my name is Igal Tapachnik. I'm a software developer. And I've also had an interesting career spanning from beginning being Anet developer. And Ellie and I worked together many years ago in another company.</p>
<p>12
00:02:37.400 --&gt; 00:03:06.440
Igal Tabachnik: and we reconnected recently. And we'll talk about that in a bit. So I spent sometimes also working in the area of code tools and developer tools. So building tools for developers which requires a very specialized set of skills. But in the recent years I've switched careers and worked primarily as a backend engineer in companies that primarily work on the Jvm. So my background in the last.</p>
<p>13
00:03:06.650 --&gt; 00:03:17.700
Igal Tabachnik: I want to say, 8 or 9 years was doing backend on Scala the language. So my my journey to rust is also a bit</p>
<p>14
00:03:17.910 --&gt; 00:03:20.130
Igal Tabachnik: different from maybe</p>
<p>15
00:03:20.260 --&gt; 00:03:30.489
Igal Tabachnik: that of other people who come from maybe C plus plus background to rust. I come from more of a functional language, and we'll talk about that. Shortly</p>
<p>16
00:03:30.650 --&gt; 00:03:51.360
Igal Tabachnik: and recently Ellie and I met and I joined Eureka. It didn't have to. It didn't, didn't take a lot to convince me to join Eureka primarily, because I knew that we're going to be developing in rust. And this is something I wanted to try. And the product itself is actually very interesting. And we'll talk about that in a bit.</p>
<p>17
00:03:52.510 --&gt; 00:03:57.539
Gabor Szabo: Yeah. So as I understand, I mean, I I actually also work with Ellie. I'm not in</p>
<p>18
00:03:57.850 --&gt; 00:04:00.480
Gabor Szabo: with him, but in the same company a couple of years ago.</p>
<p>19
00:04:00.920 --&gt; 00:04:03.350
Gabor Szabo: so we know each other from there.</p>
<p>20
00:04:04.349 --&gt; 00:04:17.759
Gabor Szabo: But I really would like to to hear a little bit more about the company. I mean, we haven't yet, so please enjoy what I know so far is it's a very young company. It's only exist a couple of months right.</p>
<p>21
00:04:18.680 --&gt; 00:04:30.190
Eli Shalom: Yeah. So in fact, we started working on on founding Eureka last year. We started with a very open goal like to improve</p>
<p>22
00:04:30.220 --&gt; 00:04:39.380
Eli Shalom: something in crypto or in blockchain, as a technology in general. And we are looking for a lot of areas where there are challenges which are both</p>
<p>23
00:04:39.410 --&gt; 00:04:51.440
Eli Shalom: interesting in the technological aspect of them, and most importantly, to convince the investors that it's worth coming to the company to have something with real essence, something where where there's enough money</p>
<p>24
00:04:51.440 --&gt; 00:05:10.680
Eli Shalom: today to work in. The reason I'm mentioning it is that a lot of companies in the blockchain deal with a greater challenge where they have to aim for the market, which will be there in a few years, and they have to speculate. And it's harder. And what we're working on is something which is active today there is a lot of</p>
<p>25
00:05:10.710 --&gt; 00:05:34.230
Eli Shalom: activity both in terms of traffic and in money. And this is where we are. So what Eureka is doing is we're building a new block builder for ethereum networks. And so one of the things I'm going to do is to give a little bit of explanations, and I'm more than willing to accept questions. Gabble on anything around it.</p>
<p>26
00:05:34.480 --&gt; 00:06:02.489
Gabor Szabo: Yeah. So I should play here the devil's advocate, I think and say that I don't know anything about this, and please explain. But it will be quite easy for me, because I really don't know anything about blockchain, so I will. So please also consider. I mean, I'm quite sure that in the audience here, and then later on, in the podcast there are going to be people who are experts in blockchain. But I'm also going to be a lot of people who don't know anything about it. So</p>
<p>27
00:06:02.790 --&gt; 00:06:19.400
Gabor Szabo: as we go, please also explain a little bit about it. Do I understand correctly that actually, you started the company without having any specific product or service in mind. Just you want to say, Okay, improve something in the area of blockchain.</p>
<p>28
00:06:19.920 --&gt; 00:06:42.040
Eli Shalom: That's the story we usually tell. It's not that we knew that it's going to be around block building, we knew, but it's going to be around one of the areas which suffer from over centralization. I'll elaborate on it in a second. But we weren't sure what exactly was going to be the product or what's going to be the and the length of the technology which we'll have to develop in order to</p>
<p>29
00:06:42.120 --&gt; 00:06:50.409
Eli Shalom: achieve whatever it's going to be eventually it got to be something a little bit ambitious, challenging to develop.</p>
<p>30
00:06:50.560 --&gt; 00:06:59.750
Eli Shalom: And and the reason for it is, and I'll have to explain a little bit what block builder is, and what block building is in blockchain.</p>
<p>31
00:06:59.750 --&gt; 00:07:01.440
Gabor Szabo: Okay, please. Please. Go ahead.</p>
<p>32
00:07:01.440 --&gt; 00:07:18.289
Eli Shalom: And so, blockchain as it sounds, it's a chain of blocks. So at every moment in the blockchain another block is added to the blockchain. And this is how the whole chain is being formed. So what does it mean to build a block or to add it to the chain?</p>
<p>33
00:07:18.290 --&gt; 00:07:31.509
Eli Shalom: So in every moment in the blockchain. Some people want to send their transactions to the ethereum network. Sending a transaction means that someone wants to run a smart contract, which is</p>
<p>34
00:07:31.510 --&gt; 00:07:44.579
Eli Shalom: a piece of code which can be verified before being executed, and can be verified about the actual execution it had, and it can be verified. So it means that if we have a smart contract.</p>
<p>35
00:07:45.040 --&gt; 00:07:58.219
Eli Shalom: and which, for example, promises that we can swap assets between us, then nobody can change this code. And once we run this code, everyone can verify that, it ran exactly as the code shows.</p>
<p>36
00:07:58.360 --&gt; 00:08:19.460
Eli Shalom: So that's something which sounds a little bit trivial or not very interesting, but when we look at a chain of transactions going into a single block, then they have a lot of side effects between them, because it's like a regular program. So when one transaction touches a variable</p>
<p>37
00:08:19.460 --&gt; 00:08:39.220
Eli Shalom: in the ethereum network, then every transaction which comes after that will see exactly this side effect. So it means that ordering the transactions is a challenge. And this is where it's becoming interesting. So when we're looking at the problem of block building, it's just a problem of</p>
<p>38
00:08:39.620 --&gt; 00:08:46.980
Eli Shalom: choosing a set of transactions and ordering them in the way which leads to the best or most valuable block.</p>
<p>39
00:08:47.620 --&gt; 00:09:05.039
Eli Shalom: So this is something which is going to be with too many details, so we'll skip it. But the nice thing which is easy to explain is that building a block is an Np-hal problem. It's both equivalent to the permutation optimization problem. And it's also a knapsack problem.</p>
<p>40
00:09:05.040 --&gt; 00:09:21.459
Eli Shalom: So we have to deal with Npr problem in order to be able to build a block. So this is the main premise of what we have to do. And the reason we're mentioning this and not anything else is. This is why we have to choose rust eventually.</p>
<p>41
00:09:21.570 --&gt; 00:09:39.649
Eli Shalom: And so, if we have to summarize this in the most oversimplified way, and building a block is the challenge of ordering a set of transactions or set of actions, and trying to predict or getting to the most valuable order of those transactions.</p>
<p>42
00:09:39.750 --&gt; 00:09:40.640
Eli Shalom: So</p>
<p>43
00:09:41.020 --&gt; 00:10:02.810
Eli Shalom: if you have to look at it, you can look at it as a kind of a black box, and we give to the black box a set of transactions or a set of actions in a specific order, and we get a value. And if we change this order, we will get a different value. And what we're looking for is the most valuable ordering which we can create in order to build a block.</p>
<p>44
00:10:03.530 --&gt; 00:10:08.489
Gabor Szabo: But who who builds the block? So I what I understood that there is the ethereum ethereum</p>
<p>45
00:10:09.370 --&gt; 00:10:25.259
Gabor Szabo: network, or or I don't know. It's a virtual machine or the the service that runs on many computers. Okay, I read a little bit about it in the last couple of days. And isn't that doing the the ordering of these blocks.</p>
<p>46
00:10:25.620 --&gt; 00:10:50.580
Eli Shalom: So the network itself is in charge of verifying that the blocks that the block builder created are, in fact valid, and can be satisfied as regular blocks which could be placed online and be checked by everyone else. So what we have is we have a few sets of very few block builders on ethereum. These are the entities which come before the transactions get to the blockchain itself.</p>
<p>47
00:10:50.770 --&gt; 00:11:03.170
Eli Shalom: So we are off chain where, before the things get to the blockchain. And we get those all those inputs. We try to create a list of transactions in a way which is forming a potential block.</p>
<p>48
00:11:03.450 --&gt; 00:11:27.369
Eli Shalom: And in every 12 seconds. In ethereum there is an auction, and every active block builder can propose the block to the network, and there is some kind of mechanism, how the block is being chosen, which practically says the most valuable block is being taken, and then the network goes to the validators and atchestrators who verify that the block is actually valid.</p>
<p>49
00:11:27.460 --&gt; 00:11:36.649
Eli Shalom: but it respects everything on the smart contracts, and that all the results that it shows are, in fact valid for the execution the transactions had.</p>
<p>50
00:11:37.070 --&gt; 00:11:57.490
Eli Shalom: So the block builder comes before the fury network, and before all the cool, decentralized entities it create. It creates a proposal for the network, and then the network chooses one of the proposals and verifies them with the nodes, validators, and other stakeholders.</p>
<p>51
00:11:58.100 --&gt; 00:11:58.520
Gabor Szabo: Okay.</p>
<p>52
00:11:58.520 --&gt; 00:12:17.119
Igal Tabachnik: So, if I may, I will also like to add so personally, I don't come from a background in blockchain. So I had to learn all this from scratch as well. Kind of a few months ago this was very new to me, and the way I understand it is very similar. It's very, very technical. But the idea is you have</p>
<p>53
00:12:17.420 --&gt; 00:12:44.590
Igal Tabachnik: kind of like an Internet, a blockchain that's designed for executing code in the blockchain space called smart contracts. Smart contracts can be money transfers between different people, or there could be pieces of actual code like actual state that's being executed safely and cryptographically verifiable way. So the flow is that there are millions, or there are many, many</p>
<p>54
00:12:44.750 --&gt; 00:12:59.239
Igal Tabachnik: hundreds of thousands of these transactions being created every second, and being placed in the network. What the blog builders do is they pick up those transactions from the ether pun intended from the network? We call them</p>
<p>55
00:12:59.240 --&gt; 00:13:15.450
Igal Tabachnik: orders, and then the the goal of this block builder of what we do is like, Ellie said, is to try and create the best and the most valuable ordering of these transactions. So once this block containing all of these transactions.</p>
<p>56
00:13:15.760 --&gt; 00:13:40.569
Igal Tabachnik: is created, we send it to those entities called the proposers. We propose the block, and then they can decide whether or not take this block. If they take this block, they can then publish it, and execute all of these transactions, and if not, every 12 seconds. This is the way the network works every 12 seconds. Everything repeats. So a new block is being created with new orders.</p>
<p>57
00:13:40.570 --&gt; 00:13:57.229
Igal Tabachnik: etc, etc. So the idea is that we are the block builder, the block builder, which is what we do at Eureka is the entity that's responsible for actually turning those many of those transactions that are floating out there. Take them.</p>
<p>58
00:13:57.600 --&gt; 00:14:02.410
Igal Tabachnik: order them in a way that they will be they. They will have the best chance of being picked up</p>
<p>59
00:14:02.810 --&gt; 00:14:04.590
Igal Tabachnik: and executed.</p>
<p>60
00:14:05.210 --&gt; 00:14:16.200
Igal Tabachnik: and and do it again and again and again, and so there are not too many entities out there that are called block builders. There are a couple of those. There are a couple of big names out there.</p>
<p>61
00:14:16.320 --&gt; 00:14:32.749
Igal Tabachnik: and what we're trying to do is we're trying to. We're trying to to become yet another blockbuilder that's hopefully going to be powerful enough by doing some optimizations in a way that we create the blocks.</p>
<p>62
00:14:33.760 --&gt; 00:14:36.079
Gabor Szabo: Okay, so basically, this log builder</p>
<p>63
00:14:36.680 --&gt; 00:14:46.940
Gabor Szabo: will run or can run on on your your servers if I understand. So it's nothing really to do with the rest of the computers that are running the the blockchain.</p>
<p>64
00:14:47.180 --&gt; 00:14:54.830
Gabor Szabo: They have some communication, but that it doesn't have to, and it can be either open source or proprietary right.</p>
<p>65
00:14:54.830 --&gt; 00:15:17.350
Igal Tabachnik: Yeah. And that's kind of the point, the idea, the whole kind of the biggest reason why we chose rust. And I will just say it up front is, it's kind of, was a decision that was made for us. So there are some open source. Big, open source projects that propose give you building blocks to build your own block builder.</p>
<p>66
00:15:17.650 --&gt; 00:15:36.219
Igal Tabachnik: So we essentially what we did, we forked that we, we took some existing open source infrastructure, and we forked it in a way that that we're adding our own modifications. But this, this entire infrastructure was written in rust.</p>
<p>67
00:15:36.970 --&gt; 00:15:45.320
Igal Tabachnik: and so we kind of went with that. So the rust kind of has a strong presence in the blockchain space for historical reasons.</p>
<p>68
00:15:45.700 --&gt; 00:15:52.610
Igal Tabachnik: But it's also very, very suitable, because in the end you're essentially, it's a server that gets deployed to the cloud</p>
<p>69
00:15:52.750 --&gt; 00:15:59.920
Igal Tabachnik: like real actual machines that run in aws or whatnot. And essentially, it's a, it's a</p>
<p>70
00:16:00.220 --&gt; 00:16:05.410
Igal Tabachnik: well, it's a network. It's a machine that listens to traffic on the, on the web.</p>
<p>71
00:16:05.720 --&gt; 00:16:09.900
Igal Tabachnik: on the ethereum network. But it's essentially a service that runs out there.</p>
<p>72
00:16:10.060 --&gt; 00:16:20.629
Gabor Szabo: So 2 2 questions. Come here. 1st of all, okay. So you forward. It is your code, or is it? Is it open source, or is it closed source, or how or what's going on with that.</p>
<p>73
00:16:21.440 --&gt; 00:16:44.569
Eli Shalom: Is closed. Source we. If we see bugs or or improvements which are general to a general block builder we submit it back to the, to the original fork. But when we are developing new features, which are the new features, are, be a little bit beyond block building, and take advantage of what people can do with it. And so these things are not</p>
<p>74
00:16:44.690 --&gt; 00:16:48.079
Eli Shalom: being opened open source.</p>
<p>75
00:16:48.470 --&gt; 00:16:49.880
Eli Shalom: So we leave them closed doors.</p>
<p>76
00:16:49.880 --&gt; 00:16:57.470
Igal Tabachnik: Yeah, okay, so the the license for it is, it's either Mit or Apache. So we we do submit.</p>
<p>77
00:16:57.470 --&gt; 00:17:21.579
Igal Tabachnik: We do submit a couple of fixes upstream. So basically, that thing is being developed in the open, and we submit patches to it when we, when we can, those things that are going to be useful for for the general audience. But we kind of extend the product. Extend the platform in a way that's proprietary. And we right now it's not open source.</p>
<p>78
00:17:21.760 --&gt; 00:17:37.200
Gabor Szabo: Okay? And then, so how? How do you earn money from this? Is it like, if your your block, if you're chaining, or whatever it's called. Your result is accepted. Then you earn some money. Do I understand correctly?</p>
<p>79
00:17:37.870 --&gt; 00:17:54.070
Eli Shalom: Yeah, this is exactly how it works. And when a block builder wins an auction, and and this block builder gets a fee, it's varying between every block, but depending on how valuable you made it. Then this is how much fee the block builder can take.</p>
<p>80
00:17:54.070 --&gt; 00:18:01.320
Gabor Szabo: Okay, so you have to be fast and clever. And yeah, basically, this, mostly these 2 things right?</p>
<p>81
00:18:01.885 --&gt; 00:18:02.450
Igal Tabachnik: Exactly.</p>
<p>82
00:18:02.450 --&gt; 00:18:03.030
Eli Shalom: That's.</p>
<p>83
00:18:03.030 --&gt; 00:18:08.850
Igal Tabachnik: Primarily, primarily the reason why you would want to pick a language like rust to do this because you want to be both.</p>
<p>84
00:18:08.970 --&gt; 00:18:13.350
Igal Tabachnik: Well, there are 3 things that you want to be. You want to be 1st and foremost correct.</p>
<p>85
00:18:13.470 --&gt; 00:18:34.809
Igal Tabachnik: You need to. You need to ensure, because we're dealing with things that depend on. Well, they are order, sensitive, they're hard, but they also have to be verifiable in the end. There's a lot of verification steps and a lot of a lot of cryptographic hashes that go on, and those calculations need to be both very, very fast</p>
<p>86
00:18:34.970 --&gt; 00:18:47.399
Igal Tabachnik: in terms of their execution. And also we have to be verifiably correct, which means that that when when the block that we create is going out to the network, we have to be able to</p>
<p>87
00:18:47.820 --&gt; 00:19:11.519
Igal Tabachnik: ensure that it contains exactly what we said that it will contain. And this is where rusts, for example, type system makes certain guarantees that that ensures that the block will be created correctly and and verifiably. So. We have a bunch of tests around it. But also the type system ensures that the structs contain just the data that that is expected.</p>
<p>88
00:19:12.280 --&gt; 00:19:30.020
Igal Tabachnik: And of course the performance because of it, because because rust is a very, very, it's a systems programming language in the end. So everything runs natively on the machine. There's no jit, there's no memory management. There's no garbage collection, so everything kind of runs very, very fast and</p>
<p>89
00:19:30.270 --&gt; 00:19:35.999
Igal Tabachnik: in a way that that's expected of something that that sits in the network and deals with high traffic.</p>
<p>90
00:19:36.560 --&gt; 00:19:39.359
Igal Tabachnik: The high deals with the high traffic essentially.</p>
<p>91
00:19:39.930 --&gt; 00:19:42.810
Gabor Szabo: Was there any consideration or</p>
<p>92
00:19:43.050 --&gt; 00:19:51.509
Gabor Szabo: so? Was there any consideration of using any other language, or it was so much given that that it it has. It was to be rushed</p>
<p>93
00:19:51.890 --&gt; 00:19:54.480
Gabor Szabo: that you didn't even think about other language.</p>
<p>94
00:19:54.690 --&gt; 00:20:05.739
Eli Shalom: So we did start with experimenting with other languages. So you, if surprisingly, we started with python, and we thought that we could just</p>
<p>95
00:20:05.980 --&gt; 00:20:16.649
Eli Shalom: do all the heavy lifting on mathematical operations with numpy and stuff like that. But it was far from the reality and the reality. There needs to be a lot of</p>
<p>96
00:20:16.900 --&gt; 00:20:29.679
Eli Shalom: real execution of code on Evm and Python will never get to the right performance. So this was an approach we had to ditch quite fast and the other competitor is go.</p>
<p>97
00:20:29.700 --&gt; 00:20:58.249
Eli Shalom: So a lot of projects are based in Go, and also one of the largest block builders in ethereum, also implemented in go, and the reason we had to choose between these 2 is whether there is a main entity called the node, which holds all the information in locally for the ethereum network. So when building a block, there needs to be a lot of access to the storage of the network, and it has to be</p>
<p>98
00:20:58.250 --&gt; 00:21:22.210
Eli Shalom: placed locally. And one of the things we realized that it's very efficient to write in the same language. And like the node we're walking with because they can share some code. They can share processes inside the same machine. And then they can share memory. So basically, the reason to choose rust was because the main node we're using is implemented in rust.</p>
<p>99
00:21:22.610 --&gt; 00:21:29.960
Eli Shalom: So this leads a lot of the choices of companies to work in blockchain to work with rust because</p>
<p>100
00:21:29.970 --&gt; 00:21:54.799
Eli Shalom: there's a main entity to work with. It can be communicated as a black box like in Http. Or it can. It has extensions where people can run things inside the same process of the node itself, and if we run our builder as close as we can to the node, and if we write it in last, and we can share the same memory, and then we can get the best in the best performance.</p>
<p>101
00:21:54.800 --&gt; 00:21:58.282
Igal Tabachnik: Yeah. And also there are additional benefits. For example,</p>
<p>102
00:21:58.820 --&gt; 00:22:20.249
Igal Tabachnik: the the node itself. It's called rus, RETH. So it's a rust implementation of the ethereum network. It's also open source, and it introduces a lot of libraries that we use internally, that provide you with primitives for the system, everything from holding, describing sums of money.</p>
<p>103
00:22:21.380 --&gt; 00:22:24.480
Igal Tabachnik: and yes, exactly. RATH. Reth.</p>
<p>104
00:22:24.480 --&gt; 00:22:29.280
Gabor Szabo: I just wrote the Free People listening to us. I just wrote it in the chat because I wasn't sure.</p>
<p>105
00:22:29.340 --&gt; 00:22:29.990
Igal Tabachnik: Yeah, yeah.</p>
<p>106
00:22:30.247 --&gt; 00:22:33.339
Gabor Szabo: And the. And so I'm going to put it on in the.</p>
<p>107
00:22:33.340 --&gt; 00:22:40.419
Igal Tabachnik: In fact, I made a bunch of links of things that we're going to mention, and maybe we can put them in the end as like a show notes.</p>
<p>108
00:22:40.630 --&gt; 00:22:42.520
Gabor Szabo: That would be a very good idea. Thank you.</p>
<p>109
00:22:42.960 --&gt; 00:23:08.489
Igal Tabachnik: So, yeah, the idea is that a lot of libraries that can be reused like with primitives, with abstractions, with, for example, if the ethereum network implements, a lot of protocols which are all published. They're all kind of described in white papers. It's all fascinating. Everything is kind of documented, and there are a bunch of different implementations, and the most popular ones are in go and rust.</p>
<p>110
00:23:08.530 --&gt; 00:23:23.440
Igal Tabachnik: And so the the rust implementations are really, they're very robust, and they're very, I would say, idiomatic to the rust language. So everything works as you would expect a real rust code to work. So, for example.</p>
<p>111
00:23:23.710 --&gt; 00:23:46.129
Igal Tabachnik: you have a bounce checking, and you have smart macros. So, for example, you have even things like addresses. If you want to send, like everything in ethereum is like an address from and to. So you have to know who you're sending from and who you're sending to, whether it's money or anything else. And this is just a big hacks number.</p>
<p>112
00:23:46.290 --&gt; 00:24:03.049
Igal Tabachnik: And so, in order for you not to spend any time parsing strings or just dealing with general validation of whether or not you were given a correct address. You just use a macro, for example, there's a macro in these building blocks called address bang.</p>
<p>113
00:24:03.050 --&gt; 00:24:20.959
Igal Tabachnik: which in compile time validates that you that you are using correct address. So it alleviates a lot of headaches and a lot of kind of these small mistakes that you can get with languages that are not as robust. Probably for dealing with this like, you can probably implement</p>
<p>114
00:24:21.020 --&gt; 00:24:25.869
Igal Tabachnik: any of these things in any other language, even like, obviously people do it in go.</p>
<p>115
00:24:25.920 --&gt; 00:24:41.199
Igal Tabachnik: But the added benefit of rust from my perspective, as somebody who uses daily is that all of these little patterns that the language encourages you to do like going through safe methods and and implementing safe conversions</p>
<p>116
00:24:41.230 --&gt; 00:25:00.830
Igal Tabachnik: ensures that you're less likely to make a mistake, especially when you're building payloads and parsing payloads at Runtime. You're more or less guaranteed that your execution will be flawless as long as you handle everything during compilation during design time of your program.</p>
<p>117
00:25:01.040 --&gt; 00:25:12.020
Igal Tabachnik: And this is again. This is one of the primary reasons why, in the end we chose rust is that there's this added guarantee of safety that the language is built upon.</p>
<p>118
00:25:12.430 --&gt; 00:25:16.090
Igal Tabachnik: It provides you with a lot of a lot of</p>
<p>119
00:25:16.220 --&gt; 00:25:22.039
Igal Tabachnik: functionality, so to speak, that ensures that many, many of these things</p>
<p>120
00:25:22.470 --&gt; 00:25:36.849
Igal Tabachnik: the compiler will handle for you, and if you're making a mistake, the compiler will aid you and tell you what exactly you're doing wrong, and so you will have much fewer runtime surprises, which is, in my opinion, is the the best possible thing that rost can do.</p>
<p>121
00:25:38.020 --&gt; 00:25:52.429
Gabor Szabo: Right back to a little bit for my understanding. You mentioned Node. That there are there are these nodes, isn't network is is just these notes. So when I say when you say the at the room at the room.</p>
<p>122
00:25:53.190 --&gt; 00:25:54.500
Igal Tabachnik: That. Yeah.</p>
<p>123
00:25:54.620 --&gt; 00:25:57.690
Gabor Szabo: When you say at the room, it's basically just the notes right.</p>
<p>124
00:25:57.690 --&gt; 00:25:58.280
Eli Shalom: Yes.</p>
<p>125
00:25:58.550 --&gt; 00:26:08.170
Gabor Szabo: Okay, so and so the the and it's an open as much as I understand. That's an open source project, basically right? Written in rust.</p>
<p>126
00:26:09.080 --&gt; 00:26:11.030
Gabor Szabo: So all these notes are written in rust.</p>
<p>127
00:26:11.420 --&gt; 00:26:13.819
Eli Shalom: So there are many implementations of the nodes.</p>
<p>128
00:26:13.820 --&gt; 00:26:14.630
Gabor Szabo: Okay.</p>
<p>129
00:26:14.630 --&gt; 00:26:17.190
Eli Shalom: The most popular ones are in. Go and rust.</p>
<p>130
00:26:18.070 --&gt; 00:26:25.150
Gabor Szabo: Okay? So the notes. So also there are different implementation of nodes. Not just the the block builders.</p>
<p>131
00:26:25.150 --&gt; 00:26:30.219
Eli Shalom: Yeah, there, there could be infinite implementations for the for the for the nodes.</p>
<p>132
00:26:30.220 --&gt; 00:26:35.350
Gabor Szabo: Okay. And then I guess there is some Api or some definition that that they must</p>
<p>133
00:26:35.640 --&gt; 00:26:37.890
Gabor Szabo: and work this way.</p>
<p>134
00:26:38.280 --&gt; 00:27:01.370
Igal Tabachnik: There's a spec basically on ethereum.org. You have the entire spec. All the white papers of many smart people wrote many years ago, and all of these things are just implementations, and yes, they have to agree on a common protocol and a common language. Essentially. In the end your payloads are encoded in. There's a special type of encoding.</p>
<p>135
00:27:01.940 --&gt; 00:27:06.569
Igal Tabachnik: There's a special type of encoding of how the actual raw data looks</p>
<p>136
00:27:06.790 --&gt; 00:27:16.910
Igal Tabachnik: on the on the wire, but every every implementation, whether it's go or or rust, or anything else. Really, I've seen. I've seen people do it in Javascript as well, of course.</p>
<p>137
00:27:17.200 --&gt; 00:27:19.749
Igal Tabachnik: because everything can be done in Javascript.</p>
<p>138
00:27:20.320 --&gt; 00:27:24.680
Igal Tabachnik: They all are able to to handle it and and talk to each other.</p>
<p>139
00:27:25.150 --&gt; 00:27:50.189
Gabor Szabo: So how do? How do they manage upgrades? I mean, if 1 1 of these notes so if they want to introduce a new service, or I don't know whatever new something into the network. Then someone implements it in one type of the notes, and and then the others don't know about it so, or they are not implemented yet. So not not only talking about, not even</p>
<p>140
00:27:50.470 --&gt; 00:27:52.530
Gabor Szabo: not talking about</p>
<p>141
00:27:53.060 --&gt; 00:28:03.820
Gabor Szabo: rolling out to the same code base, to maybe hundreds or thousands of nodes. Which itself is a is a is a problem. But if they're each node might be in different</p>
<p>142
00:28:04.410 --&gt; 00:28:06.589
Gabor Szabo: might be a different code base.</p>
<p>143
00:28:07.420 --&gt; 00:28:18.589
Gabor Szabo: Then how can they make make progress? Or what happens if what I mean? Okay? So you add the new feature, then it can't work yet, because the others</p>
<p>144
00:28:19.010 --&gt; 00:28:20.850
Gabor Szabo: don't understand it yet.</p>
<p>145
00:28:21.810 --&gt; 00:28:44.400
Eli Shalom: Yeah. So on the network, nobody can add a new feature on their own, and the idea for which there are many nodes is to get to a majority, and the right thing is always what the majority says. So if you have just one node which decides to deviate from the others, and this node will be disregarded, because it will always be the minority, and nobody will</p>
<p>146
00:28:44.550 --&gt; 00:28:52.350
Eli Shalom: take it seriously. Usually this node will get punished, and and the reputation will be harmed or slashed. I'm not exactly sure how they.</p>
<p>147
00:28:52.460 --&gt; 00:29:02.120
Eli Shalom: being incentivized not to do it, but a node can't, can decide on it on its own, to change the behavior and.</p>
<p>148
00:29:02.570 --&gt; 00:29:03.020
Gabor Szabo: Behind.</p>
<p>149
00:29:03.910 --&gt; 00:29:04.670
Eli Shalom: Yeah, but.</p>
<p>150
00:29:04.670 --&gt; 00:29:11.999
Gabor Szabo: Right. If if all of them are moving ahead to something, then then I also have to move, because otherwise I'll be different right?</p>
<p>151
00:29:12.000 --&gt; 00:29:36.389
Eli Shalom: Definitely so the idea of the majority holds all the time. So once a big change needs to come to ethereum. Usually it comes from the ethereum foundation, and they promote it through something called eap. It's an improvement proposal for ethereum. It takes very long time to get to an agreement, and once it's done and the spec of the nodes</p>
<p>152
00:29:36.390 --&gt; 00:29:42.940
Eli Shalom: changes, and then the community decides on a date in which all the nodes have to change to the new version.</p>
<p>153
00:29:43.950 --&gt; 00:29:44.620
Gabor Szabo: Hmm.</p>
<p>154
00:29:44.620 --&gt; 00:30:12.940
Igal Tabachnik: Yeah. So the idea? Yes, this is the protocol governed by the ethereum foundation and all the major upgrades to this to the way the protocol works has to be documented, agreed upon, discussed potentially for many years, until they finally pick up a code name which is usually a weird name of some sort, or maybe like a city. There was, I think there was something called London. Maybe I don't remember exactly. And yeah, they decide to switch.</p>
<p>155
00:30:13.040 --&gt; 00:30:31.269
Igal Tabachnik: And so yeah, so those things don't just nobody can really add a feature to the ethereum network because it has to be. It's like, it's like, I don't know. It's like would be adding a new feature to the Internet that would not make real like to Tcp, IP. It would have to go probably through.</p>
<p>156
00:30:31.610 --&gt; 00:30:49.609
Gabor Szabo: Yeah, yeah, yeah, those are the standards. Yeah. So you have to go with the standard. I mean, you could add the new service to the Internet, and you start doing with between 2 computers. But if if you want to change how the Tcp IP protocol works well, that good.</p>
<p>157
00:30:49.610 --&gt; 00:30:50.100
Igal Tabachnik: Live.</p>
<p>158
00:30:50.490 --&gt; 00:30:54.700
Gabor Szabo: Or how even what Http is, or whatever yeah, right?</p>
<p>159
00:30:54.700 --&gt; 00:30:55.710
Igal Tabachnik: Yeah, yeah.</p>
<p>160
00:30:57.385 --&gt; 00:30:58.580
Gabor Szabo: So</p>
<p>161
00:30:58.730 --&gt; 00:31:12.979
Gabor Szabo: what else? I wanted to ask something else about this? Oh, yeah. Yeah. How many notes are there? This is something that I was. How many notes are there in the network like more or less? It's thousands or millions or.</p>
<p>162
00:31:13.360 --&gt; 00:31:31.160
Eli Shalom: No, it's it's a lot. There are 1 million registered nodes which perform validation. It's something which forces them to be up and to be like a very active node. So there are just 1 million nodes of validators, and there are many 1 million of other nodes</p>
<p>163
00:31:31.300 --&gt; 00:31:37.309
Eli Shalom: which are just out just collecting data, storing them locally like we do. So it's a few millions.</p>
<p>164
00:31:37.700 --&gt; 00:32:04.510
Gabor Szabo: Okay. So the point is, or when I started to learn a little bit about about blockchain. And then I understood, okay, there's a majority decides. That's the point that more or less where I reached in my understanding. And then I was wondering, okay, fine majority decides. But if there is a wealthy person or a country that wants to overtake this whole thing. Then they can build.</p>
<p>165
00:32:04.730 --&gt; 00:32:12.970
Gabor Szabo: set up a lot of these machines, and I was wondering how, how big, how big that needs to be in order to become a majority.</p>
<p>166
00:32:13.370 --&gt; 00:32:18.000
Gabor Szabo: So I guess if it's a couple of millions, then then it's a lot.</p>
<p>167
00:32:18.350 --&gt; 00:32:23.539
Gabor Szabo: And I guess these are not simple machines, right? So they they</p>
<p>168
00:32:23.640 --&gt; 00:32:26.500
Gabor Szabo: very. They need to be very powerful machines, right?</p>
<p>169
00:32:26.870 --&gt; 00:32:27.750
Gabor Szabo: The notes.</p>
<p>170
00:32:28.107 --&gt; 00:32:57.040
Eli Shalom: They're not like the smallest or cheapest machines, but it's not like a like Aws machines of 5,000 bucks a month. Usually it's like medium sized machines with a lot of storage like holding the node takes a few terabytes of data, which is usually where most of the cost comes. And this is what makes it also very, very challenging to spin up a node. Take about 48 to 72 h until it becomes synced until it</p>
<p>171
00:32:57.602 --&gt; 00:33:01.730
Eli Shalom: takes all the information from other nodes and verifies it.</p>
<p>172
00:33:02.530 --&gt; 00:33:03.130
Gabor Szabo: Okay.</p>
<p>173
00:33:03.170 --&gt; 00:33:15.490
Igal Tabachnik: Because because also, yeah, you have to remember that the the idea behind the blockchain in general is because it is immutable. Everything that happened is historical and cannot cannot ever change, because it was</p>
<p>174
00:33:15.490 --&gt; 00:33:24.099
Igal Tabachnik: it was reached like a consensus was reached that this node, this this block, was placed on the network, and it will be there forever.</p>
<p>175
00:33:24.100 --&gt; 00:33:46.479
Igal Tabachnik: In order for you to modify, you have to create a new one. And so basically, the latest version will be the current, but historically you can always look ahead, and every time you need to spin up a new server or a new node, or whatever you have to fetch all of the historical data from you have to pre-populate it. And this is what that means that it takes a lot of time and a lot of storage.</p>
<p>176
00:33:46.670 --&gt; 00:33:54.349
Gabor Szabo: So the the existing chain that there is all the the chain of the blocks that already have. That's a couple of terabyte of data already.</p>
<p>177
00:33:54.770 --&gt; 00:33:55.400
Eli Shalom: Yep.</p>
<p>178
00:33:56.420 --&gt; 00:34:03.099
Gabor Szabo: And how long that has accumulated like 10 years. Right, I think, at the room, at the wrong.</p>
<p>179
00:34:03.509 --&gt; 00:34:05.660
Eli Shalom: I would say probably. Yes, but I'm not sure.</p>
<p>180
00:34:06.120 --&gt; 00:34:25.689
Gabor Szabo: So I was wondering, okay, it's just going to grow more and more. And then, okay, a lot of disk space is going to be used. My understanding is that basically, this is very similar to what? How the data of git looks like, except, of course, without branching.</p>
<p>181
00:34:26.370 --&gt; 00:34:33.260
Gabor Szabo: Now, the ability to go back in storage.</p>
<p>182
00:34:33.860 --&gt; 00:34:34.730
Gabor Szabo: Sorry.</p>
<p>183
00:34:34.730 --&gt; 00:34:38.080
Eli Shalom: We don't have the way to go back like in in git. So versioning.</p>
<p>184
00:34:38.080 --&gt; 00:34:46.250
Gabor Szabo: So indeed you could you could you? Could you could remove all the recent commits and and whatever here we I mean</p>
<p>185
00:34:47.020 --&gt; 00:34:52.670
Gabor Szabo: the same here. You could do this if you could convince all of enough notes right.</p>
<p>186
00:34:52.670 --&gt; 00:34:52.975
Eli Shalom: Yep.</p>
<p>187
00:34:53.750 --&gt; 00:34:57.129
Gabor Szabo: Basically. And okay.</p>
<p>188
00:34:57.570 --&gt; 00:35:07.400
Gabor Szabo: interesting. So let's get back to rust a little bit. And and you, so how did you get started with rust?</p>
<p>189
00:35:09.780 --&gt; 00:35:11.510
Igal Tabachnik: Do you mean me, or Ellie?</p>
<p>190
00:35:11.740 --&gt; 00:35:13.870
Gabor Szabo: One after another.</p>
<p>191
00:35:14.580 --&gt; 00:35:22.220
Igal Tabachnik: All right. I think I'll start then. So, like I mentioned earlier, my my journey to Rust was a bit different. So over the past.</p>
<p>192
00:35:22.360 --&gt; 00:35:52.110
Igal Tabachnik: I want to say. Almost 10 years I've been dealing with well, dealing. Dealing is a choice word. I've been working primarily with Scala and through Scala, which is a language on the Jvm kind of it's this hybrid, object-oriented, functional language I discovered functional programming and functional programming became something that I really fell in love with, and so I later learned Haskell and other kind of languages that belong to that family.</p>
<p>193
00:35:52.630 --&gt; 00:36:20.429
Igal Tabachnik: and through functional programming I discovered many of the benefits that kind of were pioneered in functional languages, and then picked up by every other programming language in the world. So, for example, things like virtual threads or green threads, as they're known in other languages. They were 1st introduced in Haskell, and then they were pioneered in Scala, and now Java has them, and of course, rust have them in</p>
<p>194
00:36:20.430 --&gt; 00:36:24.529
Igal Tabachnik: basically Tokyo is the implementation of virtual threads</p>
<p>195
00:36:24.680 --&gt; 00:36:44.340
Igal Tabachnik: and the whole notion of immutability and working with immutable data and transformations, like in C sharp, they would be called link. In other languages they would be called working with collections and lambdas and iterators. There was kind of all of these features were kind of</p>
<p>196
00:36:44.540 --&gt; 00:36:57.339
Igal Tabachnik: I wouldn't say pioneered, but they were heavily, heavily used in functional languages primarily, because you don't have as many variables and and and mutation going on. So you have chains and transformations of data.</p>
<p>197
00:36:57.820 --&gt; 00:36:58.973
Igal Tabachnik: And so</p>
<p>198
00:37:00.680 --&gt; 00:37:25.849
Igal Tabachnik: unfortunately, I want to say, like, I'll be frank, that unfortunately, Scala is notoriously hard to teach because of that, because you can use it as a kind of a Java with this different syntax. But this does not really give you that much of a benefit, especially today when you have languages like Kotlin, or other things that work on the Jvm. That don't necessarily require the full power of a language like Scala.</p>
<p>199
00:37:26.060 --&gt; 00:37:34.979
Igal Tabachnik: and so many, many companies that were previously using Scala. They're kind of not really starting new projects on that. So they're kind of moving away.</p>
<p>200
00:37:35.020 --&gt; 00:37:59.460
Igal Tabachnik: And so I was actually looking to do some more Scala, and it was becoming challenging. And so my options were either to go kind of into the mainstream and do maybe a little bit of Kotlin, or even typescript. And there are not a whole lot of choices for doing backend engineering, but most of it revolves today around</p>
<p>201
00:37:59.460 --&gt; 00:38:05.950
Igal Tabachnik: Java and Kotlin and typescript on the back end. There's some python, probably.</p>
<p>202
00:38:06.180 --&gt; 00:38:35.609
Igal Tabachnik: or I really wanted to look at this language called rust, because what I knew of rust is that it was yes, it was kind of a type, safe, very performant language that was created by Mozilla for a certain purpose. But what I knew of rust is that it was designed in a way that it borrowed a lot of features from functional languages. In particular. If you look at the way that rust is designed, it borrows a lot of ideas from, for example, from Haskell.</p>
<p>203
00:38:35.630 --&gt; 00:38:40.380
Igal Tabachnik: which is which is known to be like a pure functional language.</p>
<p>204
00:38:40.460 --&gt; 00:39:10.010
Igal Tabachnik: But in rust, for example, the derivation mechanism. So the way that you attach essentially behavior to structs with the derived keyword. This is an exact copy of a feature from Haskell. It's called type classes, but this is a feature that was that exists in Haskell and was adapted to many other programming languages. And, in my opinion, this is one of the most amazing features that rust has, because it allows you to precisely define behavior to a set of</p>
<p>205
00:39:10.010 --&gt; 00:39:17.199
Igal Tabachnik: a set of structure, a set of traits, essentially, traits become behaviors, and you can apply them</p>
<p>206
00:39:17.640 --&gt; 00:39:30.200
Igal Tabachnik: externally to the data. So, whereas you have in many object oriented languages, you are encouraged to kind of create behavior and data together in the same class.</p>
<p>207
00:39:30.580 --&gt; 00:39:51.219
Igal Tabachnik: in function, languages in rust. Specifically, you are encouraged to keep them separate. So you have structs that hold just the data, and you have traits and implementations of those traits as behaviors which can be attached and reattached and and defined, and most importantly verified at compile time.</p>
<p>208
00:39:51.790 --&gt; 00:40:08.670
Igal Tabachnik: So 1 1 such example is that something I've encountered yesterday. So I was refactoring a piece of code, and I needed to store 2 new fields, or at least one new field of type float. I needed the floating point number to be stored in a configuration somewhere.</p>
<p>209
00:40:09.040 --&gt; 00:40:16.560
Igal Tabachnik: I got a compilation error that said I cannot use, derive Eq. Derive equality</p>
<p>210
00:40:16.650 --&gt; 00:40:40.509
Igal Tabachnik: for a type F. 64. And this makes complete sense. You cannot. Computers do not like comparing floating point numbers. This is an impossible problem. Now, there are many, many programming languages that are happily going to let you compare 2 floating point numbers, and the end result will probably not be what you need. What you expect, so you will have some issue with Runtime.</p>
<p>211
00:40:40.620 --&gt; 00:40:52.500
Igal Tabachnik: but Rust was smart enough to figure out that you cannot derive equality for the entire config class, because the float type F, 64 does not implement the IC trait.</p>
<p>212
00:40:52.710 --&gt; 00:41:02.510
Igal Tabachnik: And this is why you get a compilation error, and it makes perfect sense. And the point is that in rust I found that many, many of these things are like this.</p>
<p>213
00:41:02.840 --&gt; 00:41:03.675
Igal Tabachnik: So</p>
<p>214
00:41:04.520 --&gt; 00:41:19.460
Igal Tabachnik: I'm just going to say that that people who are coming to Russ. They hear stories about this compiler and the borrow checker being in your way constantly, and you and you have to kind of fight the borrow checker, so to speak, to, to get</p>
<p>215
00:41:19.460 --&gt; 00:41:35.550
Igal Tabachnik: to get to the point. But I think that's the wrong way of looking at it. I think the compiler is there obviously to prevent invalid behavior invalid programs undefined behavior. So this is one of the core principles of rust is to be safe. The safety is achieved by</p>
<p>216
00:41:35.960 --&gt; 00:41:39.689
Igal Tabachnik: it's preventing you from doing things that will obviously not work.</p>
<p>217
00:41:40.240 --&gt; 00:41:58.120
Igal Tabachnik: and many, many smart people created it. And I've seen many talks by the creators of Rust, by Grayden Hoare, who talks about the kind of the history and why they did things the way that they did. But the main idea is that rust borrows many of those features from</p>
<p>218
00:41:58.310 --&gt; 00:42:08.630
Igal Tabachnik: languages that have strong and static type systems that kind of are in your way. But in order for you to to prevent you from doing kind of the wrong thing.</p>
<p>219
00:42:09.390 --&gt; 00:42:35.839
Igal Tabachnik: And finally, I'm going to say that one such mention about the borrow checkers. This is something I heard from a friend who does not do any rust. He's a scholar programmer. But he asked me, don't you get to fight the borrow checker a lot, and I would say that this notion of fighting the borrow checker is kind of a meme. It's kind of a myth in the rust world, because it is being sold as this kind of</p>
<p>220
00:42:36.140 --&gt; 00:42:49.220
Igal Tabachnik: this kind of novelty feature that the rust compiler has. It has this notion of a borrow checker. But the idea there is that because it has manual memory management, you don't want to be doing things that are wrong.</p>
<p>221
00:42:49.440 --&gt; 00:43:10.099
Igal Tabachnik: So if you want to pass a mutable variable to another function. You have to explicitly allow it to to be to be passed as mutable because somebody can modify it under your feet. And the scholar, the rust compiler is smart enough to detect such cases and tell you, no, you're doing something very, very wrong.</p>
<p>222
00:43:10.280 --&gt; 00:43:12.960
Igal Tabachnik: and so it's not there to to kind of</p>
<p>223
00:43:13.640 --&gt; 00:43:22.490
Igal Tabachnik: prevent you from doing stuff. It's there to guide you of saying, Okay, I know what you're trying to do, but there are ways of doing it, and you better, so better stick to the ways.</p>
<p>224
00:43:22.640 --&gt; 00:43:33.460
Igal Tabachnik: And finally, the last kind of it's more of a philosophical thing that I'm going to say is that there's this notion again, coming from functional languages. It's it's a thing that's called.</p>
<p>225
00:43:33.900 --&gt; 00:43:50.620
Igal Tabachnik: It's based on a very good talk that I watched many years ago. It's this notion of constraints, liberate and liberties constrain. So the idea is that if you don't have any constraints and you can do just whatever you want like in in</p>
<p>226
00:43:50.670 --&gt; 00:44:13.329
Igal Tabachnik: other programming languages. Javascript. So if you don't have any constraints whatsoever, so you can do just whatever you want, which means you can do it in any way that you want in any style that you want, in any order that you want, probably. And then what you have is down the line. You will have problems. You will have runtime issues. You will have refactoring challenges, and you will have many, many things that we know and love about</p>
<p>227
00:44:13.420 --&gt; 00:44:14.949
Igal Tabachnik: to languages like Javascript.</p>
<p>228
00:44:15.560 --&gt; 00:44:31.210
Igal Tabachnik: Now, if you have a system that's constrained, it does not let you do what you want, but it rather expects you to follow its exact kind of guidelines and its exact path that it guides you through, that there are very, very few ways in which you can implement something. So</p>
<p>229
00:44:31.800 --&gt; 00:44:46.129
Igal Tabachnik: this notion of of constraints. Liberate is is that when you are constrained kind of it sounds paradoxical, but when you are constrained by by the the system that you are building it by the type system, by the the borrow checker or whatnot.</p>
<p>230
00:44:46.350 --&gt; 00:44:52.860
Igal Tabachnik: You are then free to kind of implement it in the only way that will work. And so you don't have to worry about that.</p>
<p>231
00:44:53.200 --&gt; 00:45:05.420
Igal Tabachnik: And that's for me. That's just one of the the most tremendous benefits of using a language like rust, and also I'll have to give credit where credit is due. Also languages like Scala and languages like</p>
<p>232
00:45:05.730 --&gt; 00:45:21.399
Igal Tabachnik: Haskell, of course, and there are some some other languages that on the Microsoft side there's F sharp. Many, many functional languages embrace this principle, and, of course, type system really helps. So if you don't have types to guide you. You have to write a lot of tests.</p>
<p>233
00:45:21.520 --&gt; 00:45:48.959
Igal Tabachnik: and we can debate whether or not writing tests is a fun activity. Now that ais can do it for us. But I would say that types from my perspective come before tests. They can prevent many, many of invalid behaviors even making writing these tests unnecessary for things that cannot possibly compile. Okay, and with that I'm going to stop talking for now. And, please, if you have any, follow ups, I would.</p>
<p>234
00:45:48.960 --&gt; 00:45:58.789
Gabor Szabo: Yeah. So before letting Ellie also say, I wanted to ask you, how did you solve that problem with the floating point, comparing floating numbers?</p>
<p>235
00:45:58.790 --&gt; 00:45:59.520
Gabor Szabo: Oh.</p>
<p>236
00:45:59.670 --&gt; 00:46:21.149
Igal Tabachnik: Well, well, the point is, I needed to store a percentage a multiplier for a percentage. I ended up storing it as just as just a decimal number of, I just switched it to a U to U, 64, I used a different multiplier, essentially. But yeah, it's just one of these things.</p>
<p>237
00:46:22.280 --&gt; 00:46:23.040
Gabor Szabo: Okay.</p>
<p>238
00:46:23.360 --&gt; 00:46:24.090
Gabor Szabo: Good.</p>
<p>239
00:46:25.170 --&gt; 00:46:32.530
Igal Tabachnik: So I changed. Yeah, I changed the data type. Essentially, I didn't try to hack around the problem. I just, I solved it using a different data type.</p>
<p>240
00:46:35.920 --&gt; 00:46:56.269
Eli Shalom: So I guess my version is going to be a little bit more dull, but it's going to go through the same main theme of the language guiding us towards the right thing. So when we started working with Russ, it was the 1st time we coded in the language, and both my partner and I didn't code.</p>
<p>241
00:46:56.340 --&gt; 00:46:57.240
Eli Shalom: and</p>
<p>242
00:46:57.290 --&gt; 00:47:18.670
Eli Shalom: in that intensity for a very long time, especially me as a data science, I didn't do such things for a very, very long time. And when we started working on the software it was something which did a lot of things in parallel. We got a lot of data from many sources in parallel. We had to do a lot of computations in parallel and store them back to the same sources in parallel.</p>
<p>243
00:47:18.670 --&gt; 00:47:28.339
Eli Shalom: And one of the things we started feeling at the beginning is that we're fighting the Borough checker all the time, and that it's just interfering with our work.</p>
<p>244
00:47:28.450 --&gt; 00:47:46.360
Eli Shalom: Eventually, like probably something which happens to most rust developers. We started to figure out what's the right thing to do when we need to clone an object when we have to show it with an arc, and when we have to use a lock to show the object between different components</p>
<p>245
00:47:46.360 --&gt; 00:47:58.600
Eli Shalom: and one of the things which really impressed us after the 1st month was that it was a very large system in regards to the amount of parallelization it did, and it had no locks at all</p>
<p>246
00:47:58.730 --&gt; 00:48:19.469
Eli Shalom: in any software, in any other language I use. I was going to write and use a mutex in many places to to synchronize, and here, because the language just encourages the developers to think about who owns each object, it just led us to write it in a way which didn't require any lock.</p>
<p>247
00:48:19.470 --&gt; 00:48:29.090
Eli Shalom: and the performance was great, not just because it was rust, also because it had no locks, and we didn't have to wait in any place which we wouldn't have happened</p>
<p>248
00:48:29.520 --&gt; 00:48:31.859
Eli Shalom: in probably any other language we used.</p>
<p>249
00:48:33.460 --&gt; 00:48:40.839
Gabor Szabo: Very interesting, very interesting. Okay, so let's go further with Rust. You said that</p>
<p>250
00:48:41.020 --&gt; 00:48:48.880
Gabor Szabo: part of the reason you selected rust is because, or part of the advantages that you have from rust is that you have a lot of libraries</p>
<p>251
00:48:49.010 --&gt; 00:48:56.080
Gabor Szabo: crates that you can already use because they are part of the the node. Basically right?</p>
<p>252
00:48:56.230 --&gt; 00:48:58.810
Igal Tabachnik: So those are given.</p>
<p>253
00:48:59.070 --&gt; 00:49:13.529
Gabor Szabo: That are part of the node, and you're going to use it. And and whatever I mean, even even there might be, the question is, is valid, but I'm quite sure that you have also all kind of other crates that you are using. I mean, every rust project uses hundreds of crates.</p>
<p>254
00:49:13.530 --&gt; 00:49:13.930
Igal Tabachnik: Right.</p>
<p>255
00:49:13.970 --&gt; 00:49:21.484
Gabor Szabo: How do you? How do you? How do you? How do you select the create? How do you make sure?</p>
<p>256
00:49:22.500 --&gt; 00:49:23.889
Gabor Szabo: it's quality?</p>
<p>257
00:49:24.050 --&gt; 00:49:30.290
Gabor Szabo: Yeah. Well, that's a very good question. I will say that at least until now.</p>
<p>258
00:49:30.560 --&gt; 00:49:57.839
Igal Tabachnik: Because because the the platform itself that we that we are basing upon it was already kind of it, more or less, batteries included. It has everything that we would need to to kind of build upon upon it. It's an SDK, essentially so. I I don't remember if we needed to add an external crate other than possibly, I think it was like</p>
<p>259
00:49:58.190 --&gt; 00:50:24.179
Igal Tabachnik: some data types for that have to do with with ethereum protocols like we, we needed to to bring in one more protocol that we needed to support, and I think there was a crate for that. But but it's just a matter of you know, Googling, for rust, and whatever it is you're looking for and looking at top. 2 results. Now, I would say that most of the the crates that are used. They are used mostly by reputation.</p>
<p>260
00:50:24.440 --&gt; 00:50:42.159
Igal Tabachnik: so I wouldn't say necessarily number of stars. But it's more like a word of mouth thing that if you. For example, if you're building a cli tool and you need a command line argument, parser. So you would probably use clap. Why? Because everybody uses clap. And this is like in every book and every tutorial.</p>
<p>261
00:50:42.540 --&gt; 00:50:57.739
Igal Tabachnik: And so, if you need, obviously, if you need a synchrony, you would use Tokyo, and I know that there are other implementations, but they are maybe not as not as as powerful, or maybe not as as popular.</p>
<p>262
00:50:57.970 --&gt; 00:51:16.860
Igal Tabachnik: Maybe they have their uses, but Tokyo seems to be kind of the I wouldn't say Standard Library, but it's kind of the de facto thing that everybody else uses, and of course you need to think about interoperability. So to answer the question, I would say, if we needed to, we would probably choose it by reputation. So</p>
<p>263
00:51:17.120 --&gt; 00:51:41.230
Igal Tabachnik: how popular it is, whether or not it's registered in the official website. Can I even pull it from like? Can I even add it to my toml file and just rebuild and everything will compile. Or do I need to add some 3rd party, github Urls to my, to my configs, to pull it from source stuff like that.</p>
<p>264
00:51:41.230 --&gt; 00:51:44.499
Gabor Szabo: You encounter encounter Chris like that, I mean I.</p>
<p>265
00:51:44.500 --&gt; 00:51:49.170
Igal Tabachnik: But I suppose that there are private implementations somewhere that do not are not published.</p>
<p>266
00:51:49.340 --&gt; 00:51:53.340
Igal Tabachnik: I, personally haven't encountered that yet, but I'm.</p>
<p>267
00:51:53.340 --&gt; 00:52:04.929
Gabor Szabo: Item number that I encountered is that that you can't just Pip installs the latest, or from single app only. But you have to go to that there I encountered. But maybe that's fortunately, because</p>
<p>268
00:52:05.550 --&gt; 00:52:09.919
Gabor Szabo: I don't know, because Python is older and more and.</p>
<p>269
00:52:09.920 --&gt; 00:52:18.490
Igal Tabachnik: And rusted becomes very easy, because version pinning is very important, like you have the log files, and and I think I think</p>
<p>270
00:52:18.760 --&gt; 00:52:36.550
Igal Tabachnik: from many like package management software that I've used over the years. I think Ross did it really great because it it kind of works. And and it tells you what the latest versions are. It figures out mismatched versions between like, if you have dependencies between crates.</p>
<p>271
00:52:37.540 --&gt; 00:52:51.030
Igal Tabachnik: the rust will tell you, and enabling features independently. So if you, for example, you needed to enable Tokyo for a certain crust, if it supports it, then they have certain crate.</p>
<p>272
00:52:51.820 --&gt; 00:52:52.710
Igal Tabachnik: I think.</p>
<p>273
00:52:53.560 --&gt; 00:53:17.999
Igal Tabachnik: like I think, that they did a really good job, like rust, in my opinion, is one of the most well engineered languages that provides you with developer productivity. There are very few like the only one I can possibly think of that that does at least as good job is a language called elm, which is a web language. That's also kind of functional, and it also has its roots in</p>
<p>274
00:53:18.000 --&gt; 00:53:28.659
Igal Tabachnik: Haskell, like syntax, but its package management and its errors are just amazing. It will tell you exactly what happened and how to solve it.</p>
<p>275
00:53:28.710 --&gt; 00:53:32.250
Igal Tabachnik: and, in fact, kind of jumping is an aside.</p>
<p>276
00:53:32.470 --&gt; 00:53:47.559
Igal Tabachnik: Rust's errors are notoriously yes, they can be overwhelming sometimes, but they're notoriously so detailed is that you have AI tools today that just figure all the errors out and explain to you what went wrong</p>
<p>277
00:53:47.560 --&gt; 00:54:09.469
Igal Tabachnik: and just fix it for you. This is something I encounter daily, even if I don't want it. Sometimes I do encounter an issue with borrowing or stuff like that, or forgetting to clone something. So sometimes I want to get my task done. So I don't really want to think about it. So I just press the little icon</p>
<p>278
00:54:09.470 --&gt; 00:54:27.019
Igal Tabachnik: in my intelligent, it tells me fix with AI, and it just does. Why? Because it has a lot of context for what went wrong, and the Llms are now smart enough to kind of feed this context. Read this context and just figure it out and give me all the information. So I don't have to Google. I don't have to read docs.</p>
<p>279
00:54:27.160 --&gt; 00:54:31.639
Igal Tabachnik: It's it's it's it's really an amazing flow that</p>
<p>280
00:54:32.450 --&gt; 00:54:39.589
Igal Tabachnik: it's just incredible to me. I've been doing software for many years now, and and I don't remember anything remotely</p>
<p>281
00:54:39.920 --&gt; 00:54:45.259
Igal Tabachnik: advancing in this in this incredible rate, like like AI and AI, assisted tools.</p>
<p>282
00:54:46.620 --&gt; 00:54:49.220
Gabor Szabo: About the AI. Let's.</p>
<p>283
00:54:50.300 --&gt; 00:54:51.550
Igal Tabachnik: It was topic to topic.</p>
<p>284
00:54:51.550 --&gt; 00:54:52.030
Igal Tabachnik: Yep.</p>
<p>285
00:54:52.950 --&gt; 00:54:55.389
Gabor Szabo: No, no, I'm I'm glad we're talking about AI. That's it.</p>
<p>286
00:54:55.470 --&gt; 00:55:08.559
Gabor Szabo: Okay. So I wanted to ask about AI, if you're already talking about this, how much do you use? AI, which AI tools do you have you experienced? With which one do you feel the best</p>
<p>287
00:55:09.740 --&gt; 00:55:13.190
Gabor Szabo: for? Especially for us? Development? Of course.</p>
<p>288
00:55:13.620 --&gt; 00:55:15.750
Igal Tabachnik: Sure, Eddie, you want to go first.st</p>
<p>289
00:55:15.750 --&gt; 00:55:17.450
Eli Shalom: No, no, that's yours.</p>
<p>290
00:55:17.740 --&gt; 00:55:41.310
Igal Tabachnik: So I will kind of make a jab at Ali that he's the he's the AI person in the company, because the amount of time he spends explaining things to Chatgpt. It's amazing. But I will mention this from from my perspective, as somebody who's like a developer that's being introduced to AI assisted tools. So</p>
<p>291
00:55:42.200 --&gt; 00:55:53.800
Igal Tabachnik: I'll skip to the end. Today I'm preferring to use mostly coding agents, such as Claudecod, and recently a new tool called Amp. From</p>
<p>292
00:55:54.180 --&gt; 00:55:56.380
Igal Tabachnik: I always forget the name</p>
<p>293
00:55:57.030 --&gt; 00:56:22.470
Igal Tabachnik: sourcegraph, which is a company that also they make products for understanding and analyzing and navigating code a lot so. But now they came up with their own agentic. AI. And this is something that's really that took an incredible kind of it exploded with incredible rate in the past couple of months, really from my perspective.</p>
<p>294
00:56:22.710 --&gt; 00:56:34.319
Igal Tabachnik: But to to go back to AI 1st when Google's co-pilot was introduced. Yes, it was nice. It was kind of a predictive code completion thing. So</p>
<p>295
00:56:34.320 --&gt; 00:56:55.570
Igal Tabachnik: many people enabled it, as long as they didn't have to pay for it. So after it became a paid product, some people stayed with it. Some people didn't. I had value from it, because when I was working with Scala it helped me to fill in the boilerplate. Scala does have some boilerplate that you have to do, and so I paid out of my own pocket</p>
<p>296
00:56:55.690 --&gt; 00:57:00.830
Igal Tabachnik: initially for Github copilot, just to keep it working</p>
<p>297
00:57:01.230 --&gt; 00:57:14.799
Igal Tabachnik: and to keep churning up this boilerplate. Eventually we switched to a company subscription, and then the tools became smarter and smarter, and I started to realize that they do</p>
<p>298
00:57:15.040 --&gt; 00:57:34.220
Igal Tabachnik: understand your code better every time. So they keep this context. I needed an explanation from the Resident AI expert, Ellie. He needed to explain to me how what are tokens and how all of this stuff works. And it's it's really, truly incredible how Llms essentially are built.</p>
<p>299
00:57:34.960 --&gt; 00:58:04.160
Igal Tabachnik: But the idea, the idea there is that the more context you have, the more code of your own you can shove into the AI the better results the better predictions you're going to have. And predictions are what AI's do. They do not understand the code themselves. They understand what is the next likely token to emit, so most likely they will emit the correct thing. And so over the months over the last, I don't know. Maybe a couple like</p>
<p>300
00:58:04.210 --&gt; 00:58:10.089
Igal Tabachnik: I want to say 5 or 6 months that I've been using AI with rust, I see much less</p>
<p>301
00:58:10.370 --&gt; 00:58:31.970
Igal Tabachnik: almost none of hallucinations that typically come with with using Llms. So, for example, Llms, like even like copilot, or or even tools from Chatgpt. They don't necessarily. When they don't know something they will just make something up. They will make Api that does not exist, and they will. They will just suggest you to do things that that are just</p>
<p>302
00:58:32.080 --&gt; 00:58:33.859
Igal Tabachnik: impossible, for example.</p>
<p>303
00:58:34.080 --&gt; 00:58:46.399
Igal Tabachnik: And since switching, trying different models, and and lately I've been using Cloud's model a lot sonnet 3.7. And then. Now last week they released 4.0.</p>
<p>304
00:58:46.940 --&gt; 00:59:10.759
Igal Tabachnik: And so ever since switching to that, I've been seeing, much less hallucinations. And it really does solve the issues. And also in a way that's straight to the point. No, not too many explanations. But then they just give me actionable solutions to, for example, compilation errors, or sometimes they just want to. For example.</p>
<p>305
00:59:10.940 --&gt; 00:59:38.189
Igal Tabachnik: let's see, I just, for example, even I want to to create a struct that derives whatever debug and clone it. Just sometimes, instead of typing out the struct the code, I will just type create a struct for whatever deriving all these things, and it will just think for 2 seconds and just do it for me. So yes, I find AI used to be an incredible assistant, and I do think that we are at least in the beginning of</p>
<p>306
00:59:39.150 --&gt; 00:59:42.900
Igal Tabachnik: I don't even I don't even want to say paradigm shift, because</p>
<p>307
00:59:43.140 --&gt; 00:59:55.960
Igal Tabachnik: I think it's too big of a too big of a term for this. But I really don't remember anything kind of anything like this in in the recent years that that also explodes in</p>
<p>308
00:59:56.230 --&gt; 01:00:08.099
Igal Tabachnik: in in the way that what's the word I'm looking for kind of improves every single time every week. There's some sort of marginal, some sort of major improvement that just</p>
<p>309
01:00:08.750 --&gt; 01:00:14.759
Igal Tabachnik: I wouldn't. I wouldn't. I don't know if I would be able to go working without AI assisted tools anymore.</p>
<p>310
01:00:15.050 --&gt; 01:00:20.020
Igal Tabachnik: because it's just when you figure out the flow. It's just a huge time saver.</p>
<p>311
01:00:20.140 --&gt; 01:00:28.180
Igal Tabachnik: for example, I do. Instead of Googling. I don't remember the last time I googled anything. I use perplexity, which is another AI kind of</p>
<p>312
01:00:28.290 --&gt; 01:00:56.580
Igal Tabachnik: kind of AI aggregator that does searches for you and scans many websites and gives you actionable to-do lists. So every time I need to search for something, I don't go Google it. I just go to perplexity or sometimes chat gpt when I need the dialogue, and I find myself using using it more and more. Now, of course, all of these tools cost money, and I'm sometimes happy for my personal use. I'm happy to pay for these things because I do get the value from them.</p>
<p>313
01:00:56.670 --&gt; 01:01:16.760
Igal Tabachnik: It wasn't like that, with many kind of developer assisted tools. Funnily enough, Ellie and I used to work for a tooling company and selling tools to other developers is very hard. Tooling companies are notoriously difficult to sell like one. The biggest kind of success I can think of is probably Jetbrains.</p>
<p>314
01:01:16.890 --&gt; 01:01:19.869
Igal Tabachnik: which which is able to sell ids.</p>
<p>315
01:01:20.000 --&gt; 01:01:24.850
Igal Tabachnik: But there are now talks about ideas being a thing of the past.</p>
<p>316
01:01:25.460 --&gt; 01:01:33.830
Igal Tabachnik: Now, whether or not it's a hyperbole I don't know, but I do find many, many compelling reasons to</p>
<p>317
01:01:34.300 --&gt; 01:01:57.649
Igal Tabachnik: shift the loop to outside of the Id. The Id is there to just read through the code, maybe use some syntax highlighting and do maybe analyzing of the work that was done, but the main part of the work is being done by AI, which is exciting and scary at the same time. I'm sorry I kind of went into answering</p>
<p>318
01:01:57.860 --&gt; 01:02:07.440
Igal Tabachnik: other imaginary set of questions, but but that's that's where I stand. I really like AI, and I do feel that it brings a lot of value to my day to day.</p>
<p>319
01:02:09.640 --&gt; 01:02:11.689
Gabor Szabo: Andy, would you like to add add something to this.</p>
<p>320
01:02:12.000 --&gt; 01:02:26.939
Eli Shalom: So one thing, which is, was one of the pains a year ago. So when we started working with rust and chatgpt, and we felt with both of us, my partner and I don't know rust. We coded a lot in rust, but we don't know rust.</p>
<p>321
01:02:27.060 --&gt; 01:02:47.020
Eli Shalom: which was the 1st language I encountered this. It's also the 1st language I learned after the explosion of Llms. So this was like something which was very troubling, and less than a year after that. And so today was the 1st time I had a ticket which was done solely by an agent.</p>
<p>322
01:02:47.030 --&gt; 01:02:57.879
Eli Shalom: So my whole thing, my whole work in the ticket was just to copy paste the the Jira ticket into Amp code, and that's it. And the implementation was the right. In the 1st place.</p>
<p>323
01:02:58.380 --&gt; 01:03:00.220
Eli Shalom: it went online.</p>
<p>324
01:03:00.560 --&gt; 01:03:05.040
Eli Shalom: Even, we have an AI in Github which also reviews the Pr.</p>
<p>325
01:03:05.160 --&gt; 01:03:10.389
Eli Shalom: It gave a small comment, fixed it by itself. And that's it. I didn't do anything in the ticket</p>
<p>326
01:03:10.510 --&gt; 01:03:34.190
Eli Shalom: other than copy pasting the the Jira ticket into the into the prompt. This was something which was exciting, so I still don't know. How do I feel about the worry from last year we but I want no rust, because I don't know rust. Well, probably there are many, many good developers who do it way better than me. But</p>
<p>327
01:03:34.390 --&gt; 01:03:42.630
Eli Shalom: maybe I don't need to know rust that well in the future, because an agent will complement everything which I don't know how to do.</p>
<p>328
01:03:42.870 --&gt; 01:03:43.840
Eli Shalom: So</p>
<p>329
01:03:44.240 --&gt; 01:03:54.539
Eli Shalom: I wonder what will be the the conclusion in a year or 2 from now. But it's a very different experience than anything in the previous 2 decades. In coding.</p>
<p>330
01:03:57.220 --&gt; 01:04:04.529
Gabor Szabo: Very interesting. So I'm not sure if the next question is even relevant anymore. I wanted to ask you.</p>
<p>331
01:04:04.650 --&gt; 01:04:11.599
Gabor Szabo: I'm guessing, or I was guessing earlier that you're looking for more developers being a startup.</p>
<p>332
01:04:12.050 --&gt; 01:04:15.900
Gabor Szabo: And then I wanted to ask you, okay, what would</p>
<p>333
01:04:16.030 --&gt; 01:04:22.909
Gabor Szabo: a person who wants to apply to or or get picked up by you.</p>
<p>334
01:04:23.640 --&gt; 01:04:38.950
Gabor Szabo: What could what should they invest in in if they had like one month now to prepare, or 1 2 months to to be a better candidate for you. But I am wondering now, do you even really need more people, or you're just</p>
<p>335
01:04:39.340 --&gt; 01:04:43.590
Gabor Szabo: sit down, ride the tickets, and then you click 2 buttons, and it's done.</p>
<p>336
01:04:43.590 --&gt; 01:04:46.150
Igal Tabachnik: The official term for this is vibe coding.</p>
<p>337
01:04:46.340 --&gt; 01:04:47.040
Gabor Szabo: Yeah.</p>
<p>338
01:04:47.040 --&gt; 01:04:49.540
Igal Tabachnik: Semi-official.</p>
<p>339
01:04:49.810 --&gt; 01:04:50.570
Igal Tabachnik: Yep.</p>
<p>340
01:04:50.890 --&gt; 01:05:15.139
Eli Shalom: So there is a very good question regarding this. So there's 1 thing, but many tickets are still very hard to develop. They're conceptually hard algorithm behind them to implement are not the trivial, and they're new by nature, and I believe it. An agent or any of them won't be able to implement them end to end at the beginning. So someone with deep understanding of</p>
<p>341
01:05:15.370 --&gt; 01:05:29.939
Eli Shalom: coding engineering infrastructure will still be very relevant. And there's something which Eagle uses a lot when we're talking about rust developers, they're self selecting. So not many people go to learn and develop in rust by themselves.</p>
<p>342
01:05:30.090 --&gt; 01:05:42.489
Eli Shalom: And like, probably I'm an exception, because I didn't have to choose it last. Chose me. But many people just go there and and and decide they want to be Russ. And usually these are people with a great</p>
<p>343
01:05:42.560 --&gt; 01:05:52.600
Eli Shalom: passion for coding internals. Understanding. It's not a language we people come because it's very elegant, or the code looks very nice in the syntax.</p>
<p>344
01:05:52.660 --&gt; 01:06:20.370
Eli Shalom: so I guess one of the things is that people who want to join the team are people who really really love rust and have passion to it, and want to learn more of it and do a lot. Another aspect which is probably unique to us is that the context of ethereum development is also quite challenging, because practically what we're doing is we're developing or working on something which executes a code of another, of</p>
<p>345
01:06:20.410 --&gt; 01:06:35.029
Eli Shalom: of another virtual machine of another language. So one of the things which are very important are people who also like coding in general, and some experience in ethereum is very helpful like to understand the Protocols, how it works, how the virtual machine works.</p>
<p>346
01:06:35.080 --&gt; 01:06:40.820
Eli Shalom: It gives a lot of advantage and reduces a lot of the pain in the work.</p>
<p>347
01:06:41.320 --&gt; 01:06:56.140
Gabor Szabo: Okay? So I guess the answer would be, now that okay, so if there is a rust developer and she or he wants to join your team because they really like the idea. Then they should invest in learning at their own, and and try to</p>
<p>348
01:06:56.380 --&gt; 01:06:58.719
Gabor Szabo: learn that, for example, right.</p>
<p>349
01:06:58.720 --&gt; 01:07:01.000
Eli Shalom: Yeah, that's 1 of the things which helps most.</p>
<p>350
01:07:01.000 --&gt; 01:07:06.730
Gabor Szabo: Okay, that's sort of like the internal things would, would</p>
<p>351
01:07:07.050 --&gt; 01:07:25.100
Gabor Szabo: would like contributing to open source project. Be something that you look at the people. So if I go and contribute to open source projects, would that be something like a good point for me, or you don't care about that too much?</p>
<p>352
01:07:25.300 --&gt; 01:07:38.319
Eli Shalom: So we give it a little bit of good points, especially to anyone who works in open source. It reflects something of the excitement and passion of the of the developer. But the main thing we saw that, like real experience, like</p>
<p>353
01:07:38.640 --&gt; 01:07:53.309
Eli Shalom: having been post, the fight of the borrow checker is usually where people have more advantage with their experience. So some experience in real work with rust is is the thing we will mostly looking for.</p>
<p>354
01:07:55.720 --&gt; 01:08:09.910
Gabor Szabo: Okay. And then, finally, I would like to change a little bit the direction of the audience. And, by the way, we didn't have any question from the audience. So the people who are present. So if you would like to ask anything, just please type in chat.</p>
<p>355
01:08:10.100 --&gt; 01:08:11.210
Gabor Szabo: Awesome.</p>
<p>356
01:08:13.780 --&gt; 01:08:31.690
Gabor Szabo: But I wanted to ask. That means, from my point of view, the last question we are still waiting for the for the guest is to the audience of other managers or entrepreneurs who try to set up their own startup company.</p>
<p>357
01:08:32.590 --&gt; 01:08:33.690
Gabor Szabo: How would you?</p>
<p>358
01:08:34.189 --&gt; 01:08:37.149
Gabor Szabo: What would you tell them when, when selecting</p>
<p>359
01:08:37.350 --&gt; 01:08:40.720
Gabor Szabo: rust or not rust? I mean for you. It was a little bit</p>
<p>360
01:08:41.540 --&gt; 01:08:52.639
Gabor Szabo: less of a choice, though you did try, python, but what what point should they consider? Better to use rust or not?</p>
<p>361
01:08:53.229 --&gt; 01:09:05.659
Eli Shalom: So from my point of view, the main challenge is the lack of talent. So there are very few people, and locally, but also globally, and we've enough experience in in rust</p>
<p>362
01:09:05.759 --&gt; 01:09:25.809
Eli Shalom: and men. And because a lot of those people joined many startups, especially in the in in our area, in blockchain companies. So the and the fight and competition over over talent is is very difficult. So it means that it's going to be a price that the startup is going to pay. So</p>
<p>363
01:09:25.859 --&gt; 01:09:48.229
Eli Shalom: if a startup can choose to take a different language like a simpler one, even C-shop, then the chance to finding developers more easily is significantly higher, and going with rust means that at least for the next year or 2, and getting talent is going to be challenging.</p>
<p>364
01:09:48.369 --&gt; 01:10:04.939
Eli Shalom: So that's the main thing. I'd say we like the language. We found that the ecosystem is rich enough to support almost everything we need. So it's like very like that. We it fills everything we need. Just we don't have enough people to</p>
<p>365
01:10:05.029 --&gt; 01:10:25.899
Eli Shalom: we to be honest. We just managed to hire all the people we needed for the team, but it was we had to sweat a lot, for it was more challenging than we expected, and also I'm not sure that in regards to choosing it as a language to just a general back end and</p>
<p>366
01:10:26.139 --&gt; 01:10:31.279
Eli Shalom: service system. I'm not sure that that's the right language to use like more</p>
<p>367
01:10:31.499 --&gt; 01:10:40.379
Eli Shalom: infrastructure, like processes, things with which needs to work with high load probably justified a little bit better.</p>
<p>368
01:10:41.230 --&gt; 01:11:03.209
Igal Tabachnik: Yeah, I actually do want to add, because I think we kind of discussed this question ahead of time. And also me personally, I was responsible. In the previous company I was responsible for training and mentoring Scala developers. Now Scala and Rust are pretty much in the same boat, with regards to scarcity of talent.</p>
<p>369
01:11:03.320 --&gt; 01:11:22.239
Igal Tabachnik: It's a difficult language to pick up. And and and there are many, many way way. Kind of more forgiving languages out there. So why, why specifically rust, or why specifically, Scala. So I guess if you have needs now again rust was developed. So I'm going to say like</p>
<p>370
01:11:22.680 --&gt; 01:11:46.709
Igal Tabachnik: 2 things. 1st of all, if you don't have ras talent and and but you really need to. You can hire, and you. You should hire quality engineers with a good resume and good kind of yes, open source. Open source contributions are always kind of welcomed. But we're generally looking for people who creative thinkers and problem solvers and and people who can, just</p>
<p>371
01:11:46.710 --&gt; 01:11:55.199
Igal Tabachnik: they know how to learn things, and I am pretty sure they can pick up any language fast.</p>
<p>372
01:11:55.400 --&gt; 01:12:10.420
Igal Tabachnik: So the goal is, make your own kind of invest. So this is what we're trying to do. We're trying to also invest in training resources in material for making our own rust developers eventually.</p>
<p>373
01:12:10.530 --&gt; 01:12:17.490
Igal Tabachnik: whether or not we need to buy books or or courses, or do internal kind of sessions and and stuff like that. So</p>
<p>374
01:12:17.510 --&gt; 01:12:46.230
Igal Tabachnik: this is all part of the growing of the company that all companies in early stage should invest in. But I will say, however, the negative, if there's 1 kind of why not pick rust is exactly like Eddie mentioned. I think that if your primary product is just a back end web server, you need to handle like web requests or serve websites. I might think that rust</p>
<p>375
01:12:46.450 --&gt; 01:13:14.219
Igal Tabachnik: might be a slight overkill for that. Yes, you can. You can use an Http framework and serve it. But there's going to be way. Too much friction for getting things done quickly. I mean, you would much rather have a Jvm. Based language like Kotlin or Scala, obviously, or even typescript. There are many, many great big companies that do backends on typescript today, and it just works. And it's very, very fast, I would say, if you're a company that develops servers.</p>
<p>376
01:13:14.500 --&gt; 01:13:43.670
Igal Tabachnik: products like that have to run and serve a lot of connections and a lot of be under high loads all the time. Things like Redis, for example, which is also written in rust, or being rewritten in rust. There are many other companies that I know that develop these tools, or if you primarily need to work on a commodity or a commodity hardware. For example, if you need to deploy products like browsers, for example, to end customers</p>
<p>377
01:13:43.730 --&gt; 01:13:55.769
Igal Tabachnik: who might not have very fast machines. You might consider a language like rust or a native language that will compile to a small executable, and be very, very fast.</p>
<p>378
01:13:55.930 --&gt; 01:14:07.660
Igal Tabachnik: But of course you could pick a language like C sharp for that. Again, there are. There are trade trade-offs in in many of them, from my perspective and kind of to. To conclude this.</p>
<p>379
01:14:07.940 --&gt; 01:14:09.759
Igal Tabachnik: I would say, it's</p>
<p>380
01:14:10.040 --&gt; 01:14:14.730
Igal Tabachnik: in the end you have to decide as a manager, as as an engineering manager. What's kind of</p>
<p>381
01:14:14.890 --&gt; 01:14:21.590
Igal Tabachnik: you have to pick one out of the 2 options, whether you prefer correctness</p>
<p>382
01:14:21.770 --&gt; 01:14:25.259
Igal Tabachnik: or do you prefer well anything else</p>
<p>383
01:14:25.330 --&gt; 01:14:31.819
Igal Tabachnik: like how important it is to to have a bug-free experience for you like. If you place it higher up.</p>
<p>384
01:14:31.880 --&gt; 01:14:51.289
Igal Tabachnik: then you should probably pick a language like rust that will prevent you from having runtime surprises if I say so, if you use it correctly. Of course there's many gotchas in rust like, if you use it incorrectly like, if you unwrap everywhere, which is the wrong way of using rust. But many people do, because it</p>
<p>385
01:14:51.290 --&gt; 01:15:10.150
Igal Tabachnik: it lets them compile the code. So no unwrapping is the exact wrong thing to do. And until people realize that they will be using rust wrong and they won't get any benefit from it. They will see that it's actually it's not protecting them from anything. They will have runtime panics.</p>
<p>386
01:15:10.280 --&gt; 01:15:29.199
Igal Tabachnik: They need to learn to understand that unwrapping is not what you do, for instance, and it's a learning curve, like, like with many languages. I think rust has an additional learning curve, because it introduces a couple of novel ideas that do not exist in many languages, like people coming from Java, or even C, plus plus.</p>
<p>387
01:15:29.320 --&gt; 01:15:40.979
Igal Tabachnik: They don't necessarily know of all of these mechanisms, for, you know, separating data with behavior, for example, derivation or or things like</p>
<p>388
01:15:42.030 --&gt; 01:15:48.610
Igal Tabachnik: even the macro system works would work differently, I suppose, like, I said, there's learning curve you have to invest in it, and</p>
<p>389
01:15:48.810 --&gt; 01:15:52.030
Igal Tabachnik: it's it's a it's a matter of of a trade-off.</p>
<p>390
01:15:52.300 --&gt; 01:16:08.530
Igal Tabachnik: But but the bottom line is that if you make servers, you probably want to look into rust. If you make general backend servers like serving websites, you would likely do better with using a less difficult language to to master.</p>
<p>391
01:16:10.990 --&gt; 01:16:16.950
Gabor Szabo: Okay, thank you very much. I ran out of questions. And</p>
<p>392
01:16:17.050 --&gt; 01:16:30.999
Gabor Szabo: and our audience is rather silent today. And do you have anything else that you wanted to talk about, that you think that I should have asked earlier, and I didn't.</p>
<p>393
01:16:33.340 --&gt; 01:17:00.219
Igal Tabachnik: Well, 1st of all, I just wanted to thank you again for inviting us. This is really fun, and I like to geek out about this stuff. Sometimes it's very difficult for me to stop talking, and so hopefully. The reason there are no questions is that I inadvertently answered them all hopefully or not. We'll find out, maybe from feedback on this episodes when it comes out.</p>
<p>394
01:17:00.350 --&gt; 01:17:01.250
Igal Tabachnik: And</p>
<p>395
01:17:02.060 --&gt; 01:17:13.169
Igal Tabachnik: but but I think we covered a lot. I think the questions were great. And I'm looking forward for this podcast to run for many, many years and have many, many great guests. And</p>
<p>396
01:17:13.210 --&gt; 01:17:33.689
Igal Tabachnik: maybe before we leave, I will provide our socials, and how to reach us. If there are any, follow up questions I would be more than happy to answer even mail or or Twitter X, or even even just a private private zoom. That's also always welcomed. I'm happy to talk about these things.</p>
<p>397
01:17:34.230 --&gt; 01:17:39.800
Gabor Szabo: Okay, sir, you want to say them, or we'll just add them to.</p>
<p>398
01:17:39.800 --&gt; 01:17:45.270
Igal Tabachnik: Maybe I will. She should probably add them, because my my nicknames are weird. I have to spell them out.</p>
<p>399
01:17:45.530 --&gt; 01:17:48.909
Gabor Szabo: Okay, Ellie, you wanted to add something.</p>
<p>400
01:17:49.340 --&gt; 01:18:05.709
Eli Shalom: And so I don't have anything to add, and just have to say that I'm really excited, that a new community of rust is being built and people are attracted to it. It's a very exciting language, very exciting technology being built with it in many projects. And we're very happy that this forum exists.</p>
<p>401
01:18:07.240 --&gt; 01:18:16.319
Gabor Szabo: Well, I I really thank you very much for for being here, and and all kind of really fun, information, and and insight you we got</p>
<p>402
01:18:16.440 --&gt; 01:18:26.519
Gabor Szabo: and thank you for the audience, who was listening silently here and thank you for everyone who is listening, who is listening to the podcast</p>
<p>403
01:18:26.690 --&gt; 01:18:29.589
Gabor Szabo: there are going to be</p>
<p>404
01:18:29.980 --&gt; 01:18:36.770
Gabor Szabo: show notes is all kind of links, so please follow them, and thank you very much. Goodbye. Bye-bye.</p>
<p>405
01:18:36.770 --&gt; 01:18:37.739
Eli Shalom: Thank you. Bye.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust at Work a conversation with Ran Reichman Co-Founder and CEO of Flarion</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-05-15T07:00:01Z</updated>
    <pubDate>2025-05-15T07:00:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-at-work-flarion" />
    <id>https://rust.code-maven.com/rust-at-work-flarion</id>
    <content type="html"><![CDATA[<p><a href="https://rustacean-station.org/episode/ran-reichman/">Listen to the recording</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/CVQ5Eve2G4c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>Guest: <a href="https://www.linkedin.com/in/ran-reichman-740163b7/">Ran Reichman</a> Co-Founder &amp; CEO of <a href="https://www.flarion.io/">Flarion</a></li>
<li>Host: <a href="https://szabgab.com/">Gabor Szabo</a></li>
<li>Language: English</li>
<li>Location: Zoom</li>
</ul>
<p>In this conversation we'll discuss the use of Rust at Flarion.</p>
<p>Ran is co-founder and CEO of Flarion, a company building high-performance data processing systems using Rust.</p>
<p>Prior to Flarion, Ran built high-scale data processing systems in cybersecurity, autonomous vehicles, and cloud infrastructure.</p>
<h2 class="title is-4">Transcript</h2>
<p>1
00:00:02.840 --&gt; 00:00:25.500
Gabor Szabo: Hello and welcome to the Code-maven live meeting. And if you're listening to the podcast then it's supposed to be the rustation station. If everything goes well, then, this conversation is going to be uploaded there as well. My name is Gabor Sabo. I usually help companies with rust</p>
<p>2
00:00:25.800 --&gt; 00:00:45.769
Gabor Szabo: and python, and in this series of of meetings and conversations I try to discuss with guests how the the title is rost at work, so I'm trying to understand how people use rust at work, and</p>
<p>3
00:00:45.980 --&gt; 00:00:51.359
Gabor Szabo: what are the considerations? What are the advantages? Maybe disadvantages? And so on.</p>
<p>4
00:00:51.610 --&gt; 00:00:59.340
Gabor Szabo: And this time the 1st guest is Ron Reichman from Florian, Hi Ron.</p>
<p>5
00:00:59.720 --&gt; 00:01:01.610
Ran Reichman: Hello, yeah. It's great to be here.</p>
<p>6
00:01:02.710 --&gt; 00:01:06.595
Gabor Szabo: Thank you for accepting the invitation, and</p>
<p>7
00:01:07.530 --&gt; 00:01:17.960
Gabor Szabo: let's get started. I think the 1st thing should be is that you you introduce yourself. We actually never met. So it's gonna be a 1st for me as well.</p>
<p>8
00:01:18.450 --&gt; 00:01:25.170
Ran Reichman: Okay, excellent. Yeah. So thanks again for for having me here and excited for this chat.</p>
<p>9
00:01:26.269 --&gt; 00:01:46.930
Ran Reichman: I'm Ron Reichman, a co-founder, and CEO with clarion. And what we do is at Clarion is we're a data processing company building solutions to accelerate and make data processing much more efficient, especially at large scale of the big data which means usually like</p>
<p>10
00:01:47.928 --&gt; 00:01:53.750
Ran Reichman: terabytes, tens of terabytes, hundreds of terabytes. But we support a wider range of workloads.</p>
<p>11
00:01:53.930 --&gt; 00:02:01.579
Ran Reichman: And yeah, we're definitely a rust shop and lots to talk about in terms of why rust, how we use rust, etc.</p>
<p>12
00:02:03.090 --&gt; 00:02:14.739
Gabor Szabo: Can. Can you tell a little bit about your about your background? And this is a startup company, right? How long, how long? How long is the company? And what did you before? And how did you get there? That's that's sort of the.</p>
<p>13
00:02:16.080 --&gt; 00:02:31.519
Ran Reichman: Yeah, it's a great question. So I'm born and raised in Israel and in the army. I was in the program which has recently become more famous, thanks to the whiz founders that are also graduates spent about 8 years</p>
<p>14
00:02:31.730 --&gt; 00:02:37.570
Ran Reichman: in various intelligence units, low level development stuff like that.</p>
<p>15
00:02:38.384 --&gt; 00:02:51.085
Ran Reichman: Then went on to work on a on a news startup briefly, and then spent about 4 and a half years in the in the United States and working on</p>
<p>16
00:02:51.900 --&gt; 00:02:56.640
Ran Reichman: on autonomous vehicles and on cloud infrastructure.</p>
<p>17
00:02:57.424 --&gt; 00:03:04.729
Ran Reichman: So I had a chance to work at Roblox, which has a data at a very significant scale, and before that, at embark trucks.</p>
<p>18
00:03:04.950 --&gt; 00:03:09.610
Ran Reichman: and for the past 2 and a half, 2 years or so I've been working on what is now clarion.</p>
<p>19
00:03:11.050 --&gt; 00:03:11.715
Gabor Szabo: Okay,</p>
<p>20
00:03:12.540 --&gt; 00:03:18.980
Gabor Szabo: So it's flaring is is 2 years. And and when did you start using rust? Or when did you get</p>
<p>21
00:03:19.140 --&gt; 00:03:26.519
Gabor Szabo: to start? Yeah with rust. Was it in Florian, or or already you started to use rust earlier.</p>
<p>22
00:03:27.520 --&gt; 00:03:39.599
Ran Reichman: So I'm my. My background is C, plus, plus. I have a ton of ton of experience with the C plus plus. And when I started building Clarion. I knew that I was that I was interested in in using rust.</p>
<p>23
00:03:40.009 --&gt; 00:03:46.669
Ran Reichman: Because primarily, I mean, there's there are several reasons that we can go into, but that that's when I started going.</p>
<p>24
00:03:48.270 --&gt; 00:04:06.279
Gabor Szabo: Yeah, I'm definitely interested in in in. Why did you start? Why did you think that is good for for this company? And this is a startup company. So one of the things that I hear sometimes that it's not maybe not such a good language for startups.</p>
<p>25
00:04:09.420 --&gt; 00:04:32.499
Ran Reichman: Yeah. So I I would disagree. I think I think it's a good language for startups. I'd say 3 main reasons that we're using spark that we're using rust here at the flare on the 1st is we're connecting to existing data infrastructure for our customers, and our customers have a very high expectations in terms of reliability.</p>
<p>26
00:04:33.603 --&gt; 00:04:36.929
Ran Reichman: So it's a</p>
<p>27
00:04:37.596 --&gt; 00:04:46.779
Ran Reichman: it's a it's a quite a significant advantage. The fact that we don't really have to worry about the memory, memory, corruption, and everything that that entails.</p>
<p>28
00:04:47.090 --&gt; 00:04:49.459
Ran Reichman: so that that that was one thing</p>
<p>29
00:04:50.017 --&gt; 00:05:06.560
Ran Reichman: the second is, there's quite a lot of interesting infrastructure today in the rust world. There's also a lot of great stuff in C, plus plus. But things like polars, like data fusion. These are open source projects that we were happy to plug into and integrate with.</p>
<p>30
00:05:06.760 --&gt; 00:05:31.820
Ran Reichman: And the 3, rd which is an interesting one is that we kind of like the people who are into rust. So what we do at flare on is kind of it requires a lot of out of the box, thinking it requires trying out new systems, new ideas, and oftentimes the kind of people the kinds of people that are interested in the working in rust are also the kinds of people that we want to have at Larry on. Those were the 3 main reasons.</p>
<p>31
00:05:33.550 --&gt; 00:05:34.460
Gabor Szabo: Okay.</p>
<p>32
00:05:34.520 --&gt; 00:05:55.609
Gabor Szabo: Before I go, continue with this. Actually, I would like to ask something about this. I would like to mention that, unlike other podcasts or conversations, or whatever we have here, where there's only 2 people speaking here, we have a few other guests who are watching us and listening to us.</p>
<p>33
00:05:55.610 --&gt; 00:06:13.769
Gabor Szabo: and I would like, and though they can't speak, but they can definitely ask questions in the chat. So I would like to invite everyone who is present that if you have any questions, just type in the question, and I'm going to take care, and we are going to. I'm going to ask those questions here as well.</p>
<p>34
00:06:13.790 --&gt; 00:06:20.239
Gabor Szabo: So here already we have the the 1st questions from the from the audience is, Have you considered other languages.</p>
<p>35
00:06:21.470 --&gt; 00:06:26.619
Ran Reichman: Yeah. So my, my, I definitely considered other languages. The default for me was to use the C plus plus</p>
<p>36
00:06:28.390 --&gt; 00:06:42.050
Ran Reichman: I have a lot of good things to say about C, plus plus. I'm definitely not a hater of the language. I think so so much over the existing infrastructure. Of the of the software world was built on on top of C, plus plus</p>
<p>37
00:06:42.532 --&gt; 00:06:49.617
Ran Reichman: but yeah, I think the 3 the 3 reasons that I mentioned or pushed us towards Ross.</p>
<p>38
00:06:50.730 --&gt; 00:06:52.339
Ran Reichman: but yeah, and.</p>
<p>39
00:06:52.340 --&gt; 00:07:08.300
Gabor Szabo: Okay, I'm actually especially interested in the 3rd one that you mentioned of the the type of people. I think that was the the 3rd one. So can you describe what? How would you describe this this type, or how do they? How do they differ from? I don't know</p>
<p>40
00:07:08.480 --&gt; 00:07:09.360
Gabor Szabo: others.</p>
<p>41
00:07:10.050 --&gt; 00:07:20.130
Ran Reichman: Yeah, so any generalization is wrong. Right? So there there are. It's it's hard to categorize people for sure. But what we've seen</p>
<p>42
00:07:20.240 --&gt; 00:07:43.149
Ran Reichman: is that when people are curious about rust they're usually just curious people. They hear about a new technology, and they want to understand it better. And they want to try it out, and they wanna explore it. And we're a company fundamentally what we do like if if we zoom out is we look at it as like receiving high level instructions</p>
<p>43
00:07:43.753 --&gt; 00:07:47.960
Ran Reichman: from our customers like this is what I wanna achieve with my data.</p>
<p>44
00:07:48.280 --&gt; 00:07:54.179
Ran Reichman: And then under the hood, we, we might use different engines, different technologies, different techniques.</p>
<p>45
00:07:54.741 --&gt; 00:08:09.439
Ran Reichman: So we're we're we have a very broad stack in terms of things that we need to understand and support. So we really want people who are curious about new technology and want to adopt a different and interesting technologies. Yeah.</p>
<p>46
00:08:10.460 --&gt; 00:08:18.469
Gabor Szabo: Okay. So there's another question here which is actually jumping a little bit ahead, asking about Flurry and and get on, Github, which</p>
<p>47
00:08:18.960 --&gt; 00:08:26.850
Gabor Szabo: it was sort of planned to be that I asked later on whether any of any part of Florian is open source.</p>
<p>48
00:08:27.330 --&gt; 00:08:30.509
Gabor Szabo: and and if if he has done, where is it?</p>
<p>49
00:08:30.760 --&gt; 00:08:31.890
Gabor Szabo: Hey? Welcome.</p>
<p>50
00:08:31.890 --&gt; 00:08:32.789
Ran Reichman: Yeah, so</p>
<p>51
00:08:33.679 --&gt; 00:08:51.449
Ran Reichman: excellent question. We're huge fans of open source. And we also build on top of open source. We don't currently have a public repository. We do, do a lot of contributions particularly to projects like a data fusion and arrow</p>
<p>52
00:08:52.087 --&gt; 00:08:59.859
Ran Reichman: so that that's mostly our involvement in open source that like, we were heavy users of existing technologies. And we're able to push them to the limit</p>
<p>53
00:09:00.060 --&gt; 00:09:13.719
Ran Reichman: and find interesting bugs, edge cases, etc. And yeah, and unpack them, unpack them, debug them and issue pull requests. So we have. We have quite a bit of those in the in the open source. Ecosystem.</p>
<p>54
00:09:13.720 --&gt; 00:09:42.949
Gabor Szabo: If you're already started to go in this direction, then I have a few more questions, because I mean you mentioned 2 major projects that you're rely on major open source projects. But I guess you have tens, or maybe hundreds of of rust crates that use. And if you think about all the hierarchy that maybe thousands. And I'm really interested in. How do you deal with all the dependencies, the</p>
<p>55
00:09:43.550 --&gt; 00:09:46.289
Gabor Szabo: all the problems that come with the dependencies.</p>
<p>56
00:09:47.620 --&gt; 00:10:00.109
Ran Reichman: Yeah. So I don't think there's a good solution to this, like one of the challenges with rust, which isn't necessarily unique to us. But it's very you can feel it very strongly when you're building a a big rust project is</p>
<p>57
00:10:00.892 --&gt; 00:10:21.569
Ran Reichman: the number of crates that grows quite rapidly you start with like 50. And then you're at 150. It's only 500. So yeah, definitely, lot of lots of dependencies. We invest in the Ci infrastructure so that the build is as fast as possible. We we're constantly maintaining</p>
<p>58
00:10:21.720 --&gt; 00:10:24.008
Ran Reichman: the like the whole</p>
<p>59
00:10:25.040 --&gt; 00:10:31.749
Ran Reichman: build set up in order for it to be as quick as possible. Sometimes. That also means using like powerful servers</p>
<p>60
00:10:32.212 --&gt; 00:10:36.077
Ran Reichman: but I don't think there's a silver bullet here in terms of</p>
<p>61
00:10:36.812 --&gt; 00:11:01.139
Gabor Szabo: What? Yeah. What I'm interested in is, how do you select crates? How do you make sure that they are? How how much can you invest in, or how much do you invest in verifying that they are secure enough that they performant enough? And how do you deal with with bugs, or any issues in these these crates.</p>
<p>62
00:11:02.440 --&gt; 00:11:11.110
Ran Reichman: Yeah. So if if we encounter a a, we're quite picky so if if something is small enough, then we won't take a crate, but actually implement it.</p>
<p>63
00:11:11.574 --&gt; 00:11:17.419
Ran Reichman: But in terms of bugs and reliability. So that's the that's the thing that I think we we invest more than anything else</p>
<p>64
00:11:17.740 --&gt; 00:11:19.719
Ran Reichman: in terms of just like</p>
<p>65
00:11:20.614 --&gt; 00:11:28.730
Ran Reichman: we really have tons and tons of tests to make sure that reliability is that is really as close as possible to 100%</p>
<p>66
00:11:30.390 --&gt; 00:11:36.083
Ran Reichman: And that also is the case. When we introduce new crates, like, we're also we're we're we have</p>
<p>67
00:11:36.540 --&gt; 00:11:56.890
Ran Reichman: a very expensive suite of testing for that in terms of a a security that's mostly a matter of reputation, like we don't choose crates that we think will do a bad job for us or that were that are shady. We look at like number of downloads. Are people using this in the ecosystem stuff like that?</p>
<p>68
00:12:00.420 --&gt; 00:12:02.709
Ran Reichman: Yeah, I think that's mostly it.</p>
<p>69
00:12:03.020 --&gt; 00:12:04.909
Gabor Szabo: Have you? Have you</p>
<p>70
00:12:05.070 --&gt; 00:12:16.720
Gabor Szabo: considered or tried, or do you think that there is a need of financing, sponsoring certain open source developers who are</p>
<p>71
00:12:16.960 --&gt; 00:12:26.660
Gabor Szabo: unrelated to your company, who maintain these these packages, or or bug bounties, or things like this.</p>
<p>72
00:12:27.540 --&gt; 00:12:30.942
Ran Reichman: Yeah, I I completely, I think,</p>
<p>73
00:12:31.620 --&gt; 00:12:35.570
Ran Reichman: I think companies like us should definitely invest in these kinds of things.</p>
<p>74
00:12:36.193 --&gt; 00:12:39.720
Ran Reichman: We haven't yet detected like a</p>
<p>75
00:12:40.000 --&gt; 00:13:02.590
Ran Reichman: the right projects in terms of the ones that we're actually heavily using and in need of these resources. Because we're pretty in the mainstream, like lots of Apache stuff, like lots of stuff that's already has a lot of investment. But yeah, if we encounter something that we can contribute to or even contribute financially, definitely, something that we'd consider. We we want the ecosystem to be sustainable.</p>
<p>76
00:13:03.920 --&gt; 00:13:28.949
Gabor Szabo: Okay. So I think we can go back to to the mainstream sort of of this conversation. But actually, there are questions here that sort of related to this, which let me read it, because that's easier. Also, could you please elaborate a bit more on the nature of rust in your use case, what do you mainly do with rust? Do you use Asyncrust?</p>
<p>77
00:13:30.480 --&gt; 00:13:33.583
Gabor Szabo: Yeah. So great question.</p>
<p>78
00:13:34.680 --&gt; 00:13:42.290
Ran Reichman: The the nature of our use of rust is we use rust, basically in all of the data processing that we that we do</p>
<p>79
00:13:42.792 --&gt; 00:13:50.970
Ran Reichman: so the way our system works is that we connect to existing infrastructure. So it can be something like written in Scala, for instance, Apache spark</p>
<p>80
00:13:51.885 --&gt; 00:13:58.399
Ran Reichman: or in python and some of the ray infrastructure. And once we pass on</p>
<p>81
00:13:59.141 --&gt; 00:14:05.909
Ran Reichman: the responsibility of the data processing from the high level language to a rust.</p>
<p>82
00:14:06.340 --&gt; 00:14:18.049
Ran Reichman: We do everything in rust. We use a Jni when it's a Java virtual machine, and and python, we also use the relevant bindings to pass from</p>
<p>83
00:14:18.500 --&gt; 00:14:28.769
Ran Reichman: from python to rust. And then it's basically rust all the way until we we have to give back the some sort of result. And then and then send it back.</p>
<p>84
00:14:29.470 --&gt; 00:14:36.040
Gabor Szabo: So besides rust, what are what other languages do you use? Separate.</p>
<p>85
00:14:36.040 --&gt; 00:14:37.139
Ran Reichman: Yes, we we use.</p>
<p>86
00:14:37.140 --&gt; 00:14:42.359
Gabor Szabo: Python and and but I don't know if you're using actually or just somehow connecting.</p>
<p>87
00:14:42.360 --&gt; 00:14:47.319
Ran Reichman: We're mostly connecting like we're using Scala and Python Scala more than python</p>
<p>88
00:14:47.896 --&gt; 00:14:51.089
Ran Reichman: because of its use in Jvm environments.</p>
<p>89
00:14:52.790 --&gt; 00:14:53.930
Ran Reichman: And</p>
<p>90
00:14:54.420 --&gt; 00:15:06.250
Ran Reichman: but whenever we can implement something that's that requires performance, we do. We do it in rost. And that's most of what we do requires a a pretty significant performance investment.</p>
<p>91
00:15:08.060 --&gt; 00:15:20.129
Gabor Szabo: Okay, so we can now circle back to the to the beginning of the company, and how rust was introduced to the company, and how and and how you</p>
<p>92
00:15:20.600 --&gt; 00:15:35.980
Gabor Szabo: find new employees. I mean, this was a startup company. So there were. There was no one there. So it's not like a company where you have to start teaching people rust or so. It's totally your decision. If you are bringing in people with rust experience or</p>
<p>93
00:15:36.120 --&gt; 00:15:40.115
Gabor Szabo: without, and then teaching them, how was that process?</p>
<p>94
00:15:40.850 --&gt; 00:15:46.509
Gabor Szabo: What kind of people arrived? They were? Were they already experienced in rust.</p>
<p>95
00:15:47.640 --&gt; 00:15:51.330
Ran Reichman: Yeah. So most of the people we hired are experienced in rust</p>
<p>96
00:15:52.128 --&gt; 00:16:12.230
Ran Reichman: they have. sometimes that means just a general like generally, like as a hobby, have built things in rust. There's some crypto aspect because of the success of the Solana as a blockchain, so that that spurred a lot of rust development</p>
<p>97
00:16:12.762 --&gt; 00:16:20.679
Ran Reichman: so we have a bit from there. And there are a few people who don't really have a rust background, but are a strong C plus plus developers.</p>
<p>98
00:16:20.870 --&gt; 00:16:23.070
Ran Reichman: And there we were able to.</p>
<p>99
00:16:26.037 --&gt; 00:16:46.762
Ran Reichman: there, there! It's more of a an investment as a startup. We don't do a lot of training. But if someone in our interview process shows potential and is able to learn rust relatively quickly, then we. We also consider those people. And we have a few of those. I'll say that</p>
<p>100
00:16:48.140 --&gt; 00:16:58.174
Ran Reichman: we try just as a as a philosophy not to push rust to the limit in terms of performance. We push it to the limit in terms of</p>
<p>101
00:16:58.640 --&gt; 00:16:59.560
Ran Reichman: and</p>
<p>102
00:16:59.990 --&gt; 00:17:12.010
Ran Reichman: low level implementations, and we push it to the limit. But we don't like we don't try to be too sophisticated or too clever with the language. That's kind of my experience with C plus plus as well that like, it's possible to be very.</p>
<p>103
00:17:12.190 --&gt; 00:17:33.960
Ran Reichman: very smart and very clever, but sometimes that makes the code harder to maintain. So if if one of you took a look at our code base, you'd see that it's it's mostly straightforward. And when we're doing something that's elaborate, it's usually because that was the last resort. And that's kind of my philosophy, regardless of rust, but especially in rust. Because you you can do a lot of very sophisticated stuff.</p>
<p>104
00:17:35.790 --&gt; 00:17:47.790
Gabor Szabo: Can you elaborate a bit more? What are these things that you feel that there are too sophisticated, or or that you would like to that you're avoiding in in this case.</p>
<p>105
00:17:48.830 --&gt; 00:17:50.340
Ran Reichman: Yeah. So I think,</p>
<p>106
00:17:52.090 --&gt; 00:18:02.329
Ran Reichman: I mean, not. Not all of these are necessarily sophisticated, but the they add complexity. So when it comes to handling channels. Async. Things things in that area.</p>
<p>107
00:18:03.990 --&gt; 00:18:31.159
Ran Reichman: sometimes sometimes. You have to use it. But if you can, if you can be like single core, running very powerfully and achieving your goals. Then we prefer that when it's possible that that's kind of the things that we're looking for. So anything that's like, I mean, this is this is the way in computer science generally, right? Like, once, once you introduce concurrency of various forms. Then things. Things become much more complicated the way when we can avoid that, we avoid it.</p>
<p>108
00:18:32.520 --&gt; 00:18:59.869
Gabor Szabo: Right? So there was a question here that I'm not sure that too relevant to you. But maybe you have some input on this. So how easy for you to recruit developers! Our company is mostly C plus plus and python. And when I introduced Rust Code into the Python group for performance. I saw a lot of resistance from the developers, so I know that it's probably not, really. You haven't probably encountered this, but.</p>
<p>109
00:19:00.310 --&gt; 00:19:08.610
Ran Reichman: I actually have some relevant experience, because I've I've interviewed a lot of people with C plus plus background. And I think there's a there's a divergence there are people who</p>
<p>110
00:19:09.303 --&gt; 00:19:24.626
Ran Reichman: who really love c plus plus really appreciate what it's able to bring to the table. And they don't wanna switch to another language. And when we encounter those in our recruiting process, then we don't try to convince them, because they love what we're doing, and we're not doing what they're doing. And that's great</p>
<p>111
00:19:25.030 --&gt; 00:19:33.180
Ran Reichman: and that that really, I think when when you're in an existing company and you want to introduce rust. I think. Actually, the Linux kernel</p>
<p>112
00:19:33.630 --&gt; 00:19:36.849
Ran Reichman: did a great job in this regard when they're saying like.</p>
<p>113
00:19:37.070 --&gt; 00:19:40.390
Ran Reichman: you can't, you don't really wanna migrate to rust</p>
<p>114
00:19:41.645 --&gt; 00:19:56.979
Ran Reichman: cause, you really want to just migrate to anything basically in the software world, you wanna gradually add functionality show value. See? See that you're able to provide better, developer experience and improved velocity.</p>
<p>115
00:19:57.130 --&gt; 00:20:01.643
Ran Reichman: and then you can encourage people to move on. But I think</p>
<p>116
00:20:02.190 --&gt; 00:20:18.619
Ran Reichman: so if you're starting a new project. This is also what we're seeing in the data processing world. So if a company is using Apache spark and you say, Oh, no, you should use ray, or you should use duck. dB, usually, it's a tough sell because they're using a certain technology. And they like that technology. And they're proficient in that technology.</p>
<p>117
00:20:18.840 --&gt; 00:20:26.089
Ran Reichman: And it's much easier to say, Okay, we're like in this new new team that's building a new technology from scratch.</p>
<p>118
00:20:26.320 --&gt; 00:20:34.400
Ran Reichman: We can try something new. And I found that throughout my experience, and that that's much easier than moving a system from one technology to another.</p>
<p>119
00:20:34.961 --&gt; 00:20:45.909
Ran Reichman: Yeah, that's also the case, like, regardless of rust and C plus plus like Java, go like golang. All of that stuff like there's there's ton of tons of examples in that regard.</p>
<p>120
00:20:47.520 --&gt; 00:20:56.690
Gabor Szabo: The the people who are so. So you recruited a number of people who who basically didn't know rust, but were interested in in rust as well. Right.</p>
<p>121
00:20:58.663 --&gt; 00:21:05.120
Gabor Szabo: What was their learning, process, or learning resources that you might recommend to to everyone else?</p>
<p>122
00:21:12.360 --&gt; 00:21:17.029
Ran Reichman: I think 1st of all, the the Standard Rust Book.</p>
<p>123
00:21:17.350 --&gt; 00:21:31.880
Ran Reichman: It's a good book. There's a lot of good stuff there. I think I read it cover to cover, like online, obviously. But I think I think when you want to get acquainted with rust and what it has to offer, then that's a good thing to use.</p>
<p>124
00:21:32.722 --&gt; 00:21:39.955
Ran Reichman: I think when you're in learning mode, and you want to understand things, then,</p>
<p>125
00:21:41.140 --&gt; 00:21:52.829
Ran Reichman: AI is quite useful like saying like, Hey, I know how to write this in c plus plus like, how would you write this in rust? And then you say, like, explain to me this decoration. Explain why it's not compiling stuff like that.</p>
<p>126
00:21:53.446 --&gt; 00:22:06.289
Ran Reichman: Like AI has its issues and its challenges. And it's hallucination. But when when you're asking like, basic questions of like, this is what I'm doing. This is what I'm trying to achieve. This is how I know how to do it in Python C, plus. Plus. What have you?</p>
<p>127
00:22:06.400 --&gt; 00:22:19.699
Ran Reichman: Then I found that that to be very effective, and I I do very much believe that it's easier to learn a programming language by doing so. Like reading a book is great, but you only internalize things when you</p>
<p>128
00:22:19.840 --&gt; 00:22:29.000
Ran Reichman: and when you try to build, and the compiler is mad at you, and it's like, no, you can't do that. You can't do that either. You can't do that either, and rust in that sense is very annoying. It's a it's a strict boss</p>
<p>129
00:22:29.641 --&gt; 00:22:34.760
Ran Reichman: but the result is good. The result is one in which you can really rely on the</p>
<p>130
00:22:35.310 --&gt; 00:22:39.499
Ran Reichman: and the accurate accuracy, and</p>
<p>131
00:22:40.990 --&gt; 00:22:45.530
Ran Reichman: the reliability of the result. I think that's kind of a Us.</p>
<p>132
00:22:46.830 --&gt; 00:22:59.520
Ran Reichman: a switch that people need to do when they're moving to rust, and when they're trying out rust that, like the compilation, is hard, like getting things to compile is oftentimes the hard part. Then, when things run. They usually run accurately</p>
<p>133
00:23:00.252 --&gt; 00:23:07.230
Ran Reichman: so that's that. That's what we tell people who are who are starting to learn. We're trying things out.</p>
<p>134
00:23:08.220 --&gt; 00:23:08.970
Ran Reichman: Yep.</p>
<p>135
00:23:10.130 --&gt; 00:23:29.490
Gabor Szabo: Yeah, so I do a lot of training. And my experience is that it's nice to explain things to people. But they actually really learn when they do the practice and when they get feedback for whatever they did, and well in rust the compiler gives a lot of feedback, so I have less work. But</p>
<p>136
00:23:29.660 --&gt; 00:23:39.220
Gabor Szabo: still the human human feedback is nice when when you might already solve the problem. But there are better ways to to write in in the given language.</p>
<p>137
00:23:40.770 --&gt; 00:23:45.740
Ran Reichman: Yeah, yeah, 100%. I also say, I think that once you're in a rush scheme</p>
<p>138
00:23:45.910 --&gt; 00:23:56.859
Ran Reichman: which not everyone is in. And it's kind of a priv privilege. Then more junior members just ask a lot of questions, and our senior members like to like to share and mentor.</p>
<p>139
00:23:56.970 --&gt; 00:23:58.060
Ran Reichman: So</p>
<p>140
00:23:58.511 --&gt; 00:24:14.310
Ran Reichman: sometimes you're like, Well, why is this happening? And people just explain like, this is the philosophy behind how this works. So once you have some sort of a a core of a team that's able to provide these insights. Then continuously growing, it</p>
<p>141
00:24:14.780 --&gt; 00:24:16.490
Ran Reichman: becomes easier.</p>
<p>142
00:24:16.490 --&gt; 00:24:29.740
Gabor Szabo: Yeah. A nice part about this actually is that it's not not just not just the juniors who learn from such interaction, but also the more experienced people who encounter interesting</p>
<p>143
00:24:30.200 --&gt; 00:24:45.140
Gabor Szabo: code snippets from the juniors. And then they have to have to think about why these people, why, that person wrote that kind of code. And and what's the story behind it? So I think it's it's in bi directional learning. There.</p>
<p>144
00:24:45.400 --&gt; 00:24:51.879
Ran Reichman: Yeah, I think I think that's true about mentoring in general, like as a mentor, as a professor, as a teacher, you, you learn a lot from your students.</p>
<p>145
00:24:53.490 --&gt; 00:24:55.330
Ran Reichman: I feel the same way as a manager.</p>
<p>146
00:24:56.880 --&gt; 00:25:22.669
Gabor Szabo: Okay. So there is a question here which is actually very close to what I wanted to ask. But let's ask this 1 first.st So do you have any suggestion for someone who would like to find work in rust? Well, see, and other things, and is comfortable with them, but only has web, dev experience, career, wise career, wise. The transition seems borderline impossible.</p>
<p>147
00:25:24.830 --&gt; 00:25:46.349
Ran Reichman: Yeah. So I I understand the sentiment of the comment. It's it's definitely not easy. Because the companies look at your background. And if your background doesn't seem related to what you're looking for I mean the the inconvenient truth is that it's just hard to break through. It's hard to say, like, Oh, yeah, this is this is what I previously did. But what now? I want to do something new.</p>
<p>148
00:25:46.830 --&gt; 00:25:50.715
Ran Reichman: and I I think the</p>
<p>149
00:25:52.780 --&gt; 00:25:59.919
Ran Reichman: they're the main solution to this, and it's not a convenient one, because it requires work. But that's why it's powerful</p>
<p>150
00:25:59.950 --&gt; 00:26:27.659
Ran Reichman: is open source is contributions. Because, like, we have people that we interviewed for the company like we pursued them like we reached out to them that we never met. We don't know what else they did in the world. We just saw the kinds of contributions that they were able to make to interesting projects and say, this is the kind of person we want in the team, and we didn't know that they were like they could be Web Devs. They could be python they could be. I don't know what I honestly don't know what they're doing in their day job.</p>
<p>151
00:26:27.670 --&gt; 00:26:47.530
Ran Reichman: but if you see people if they have like, it's kind of in that sense like art. So if someone shows you their art and the art is beautiful, then you say, like, Okay, I don't really care about the rest. I would like that someone on the team. And it's not easy, because you have to invest. And you have to like, learn and learn these environments, etc. You gain a lot from that. But you have to invest a lot of that.</p>
<p>152
00:26:47.550 --&gt; 00:26:52.829
Ran Reichman: So yeah, not not not the the fast route or the easy route, but one that I think is effective.</p>
<p>153
00:26:53.780 --&gt; 00:27:22.260
Gabor Szabo: Yeah. So so I'm afraid that you already answered my next question. But maybe you can elaborate a little bit more. So let I assume that as a startup you're growing so you're looking for more people. So if I wanted to join your company in the next months, too or so, so I don't have too much time. But let's let's assume I have some background that is relevant to you. What would you suggest to make</p>
<p>154
00:27:22.580 --&gt; 00:27:24.339
Gabor Szabo: to make it</p>
<p>155
00:27:24.570 --&gt; 00:27:35.679
Gabor Szabo: easier for me to to. Yeah, to make it easier for me to to find you or or you to find me, or or okay, whatever right? I think you understand the question.</p>
<p>156
00:27:36.700 --&gt; 00:27:37.200
Gabor Szabo: I hope.</p>
<p>157
00:27:37.200 --&gt; 00:27:39.179
Ran Reichman: Yeah. So 1st of all, the the.</p>
<p>158
00:27:39.180 --&gt; 00:27:48.569
Gabor Szabo: To improve my chances. Actually, I think that should be the question. So what should I do to improve my chances that you actually find me, or employ me, and so on.</p>
<p>159
00:27:49.140 --&gt; 00:28:00.230
Ran Reichman: Yeah, so it's a good. It's a great question. The easiest answer is, 1st of all to apply. that's that's the the 1st step, and we do look at applications. That that we get.</p>
<p>160
00:28:01.072 --&gt; 00:28:04.150
Ran Reichman: I think. Given a certain application.</p>
<p>161
00:28:05.470 --&gt; 00:28:09.219
Ran Reichman: You have to like our interview process.</p>
<p>162
00:28:09.682 --&gt; 00:28:14.819
Ran Reichman: We. We work very hard for our interview process to be very similar to the work itself.</p>
<p>163
00:28:15.491 --&gt; 00:28:36.339
Ran Reichman: I found that the at the like big tech, and most of the interviews are kind of IQ test. And it's not a bad thing like these companies like they they optimize for getting just very smart people, and obviously they're doing very well for with that. But for us, we want people who like during the interview really understand how their day to day is gonna look like.</p>
<p>164
00:28:36.440 --&gt; 00:28:43.669
Ran Reichman: And they like it. They they see like they they do the interview task that we give them. And they say, Okay, this. These are the kinds of things that I want to do in the future.</p>
<p>165
00:28:43.840 --&gt; 00:28:47.260
Ran Reichman: And sometimes people look at them and and they don't</p>
<p>166
00:28:47.370 --&gt; 00:29:05.450
Ran Reichman: like they? They realize that they don't want to work on. I don't know low level optimization database. So what I would encourage like our website, Clarionio, you can see the kinds of technologies that we're using, which is like polars, data, fusion, arrow stuff like that.</p>
<p>167
00:29:05.580 --&gt; 00:29:14.820
Ran Reichman: So if you engage with these projects and look at them and think how to use them. You don't even have to contribute to the open source. You can think like, Okay, how do? How do I use.</p>
<p>168
00:29:14.990 --&gt; 00:29:16.870
Ran Reichman: and something like polars</p>
<p>169
00:29:18.430 --&gt; 00:29:38.030
Ran Reichman: in data processing like, How how does that work? And if you're able to answer that question and share your experience and stuff like that. Then you're already ahead of, like, 90% of the people who who have no context don't know how any of these things work. And so oftentimes putting in the work puts you pretty much ahead.</p>
<p>170
00:29:39.170 --&gt; 00:29:39.889
Gabor Szabo: Right?</p>
<p>171
00:29:40.980 --&gt; 00:29:53.530
Gabor Szabo: okay. The next sort of the question of the expansion of this question would be, which is slightly, I feel strange with this question, because it sort of assumes a little bit of</p>
<p>172
00:29:53.891 --&gt; 00:30:16.080
Gabor Szabo: moving ahead or or back in in time. So a little bit of time travel. But what would you suggest to someone if if the person has one or 2 years? So decides that, okay, I have no clue about rust and all of all of this stuff, but I know your company, and I really would like to work at at your company.</p>
<p>173
00:30:16.080 --&gt; 00:30:26.009
Gabor Szabo: So I have. Now I'm going to start to do, learn things and do things. So in a year or 2 I have a much better chances to</p>
<p>174
00:30:26.710 --&gt; 00:30:31.020
Gabor Szabo: get hired by Florian. Obviously you don't know what Florian will look like in 2 years.</p>
<p>175
00:30:31.020 --&gt; 00:30:31.989
Gabor Szabo: Yeah, of course.</p>
<p>176
00:30:31.990 --&gt; 00:30:41.889
Gabor Szabo: So that's why it's a little bit tricky question. On the other hand, you could think about it. What would you have suggested 2 years ago, or a year ago, for someone like this</p>
<p>177
00:30:42.040 --&gt; 00:30:43.340
Gabor Szabo: to be hired now.</p>
<p>178
00:30:43.340 --&gt; 00:30:50.260
Ran Reichman: Yeah, no, I I think that's a really interesting question to me. The answer is, if if you're looking at like the medium and long term.</p>
<p>179
00:30:50.520 --&gt; 00:30:55.980
Ran Reichman: I think the my advice would just to be more ambitious. Like, if if you're saying like I</p>
<p>180
00:30:56.270 --&gt; 00:31:08.050
Ran Reichman: for the next year or the next 2 years. I'm gonna work on this technology. Then you can really achieve a whole lot in that time, even as a side project. So I I would try to do something that excites me.</p>
<p>181
00:31:08.090 --&gt; 00:31:28.381
Ran Reichman: Like 99% of the of the things that people work on. They just churn, they start working on it, and they they enjoy it for a while, and then they stop working for some reason. And that that's true for myself also, like that just happens like you start working on something, and then life happens, and you have a lot of other things to do. But if you're committed for a long time frame. Then you can really achieve a lot.</p>
<p>182
00:31:28.790 --&gt; 00:31:36.020
Ran Reichman: and I would. I would just try to choose the something ambitious like, try to understand something, try to change something, try to do something like that.</p>
<p>183
00:31:41.010 --&gt; 00:31:49.180
Gabor Szabo: Okay, yeah, I, I thought about some specific types of projects to work on or.</p>
<p>184
00:31:49.790 --&gt; 00:32:01.669
Ran Reichman: So some people like, if we talk about specific projects like some people work on, for instance, the game engines and rust. If you're interested in gaming. There's this kind of joke that everybody wants to build a game engine in rust, but nobody wants to build a game.</p>
<p>185
00:32:01.900 --&gt; 00:32:27.190
Ran Reichman: and so I don't think that's necessarily bad, but like these are the kinds of things like, if you're excited about gaming, try to build a game engine if you're excited about AI. Then try to see like what's relevant in AI with rust. I don't know if there's that much, but if you're excited about data, then you can look at these big data projects. There are quite a few at this point. Big rust projects online.</p>
<p>186
00:32:27.380 --&gt; 00:32:50.029
Ran Reichman: And then I, I look at like the top 1520 rust projects on Github and say, like, what excites me here? What's interesting like, what would I want to build? What would I want to recreate. What would I want to benchmark or test, or stuff like that? And that also brings you connections like, if you, if you one of the things that I learned throughout my career is that when you reach out to successful people</p>
<p>187
00:32:50.614 --&gt; 00:32:55.280
Ran Reichman: that are technical and you engage with what they're working on.</p>
<p>188
00:32:55.659 --&gt; 00:33:03.900
Ran Reichman: Like, the response rate is huge. It's like, I don't know, maybe 90% or something like people people like that. People are excited about their technology and want to build on it.</p>
<p>189
00:33:04.420 --&gt; 00:33:09.119
Ran Reichman: so finding those things that you actually want to engage with and actually engaging</p>
<p>190
00:33:09.685 --&gt; 00:33:12.880
Ran Reichman: I I think is a is a great investment.</p>
<p>191
00:33:18.840 --&gt; 00:33:21.160
Gabor Szabo: Yeah, that's that's an excellent point.</p>
<p>192
00:33:21.716 --&gt; 00:33:24.769
Gabor Szabo: I I tried to Co, to</p>
<p>193
00:33:25.130 --&gt; 00:33:29.710
Gabor Szabo: to recommend people all the time to to invest in open source</p>
<p>194
00:33:29.900 --&gt; 00:33:43.889
Gabor Szabo: doing things in open source. But it's always a people get excited. But they they most of the people actually don't follow through this, and they do a little bit, and and then they abandon it the whole thing.</p>
<p>195
00:33:44.210 --&gt; 00:33:50.790
Gabor Szabo: So those who do continue I guess they will stand out.</p>
<p>196
00:33:50.790 --&gt; 00:34:02.239
Ran Reichman: Yeah, yeah, I think I think that's exactly right. I think because of the churn, and because most people don't go deep. So if you're able to go deep and and commit to something. Then again, you're you're ahead of, like 90% of people already.</p>
<p>197
00:34:07.240 --&gt; 00:34:12.890
Gabor Szabo: So there's a comment here that for those a good start is trying to help in an existing open source project.</p>
<p>198
00:34:13.030 --&gt; 00:34:14.480
Gabor Szabo: What do you think about that</p>
<p>199
00:34:16.440 --&gt; 00:34:20.340
Gabor Szabo: open source, project or or create your new, create your own.</p>
<p>200
00:34:20.340 --&gt; 00:34:36.189
Ran Reichman: I I wouldn't try to create my own as a start. But I think, even before helping even just using an open source project like. There's a huge one of the things that we're seeing at the flare on is that there's a huge variability</p>
<p>201
00:34:36.420 --&gt; 00:34:39.879
Ran Reichman: in terms of what the open source project is able to do</p>
<p>202
00:34:40.510 --&gt; 00:34:43.570
Ran Reichman: like some projects, especially in their core.</p>
<p>203
00:34:43.860 --&gt; 00:34:55.739
Ran Reichman: They're super robust, they work, they, they, you just plug and play, and others are like they can be hard to use. They have a rough edges of various sorts. And being a user and understanding like.</p>
<p>204
00:34:56.170 --&gt; 00:35:23.629
Ran Reichman: where does this technology really work. Well, where does it not work well, like? Why doesn't it work? Well? These are the kinds of things that you don't even have to start by like. Sometimes people are intimidated by contributing, because, like maybe people won't like what I contributed, or maybe I'll have a back and forth with some maintainer for days, and I won't get anything through. But just like starting with using and gaining insights and opening issues and saying, like, Hey, I saw this, is this. Okay, is this expected?</p>
<p>205
00:35:25.040 --&gt; 00:35:36.049
Ran Reichman: again, these are the kinds of things that people just don't do. It sounds simple. It is simple, like it's not hard to take it to choose a project and and try to try to engage with it. But most people just don't do that.</p>
<p>206
00:35:37.400 --&gt; 00:35:42.869
Gabor Szabo: Yeah. So a lot of a lot of this work is not very difficult, but time consuming.</p>
<p>207
00:35:43.170 --&gt; 00:36:01.749
Ran Reichman: It's time consuming. It's an investment. There's no going around that. That's why it's valuable in a sense, like in the in the cryptocurrency world. There's a concept of a proof of work that you like show that you invested the time in something. I think, that's applicable to many, many aspects of life. So if you, if you invest that work, yeah, I think it has value.</p>
<p>208
00:36:03.060 --&gt; 00:36:10.739
Gabor Szabo: Okay, so how do you evaluate the the decision that that you used? Rust?</p>
<p>209
00:36:11.040 --&gt; 00:36:14.909
Gabor Szabo: What did you that you that you use your rust? Yeah. So.</p>
<p>210
00:36:15.610 --&gt; 00:36:34.949
Ran Reichman: Yeah, it's a great question. It's a piercing question, I'd say, because it's it's hard to evaluate, right? You made such a big decision. And now you have to decide like, see if it's a good decision. I haven't regretted it yet, like I haven't seen a point where it's like, Oh, man, why did we do we use this technology? That was a huge mistake. We also have the very significant benefit of starting from scratch.</p>
<p>211
00:36:35.515 --&gt; 00:36:42.215
Ran Reichman: So when you start from scratch. You don't have any legacy and before before the conversation we talked about</p>
<p>212
00:36:43.127 --&gt; 00:37:00.820
Ran Reichman: like a migrating code to rust, so we don't really do that like we, we rewrite some things. And when you rewrite, then you're just like starting from scratch. So a lot of the pains of moving from one technology to another. We just skipped. It's much easier to start from scratch</p>
<p>213
00:37:01.857 --&gt; 00:37:06.942
Ran Reichman: so I think I think it's too early to say for now like no regrets at this point.</p>
<p>214
00:37:08.110 --&gt; 00:37:09.156
Ran Reichman: We'll see</p>
<p>215
00:37:10.100 --&gt; 00:37:32.040
Gabor Szabo: Okay, what are the parts of of rust that or creates, or like the whole package? That you find exceptional good for for you or in general. And what? What are the areas where the rust world could improve? Where? It's something that hurts you.</p>
<p>216
00:37:33.280 --&gt; 00:37:37.579
Ran Reichman: Yeah. So I'm I'll start with a positive I think</p>
<p>217
00:37:37.980 --&gt; 00:37:54.099
Ran Reichman: rust in the past, say, 5 years has really matured in a in an impressive way. Like, you see, we engage with customers using all sorts of technologies, whether it's data, lake technologies or data processing or storage and stuff like that.</p>
<p>218
00:37:54.320 --&gt; 00:37:55.320
Ran Reichman: And</p>
<p>219
00:37:56.448 --&gt; 00:38:10.391
Ran Reichman: there's usually a crate for that, like the echoing the apples. There's an app for that. So usually there's a crate for that. Usually someone builds something pretty good that's able to use this technology, and and help</p>
<p>220
00:38:11.480 --&gt; 00:38:13.060
Ran Reichman: help work with it.</p>
<p>221
00:38:15.330 --&gt; 00:38:36.489
Ran Reichman: so that's something that I think is very good. I also think that the reliability is real like we. We did something that where we were integrating like Scala code and rust code. And suddenly there was like a memory corruption. And someone on our team was like, Oh, a memory corruption. I haven't seen one of those in years, so that that was like a moment of, Okay, yeah, this this rust thing is working.</p>
<p>222
00:38:36.650 --&gt; 00:38:45.180
Ran Reichman: I'd say, the the 2 negatives that I can think of is one a build time</p>
<p>223
00:38:45.744 --&gt; 00:39:05.519
Ran Reichman: there really is. It's a pain like building rust pretty quickly becomes pretty time consuming. And it's hard to optimize like when I when I worked in c plus plus, there were all sorts of tricks to to make the build run faster, even though I also encountered many situations where we had a very long build.</p>
<p>224
00:39:05.883 --&gt; 00:39:23.279
Ran Reichman: But yeah, that that's that's a pain. And another one is, I'd say, the flip side of the there's a crate for that. But there's a lot of the support is that there's a lot of vaporware. I'd say there are like crates that you use them. And you're like, okay, this crate. It doesn't really work. And that's fine. I mean, you know, nobody like</p>
<p>225
00:39:23.620 --&gt; 00:39:42.310
Ran Reichman: nobody's selling you that crate. It's just something that someone published online. But you realize that you have to. You have to prune it. You have to make decisions. You have to make sure that this this relates to your previous about, how do you choose the right crate? So you have to choose. You have to make sure that you're using something that you can believe in.</p>
<p>226
00:39:44.770 --&gt; 00:40:12.500
Gabor Szabo: For a second, returning to the earlier conversation or a part of the conversation. We have another question here follow up to finding work as a web dev any suggestions for types of repos, types of projects that would be appreciated by employees employers if you contribute to. In your opinion, of course, I am contributing to programming languages. For example, I guess the</p>
<p>227
00:40:12.520 --&gt; 00:40:17.530
Gabor Szabo: person means compilers. What do you mean? Programming languages.</p>
<p>228
00:40:23.480 --&gt; 00:40:24.930
Ran Reichman: Yeah. So I think</p>
<p>229
00:40:25.750 --&gt; 00:40:35.789
Ran Reichman: I think that's definitely good, like working on these kinds of technologies. It's not easy, something that like that that does differentiate you. But I will say</p>
<p>230
00:40:36.060 --&gt; 00:40:43.710
Ran Reichman: that it's valuable to be able to like. I, currently, this is changing. But currently</p>
<p>231
00:40:44.217 --&gt; 00:40:57.030
Ran Reichman: there's still a limited number of companies that are hiring for rust roles, and the the number is growing. But it's different. If you're coming to a company like aws, which does a lot of rust.</p>
<p>232
00:40:57.340 --&gt; 00:41:25.589
Ran Reichman: or a company like Clarion that does a lot of us, just because, like, there are different use cases. So at Aws or Google, or something like that. You'll spend a lot of a lot more time on concurrency, because that's just like there's a lot of input, output happening inside their systems and a lot of micro services. So if I were interested in in a role in one of those companies, I'd probably try to understand like they have blog posts. They write interesting stuff about their challenges. I tried to understand a bit their stack</p>
<p>233
00:41:26.150 --&gt; 00:41:27.080
Ran Reichman: and</p>
<p>234
00:41:27.591 --&gt; 00:41:36.040
Ran Reichman: gain relevant experience. There, if we're talking about a company like Ferryon then, it's it's a different stack. So there are many islands in the rust world.</p>
<p>235
00:41:36.180 --&gt; 00:41:38.988
Ran Reichman: and I I try to</p>
<p>236
00:41:39.890 --&gt; 00:41:55.309
Ran Reichman: like, I think compilers are, are a great great place to start and if you find a a company building a compiler in rust, and obviously that's that's fantastic. But if you're looking at a company that's that's not doing exactly that. Then I would try getting acquainted with the with the tech stack that they're using.</p>
<p>237
00:41:56.210 --&gt; 00:42:00.079
Gabor Szabo: Actually. For to this point I sort of</p>
<p>238
00:42:00.330 --&gt; 00:42:17.380
Gabor Szabo: partially dreaming of about companies that would say to their to their candidates that, Okay, here are a couple of issues open in an open project, and your homework or home assignment for</p>
<p>239
00:42:17.380 --&gt; 00:42:36.719
Gabor Szabo: for the interview process is to deal with those issues, and maybe not even directly related to the company. So to see how the person interacts with open source projects and and without and contributing to the world. Sort of</p>
<p>240
00:42:37.365 --&gt; 00:42:37.660
Gabor Szabo: yeah.</p>
<p>241
00:42:37.660 --&gt; 00:42:58.200
Ran Reichman: Yeah, I totally agree. I'd also add that the big advantage of engaging with projects that are related to the company is that you get a better understanding if you want to work there. This touches on what I mentioned earlier, like sometimes you, you might think that you want to work with. But then you look at like the the stack, what they're building, and you say, that that's not really my thing.</p>
<p>242
00:42:58.270 --&gt; 00:43:09.230
Ran Reichman: And the the best time I. This is what I tell the candidates as well. The best time to understand that is, there is like, before you join the company. And cause. Yeah, it's really important to write that to find the right fit.</p>
<p>243
00:43:09.810 --&gt; 00:43:28.770
Gabor Szabo: So here we have a very technical question or more technical than what we had. So far, high performance data data processing is is what you are. That's, I think the statement fly around inside. I don't know where this sentence comes from, so could you share any valuable practical examples</p>
<p>244
00:43:28.770 --&gt; 00:43:44.370
Gabor Szabo: or tricks, how you debug distributed and high performance use cases. Do you use Tokyo for development, or just something like wrappers around arrow data, fusion, and so on. Any other valuable recommendations.</p>
<p>245
00:43:46.010 --&gt; 00:43:47.834
Ran Reichman: Yeah, it's a big question.</p>
<p>246
00:43:49.980 --&gt; 00:43:56.000
Ran Reichman: 1st of all, I mentioned this. But I'll mention it again, because it's just so important, like tests</p>
<p>247
00:43:56.250 --&gt; 00:44:00.129
Ran Reichman: across the stack matter a whole lot. And</p>
<p>248
00:44:00.850 --&gt; 00:44:07.189
Ran Reichman: this varies across companies. Because if you're building a like, I've I have some experience like with like a front end development.</p>
<p>249
00:44:07.370 --&gt; 00:44:27.850
Ran Reichman: and there I don't know if I didn't invest a huge amount of my time in tests. You mostly want to iterate and see that it works and find bugs and solve them. When you're building a mission critical software, which is what we're doing. You really want things to be exact, like some startups can move fast and break things at play around. We don't move. We try to move as fast as possible, but</p>
<p>250
00:44:28.350 --&gt; 00:44:51.179
Ran Reichman: it really needs to be stable. So this means integration tests, system tests, unit tests. These are the kinds of things that that are very useful to debug even distributed and high performance systems, because even a distributed system eventually includes various components and interactions between those components. And if you test those well.</p>
<p>251
00:44:51.380 --&gt; 00:44:54.490
Ran Reichman: then you reduce the number of cases that said</p>
<p>252
00:44:54.620 --&gt; 00:45:01.289
Ran Reichman: our team finds itself running something for 3 h on 2 TB of data in order to find all sorts of edge cases.</p>
<p>253
00:45:01.630 --&gt; 00:45:02.950
Ran Reichman: And there.</p>
<p>254
00:45:03.110 --&gt; 00:45:04.190
Ran Reichman: I think.</p>
<p>255
00:45:05.150 --&gt; 00:45:12.210
Ran Reichman: 1st of all, it's not something that we've solved, I'd say, and we're working hard on building tooling.</p>
<p>256
00:45:12.650 --&gt; 00:45:37.429
Ran Reichman: That extracts data from the data processing pipeline and visualizes it in a way that's easy to understand. So that you understand, like, how much memory you're using, how much CPU like, why is it happening? How much disk? And interestingly, this is something that is also gonna be valuable for our customers. So like, we make data processing much more efficient, much faster, much more performant.</p>
<p>257
00:45:38.376 --&gt; 00:45:49.580
Ran Reichman: But by doing that we also wanna visualize this to our customers. So in a sense, we wanna visualize it to ourselves to understand what the bottlenecks are, and then visualize it to our customers. This is a hard thing to do.</p>
<p>258
00:45:51.640 --&gt; 00:46:01.180
Ran Reichman: so I I would say, we we've solved it. But I'd say, adding a lot of debugging. We use also a a Tracy</p>
<p>259
00:46:01.360 --&gt; 00:46:03.801
Ran Reichman: actually, as a tool to</p>
<p>260
00:46:04.570 --&gt; 00:46:11.639
Ran Reichman: defined performance issues, and it's quite effective so when you're able to attach things to your code.</p>
<p>261
00:46:11.800 --&gt; 00:46:14.280
Ran Reichman: and they do all sorts of</p>
<p>262
00:46:16.100 --&gt; 00:46:24.969
Ran Reichman: performance, monitoring of various sorts and benchmarking we found that to be valuable, especially when when debugging performance issues.</p>
<p>263
00:46:27.390 --&gt; 00:46:47.120
Gabor Szabo: So the next question that coming from the audience is actually the next question I wanted to ask. So I'm going to ask in the way I thought about sort of is that to try to understand what is your experience? Using AI tools to write rust code, which</p>
<p>264
00:46:47.770 --&gt; 00:46:51.410
Gabor Szabo: tool you might be using, which model.</p>
<p>265
00:46:52.960 --&gt; 00:46:59.420
Ran Reichman: Yeah. So 1st of all, let's say, we're model agnostic at Flareon I found that the AI</p>
<p>266
00:46:59.910 --&gt; 00:47:19.169
Ran Reichman: it's similar to ides and even operating systems. People have their preferences. And as a as a manager, I I'm not gonna push someone to use a certain flavor of AI, because because I have a preference for it. Like, I trust the the team members to</p>
<p>267
00:47:19.650 --&gt; 00:47:26.699
Ran Reichman: try to be as effective and efficient as possible. And we bring people that like are trustworthy in that regard.</p>
<p>268
00:47:27.287 --&gt; 00:47:42.000
Ran Reichman: I've had good experience with Cloud. I think it's it's good for software development. Some team members really like a chat gpt some like deep seek they found, especially our one to be effective.</p>
<p>269
00:47:43.830 --&gt; 00:47:45.410
Ran Reichman: I'll say that the things that</p>
<p>270
00:47:45.540 --&gt; 00:47:50.200
Ran Reichman: the AI is best at in terms of our development is,</p>
<p>271
00:47:52.070 --&gt; 00:48:06.599
Ran Reichman: 1st of all, needle in a haystack issues where you have like this huge error. And you say, like, Hey, AI! Like, what? What do you think is going on here? And then it's like, Oh, you! You wrote this incorrectly, and you should fix it. And usually, usually that's just right. Like you take a blob of code. You take the error</p>
<p>272
00:48:07.190 --&gt; 00:48:11.500
Ran Reichman: 9 out of 10 times. It says like this is probably there. And and it's right.</p>
<p>273
00:48:13.520 --&gt; 00:48:42.860
Ran Reichman: basic functionality. Is good. But usually that doesn't save that much money. I think the metric Sam Altman has said, I said this, and I 100% agree. I think the metric of like percent of code written by AI is is what in startup world they call a vanity metric which is like it's. It sounds interesting, but it doesn't really tell you how much how much you're using. Because, like autocomplete, like, how much of my text that I write in emails is written by autocomplete? Probably a lot. But like, how significant is that to my</p>
<p>274
00:48:43.170 --&gt; 00:48:45.649
Ran Reichman: in my process, and not too much.</p>
<p>275
00:48:48.040 --&gt; 00:48:53.059
Ran Reichman: I will say that where AI isn't as good is when things get complex.</p>
<p>276
00:48:53.310 --&gt; 00:48:55.449
Ran Reichman: and that happens a lot for us.</p>
<p>277
00:48:55.880 --&gt; 00:49:02.270
Ran Reichman: If you're trying to write something very performant. If you're trying to write something that's distributed and</p>
<p>278
00:49:02.390 --&gt; 00:49:27.841
Ran Reichman: different things impact each other, whether it's memory. CPU disk, usage networking. Once many parameters get into the equation. Usually the AI focuses on some local minimum and not on like the whole system, and we found it to be very difficult to get it to solve. Those kinds of problems which is kind of fun. Because, like you want to be working on things that are</p>
<p>279
00:49:29.031 --&gt; 00:49:34.358
Ran Reichman: not like the AI has trouble with, because otherwise, I mean, I don't know. You can just get the AI to do them. So</p>
<p>280
00:49:37.560 --&gt; 00:50:06.820
Gabor Szabo: Let's switch a little bit to a slightly different audience. The audience, that part of the people who are here. I guess they're part of that group. If you're talking to other startup founders, or Ctos or so manager level people, or or co-founders, what would you recommend them? How to decide whether to use rust</p>
<p>281
00:50:06.870 --&gt; 00:50:08.860
Gabor Szabo: or or not to use rust.</p>
<p>282
00:50:11.550 --&gt; 00:50:12.220
Ran Reichman: Yeah, so.</p>
<p>283
00:50:12.220 --&gt; 00:50:15.819
Gabor Szabo: How to, how should they evaluate it, or.</p>
<p>284
00:50:17.270 --&gt; 00:50:25.230
Ran Reichman: So the place I'd start is, you want to have some familiarity with it. You like you want to champion. I think that's true with any new technology.</p>
<p>285
00:50:26.069 --&gt; 00:50:29.501
Ran Reichman: You don't wanna like if you have.</p>
<p>286
00:50:31.026 --&gt; 00:50:40.180
Ran Reichman: an engineer with the 3 years of experience, and they say, like, hey? Rust is exciting. I want to bring this to the company. You're unlikely to be successful by doing that.</p>
<p>287
00:50:40.560 --&gt; 00:50:42.820
Ran Reichman: but if you have someone who can.</p>
<p>288
00:50:43.080 --&gt; 00:50:50.090
Ran Reichman: who can experiment. Who can mentor who can make decisions on the right projects for this technology?</p>
<p>289
00:50:50.879 --&gt; 00:51:01.740
Ran Reichman: Then I think you're much more likely to be successful. And I mentioned this earlier, but I'll mention it again, because I really think it's it's crucial, is choosing the right projects</p>
<p>290
00:51:02.040 --&gt; 00:51:09.050
Ran Reichman: is super super important. So if you have like a contained project that you know what you want to achieve there, and you're starting from scratch.</p>
<p>291
00:51:09.230 --&gt; 00:51:17.280
Ran Reichman: and you want to do that with rust, and you have the the know how, then I don't see why it shouldn't succeed like it's a very much set up for success.</p>
<p>292
00:51:17.400 --&gt; 00:51:20.084
Ran Reichman: But the more the more the project is</p>
<p>293
00:51:20.720 --&gt; 00:51:28.519
Ran Reichman: distanced from that situation, I think the less likely it is that that, it'll it'll be a success.</p>
<p>294
00:51:32.260 --&gt; 00:51:33.280
Gabor Szabo: Okay.</p>
<p>295
00:51:34.410 --&gt; 00:51:44.839
Gabor Szabo: I am, I think, mostly at the end of of my questions. I don't know if the audience have more questions. The audience who is here, or if you have the</p>
<p>296
00:51:45.320 --&gt; 00:52:02.240
Gabor Szabo: subjects that you would like to bring up, that I I didn't ask because I didn't think about that important, and you think it would be important to for people to know about the company, about the use of rust, how to apply for a job at you to your company.</p>
<p>297
00:52:03.370 --&gt; 00:52:06.200
Ran Reichman: Yeah. So how how to apply?</p>
<p>298
00:52:06.320 --&gt; 00:52:19.700
Ran Reichman: It's pretty easy, like we have linkedin posts at our company, so you can look at Linkedin, at at flare on and see probably the most relevant here at the low level developer, which is how we call our rust position.</p>
<p>299
00:52:21.420 --&gt; 00:52:27.170
Ran Reichman: Yeah, I think there's a lot of exciting momentum in the rust world. Lots of talent.</p>
<p>300
00:52:27.370 --&gt; 00:52:30.350
Ran Reichman: I think the fact that big tech is investing in rust</p>
<p>301
00:52:30.570 --&gt; 00:52:36.710
Ran Reichman: is really significant. Because, it just creates</p>
<p>302
00:52:37.390 --&gt; 00:52:48.250
Ran Reichman: a whole set of people who are being trained and using the rust in production, and they also contributing to open source projects. So I think that's great.</p>
<p>303
00:52:48.870 --&gt; 00:52:55.240
Ran Reichman: And yeah, lots of exciting stuff. Here, we're we're in terms of Larry on. So we're</p>
<p>304
00:52:56.010 --&gt; 00:53:14.129
Ran Reichman: like, the world of data is so vast. And there's a there's so much to do here, and so many engines and technologies that can be applied when a company wants to do data processing very efficiently. So we're obviously excited about that future. And we think about rost has a has an important role. There.</p>
<p>305
00:53:16.500 --&gt; 00:53:20.470
Gabor Szabo: Actually, I just thought about a new question, what are the main</p>
<p>306
00:53:20.890 --&gt; 00:53:33.290
Gabor Szabo: problems that Florian is is facing that your engineers will need to solve in the foreseeable future that the new people who are joining the team might need to work on.</p>
<p>307
00:53:34.600 --&gt; 00:53:43.313
Ran Reichman: Yeah. So I mean, I'd say, our engineers are pretty fortunate to have pretty tough challenges. so</p>
<p>308
00:53:44.160 --&gt; 00:53:51.380
Ran Reichman: in in many senses. We're building a a distributed database for data processing, and that means</p>
<p>309
00:53:51.710 --&gt; 00:53:55.649
Ran Reichman: handling issues of a very significant scale</p>
<p>310
00:53:55.900 --&gt; 00:54:12.259
Ran Reichman: of a disk usage of memory management. these are the kinds of things that we're we're excited about like, how much, how much CPU is this using? How much memory is this? Designed correctly. Should we redesign this part of code of the code, should we?</p>
<p>311
00:54:14.072 --&gt; 00:54:19.147
Ran Reichman: sometimes we, we insert many fast paths into our code, so that,</p>
<p>312
00:54:20.238 --&gt; 00:54:25.790
Ran Reichman: when a customer is using is using it naively, and we can get a big performance boost</p>
<p>313
00:54:26.350 --&gt; 00:54:39.550
Ran Reichman: so lots of challenges in that area, it's like CPU memory large scale of data and and performance. Those are the kinds of things that we encounter basically every day.</p>
<p>314
00:54:39.790 --&gt; 00:54:49.780
Ran Reichman: And we also encounter a lot of like new and interesting technologies because our customers have a lot of new and interesting technologies that we we have to learn about them support them, etcetera.</p>
<p>315
00:54:50.850 --&gt; 00:54:55.979
Gabor Szabo: Actually, who? Who are your customers, or what type of of companies are? Are your customers, or</p>
<p>316
00:54:56.750 --&gt; 00:54:58.330
Gabor Szabo: could be your customers.</p>
<p>317
00:54:58.900 --&gt; 00:55:04.656
Ran Reichman: Yeah. So our our customers are mostly the enterprise. meaning the companies that</p>
<p>318
00:55:05.478 --&gt; 00:55:13.230
Ran Reichman: that are very significant data infrastructure. Because they're the ones that carry them care the most about performance. So if the company has a</p>
<p>319
00:55:13.360 --&gt; 00:55:19.639
Ran Reichman: hundreds or thousands of data processing jobs, whether it's a spark array, or hadoop, or trino.</p>
<p>320
00:55:19.830 --&gt; 00:55:27.419
Ran Reichman: These are the kinds of companies that really care about performance that really have pains in terms of managing their spark and their data infrastructure in general.</p>
<p>321
00:55:27.590 --&gt; 00:55:32.639
Ran Reichman: And they're they're the ones that that are most excited about what Flarion brings to the table.</p>
<p>322
00:55:34.620 --&gt; 00:55:41.769
Gabor Szabo: Okay, probably that should. That shouldn't have been the the last question. But so if somehow, this is how it turned out, anyway.</p>
<p>323
00:55:41.770 --&gt; 00:55:42.170
Ran Reichman: Okay.</p>
<p>324
00:55:42.420 --&gt; 00:55:50.540
Gabor Szabo: I don't see any more questions from the audience any any final words for this meeting podcast.</p>
<p>325
00:55:51.180 --&gt; 00:55:58.989
Ran Reichman: No, I mean, I I appreciate this conversation and thanks everyone for joining and asking interesting questions. And yeah, thank you, Gabor, for organizing.</p>
<p>326
00:55:59.380 --&gt; 00:56:22.929
Gabor Szabo: Thank you very much, and I really enjoyed it. And if you're watching this as a video, then please like the video. And if you listen to on, on the podcast, then in the show notes, there are going to be links where you can find the company and the other things that we discussed. And thank you, everyone for. Thank you, Ron, to</p>
<p>327
00:56:22.930 --&gt; 00:56:30.949
Gabor Szabo: be here, and everyone else who joined us and asked questions that were enhanced. I think the the whole conversation.</p>
<p>328
00:56:31.000 --&gt; 00:56:33.560
Gabor Szabo: and thank you everyone for listening.</p>
<p>329
00:56:33.960 --&gt; 00:56:34.890
Gabor Szabo: Goodbye.</p>
<p>330
00:56:35.260 --&gt; 00:56:35.960
Ran Reichman: Thank you.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Sort a graph of dependencies using Toplogical Sort</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-04-08T10:30:01Z</updated>
    <pubDate>2025-04-08T10:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/sort-dependencies-with-topological-sort" />
    <id>https://rust.code-maven.com/sort-dependencies-with-topological-sort</id>
    <content type="html"><![CDATA[<p>The <a href="https://crates.io/crates/topological-sort">topological-sort</a> crate helps you find order in a directed graph.
In other words if you have a bunch of dependencies it helps you untangle the order you need to do them.</p>
<h2 class="title is-4">Example: Simplified Spaghetti Bolognese</h2>
<ul>
<li>Simplified Spaghetti Bolognese depends on Cooked pasta and Sauce</li>
<li>Cooked pasta depends on Dry Pasta and Boilding Water</li>
<li>Sauce depends on Pealed Onion, Pepper, Pealed Tomato</li>
</ul>
<p>Based on this one could establish an order in which things need to be prepared and one could also establish the list of things that can be done in parallel.</p>
<h2 class="title is-4">Example: Omlet</h2>
<p>Sometimes, however you find yourself in trouble. For example:</p>
<ul>
<li>Omlet depends on Egg</li>
<li>Egg depends on Chicken</li>
<li>Chicken depends on Egg</li>
</ul>
<p>Here we don't know if we'll need the Egg or the Chick firts. We have a circular dependency.</p>
<h2 class="title is-4">Examples in code</h2>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/try-toplogical-sort/src/main.rs">examples/try-toplogical-sort/src/main.rs</a></strong></p>
<pre><code class="language-rust">use topological_sort::TopologicalSort;

fn main() {
    independent_things();
    pop_independent_things();
    simple_dependencies();
    complex_dependencies();
    circular_dependencies();
    pop_circular_dependencies();

    many_circular_dependencies();
}

// First &lt; Second &lt; Third
fn simple_dependencies() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    ts.add_dependency(&quot;First&quot;, &quot;Second&quot;);
    ts.add_dependency(&quot;Second&quot;, &quot;Third&quot;);
    assert_eq!(ts.len(), 3);

    // Fetch the elements that don't depend on anything
    let all = ts.pop_all();
    assert_eq!(all.len(), 1);
    assert_eq!(all[0], &quot;First&quot;);

    let all = ts.pop_all();
    assert_eq!(all.len(), 1);
    assert_eq!(all[0], &quot;Second&quot;);

    let all = ts.pop_all();
    assert_eq!(all.len(), 1);
    assert_eq!(all[0], &quot;Third&quot;);

    let all = ts.pop_all();
    assert_eq!(all.len(), 0);
}

fn independent_things() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    assert_eq!(ts.len(), 0);
    assert!(ts.is_empty());

    ts.insert(&quot;A&quot;);
    ts.insert(&quot;B&quot;);
    ts.insert(&quot;C&quot;);
    assert_eq!(ts.len(), 3);
    // println!(&quot;{:?}&quot;, ts);


    // The order of insertion does not matter, we get the items in arbitrary order
    let all = ts.pop_all();
    assert_eq!(all.len(), 3);
    for thing in [&quot;A&quot;, &quot;B&quot;, &quot;C&quot;] {
        assert!(all.contains(&amp;thing));
    }

    assert!(ts.is_empty());
}

fn pop_independent_things() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    assert_eq!(ts.len(), 0);
    assert!(ts.is_empty());

    ts.insert(&quot;A&quot;);
    ts.insert(&quot;B&quot;);
    ts.insert(&quot;C&quot;);
    assert_eq!(ts.len(), 3);

    // The order of insertion does not matter, we get the items in arbitrary order
    let mut all = vec![&quot;A&quot;, &quot;B&quot;, &quot;C&quot;];

    for _ in 0..3 {
        let elem = ts.pop();
        let elem = elem.unwrap();
        assert!(all.contains(&amp;elem));
        let index = all.iter().position(|x| *x == elem).unwrap();
        all.remove(index);
    }
    assert_eq!(all.len(), 0);
    assert_eq!(ts.len(), 0);
}

// First A &lt; Second
// First B &lt; Second
// Second &lt; Third A
// Second &lt; Third B
fn complex_dependencies() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    ts.add_dependency(&quot;First A&quot;, &quot;Second&quot;);
    ts.add_dependency(&quot;First B&quot;, &quot;Second&quot;);
    ts.add_dependency(&quot;Second&quot;, &quot;Third A&quot;);
    ts.add_dependency(&quot;Second&quot;, &quot;Third B&quot;);
    assert_eq!(ts.len(), 5);

    let all = ts.pop_all();
    assert_eq!(all.len(), 2);
    assert!(all.contains(&amp;&quot;First A&quot;));
    assert!(all.contains(&amp;&quot;First B&quot;));

    let all = ts.pop_all();
    assert_eq!(all.len(), 1);
    assert!(all.contains(&amp;&quot;Second&quot;));

    let all = ts.pop_all();
    assert_eq!(all.len(), 2);
    assert!(all.contains(&amp;&quot;Third A&quot;));
    assert!(all.contains(&amp;&quot;Third B&quot;));
}

// Chicken &lt;-&gt; Egg
fn circular_dependencies() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    ts.add_dependency(&quot;Chicken&quot;, &quot;Egg&quot;);
    ts.add_dependency(&quot;Egg&quot;, &quot;Chicken&quot;);
    // println!(&quot;{:?}&quot;, ts);

    // if pop_all returned an empty vector and there are still elements in the TS
    // that means the dependencies are circular
    let all = ts.pop_all();
    assert_eq!(all.len(), 0);
    assert_eq!(ts.len(), 2);
}

// Chicken &lt;-&gt; Egg
// Shakshuka &lt; Egg
// Chicken &lt; Qqrq
fn pop_circular_dependencies() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    ts.add_dependency(&quot;Chicken&quot;, &quot;Egg&quot;);
    ts.add_dependency(&quot;Egg&quot;, &quot;Chicken&quot;);
    ts.add_dependency(&quot;Shakshuka&quot;, &quot;Egg&quot;);
    ts.add_dependency(&quot;Chicken&quot;, &quot;Qqrq&quot;);
    // println!(&quot;{:?}&quot;, ts);

    let elem = ts.pop();
    assert_eq!(elem, Some(&quot;Shakshuka&quot;));

    let elem = ts.pop();
    assert_eq!(elem, None);
}


fn many_circular_dependencies() {
    let mut ts = TopologicalSort::&lt;&amp;str&gt;::new();
    ts.add_dependency(&quot;Chicken&quot;, &quot;Egg&quot;);
    ts.add_dependency(&quot;Egg&quot;, &quot;Chicken&quot;);

    ts.add_dependency(&quot;Egg&quot;, &quot;Omlet&quot;);
    // ts.add_dependency(&quot;A&quot;, &quot;Egg&quot;);
    // ts.add_dependency(&quot;B&quot;, &quot;Omlet&quot;);
    // ts.add_dependency(&quot;A&quot;, &quot;B&quot;);
    // ts.add_dependency(&quot;B&quot;, &quot;A&quot;);


    println!(&quot;{:?}&quot;, ts);
    assert_eq!(ts.pop(), None);
}
</code></pre>
<p><strong><a href="https://github.com/szabgab/rust.code-maven.com/tree/main/examples/try-toplogical-sort/Cargo.toml">examples/try-toplogical-sort/Cargo.toml</a></strong></p>
<pre><code class="language-toml">[package]
name = &quot;try-toplogical-sort&quot;
version = &quot;0.1.0&quot;
edition = &quot;2024&quot;

[dependencies]
topological-sort = &quot;0.2.2&quot;

</code></pre>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>Rust and embedded programming with Leon Vak</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-03-21T14:30:01Z</updated>
    <pubDate>2025-03-21T14:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/rust-and-embedded-programming-with-leon-vak" />
    <id>https://rust.code-maven.com/rust-and-embedded-programming-with-leon-vak</id>
    <content type="html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/kh24SgUIid4" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<p>In this online session <a href="https://www.linkedin.com/in/leon-vak-24445922/">Leon Vak</a>, who gave 3 excellent presentations about Embedded programming and Linux kernel programming with Rust at Abra, is going to show us how he uses Rust to write programs for an embedded device.</p>
<p><img src="images/leon-vak.jpeg" alt="Leon Vak" /></p>
<ul>
<li><a href="https://benchmarksgame-team.pages.debian.net/benchmarksgame/index.html">Debian Benchmark</a></li>
<li><a href="https://github.com/l-0-l/rust-examples-microbit-2024">Source code</a></li>
</ul>
<h2 class="title is-4">Transcript</h2>
<p>1
00:00:01.900 --&gt; 00:00:21.539
Gabor Szabo: So Hello, and and welcome to the Code Maven and Meetup Group. And if you're watching the video, then the Code Maven Youtube, Channel and my name is Gabor Sobo. I usually teach rust and python, and how companies introduce these languages or introduce testing for these languages, and I also organize the</p>
<p>2
00:00:21.950 --&gt; 00:00:50.339
Gabor Szabo: Both the rust and the python meetup groups here in Israel. And I also have this Code Mavens Group, where I try to organize presentations both in rust and in python, in English, in zoom. So we can reach all the international community. And we can also invite people. If you look at the history. You can find all kind of other videos from other people about all kind of interesting subjects in these 2 languages.</p>
<p>3
00:00:50.812 --&gt; 00:00:59.000
Gabor Szabo: Is that said, I am really happy, Leon, that you agreed to give this presentation. I think this is the 3rd time you're already giving this or so so</p>
<p>4
00:00:59.000 --&gt; 00:00:59.780
Leon: Yeah.</p>
<p>5
00:01:00.216 --&gt; 00:01:26.380
Gabor Szabo: And but this time it's in English. So we'll have it also for the international community and recorded. And thank you very much everyone who joined us. As I said earlier, you can feel free to ask questions in the chat, and if you don't want to speak up, and that's it, I think. Now the stage is yours.</p>
<p>6
00:01:26.980 --&gt; 00:01:27.570
Leon: Alright!</p>
<p>7
00:01:27.670 --&gt; 00:01:31.940
Gabor Szabo: Share your screen. You can talk without sharing your screen whatever you like.</p>
<p>8
00:01:32.420 --&gt; 00:01:46.970
Leon: All right, all right, all right, we're there the right. So let me just share the screen again.</p>
<p>9
00:01:49.430 --&gt; 00:01:52.930
Leon: Alright. So you guys will be</p>
<p>10
00:01:53.900 --&gt; 00:01:56.700
Leon: able to see my screen very soon</p>
<p>11
00:01:56.700 --&gt; 00:01:58.690
Gabor Szabo: Yeah, we see the embedded summer camp</p>
<p>12
00:01:59.020 --&gt; 00:02:06.749
Leon: Okay, okay, okay, okay, very good. So right? So this this meetup was a</p>
<p>13
00:02:07.140 --&gt; 00:02:10.999
Leon: was created as a part of 3.</p>
<p>14
00:02:11.860 --&gt; 00:02:18.329
Leon: 3 separate meetups we have arranged in our company called Abra.</p>
<p>15
00:02:18.470 --&gt; 00:02:28.430
Leon: and this was the the specific one we're talking about right now is the rust in embedded systems, and</p>
<p>16
00:02:29.150 --&gt; 00:02:31.490
Leon: and it was a</p>
<p>17
00:02:31.970 --&gt; 00:02:47.240
Leon: it was the second one. The 1st one was Linux Kernel Development, which was not related to rust at all. The second one was the rust in embedded systems, and the last one was rust in Linux Kernel.</p>
<p>18
00:02:49.070 --&gt; 00:02:59.470
Leon: This series was quite interesting for me to prepare and to present, and I hope you'll find it.</p>
<p>19
00:03:00.025 --&gt; 00:03:02.050
Leon: at least a bit amusing.</p>
<p>20
00:03:02.460 --&gt; 00:03:03.780
Leon: M.</p>
<p>21
00:03:04.210 --&gt; 00:03:07.209
Leon: So, right, we?</p>
<p>22
00:03:09.926 --&gt; 00:03:13.219
Leon: yeah. 1st of all, I my name is Leon.</p>
<p>23
00:03:13.410 --&gt; 00:03:14.240
Leon: Right?</p>
<p>24
00:03:14.350 --&gt; 00:03:19.780
Leon: That's enough. And you know, we, the rest people.</p>
<p>25
00:03:20.060 --&gt; 00:03:24.990
Leon: We we have. We clearly have some issues right?</p>
<p>26
00:03:25.662 --&gt; 00:03:32.320
Leon: And you will. I guess by now you already are aware about</p>
<p>27
00:03:32.580 --&gt; 00:03:41.690
Leon: our little problems. But you know that's why we're here today. So I hope you'll and Joyce</p>
<p>28
00:03:42.611 --&gt; 00:04:03.329
Leon: we will be talking about rust for embedded and we will mention how rust for embedded systems for bare metal, embedded systems is not the same as rust for you know, when you develop in user space like Linux windows, whatever</p>
<p>29
00:04:04.181 --&gt; 00:04:10.899
Leon: we will mention the fact that rust provides your</p>
<p>30
00:04:11.640 --&gt; 00:04:21.590
Leon: gives you or lets you develop in a full. It's very supporting ecosystem for embedded and specifically for bare metal.</p>
<p>31
00:04:22.340 --&gt; 00:04:31.600
Leon: And we will be questioning just a little bit rust versus C and C plus plus in the embedded. Just to touch on that, because</p>
<p>32
00:04:32.060 --&gt; 00:04:33.629
Leon: it's hard not to.</p>
<p>33
00:04:33.940 --&gt; 00:04:41.539
Leon: And what we will not be doing today, we will not be learning what embedded development is. I</p>
<p>34
00:04:41.750 --&gt; 00:04:45.869
Leon: hope that you guys have any well, just</p>
<p>35
00:04:46.020 --&gt; 00:05:03.269
Leon: any sort of idea about it up to now. And we will not be mentioning concepts like serial port and the leads, the leds switching on and off, and so on. Right? I assume that you</p>
<p>36
00:05:03.410 --&gt; 00:05:09.889
Leon: are aware about these things, and we are not going to be learning the rust language.</p>
<p>37
00:05:10.300 --&gt; 00:05:14.369
Leon: It's not about learning rust language. I hope you will</p>
<p>38
00:05:14.620 --&gt; 00:05:18.459
Leon: see what the presentation is about.</p>
<p>39
00:05:18.977 --&gt; 00:05:31.299
Leon: There are not many slides here. We'll just speak very quickly about a few slides here like 3, 4 slides, and then we will switch to a hands on a demo</p>
<p>40
00:05:32.256 --&gt; 00:05:45.963
Leon: which is which has a little issue today. Because, there is one thing that's not working for some reason, but we will get over it. And right. So let's</p>
<p>41
00:05:46.770 --&gt; 00:05:47.819
Leon: go ahead.</p>
<p>42
00:05:49.640 --&gt; 00:05:52.310
Leon: What are we?</p>
<p>43
00:05:52.600 --&gt; 00:05:56.299
Leon: Well, I I cannot say we're all familiar with that, but</p>
<p>44
00:05:57.121 --&gt; 00:06:23.460
Leon: many of us are well familiar with it, with the good old dead old days when you were quite locked, with a development under a specific platform and a specific ide, and the specific debugger. And whatever zylogue is a good example, I used to work with it once. And yeah, so we had an ide just for it.</p>
<p>45
00:06:23.800 --&gt; 00:06:30.909
Leon: Special debugger probe, and everything is quite unique for this platform.</p>
<p>46
00:06:31.950 --&gt; 00:06:48.280
Leon: And so yeah, so it's all about the Ics, the chips eventually. So the chip was from Zylogue, and the Id was developed by them, and the compiler and the debugger. Everything is just.</p>
<p>47
00:06:48.690 --&gt; 00:06:50.650
Leon: you know, very custom.</p>
<p>48
00:06:52.730 --&gt; 00:07:02.630
Leon: And now we have rust, and this is very, very different from C, because</p>
<p>49
00:07:03.420 --&gt; 00:07:18.349
Leon: well, we have the next slide. So why rush 1st of all, we will be moving from vendor login to freedom. We are really capable of developing whatever we want without any.</p>
<p>50
00:07:18.650 --&gt; 00:07:26.759
Leon: I am any code supplied by the vendor entirely.</p>
<p>51
00:07:27.510 --&gt; 00:07:34.549
Leon: and we will use any id that we like I used. I'm used to work with</p>
<p>52
00:07:35.420 --&gt; 00:07:40.020
Leon: this code, but you can use any id</p>
<p>53
00:07:40.290 --&gt; 00:07:50.280
Leon: of choice. You don't need an idea. You can use just the code editor. And for the hardcore guys you can do everything in them.</p>
<p>54
00:07:50.980 --&gt; 00:07:52.250
Leon: M.</p>
<p>55
00:07:52.770 --&gt; 00:07:58.590
Leon: And what's good about rust compared to the bare metal C programming.</p>
<p>56
00:07:58.840 --&gt; 00:08:09.209
Leon: It's the power of modern language in embedded programming. It's just incredible what stuff you can do in bare metal. If you</p>
<p>57
00:08:09.820 --&gt; 00:08:18.950
Leon: you know, if you if you're used to bare metal programming in C, then the switch to rust would just knock your mind off.</p>
<p>58
00:08:19.580 --&gt; 00:08:27.890
Leon: M, yeah. And why? Rust, of course, unmatched safety concurrency. And what about the performance?</p>
<p>59
00:08:29.070 --&gt; 00:08:36.760
Leon: Well, we really need to talk about it. Because that's 1 of the main questions people always ask about.</p>
<p>60
00:08:36.860 --&gt; 00:08:43.650
Leon: You know why use rust and not c not c plus plus in embedded development.</p>
<p>61
00:08:43.990 --&gt; 00:08:51.310
Leon: So and many times everything boils down to performance.</p>
<p>62
00:08:52.700 --&gt; 00:09:00.640
Leon: I will give you the tools to measure your own and performance requirements.</p>
<p>63
00:09:00.810 --&gt; 00:09:04.850
Leon: So let's Luke over here.</p>
<p>64
00:09:05.620 --&gt; 00:09:10.329
Leon: You have the I'll try to make it slightly bigger</p>
<p>65
00:09:10.985 --&gt; 00:09:16.219
Leon: you have the benchmark game. Right? This is under Debian.</p>
<p>66
00:09:16.990 --&gt; 00:09:22.079
Leon: Okay, debian.net benchmark game. You can find it easily on the net.</p>
<p>67
00:09:22.440 --&gt; 00:09:23.900
Leon: Okay, no worries.</p>
<p>68
00:09:24.050 --&gt; 00:09:31.630
Leon: And and you have certain comparisons of rust versus</p>
<p>69
00:09:32.470 --&gt; 00:09:36.419
Leon: other languages. So let's take C, for example.</p>
<p>70
00:09:37.040 --&gt; 00:09:41.829
Leon: right? And you have the comparison to Gcc.</p>
<p>71
00:09:42.210 --&gt; 00:09:47.400
Leon: and you have different algorithms here. Everything is very, very, you know.</p>
<p>72
00:09:47.620 --&gt; 00:09:57.069
Leon: Open. So if you click on the specific algorithm, you get the all kind of measurements.</p>
<p>73
00:09:57.690 --&gt; 00:10:03.419
Leon: And you can get to the algorithm itself, the implementations, everything is here. It's all.</p>
<p>74
00:10:03.790 --&gt; 00:10:06.780
Leon: It's all open source and available.</p>
<p>75
00:10:08.360 --&gt; 00:10:16.690
Leon: So when you compare rust to C with Gcc. For example, you can see the you know</p>
<p>76
00:10:17.360 --&gt; 00:10:19.880
Leon: the different runs here.</p>
<p>77
00:10:20.400 --&gt; 00:10:48.149
Leon: and you can sort it. You can do a lot of things here, but eventually you will see that rust is not better than C. And C is not better than rust depending on an algorithm and on the tests performed in some, in some C would be quicker in some rust will take the 1st places.</p>
<p>78
00:10:48.350 --&gt; 00:10:49.969
Leon: It's just, you know.</p>
<p>79
00:10:50.210 --&gt; 00:10:53.650
Leon: It's all right. They are quite the same eventually.</p>
<p>80
00:10:53.880 --&gt; 00:11:00.679
Leon: so no need to worry about performance. The performance is, how do you define it?</p>
<p>81
00:11:00.870 --&gt; 00:11:04.079
Leon: I suppose it's as good as it gets.</p>
<p>82
00:11:04.890 --&gt; 00:11:13.699
Leon: at least, you know, using modern compilers and systems, you can instead compare it to the C. Lang.</p>
<p>83
00:11:13.840 --&gt; 00:11:18.220
Leon: And once again, the picture doesn't change much.</p>
<p>84
00:11:19.720 --&gt; 00:11:28.969
Leon: so feel free to go to this site and and check it for yourself. I will not be teaching you what's</p>
<p>85
00:11:29.140 --&gt; 00:11:30.960
Leon: the best for you.</p>
<p>86
00:11:31.390 --&gt; 00:11:36.540
Leon: You can compare it to any language, and with different algos and whatever.</p>
<p>87
00:11:37.260 --&gt; 00:11:48.149
Leon: So enough with that, I suppose. It's quite clear right now, why does it start again?</p>
<p>88
00:11:48.560 --&gt; 00:11:54.029
Leon: Okay, sorry. Okay, so this is about the performance.</p>
<p>89
00:11:54.780 --&gt; 00:11:59.740
Leon: you know, talking about safety, concurrency, and whatever you.</p>
<p>90
00:12:00.560 --&gt; 00:12:02.379
Leon: I guess that by now you're</p>
<p>91
00:12:02.730 --&gt; 00:12:12.649
Leon: trust shines on these sides and way way better than C. So if the performance is the same, so why choose any other language?</p>
<p>92
00:12:14.003 --&gt; 00:12:17.730
Leon: Oh, yeah. By the way, this is Ferris.</p>
<p>93
00:12:19.090 --&gt; 00:12:23.570
Leon: Just so you know this is the mascot. His name is Ferris.</p>
<p>94
00:12:24.299 --&gt; 00:12:37.200
Leon: Any idea why, he's called Ferris? It's very simple, Ferro, like rust, like whatever programmers jokes.</p>
<p>95
00:12:38.160 --&gt; 00:12:47.950
Leon: M, all right. So what and how the bare metal programming is different.</p>
<p>96
00:12:50.400 --&gt; 00:12:55.889
Leon: Well, eventually, when you write any program for</p>
<p>97
00:12:56.540 --&gt; 00:13:03.409
Leon: see for for for any OS like Windows or Linux, or whatever.</p>
<p>98
00:13:03.860 --&gt; 00:13:14.139
Leon: Eventually your code will swap to using C interfaces because the operating systems.</p>
<p>99
00:13:14.320 --&gt; 00:13:23.300
Leon: not all of them, but most of them are written with C, and your code will just</p>
<p>100
00:13:25.230 --&gt; 00:13:29.020
Leon: run C code eventually under the hood.</p>
<p>101
00:13:29.890 --&gt; 00:13:33.620
Leon: Here is an example using the foreign function interface.</p>
<p>102
00:13:34.460 --&gt; 00:13:40.610
Leon: This is this comes from the rust. It's just an random example</p>
<p>103
00:13:40.730 --&gt; 00:13:51.059
Leon: and rust lang rust. 3 master library, Std. Src. OS unix Fs. So this is a file system library</p>
<p>104
00:13:51.360 --&gt; 00:13:52.810
Leon: for unix.</p>
<p>105
00:13:53.030 --&gt; 00:13:57.880
Leon: And this is just one function from it. Make dear function.</p>
<p>106
00:13:58.300 --&gt; 00:13:59.600
Leon: What does it do?</p>
<p>107
00:14:01.040 --&gt; 00:14:06.579
Leon: It simply calls the lip. See? Make deer on this machine.</p>
<p>108
00:14:07.380 --&gt; 00:14:18.040
Leon: This is quite clear. And because these things, these things are implemented on the Lipsy level, and</p>
<p>109
00:14:18.400 --&gt; 00:14:20.120
Leon: everything boils down to that.</p>
<p>110
00:14:21.810 --&gt; 00:14:25.730
Leon: There is certain questions that one may ask.</p>
<p>111
00:14:25.900 --&gt; 00:14:29.319
Leon: If it all boils, boils down to C, then why use rust?</p>
<p>112
00:14:29.910 --&gt; 00:14:31.759
Leon: Well if you can.</p>
<p>113
00:14:32.030 --&gt; 00:14:34.520
Leon: Right? If you can write</p>
<p>114
00:14:34.620 --&gt; 00:14:44.480
Leon: big apps with lots of business logic and feel safe on memory issues and everything else rust helps you with.</p>
<p>115
00:14:44.930 --&gt; 00:14:49.319
Leon: Then I think you've done a good job here.</p>
<p>116
00:14:50.070 --&gt; 00:14:58.979
Leon: anyway. A foreign function. Interface is an interesting topic to read about Ffi. You can find it easily on the network.</p>
<p>117
00:14:59.450 --&gt; 00:15:03.720
Leon: And, by the way, rust is an open source language.</p>
<p>118
00:15:04.651 --&gt; 00:15:07.539
Leon: Just try to find</p>
<p>119
00:15:07.720 --&gt; 00:15:14.089
Leon: the code for make deer in lip C. It will take you some time, I promise you that</p>
<p>120
00:15:14.190 --&gt; 00:15:20.950
Leon: it's not that easy with rust. You just get there almost immediately with any search on the network.</p>
<p>121
00:15:23.330 --&gt; 00:15:28.359
Leon: So yeah, so you are programming in rust. However.</p>
<p>122
00:15:28.710 --&gt; 00:15:34.490
Leon: you're getting to see interfaces on the OS abis.</p>
<p>123
00:15:36.270 --&gt; 00:15:41.220
Leon: The rest for embedded is very different on these regards. Well.</p>
<p>124
00:15:41.350 --&gt; 00:15:47.960
Leon: once again, when I say rust for embedded here, I mean rust for bare metal embedded systems. All right.</p>
<p>125
00:15:48.310 --&gt; 00:15:54.669
Leon: So as you can see at first, st you see. Well, you guys, I don't know. Some of you may</p>
<p>126
00:15:54.830 --&gt; 00:16:01.030
Leon: have experience with Russ. Some not. I will explain. Some basics. Don't worry about it. So</p>
<p>127
00:16:02.130 --&gt; 00:16:05.690
Leon: you have the no Std. And no main.</p>
<p>128
00:16:06.030 --&gt; 00:16:07.530
Leon: Why is that?</p>
<p>129
00:16:07.870 --&gt; 00:16:10.739
Leon: Well, 1st of all, there is no standard library.</p>
<p>130
00:16:11.010 --&gt; 00:16:13.529
Leon: There is no standard library under</p>
<p>131
00:16:13.900 --&gt; 00:16:17.330
Leon: bare metal programming. You don't have any</p>
<p>132
00:16:18.100 --&gt; 00:16:24.949
Leon: special library behind everything. You don't have the Lib. C. Or stuff to help you with.</p>
<p>133
00:16:25.070 --&gt; 00:16:38.669
Leon: There are certain standard stuff there. There is a small standard library built into your code now, when you compile with no Std. But these are just basics</p>
<p>134
00:16:39.190 --&gt; 00:16:48.579
Leon: and and no main, because, you know you're you feel free to select your entry point. For example, here. It's called my main.</p>
<p>135
00:16:48.760 --&gt; 00:17:01.990
Leon: and it's it has the entry syntax here that marks it as entry point for this function. So when it builds, the Linker will arrange</p>
<p>136
00:17:02.130 --&gt; 00:17:05.830
Leon: and the start of our code over here.</p>
<p>137
00:17:06.000 --&gt; 00:17:10.809
Leon: So what you see here is some basic code for</p>
<p>138
00:17:12.598 --&gt; 00:17:16.859
Leon: for a bare metal program in rust.</p>
<p>139
00:17:17.300 --&gt; 00:17:20.852
Leon: Apart from the main, you have the</p>
<p>140
00:17:21.579 --&gt; 00:17:28.689
Leon: the core panic panic info stuff which will be used for this function</p>
<p>141
00:17:28.800 --&gt; 00:17:38.690
Leon: because we need to provide the panic function. This is the only function that we really have to provide apart from the entry function.</p>
<p>142
00:17:38.990 --&gt; 00:17:41.750
Leon: And why do we need to provide panic.</p>
<p>143
00:17:42.000 --&gt; 00:17:44.152
Leon: People familiar with</p>
<p>144
00:17:45.350 --&gt; 00:17:54.397
Leon: with programming under an operating system are used to error handling to all kind of</p>
<p>145
00:17:55.560 --&gt; 00:18:08.500
Leon: all kind of failures that are treated, whether in well, we, we are talking about runtime stuff right now. So at Runtime your program can fail in different ways.</p>
<p>146
00:18:08.990 --&gt; 00:18:13.149
Leon: But in a bare metal embedded system.</p>
<p>147
00:18:13.650 --&gt; 00:18:19.890
Leon: You don't have this luxury. You need to handle your panics by yourself.</p>
<p>148
00:18:20.370 --&gt; 00:18:26.830
Leon: and when your code is about to panic you need to provide a handler to go into.</p>
<p>149
00:18:27.700 --&gt; 00:18:32.799
Leon: and I'll just give you just just a thought. You know. Why.</p>
<p>150
00:18:33.690 --&gt; 00:18:39.370
Leon: Why is this here? Why, the inline? Never for the panic handler</p>
<p>151
00:18:42.840 --&gt; 00:18:48.959
Leon: any ideas, why cannot this function be inlined?</p>
<p>152
00:18:51.310 --&gt; 00:18:58.189
Leon: The the reason for that is that this function will be called by a pointer.</p>
<p>153
00:18:58.650 --&gt; 00:19:05.659
Leon: This function sits somewhere in the memory, and in case the CPU performs some illegal function</p>
<p>154
00:19:06.430 --&gt; 00:19:19.190
Leon: like dividing by 0 or any other failure, then it will just jump over to the panic function. Now, inside panic function, it's up to you how to handle it.</p>
<p>155
00:19:19.590 --&gt; 00:19:30.769
Leon: It's bare metal. You have no OS to look after. So you it's up to you. You can reset the platform, for example, or you can just do nothing and get stuck in the loop</p>
<p>156
00:19:30.950 --&gt; 00:19:32.130
Leon: whatever you want.</p>
<p>157
00:19:32.590 --&gt; 00:19:38.470
Leon: So this here is a very basic program for the cortex, M.</p>
<p>158
00:19:38.810 --&gt; 00:19:39.839
Leon: And stuff.</p>
<p>159
00:19:40.280 --&gt; 00:19:48.750
Leon: Now, how the things work with rust for bare metal programming with embedded rust for bare metal.</p>
<p>160
00:19:48.910 --&gt; 00:19:54.790
Leon: 1st of all, you have the hardware, right? We all know Leds.</p>
<p>161
00:19:55.210 --&gt; 00:20:01.379
Leon: And how do you control this hardware? Well, you can use direct register access.</p>
<p>162
00:20:02.410 --&gt; 00:20:05.150
Leon: This is an example you use unsafe.</p>
<p>163
00:20:05.650 --&gt; 00:20:12.039
Leon: and you write volatile, and this is the address</p>
<p>164
00:20:12.260 --&gt; 00:20:18.120
Leon: right? And then you read volatile. Ptr. Read volatile from the same address.</p>
<p>165
00:20:18.250 --&gt; 00:20:24.930
Leon: and then you perform an operation on it just to light up the relevant led.</p>
<p>166
00:20:25.060 --&gt; 00:20:32.269
Leon: and then you write it back. So you read the value you modify it, and then you write it back to the memory.</p>
<p>167
00:20:32.650 --&gt; 00:20:41.775
Leon: To do that you need to understand very well what you're doing, because this is just an address. It's just a re register in the</p>
<p>168
00:20:42.370 --&gt; 00:20:52.548
Leon: in the in your mcu. So you you need to understand very well what you're doing here you need to read the the data sheets and</p>
<p>169
00:20:53.350 --&gt; 00:20:55.329
Leon: figure out everything for yourself.</p>
<p>170
00:20:56.400 --&gt; 00:21:07.640
Leon: The next level just above it is the pack, the peripheral access rate, this looks very different.</p>
<p>171
00:21:08.400 --&gt; 00:21:13.090
Leon: 1st of all, you use the relevant pack.</p>
<p>172
00:21:13.260 --&gt; 00:21:18.689
Leon: In this case I gave an example for an Stm. 32 F. 4.</p>
<p>173
00:21:19.070 --&gt; 00:21:26.679
Leon: This is all open source and everything very accessible. You can check out the code inside whatever you want.</p>
<p>174
00:21:26.960 --&gt; 00:21:31.870
Leon: So there you apply to Gpio</p>
<p>175
00:21:32.200 --&gt; 00:21:36.800
Leon: a number A, which is the one of the Gpio sets.</p>
<p>176
00:21:36.980 --&gt; 00:21:41.510
Leon: and then you have the output data register, and then you modify it</p>
<p>177
00:21:41.960 --&gt; 00:21:46.250
Leon: alright, which is a method in Svd. To rust, which will</p>
<p>178
00:21:46.390 --&gt; 00:21:48.939
Leon: we'll just mention in a second</p>
<p>179
00:21:49.844 --&gt; 00:21:58.560
Leon: and then you just use the Odr 5 in this case, and you clear a bit.</p>
<p>180
00:22:00.030 --&gt; 00:22:03.510
Leon: This makes more sense than what we've seen below.</p>
<p>181
00:22:04.100 --&gt; 00:22:06.560
Leon: Now, what's the Svd to rust?</p>
<p>182
00:22:08.230 --&gt; 00:22:23.299
Leon: well, most Mcu manufacturers provide Svd files that define the whole usage of their Gpios or the pins of the of the Mcu.</p>
<p>183
00:22:23.420 --&gt; 00:22:33.619
Leon: And you can use the Svd to rust a tool to create the the packs.</p>
<p>184
00:22:33.720 --&gt; 00:22:45.400
Leon: Okay, so packs can be created automatically, mostly. By just receiving the proper Svd file for the platform. So if you have your own</p>
<p>185
00:22:45.590 --&gt; 00:22:56.750
Leon: like, you developed your own silicon, or a just have something that is not currently supported. As long as you have the Svd file, you're okay.</p>
<p>186
00:22:57.210 --&gt; 00:23:03.900
Leon: You can get more information about it in Svd. To rust. Just type it on the net, and you'll find out.</p>
<p>187
00:23:05.430 --&gt; 00:23:08.480
Leon: So this is nicer, but we can do better.</p>
<p>188
00:23:09.970 --&gt; 00:23:19.200
Leon: One level above it is the hardware obstruction layer. How we'll know this this name</p>
<p>189
00:23:19.700 --&gt; 00:23:25.870
Leon: and the how is way more convenient for us, as you can see here, we use the how.</p>
<p>190
00:23:25.970 --&gt; 00:23:32.570
Leon: and we have the sample usage like Gpioa PA. 5,</p>
<p>191
00:23:32.800 --&gt; 00:23:36.689
Leon: which was the Odr 5 over here.</p>
<p>192
00:23:36.970 --&gt; 00:23:42.570
Leon: and maybe probably number Gpi. Number 5 over here</p>
<p>193
00:23:42.830 --&gt; 00:23:51.129
Leon: into push, pull output. Okay? So we we 1st configure it to push, pull output. Then we set it to high.</p>
<p>194
00:23:51.480 --&gt; 00:23:53.120
Leon: and that's it.</p>
<p>195
00:23:54.380 --&gt; 00:24:01.140
Leon: Alright. So here, this is very, very straightforward, very convenient to use, and you have it all</p>
<p>196
00:24:01.530 --&gt; 00:24:09.579
Leon: in the relevant hull crate like Stm. 32 f. Or xxl.</p>
<p>197
00:24:11.133 --&gt; 00:24:31.049
Leon: But then you have the board support packages which are fantastic. The difference between how and the board support package is that the how allows you to work with the Mcu. So you select the Mcu and then you use its how.</p>
<p>198
00:24:31.200 --&gt; 00:24:35.940
Leon: But board support packages is for is clearly for a board</p>
<p>199
00:24:36.597 --&gt; 00:24:42.970
Gabor Szabo: Sorry for to interrupt you. I have a question. If it's okay, business layers.</p>
<p>200
00:24:44.680 --&gt; 00:24:45.680
Gabor Szabo: Can you hear me?</p>
<p>201
00:24:45.840 --&gt; 00:24:46.780
Leon: Yeah, yeah, I'm with you.</p>
<p>202
00:24:47.020 --&gt; 00:24:48.340
Gabor Szabo: So so</p>
<p>203
00:24:49.230 --&gt; 00:25:01.900
Gabor Szabo: are these examples really related, so meaning that there, there is the the lowest level the direct register access. You have this hexadecimal number?</p>
<p>204
00:25:02.030 --&gt; 00:25:08.819
Gabor Szabo: Is the Odr actually correct? The Odr corresponds to that or so is there a name for basically</p>
<p>205
00:25:08.820 --&gt; 00:25:09.600
Leon: Yes.</p>
<p>206
00:25:09.600 --&gt; 00:25:10.090
Gabor Szabo: We'll go ahead</p>
<p>207
00:25:10.090 --&gt; 00:25:15.680
Leon: Yes, yes, yes, under the hood. It works exactly like it's shown here.</p>
<p>208
00:25:15.970 --&gt; 00:25:30.180
Leon: all right. Eventually everything boils down to these these commands, but they are just wrapped in layers of wrappers that allow you to use them in the easiest way possible.</p>
<p>209
00:25:31.220 --&gt; 00:25:41.329
Gabor Szabo: Okay. So basically, the the what you can see then the on the pack level operation is basically doing the same reading and shifting and writing back</p>
<p>210
00:25:41.580 --&gt; 00:25:42.779
Leon: Yes, exactly.</p>
<p>211
00:25:43.630 --&gt; 00:25:45.360
Gabor Szabo: Is the clear bit? Okay.</p>
<p>212
00:25:45.510 --&gt; 00:25:45.840
Leon: Yep.</p>
<p>213
00:25:45.840 --&gt; 00:25:46.859
Gabor Szabo: Okay. Thank you.</p>
<p>214
00:25:47.660 --&gt; 00:26:05.250
Leon: So the difference between the hull and the Bsp. Is because Bsp is about the board. So the actual board, like like this one over here. This is a board. It's a specific board that you can get and use.</p>
<p>215
00:26:05.370 --&gt; 00:26:08.629
Leon: So if you have evaluation boards.</p>
<p>216
00:26:08.860 --&gt; 00:26:13.760
Leon: many of these evaluation boards like the nucleo over here.</p>
<p>217
00:26:14.840 --&gt; 00:26:25.820
Leon: You have the Bsp available for them. Now, why is it better to use the Bsp eventually, if you're using a</p>
<p>218
00:26:27.230 --&gt; 00:26:33.810
Leon: an evaluation board. It's because here, for example, we can define an led.</p>
<p>219
00:26:34.920 --&gt; 00:26:37.339
Leon: So when we define an led.</p>
<p>220
00:26:38.380 --&gt; 00:26:52.280
Leon: and of course we configure it as appropriate, then you. You just have the on method for the led, because we know that this is an led. It's not just a Gpio.</p>
<p>221
00:26:52.630 --&gt; 00:26:59.930
Leon: because we know that behind this specific Gpio on this specific board, we absolutely have an led.</p>
<p>222
00:27:00.220 --&gt; 00:27:05.510
Leon: so we can configure it and just use the specific led with just an own command.</p>
<p>223
00:27:05.840 --&gt; 00:27:08.540
Leon: and it makes the life very easy.</p>
<p>224
00:27:09.520 --&gt; 00:27:10.465
Leon: And</p>
<p>225
00:27:11.550 --&gt; 00:27:29.480
Leon: also, if you have your own board, if you develop your own board, then you can use some basic or some similar Bsps to define your own Bsp, and work, you know, like a king with this board very easy interface.</p>
<p>226
00:27:29.950 --&gt; 00:27:37.040
Leon: So these are the layers of working with and</p>
<p>227
00:27:37.580 --&gt; 00:27:43.445
Leon: and these are the layers of working with rust,</p>
<p>228
00:27:44.820 --&gt; 00:27:47.700
Leon: With mcus in bare metal.</p>
<p>229
00:27:48.920 --&gt; 00:27:51.620
Leon: Now, you know.</p>
<p>230
00:27:53.400 --&gt; 00:28:02.520
Leon: And I use C. The C language in embedded development for for too long.</p>
<p>231
00:28:03.760 --&gt; 00:28:12.279
Leon: And then, when I started, you know, considering this meetup, I just</p>
<p>232
00:28:13.250 --&gt; 00:28:21.029
Leon: did a test. I just went to the Internet, you know, on Google and wrote cross compilation setup in C,</p>
<p>233
00:28:22.340 --&gt; 00:28:26.969
Leon: and the 1st thing it brought me to was</p>
<p>234
00:28:27.290 --&gt; 00:28:45.490
Leon: stack overflow cross compilation requirements. I have some basic knowledge about compiling with C need to get a couple of generic cross compilation questions answered. In my case, I'm trying to whatever and this and that, and there were lots of sections like that, and no real good explanation.</p>
<p>235
00:28:45.900 --&gt; 00:28:53.320
Leon: If you do the same in rust, you immediately arrive to the right place, to the right</p>
<p>236
00:28:53.540 --&gt; 00:29:00.600
Leon: website and to the right page. That explains you exactly how to build everything you need.</p>
<p>237
00:29:01.230 --&gt; 00:29:09.680
Leon: And this is just fantastic. This is why rust is a modern programming language. Unlike C,</p>
<p>238
00:29:12.120 --&gt; 00:29:16.249
Leon: we can talk a lot about that, but we will, we will not right now.</p>
<p>239
00:29:16.510 --&gt; 00:29:22.510
Leon: Still, the picture is clear. I clearly feel the difference here.</p>
<p>240
00:29:24.060 --&gt; 00:29:33.189
Leon: Yeah, this is just some fun poster I made for explaining my feelings.</p>
<p>241
00:29:33.420 --&gt; 00:29:37.449
Leon: Yes, C. Is quite confusing at times.</p>
<p>242
00:29:37.590 --&gt; 00:29:45.570
Leon: Rust is way more straightforward, so you can be ready to go. Oh, sorry to rust in 5 min.</p>
<p>243
00:29:45.800 --&gt; 00:29:47.190
Leon: maybe less.</p>
<p>244
00:29:47.400 --&gt; 00:29:53.539
Leon: It's all up to you. You install the cross compiler and set up a project that's all.</p>
<p>245
00:29:53.920 --&gt; 00:30:00.120
Leon: So rust up target, add you add your own target depends on what you work with.</p>
<p>246
00:30:00.400 --&gt; 00:30:03.190
Leon: Then you create the project.</p>
<p>247
00:30:04.090 --&gt; 00:30:15.740
Leon: Then you go into your project. Then you cargo. Ed, for example, in this case it's cortex, and there are different targets. We will mention Rtt. Very soon.</p>
<p>248
00:30:16.700 --&gt; 00:30:21.559
Leon: and that's about it. You're ready to to work</p>
<p>249
00:30:22.310 --&gt; 00:30:27.499
Leon: now, you code it. You set it up. You set it up for the target, and then</p>
<p>250
00:30:28.450 --&gt; 00:30:30.860
Leon: then the fun part begins, because.</p>
<p>251
00:30:31.310 --&gt; 00:30:38.230
Leon: unlike with C or any other language, well, most of other languages I'm familiar with.</p>
<p>252
00:30:39.939 --&gt; 00:30:44.520
Leon: You check it, build it, flash it, debug it.</p>
<p>253
00:30:44.730 --&gt; 00:30:49.999
Leon: and even more stuff you can do with it like Rtt. Eat</p>
<p>254
00:30:50.160 --&gt; 00:30:54.119
Leon: and so on, just with one single command.</p>
<p>255
00:30:54.510 --&gt; 00:30:56.409
Leon: It's cargo and bed.</p>
<p>256
00:30:57.010 --&gt; 00:31:19.039
Leon: You don't have to use it. But this is a wonderful command. And once again I'm mentioning this is a great ecosystem to start working with embedded development with bare metal. It's cargo embed. You specify the target or you can specify it in the configuration file. And that's it. You just type cargo embed, and it's already there.</p>
<p>257
00:31:19.250 --&gt; 00:31:20.770
Leon: We'll see it in a second.</p>
<p>258
00:31:21.470 --&gt; 00:31:30.469
Leon: So cargo is really, I really believe that it's the marvel of modern development. It's incredible.</p>
<p>259
00:31:30.650 --&gt; 00:31:36.530
Leon: You, it allows you to create new projects very quickly with git built in.</p>
<p>260
00:31:36.680 --&gt; 00:31:44.309
Leon: you add and manage crates and utilities. You have a simplified, efficient builds because well.</p>
<p>261
00:31:44.540 --&gt; 00:31:55.150
Leon: when you use it, you know the integrated testing framework inside automatically generate the documentation. You want seamless, embedded workflow.</p>
<p>262
00:31:55.370 --&gt; 00:32:00.199
Leon: very easy, manage multiple related packages.</p>
<p>263
00:32:00.440 --&gt; 00:32:01.370
Leon: There are.</p>
<p>264
00:32:02.690 --&gt; 00:32:12.529
Leon: Cargo is a fantastic tool, especially for the beginners. It allows you to do everything quickly and very, very efficiently.</p>
<p>265
00:32:12.650 --&gt; 00:32:20.600
Leon: You really should read into the cargo abilities, because well, I do believe many of you have used cargo in past, but</p>
<p>266
00:32:21.710 --&gt; 00:32:29.580
Leon: many of us rust developers are not quite aware about the whole list of</p>
<p>267
00:32:30.330 --&gt; 00:32:34.820
Leon: things you can do with cargo. It's a very nice reading.</p>
<p>268
00:32:36.020 --&gt; 00:32:41.759
Leon: So before we jump to some code, any questions.</p>
<p>269
00:32:43.920 --&gt; 00:32:44.930
Leon: That's nice.</p>
<p>270
00:32:46.000 --&gt; 00:32:49.639
Leon: Oh, that's from the meetup. We had refreshments there.</p>
<p>271
00:32:53.060 --&gt; 00:32:55.549
Leon: Because I'm going to show you some code.</p>
<p>272
00:32:58.880 --&gt; 00:32:59.880
Leon: And.</p>
<p>273
00:33:00.630 --&gt; 00:33:17.039
Leon: by the way, you can check out all the examples here because we will. We don't have much time for the examples. But you can use this repo I created just for the sake of this meetup. I will.</p>
<p>274
00:33:19.280 --&gt; 00:33:26.410
Leon: Here is the chat. I will put it through right here, so you can access it all right.</p>
<p>275
00:33:27.280 --&gt; 00:33:34.150
Leon: Good. So we have this code over here.</p>
<p>276
00:33:34.640 --&gt; 00:33:39.439
Leon: and let's let me see. All right. So we have the 1st example here. Now.</p>
<p>277
00:33:39.440 --&gt; 00:33:42.209
Gabor Szabo: Enlarge a little. Sorry. Can you enlarge a little bit? The font</p>
<p>278
00:33:42.630 --&gt; 00:33:46.599
Leon: No, of course I can. Just a second</p>
<p>279
00:33:47.380 --&gt; 00:33:50.020
Gabor Szabo: It's embedded. You can't enlarge the phones</p>
<p>280
00:33:50.925 --&gt; 00:34:01.540
Leon: Alright, so we're good all right. So</p>
<p>281
00:34:02.650 --&gt; 00:34:11.650
Leon: let's see. So this is the 1st example. I believe this. It will be the most important one we have the main</p>
<p>282
00:34:11.909 --&gt; 00:34:15.960
Leon: here. So, as we said, no Std and no main.</p>
<p>283
00:34:16.449 --&gt; 00:34:21.187
Leon: then we import. We use a cortex, m,</p>
<p>284
00:34:22.199 --&gt; 00:34:24.449
Leon: and we don't really use it.</p>
<p>285
00:34:24.560 --&gt; 00:34:29.120
Leon: Why do we do this, then, for default, critical section implementation.</p>
<p>286
00:34:29.820 --&gt; 00:34:37.310
Leon: And when we are not using the micro bit create. We will be working with this M.</p>
<p>287
00:34:37.420 --&gt; 00:34:48.369
Leon: With this board called Micro bit. It's from. It's by BBC, you can check it out and you have some. I believe you. You even have links in the in the repo.</p>
<p>288
00:34:48.550 --&gt; 00:34:54.909
Leon: and this is just a board with few Leds and stuff on it, and</p>
<p>289
00:34:55.219 --&gt; 00:34:58.379
Leon: and it's very easy to use. Very cheap.</p>
<p>290
00:34:58.550 --&gt; 00:35:00.650
Leon: Very nice for beginners.</p>
<p>291
00:35:01.624 --&gt; 00:35:14.789
Leon: So yeah. So we have the when we are not using the micro bit crate, and we don't hear. So we are not like using hull or a a Bsp.</p>
<p>292
00:35:15.130 --&gt; 00:35:22.549
Leon: but we are using cortex M, so we are applying directly to the CPU of cortex. M,</p>
<p>293
00:35:22.700 --&gt; 00:35:27.840
Leon: we're using the entry point and we have the rtt.</p>
<p>294
00:35:28.455 --&gt; 00:35:33.849
Leon: the panic. Rt target simply brings us the panic section that we don't.</p>
<p>295
00:35:34.422 --&gt; 00:35:44.300
Leon: We don't need to create it manually, it does it for us. So when you use this panic, then it will just add the handler function for you.</p>
<p>296
00:35:44.560 --&gt; 00:35:54.579
Leon: and then Rt, rtt, well, I don't remember the abbreviation, but Rtt is just the Prince.</p>
<p>297
00:35:54.700 --&gt; 00:36:06.210
Leon: This is a protocol by seger, and used for debugging over different debuggers, and you will immediately see how it works.</p>
<p>298
00:36:06.620 --&gt; 00:36:09.840
Leon: So we have our entry function.</p>
<p>299
00:36:10.540 --&gt; 00:36:13.079
Leon: We have the Rtt. Init print.</p>
<p>300
00:36:13.810 --&gt; 00:36:22.350
Leon: so initialize it for printing print a hello message to the rt, just like our print line. This is the function.</p>
<p>301
00:36:22.620 --&gt; 00:36:26.960
Leon: and that's it. And then we're stuck in the loop forever.</p>
<p>302
00:36:27.230 --&gt; 00:36:32.170
Leon: Now, how do we actually build it and work with it?</p>
<p>303
00:36:32.670 --&gt; 00:36:33.870
Leon: It's quite easy.</p>
<p>304
00:36:34.090 --&gt; 00:36:45.180
Leon: I go into the example. One directory am cargo embed.</p>
<p>305
00:36:46.970 --&gt; 00:36:50.850
Leon: This is everything we need to just build it and run it.</p>
<p>306
00:36:51.120 --&gt; 00:36:57.670
Leon: It it it built it, flashed it, and ran it just for us.</p>
<p>307
00:36:57.850 --&gt; 00:37:05.830
Leon: So we have. Hello from micro bit, and this is the output of the Rtt. Interface</p>
<p>308
00:37:08.330 --&gt; 00:37:09.789
Leon: as easy as that</p>
<p>309
00:37:10.490 --&gt; 00:37:12.560
Gabor Szabo: It's connected with a USB, right?</p>
<p>310
00:37:13.360 --&gt; 00:37:18.359
Leon: Yeah, it's connected with USB, and it creates 2 serial ports on the system.</p>
<p>311
00:37:18.870 --&gt; 00:37:27.330
Leon: Okay, so this is all. Going through a serial Port M.</p>
<p>312
00:37:27.630 --&gt; 00:37:33.040
Leon: Maybe you can even see the port over here. No, you cannot, whatever.</p>
<p>313
00:37:33.850 --&gt; 00:37:43.270
Leon: Right? So now let's take something more interesting. You know we are all embedded guys. We like seeing Leds</p>
<p>314
00:37:43.660 --&gt; 00:37:45.580
Leon: on and off, right?</p>
<p>315
00:37:46.250 --&gt; 00:37:52.639
Leon: So here we have the matrix. And now here I already start using the micro bit crate.</p>
<p>316
00:37:52.980 --&gt; 00:37:54.820
Leon: This is the Bsp.</p>
<p>317
00:37:55.310 --&gt; 00:38:01.509
Leon: okay, so it allows me to use the board in the in a very, very easy way.</p>
<p>318
00:38:02.030 --&gt; 00:38:08.190
Leon: For example. Well, you you can see just some sort of array over here.</p>
<p>319
00:38:08.940 --&gt; 00:38:13.669
Leon: and this is a kind of irrelevant function. We will not go into it.</p>
<p>320
00:38:13.910 --&gt; 00:38:16.500
Leon: But then, what what do we do here.</p>
<p>321
00:38:16.620 --&gt; 00:38:19.689
Leon: Just look how simple the code is.</p>
<p>322
00:38:20.020 --&gt; 00:38:25.289
Leon: Board. Take. Okay, so we initialize the board.</p>
<p>323
00:38:25.420 --&gt; 00:38:28.700
Leon: Then we initialize a timer because we need a timer here.</p>
<p>324
00:38:28.920 --&gt; 00:38:31.920
Leon: So we use the timer 0 of this board.</p>
<p>325
00:38:32.380 --&gt; 00:38:44.860
Leon: and we need the display, the display in this case, because this is bsp, so it has a display, for, as you can see, here, you have the Leds and metric matrix of Leds.</p>
<p>326
00:38:45.410 --&gt; 00:38:54.430
Leon: So now you just loop through the matrix just by creating display show, and then</p>
<p>327
00:38:56.140 --&gt; 00:39:04.089
Leon: and that's about it. You just have the display show function that you display the the array. So let's</p>
<p>328
00:39:05.680 --&gt; 00:39:10.350
Leon: let's run it. No, not here. City X.</p>
<p>329
00:39:11.400 --&gt; 00:39:14.850
Leon: Example 2 cargo and bed.</p>
<p>330
00:39:22.560 --&gt; 00:39:25.330
Leon: Alright. Now, what do we see here?</p>
<p>331
00:39:26.340 --&gt; 00:39:27.910
Leon: Hey?</p>
<p>332
00:39:28.960 --&gt; 00:39:31.879
Leon: This is the best moment in my career.</p>
<p>333
00:39:33.870 --&gt; 00:39:43.460
Leon: Alright! So we have successfully and created a lit carousel.</p>
<p>334
00:39:44.030 --&gt; 00:39:49.200
Leon: Now I want to show you just a bit inside of how the things work</p>
<p>335
00:39:49.330 --&gt; 00:39:54.880
Leon: and what what files do you need to use to make this all happen.</p>
<p>336
00:39:56.330 --&gt; 00:40:02.489
Leon: Unlike with simple rust that you use with an operating system.</p>
<p>337
00:40:03.190 --&gt; 00:40:09.560
Leon: Here, apart from your main, you have a few things. Let's start with the standard things.</p>
<p>338
00:40:09.680 --&gt; 00:40:11.739
Leon: cargo.com.</p>
<p>339
00:40:12.240 --&gt; 00:40:19.399
Leon: It just includes the libraries and everything. I mean the crates we have here. Everything is quite standard.</p>
<p>340
00:40:19.580 --&gt; 00:40:28.324
Leon: Alright. Don't forget about the features using cortex, M. Critical section inline awesome. And so you need to</p>
<p>341
00:40:30.190 --&gt; 00:40:31.620
Leon: to to get them in.</p>
<p>342
00:40:32.120 --&gt; 00:40:39.670
Leon: But then you have 2 additional files which are very important.</p>
<p>343
00:40:39.900 --&gt; 00:40:41.900
Leon: You have the build dot Rs.</p>
<p>344
00:40:42.510 --&gt; 00:40:55.919
Leon: the build dot. Rs script is quite standard. It's not special for every project you don't have to change it, but you might want to change it eventually. I will not just go through everything here.</p>
<p>345
00:40:56.380 --&gt; 00:41:01.980
Leon: It's quite clear, but not a very obvious from the start.</p>
<p>346
00:41:02.430 --&gt; 00:41:09.490
Leon: It simply makes sure that your Linker would will take this Linker script.</p>
<p>347
00:41:09.790 --&gt; 00:41:20.240
Leon: because, as usual, with a embedded developer embedded development on Mcus. You need to specify some</p>
<p>348
00:41:20.870 --&gt; 00:41:29.070
Leon: initial data for the Mcu to run. So here it's quite simple. You have the flash memory, and you have the RAM</p>
<p>349
00:41:29.680 --&gt; 00:41:30.770
Leon: very easy.</p>
<p>350
00:41:32.200 --&gt; 00:41:40.989
Leon: and the build dot Rs simply makes sure that this is the file that's used by the Linker.</p>
<p>351
00:41:42.590 --&gt; 00:41:50.390
Leon: and the last thing. Oh, not the last one, actually. But let's look at it.</p>
<p>352
00:41:50.530 --&gt; 00:41:53.070
Leon: The embed dot tunnel.</p>
<p>353
00:41:53.450 --&gt; 00:42:03.250
Leon: This file is actually specifies everything. What everything you do with cargo embed the cargo embed command</p>
<p>354
00:42:03.640 --&gt; 00:42:05.270
Leon: deals with this file</p>
<p>355
00:42:05.420 --&gt; 00:42:12.060
Leon: so you can set up the default protocol here, like currently your probe is single wire debugging.</p>
<p>356
00:42:13.300 --&gt; 00:42:18.189
Leon: You can also specify Jtag. It depends on your debugger. You just specify it over here.</p>
<p>357
00:42:18.980 --&gt; 00:42:25.529
Leon: Then you have the general settings for the target, like, for example, you need to specify what</p>
<p>358
00:42:25.750 --&gt; 00:42:27.119
Leon: chip you're using.</p>
<p>359
00:42:27.640 --&gt; 00:42:35.550
Leon: So in our case, this is the Nordic chip. Nrf, whatever you need to get this information from the</p>
<p>360
00:42:37.110 --&gt; 00:42:39.649
Leon: from the Gp you're using right.</p>
<p>361
00:42:40.210 --&gt; 00:42:43.210
Leon: and you so you can specify chip models.</p>
<p>362
00:42:43.340 --&gt; 00:42:50.520
Leon: The default reset operation here is that you can halt after flashing.</p>
<p>363
00:42:50.900 --&gt; 00:42:52.740
Leon: Why is it useful?</p>
<p>364
00:42:53.130 --&gt; 00:42:58.649
Leon: When is it useful to halt after flashing and stop the program from running.</p>
<p>365
00:42:59.100 --&gt; 00:43:00.969
Leon: It's during your debug.</p>
<p>366
00:43:01.710 --&gt; 00:43:02.670
Leon: Okay?</p>
<p>367
00:43:03.850 --&gt; 00:43:10.769
Leon: And then, you have the default. Rt, which is either enabled or not.</p>
<p>368
00:43:11.040 --&gt; 00:43:18.009
Leon: For example, in this case I don't use Rtt. At all. There was no rtt in my code.</p>
<p>369
00:43:19.190 --&gt; 00:43:20.230
Leon: any of it.</p>
<p>370
00:43:20.760 --&gt; 00:43:23.859
Leon: So why did I enable Rtt, anyway?</p>
<p>371
00:43:24.180 --&gt; 00:43:34.470
Leon: Because and why do I initialize it, anyway? Because for debugging, I still use Rtt Target target. And</p>
<p>372
00:43:35.020 --&gt; 00:43:39.589
Leon: yeah, the panic target. So if I get any panic. It would print me</p>
<p>373
00:43:39.830 --&gt; 00:43:44.049
Leon: something on rtt, so I will know I have a panic in my code.</p>
<p>374
00:43:44.880 --&gt; 00:43:53.840
Leon: but I can drop it. Okay. So, for example, if I change it here to false, and I</p>
<p>375
00:43:55.410 --&gt; 00:44:02.730
Leon: and I build it again and run it, you will see that Rtt. Is no longer enabled on start.</p>
<p>376
00:44:04.360 --&gt; 00:44:09.620
Leon: Okay, the the the board is still running, of course.</p>
<p>377
00:44:10.340 --&gt; 00:44:11.280
Leon: That's it.</p>
<p>378
00:44:12.080 --&gt; 00:44:13.550
Leon: M.</p>
<p>379
00:44:14.150 --&gt; 00:44:18.950
Leon: You also have the default. Gdb, and note this. It's enabled.</p>
<p>380
00:44:19.590 --&gt; 00:44:21.680
Leon: The Gdb. Is enabled here.</p>
<p>381
00:44:22.400 --&gt; 00:44:40.040
Leon: and and you can specify the port. Let's get to Gdb. No worries and default flashing. Of course you can enable the default flashing, but you can. If you have a different flashing algorithm or program, you just specify it here. No worries at all. It's all very configurable.</p>
<p>382
00:44:40.960 --&gt; 00:44:44.720
Leon: Now let's look on the</p>
<p>383
00:44:46.080 --&gt; 00:44:47.630
Leon: Gdb stuff.</p>
<p>384
00:44:47.940 --&gt; 00:44:56.499
Leon: So we are here, and I will quickly. Start the debugging.</p>
<p>385
00:44:58.290 --&gt; 00:45:04.270
Leon: so I will just copy and paste some commands. It will not annoy you, M.</p>
<p>386
00:45:04.940 --&gt; 00:45:09.579
Leon: I'm running the Gdb multi arc with my target. Executable.</p>
<p>387
00:45:11.820 --&gt; 00:45:20.709
Leon: Alright. So I'm inside. Gdb, now with my target. Now I want to connect to my remote, which is by default</p>
<p>388
00:45:20.830 --&gt; 00:45:22.119
Leon: on this port</p>
<p>389
00:45:22.630 --&gt; 00:45:25.209
Gabor Szabo: We're doing a lot of the phones here, too. Please</p>
<p>390
00:45:25.210 --&gt; 00:45:28.329
Leon: I don't know. Maybe let's see. Yes.</p>
<p>391
00:45:28.860 --&gt; 00:45:31.209
Leon: Now I will need to.</p>
<p>392
00:45:32.620 --&gt; 00:45:33.360
Leon: Yeah.</p>
<p>393
00:45:34.060 --&gt; 00:45:34.670
Gabor Szabo: Thanks.</p>
<p>394
00:45:37.100 --&gt; 00:45:39.890
Leon: All right, M.</p>
<p>395
00:45:40.370 --&gt; 00:45:44.254
Leon: And now and now I can.</p>
<p>396
00:45:45.290 --&gt; 00:45:55.719
Leon: I believe it does it by by itself. But I source the Gdb. In. It doesn't matter I will just configure the dashboard a little bit.</p>
<p>397
00:45:57.350 --&gt; 00:45:58.480
Leon: Okay.</p>
<p>398
00:45:58.630 --&gt; 00:46:06.120
Leon: And let's have a and didn't I?</p>
<p>399
00:46:08.620 --&gt; 00:46:11.169
Leon: That's kind of strange.</p>
<p>400
00:46:11.970 --&gt; 00:46:14.659
Leon: Okay. No, wait.</p>
<p>401
00:46:16.691 --&gt; 00:46:20.200
Leon: Yes, let's start it again.</p>
<p>402
00:46:21.370 --&gt; 00:46:25.559
Leon: Oh, yes, right? Right? Right? Right? So that's the problem.</p>
<p>403
00:46:25.970 --&gt; 00:46:31.509
Leon: Let's see. Where am I? Target?</p>
<p>404
00:46:33.570 --&gt; 00:46:34.175
Leon: Yeah.</p>
<p>405
00:46:35.900 --&gt; 00:46:38.220
Leon: Okay, debug.</p>
<p>406
00:46:39.460 --&gt; 00:46:43.780
Leon: And hmm.</p>
<p>407
00:46:47.940 --&gt; 00:46:51.570
Leon: okay, all right, all right. All right.</p>
<p>408
00:46:51.740 --&gt; 00:46:54.710
Leon: So where were we in</p>
<p>409
00:47:02.520 --&gt; 00:47:06.030
Leon: and breakpoint?</p>
<p>410
00:47:06.910 --&gt; 00:47:11.299
Leon: Yeah, the program is not being run.</p>
<p>411
00:47:11.740 --&gt; 00:47:13.739
Leon: What's going on?</p>
<p>412
00:47:16.180 --&gt; 00:47:25.700
Leon: This is what happens when you try to show something quickly the exact format error.</p>
<p>413
00:47:30.730 --&gt; 00:47:32.510
Leon: That's strange.</p>
<p>414
00:47:34.050 --&gt; 00:47:36.960
Leon: Let's try something else.</p>
<p>415
00:47:53.600 --&gt; 00:47:57.630
Leon: Something is wrong about it.</p>
<p>416
00:47:58.020 --&gt; 00:48:14.219
Leon: Well, I will not. Continue with this direction, because I will waste all your time, and I still want to show you stuff. But, generally speaking, debugging is quite easy, because you have the debugging built in already.</p>
<p>417
00:48:14.540 --&gt; 00:48:20.050
Leon: Alright, so you can simply connect and debug your code.</p>
<p>418
00:48:20.250 --&gt; 00:48:26.780
Leon: And it's all very convenient, because you don't need to even add another line over there.</p>
<p>419
00:48:27.060 --&gt; 00:48:45.689
Leon: And one more thing to mention is that in config dot tunnel you can specify how to work with. Your specific configuration like in this case. I've configured it all arm and target OS, and so on. Use</p>
<p>420
00:48:46.100 --&gt; 00:48:49.860
Leon: the Linker script the specific Linker script.</p>
<p>421
00:48:50.398 --&gt; 00:48:57.150
Leon: That's quite easy, or you can provide your own specific target if you want really up to you.</p>
<p>422
00:48:57.290 --&gt; 00:49:06.119
Leon: So these are the main files that you have here. We mentioned the embed, the tumul, the most important file for cargo embed.</p>
<p>423
00:49:06.240 --&gt; 00:49:15.049
Leon: We have the cargo standard and the bill dot Rs. Which selects the Linker script.</p>
<p>424
00:49:15.250 --&gt; 00:49:17.070
Leon: and the Linker script itself.</p>
<p>425
00:49:17.690 --&gt; 00:49:22.539
Leon: That's everything we need to get going, and it's all available on the net.</p>
<p>426
00:49:23.751 --&gt; 00:49:37.039
Leon: Just another example. Here, let's say and then see the and let's take</p>
<p>427
00:49:37.200 --&gt; 00:49:46.100
Leon: example for the accelerometer and cargo embed.</p>
<p>428
00:50:02.390 --&gt; 00:50:03.220
Leon: Yep.</p>
<p>429
00:50:03.820 --&gt; 00:50:10.549
Leon: So now we have the values from the accelerometer on this board, so you can see the values</p>
<p>430
00:50:10.820 --&gt; 00:50:13.559
Leon: are changing in the 3 directions.</p>
<p>431
00:50:14.420 --&gt; 00:50:22.879
Leon: And yeah, and how you achieve this thing quite easily.</p>
<p>432
00:50:23.400 --&gt; 00:50:30.470
Leon: And you have the the code right here in front of you.</p>
<p>433
00:50:30.640 --&gt; 00:50:38.522
Leon: So, and you have the from microbeat you get the</p>
<p>434
00:50:39.874 --&gt; 00:50:45.109
Leon: twi interface, the uart interfaces, timers, and everything.</p>
<p>435
00:50:45.710 --&gt; 00:50:54.900
Leon: Then in this case you initialize the board itself as usual. Board. Take, then, you initialize timer.</p>
<p>436
00:50:55.500 --&gt; 00:50:57.290
Leon: You have the serial.</p>
<p>437
00:50:57.820 --&gt; 00:51:06.070
Leon: You are new, as you can see, very everything is very straightforward here, right? It's the simplest thing you can think about to</p>
<p>438
00:51:06.220 --&gt; 00:51:09.709
Leon: initialize a serial interface.</p>
<p>439
00:51:09.960 --&gt; 00:51:15.809
Leon: and then you set up the I square C interface the the 2 wire interface</p>
<p>440
00:51:16.310 --&gt; 00:51:21.359
Leon: right also, as you can see, very easy for supply frequency, and that's about it.</p>
<p>441
00:51:21.750 --&gt; 00:51:27.540
Leon: And then here, in this case, it has a sensor called Lsm. 303,</p>
<p>442
00:51:27.890 --&gt; 00:51:34.160
Leon: and for which we have a separate crate, which is totally a totally unrelated crate.</p>
<p>443
00:51:34.330 --&gt; 00:51:36.749
Leon: But it provides us access.</p>
<p>444
00:51:36.890 --&gt; 00:51:38.139
Leon: Who the censor?</p>
<p>445
00:51:39.340 --&gt; 00:51:44.559
Leon: We initialize the sensor. We set the accelerator mode, and so on.</p>
<p>446
00:51:44.830 --&gt; 00:51:52.399
Leon: and then, for we delay for 50. We sleep for 50 ms.</p>
<p>447
00:51:53.610 --&gt; 00:51:56.240
Leon: and then we have the acceleration.</p>
<p>448
00:51:56.960 --&gt; 00:52:02.539
Leon: We are reading the acceleration in one command, one simple command over I square C,</p>
<p>449
00:52:04.090 --&gt; 00:52:09.739
Leon: and that's about it. We write it to the serial line, and then we r print. Line it as well.</p>
<p>450
00:52:10.110 --&gt; 00:52:16.700
Leon: Now I wanted to show you the prints from the serial line. However.</p>
<p>451
00:52:16.800 --&gt; 00:52:22.220
Leon: it seems like I have some issue here</p>
<p>452
00:52:25.250 --&gt; 00:52:35.769
Leon: at the moment, because when I connect to the serial line I see nothing, and that's the quite weird.</p>
<p>453
00:52:36.060 --&gt; 00:52:45.029
Leon: I don't know. I see. M. 0. This is the this is the interface, but</p>
<p>454
00:52:45.470 --&gt; 00:52:51.270
Leon: I see nothing on it. So hmm!</p>
<p>455
00:52:53.740 --&gt; 00:52:59.090
Leon: I think I know why I think I know why</p>
<p>456
00:53:04.080 --&gt; 00:53:07.490
Leon: PTYA. CM. 0 am</p>
<p>457
00:53:12.823 --&gt; 00:53:13.456
Leon: sorry.</p>
<p>458
00:53:20.710 --&gt; 00:53:30.349
Leon: I think I know why DTYA. CM. 0, and then.</p>
<p>459
00:53:35.780 --&gt; 00:53:36.870
Leon: and</p>
<p>460
00:53:44.330 --&gt; 00:53:47.530
Leon: I think it was 1,200.</p>
<p>461
00:53:48.090 --&gt; 00:53:49.350
Leon: Let's see.</p>
<p>462
00:53:51.610 --&gt; 00:53:52.690
Leon: Okay?</p>
<p>463
00:53:56.540 --&gt; 00:54:03.749
Leon: Oh, hey, I got training. So it was configured for a different bowed rate or wrong bout rate.</p>
<p>464
00:54:04.890 --&gt; 00:54:09.540
Leon: So you can see that now it prints to the serial interface</p>
<p>465
00:54:09.780 --&gt; 00:54:14.180
Leon: I'm connected over minicom, and then you can also see.</p>
<p>466
00:54:14.400 --&gt; 00:54:17.849
Leon: And you can also see it over here.</p>
<p>467
00:54:18.340 --&gt; 00:54:21.130
Leon: and I closed it. So I need to</p>
<p>468
00:54:21.460 --&gt; 00:54:24.279
Leon: suppose I need to rerun it. But whatever?</p>
<p>469
00:54:24.690 --&gt; 00:54:35.689
Leon: And yeah, so in this way. As you can see, printing to the serial port</p>
<p>470
00:54:36.410 --&gt; 00:54:40.840
Leon: could not be simpler than with rust here, and</p>
<p>471
00:54:41.040 --&gt; 00:54:51.537
Leon: and I remember my initial projects in C with embedded with St. Micro electronics Mcus, and with</p>
<p>472
00:54:52.360 --&gt; 00:54:57.460
Leon: ziologue and such. It was a nightmare here, you know.</p>
<p>473
00:54:58.880 --&gt; 00:55:08.409
Leon: very easy and straightforward. So my my point in this presentation, because we need to wrap up.</p>
<p>474
00:55:09.610 --&gt; 00:55:13.886
Leon: The main thing I'm trying to</p>
<p>475
00:55:15.580 --&gt; 00:55:17.929
Leon: to to show here is that</p>
<p>476
00:55:18.290 --&gt; 00:55:22.880
Leon: 1st of all, the trust is a very modern</p>
<p>477
00:55:23.080 --&gt; 00:55:28.349
Leon: language and ecosystem for developing for bare metal.</p>
<p>478
00:55:29.260 --&gt; 00:55:32.559
Leon: It's very convenient. It's very</p>
<p>479
00:55:34.510 --&gt; 00:55:36.099
Leon: It's very mature.</p>
<p>480
00:55:36.630 --&gt; 00:55:46.920
Leon: It's not like. It's something that you need to, you know. Spend your nights on configuring.</p>
<p>481
00:55:47.380 --&gt; 00:55:51.720
Leon: It's mature. You just install it and run it. It's very straightforward.</p>
<p>482
00:55:53.900 --&gt; 00:55:58.460
Leon: more. Moreover, if you need.</p>
<p>483
00:55:58.900 --&gt; 00:56:02.860
Leon: you know, in in my view, if you want to. To.</p>
<p>484
00:56:03.340 --&gt; 00:56:09.739
Leon: To begin working with bare metal programming today with mcus.</p>
<p>485
00:56:10.350 --&gt; 00:56:12.470
Leon: I think that there is no</p>
<p>486
00:56:12.730 --&gt; 00:56:19.819
Leon: reason to choose C over rust at all, because rust will</p>
<p>487
00:56:19.970 --&gt; 00:56:25.420
Leon: rust and cargo will provide you everything you need get going, and</p>
<p>488
00:56:25.580 --&gt; 00:56:35.359
Leon: in a in a safe memory, safe way. So why bother even dealing with sea and whatever?</p>
<p>489
00:56:35.540 --&gt; 00:56:44.768
Leon: So if you have a new project for bare metal machines. There is absolutely no reason to choose</p>
<p>490
00:56:45.730 --&gt; 00:56:49.169
Leon: to choose C over us. That's about it.</p>
<p>491
00:56:50.090 --&gt; 00:56:57.130
Leon: So, Gabbara. I'm quite done. I have. I didn't show everything, but we were. We're out of time</p>
<p>492
00:56:58.190 --&gt; 00:57:01.009
Leon: You you guys can use the repo to</p>
<p>493
00:57:01.120 --&gt; 00:57:03.370
Leon: to check out the rest of the things</p>
<p>494
00:57:04.890 --&gt; 00:57:19.930
Gabor Szabo: Okay. So I'll 1st of all, thank you very much. I just checked. I had this micro bit that I bought like a year ago, and I still didn't do anything with it. It's version 2. So I'll have to see if if this code I see that</p>
<p>495
00:57:19.930 --&gt; 00:57:24.675
Leon: Well, well, this for version 2, as you can see.</p>
<p>496
00:57:26.080 --&gt; 00:57:34.010
Leon: over here, I think. I put it year. Yes.</p>
<p>497
00:57:34.220 --&gt; 00:57:47.210
Leon: So over here you can we work for version 1 1.5. Use with this one for the version, 2 works with 7</p>
<p>498
00:57:47.370 --&gt; 00:57:48.439
Leon: v. 7</p>
<p>499
00:57:48.650 --&gt; 00:57:49.390
Gabor Szabo: Okay.</p>
<p>500
00:57:49.390 --&gt; 00:57:50.559
Leon: That's the difference.</p>
<p>501
00:57:51.280 --&gt; 00:58:05.380
Leon: And by the way, you can find a lot about it on the Internet, it's all there. You just type in. Oh, by the way, I want to even show you how it works. You see, you go into rust for embedded.</p>
<p>502
00:58:06.060 --&gt; 00:58:11.460
Leon: and you reach the embedded Rust book, I really.</p>
<p>503
00:58:11.670 --&gt; 00:58:25.830
Leon: I really like the the documentation in Rust for embedded because when I started with embedded programming there was no such thing for C. There are plenty of C books.</p>
<p>504
00:58:26.020 --&gt; 00:58:31.130
Leon: but nothing close to to stuff like this.</p>
<p>505
00:58:31.940 --&gt; 00:58:38.819
Leon: So you have the embedded rust manuals here for everything, you know</p>
<p>506
00:58:39.110 --&gt; 00:58:45.689
Leon: whatever. And then you have the bare metal rust section, which is very specific</p>
<p>507
00:58:45.860 --&gt; 00:58:54.510
Leon: with all the installations and explanations about how to set things up for different operating systems, and so on.</p>
<p>508
00:58:55.420 --&gt; 00:59:05.319
Leon: And then, for example, the discovery here section, it's all about specifically about the micro bit</p>
<p>509
00:59:06.040 --&gt; 00:59:13.420
Leon: alright. This is the everything here in discovery is about micro bit. And here is just another example of</p>
<p>510
00:59:13.600 --&gt; 00:59:15.490
Leon: working with Stm.</p>
<p>511
00:59:15.980 --&gt; 00:59:23.190
Leon: 32 specific board. Everything is just like with all the examples and everything</p>
<p>512
00:59:23.500 --&gt; 00:59:26.470
Leon: very clear, very straightforward, and so on.</p>
<p>513
00:59:29.860 --&gt; 00:59:30.840
Gabor Szabo: Excellent.</p>
<p>514
00:59:32.050 --&gt; 00:59:46.409
Gabor Szabo: So thank you very much if anyone has any questions who wants to still ask it during the presentation. But we didn't have, through all the presentation. Maybe you have something now, and do go ahead and ask.</p>
<p>515
00:59:46.800 --&gt; 00:59:47.960
Gabor Szabo: and</p>
<p>516
00:59:48.960 --&gt; 01:00:14.850
Gabor Szabo: if not, then we are going to shut down the the recording, and then you can, because you are here. You have this privilege that you can stay around, and then we can have a continue the discussion. If you're watching on the Youtube. Then you have the privilege to click the like button and follow the channel. And so, Leon, thank you very much for this presentation, and thanks everyone for</p>
<p>517
01:00:14.960 --&gt; 01:00:22.680
Gabor Szabo: and for attending, and so hope to see you soon at a different presentation.</p>
<p>518
01:00:22.960 --&gt; 01:00:23.830
Gabor Szabo: Bye, bye.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

  <entry>
    <title>crum: Complex Numbers and Complex Matrices in Rust with Frans Slabber</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-03-19T07:30:01Z</updated>
    <pubDate>2025-03-19T07:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://rust.code-maven.com/crum" />
    <id>https://rust.code-maven.com/crum</id>
    <content type="html"><![CDATA[<p><a href="https://github.com/fransslabber/crum/">crum</a> ia a Rust crate for implementing complex numbers and matrices with a large focus on complex matrices and their use in numerical analysis.</p>
<p><a href="https://www.linkedin.com/in/frans-slabber/">Frans Slabber</a></p>
<p><img src="images/frans-slabber.jpeg" alt="Frans Slabber" /></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/AjgWnYuTfXc" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<h2 class="title is-4">Transcript</h2>
<p>1
00:00:00.570 --&gt; 00:00:02.170
Frans: This meeting is being recorded</p>
<p>2
00:00:02.170 --&gt; 00:00:15.080
Gabor Szabo: So Hi, and welcome to the codeme events meetings, the meet up group. And if you're watching the Youtube video, then to the codeme events, Youtube Channel. And my name is Gabor Sabo. I</p>
<p>3
00:00:15.270 --&gt; 00:00:23.110
Gabor Szabo: I'm a self-employed. I help companies introduce rust and python, help them with training, help them with testing.</p>
<p>4
00:00:23.220 --&gt; 00:00:35.710
Gabor Szabo: And I also organize events, both in person meetings in Tel, Aviv, and in Python for Python and and Rust, and also these online events in English.</p>
<p>5
00:00:36.290 --&gt; 00:00:50.500
Gabor Szabo: in order to share knowledge between people all around the world. And I think it's a very good way to learn about all kind of things that we can't learn or ourselves</p>
<p>6
00:00:50.660 --&gt; 00:01:08.890
Gabor Szabo: this time. We have Franz, who agreed to give this presentation, and you're going to introduce yourself, or he's going to introduce himself in a bit. I'm really happy that you agreed to give this presentation, and I thank everyone who joined us in this meeting</p>
<p>7
00:01:08.890 --&gt; 00:01:25.200
Gabor Szabo: feel free to ask questions after the recording, we can stay around. So if there are things that you don't want to talk about during the recording and in the Youtube, video, that's fine, we can stay around after the meeting and have a little chat as well. That's the</p>
<p>8
00:01:25.230 --&gt; 00:01:28.480
Gabor Szabo: advantage of actually being in the in the meeting.</p>
<p>9
00:01:28.710 --&gt; 00:01:31.369
Gabor Szabo: And also you can ask questions.</p>
<p>10
00:01:32.320 --&gt; 00:01:47.709
Gabor Szabo: and if you're watching the video, then please click the like button and follow the channel. So you get notified and also join our the call me events meet up group, so you will be able to see when we have a new meetings.</p>
<p>11
00:01:48.430 --&gt; 00:01:53.809
Gabor Szabo: Franz. Welcome to this meeting. Please introduce yourself, and it's yours.</p>
<p>12
00:01:54.540 --&gt; 00:01:57.089
Gabor Szabo: Share your screen, if you like, and whatever</p>
<p>13
00:01:57.090 --&gt; 00:02:01.689
Frans: Yeah, thanks. Thanks. Kabor. And thanks for the opportunity.</p>
<p>14
00:02:02.283 --&gt; 00:02:11.110
Frans: As as I just mentioned to you. Unfortunately, I've I've I haven't got a formal presentation. But I will talk through</p>
<p>15
00:02:11.230 --&gt; 00:02:24.920
Frans: this sort of process that went into what I'm doing. So 1st of all, my name is Franz Bresler slabber. That's the full spectrum of names. And I'm a programmer living in South Africa.</p>
<p>16
00:02:25.370 --&gt; 00:02:30.309
Frans: I've been a programmer since I can't remember</p>
<p>17
00:02:30.570 --&gt; 00:02:49.090
Frans: since 94 mainly and and oh, okay, I work for myself as well. So I do various contracts, developing mainly in the technical sort of programming space solving.</p>
<p>18
00:02:49.620 --&gt; 00:02:53.009
Frans: modeling problems, etc, stuff like that.</p>
<p>19
00:02:54.810 --&gt; 00:03:00.240
Frans: So my main expertise has always been c plus plus.</p>
<p>20
00:03:00.930 --&gt; 00:03:19.600
Frans: Recently I had moved into Golang a bit, and then I sort of out of interest started in rust. So rust is almost I haven't. How can I say? Used it commercially, but it's it's an interest, and it's a fascinating way for me to.</p>
<p>21
00:03:19.810 --&gt; 00:03:23.493
Frans: I've got a strong interest in mathematics.</p>
<p>22
00:03:24.270 --&gt; 00:03:34.070
Frans: especially how it relates to a numerical computing for use in in machine learning and stuff like that</p>
<p>23
00:03:34.230 --&gt; 00:03:35.530
Frans: stuff like that</p>
<p>24
00:03:37.020 --&gt; 00:03:48.970
Frans: very technical term. Okay, so 1st order of business, what I did is I'm gonna share screen, because I think that's the easiest way to to go about this. That's okay. Gabor.</p>
<p>25
00:03:49.230 --&gt; 00:03:50.300
Frans: obviously.</p>
<p>26
00:03:50.300 --&gt; 00:03:52.039
Gabor Szabo: Sure. Sure. Sure. Go ahead.</p>
<p>27
00:03:52.240 --&gt; 00:03:55.820
Frans: Okay. So I'm not too familiar.</p>
<p>28
00:03:58.220 --&gt; 00:04:00.240
Gabor Szabo: Should be a big green button</p>
<p>29
00:04:00.240 --&gt; 00:04:01.989
Frans: Yeah, yeah, I've got it.</p>
<p>30
00:04:02.870 --&gt; 00:04:10.210
Frans: Share. Oh, yeah. Oh, not seeing it. Select window. So I'm gonna select.</p>
<p>31
00:04:11.310 --&gt; 00:04:16.779
Frans: Not that one know what that doing open store.</p>
<p>32
00:04:17.060 --&gt; 00:04:25.299
Frans: allow visual studio. So I've got a very big screen. So please tell me if the resolution is okay.</p>
<p>33
00:04:25.300 --&gt; 00:04:30.200
Gabor Szabo: But way too small the letters. So if you can enlarge the fonts, that would be nice</p>
<p>34
00:04:30.380 --&gt; 00:04:34.192
Frans: Yeah, I can just zoom in. I think that works as well.</p>
<p>35
00:04:34.990 --&gt; 00:04:36.410
Frans: Just a moment.</p>
<p>36
00:04:37.850 --&gt; 00:04:39.590
Frans: No, it is.</p>
<p>37
00:04:41.280 --&gt; 00:04:45.380
Frans: There is a yes, somebody wants to say something</p>
<p>38
00:04:45.380 --&gt; 00:04:49.949
Gabor Szabo: No, no, I just going to turn it off it. It beeps when someone joins</p>
<p>39
00:04:50.150 --&gt; 00:04:51.100
Frans: All right.</p>
<p>40
00:04:53.500 --&gt; 00:04:55.160
Frans: Just a moment.</p>
<p>41
00:05:02.250 --&gt; 00:05:05.009
Frans: I've done this before. Sorry guys.</p>
<p>42
00:05:05.010 --&gt; 00:05:06.980
Gabor Szabo: So is it. A windows</p>
<p>43
00:05:07.418 --&gt; 00:05:10.929
Frans: There we go. No, it's it's a Linux</p>
<p>44
00:05:11.355 --&gt; 00:05:14.759
Gabor Szabo: For me. It's control shift plus you usually</p>
<p>45
00:05:14.760 --&gt; 00:05:16.020
Frans: Yeah, there we go.</p>
<p>46
00:05:16.260 --&gt; 00:05:17.920
Frans: That's slightly better.</p>
<p>47
00:05:17.920 --&gt; 00:05:21.180
Gabor Szabo: A little bit more, a little bit more.</p>
<p>48
00:05:22.180 --&gt; 00:05:25.310
Gabor Szabo: Yeah, more, more.</p>
<p>49
00:05:25.310 --&gt; 00:05:26.210
Gabor Szabo: One more sure</p>
<p>50
00:05:27.545 --&gt; 00:05:28.360
Frans: Wow!</p>
<p>51
00:05:29.330 --&gt; 00:05:38.159
Gabor Szabo: Yeah, okay, thanks. That's now. No, at least I can see. I don't know if anyone else still needs larger. Please let us know. For me. It's it's fine</p>
<p>52
00:05:38.920 --&gt; 00:05:46.420
Frans: Okay, good stuff. So basically, let's go. Let's start at the beginning.</p>
<p>53
00:05:46.770 --&gt; 00:05:57.899
Frans: So the 1st thing I started playing with is complex numbers, and the idea is to write A. What in C would be a template class</p>
<p>54
00:06:00.670 --&gt; 00:06:24.770
Frans: to write the equivalent in rust, and to actually have limiting it by means of traits. Okay, so sorry. Let me just take a step back here. The whole idea that I started out with as well is that I wanted to write something. One of the main ideas is that it's completely safe code.</p>
<p>55
00:06:24.820 --&gt; 00:06:35.120
Frans: So I don't call into any under the covers, call into any unsafe libraries, any C or C plus plus libraries.</p>
<p>56
00:06:35.360 --&gt; 00:06:50.489
Frans: Of course, that comes with a performance penalty because you gain quite a lot by. For example, if to do your matrix, arithmetic or matrix manipulation. To do that with</p>
<p>57
00:06:50.630 --&gt; 00:06:56.999
Frans: pointer arithmetic is is generally much faster, but</p>
<p>58
00:06:57.150 --&gt; 00:07:14.019
Frans: I try. I stayed away from it on purpose. So this is all safe for us. Code number one. And also I. Then obviously the closest I could come in terms of performance is by using iterators extensively.</p>
<p>59
00:07:17.140 --&gt; 00:07:25.969
Frans: So, okay, having said that, I started out with the basic ideas of a generic complex number class.</p>
<p>60
00:07:26.310 --&gt; 00:07:37.120
Frans: and there are there are libraries out here that out there that do it, and probably do it much better. So I've got no claim that I'm doing wonderful stuff.</p>
<p>61
00:07:37.540 --&gt; 00:07:43.790
Frans: and as you can see, this will look quite a bit outstanding. But okay, sorry. Let me just go to the top.</p>
<p>62
00:07:44.337 --&gt; 00:07:52.080
Frans: So what I started up is just a basic structural and imaginary, with a type of generic type T.</p>
<p>63
00:07:52.420 --&gt; 00:08:03.800
Frans: And because I wanted to make this compliant with num traits float and integer actually specifically</p>
<p>64
00:08:05.580 --&gt; 00:08:12.919
Frans: I had to define all the traits now, some of them I haven't completed yet, because I didn't</p>
<p>65
00:08:13.530 --&gt; 00:08:21.930
Frans: use the so if we go down here you will see there's some to do's in. There.</p>
<p>66
00:08:22.470 --&gt; 00:08:23.499
Frans: there we go.</p>
<p>67
00:08:25.446 --&gt; 00:08:26.940
Frans: Which is</p>
<p>68
00:08:27.110 --&gt; 00:08:36.119
Frans: probably needs to be fleshed out at some point. So again, just reminding you that this is purely a fun project for me.</p>
<p>69
00:08:36.270 --&gt; 00:08:54.100
Frans: I'm not beholden to anyone to have a finished, polished product. Of course I would like to move to that point, but hey? It's all dependent on when I have time or not. So that's my last excuse I'm going to make</p>
<p>70
00:08:54.480 --&gt; 00:09:03.099
Frans: from us this evening. Okay, so complex numbers, not a big thing. There are things out there pretty much</p>
<p>71
00:09:04.980 --&gt; 00:09:12.970
Frans: And I mean, I'm not going to dwell on this too too much. This is, you can imagine, this is very basic kind of coding.</p>
<p>72
00:09:13.370 --&gt; 00:09:20.389
Frans: right? So, of course, that the aim of that was to start moving into matrices.</p>
<p>73
00:09:20.690 --&gt; 00:09:23.740
Frans: So then</p>
<p>74
00:09:26.980 --&gt; 00:09:34.670
Frans: I start. Okay, sorry. I just want to get you the matrix declaration apologies for this scrolling around.</p>
<p>75
00:09:34.890 --&gt; 00:09:36.490
Frans: Oh, boom!</p>
<p>76
00:09:39.800 --&gt; 00:09:48.610
Frans: So what I decided on in terms of looking towards the future</p>
<p>77
00:09:48.840 --&gt; 00:09:53.970
Frans: to store the all the data in a flat vector.</p>
<p>78
00:09:54.490 --&gt; 00:10:04.109
Frans: generic vector and to make it row dominant. So what that means is that if you if you look at a matrix, and</p>
<p>79
00:10:04.240 --&gt; 00:10:11.780
Frans: you look at the 1st row that would be the first.st So say you've got a a</p>
<p>80
00:10:14.170 --&gt; 00:10:17.920
Frans: in rows. Sorry in columns. So the 1st</p>
<p>81
00:10:18.150 --&gt; 00:10:33.629
Frans: N entries in the vector is the 1st row and then the second N entries that follow onto that is the second row, so I don't know if that creates a easy visualization. But that's for those that don't.</p>
<p>82
00:10:34.240 --&gt; 00:10:36.849
Frans: I haven't heard about road dominance, anyway.</p>
<p>83
00:10:37.090 --&gt; 00:10:50.160
Frans: So and that was sort of then it started getting interesting. So the normal things like adding a matrix subtracting a matrix, extensive use of of just</p>
<p>84
00:10:50.380 --&gt; 00:10:54.589
Frans: iterator and all the the goodies that it has with it.</p>
<p>85
00:10:58.050 --&gt; 00:11:03.670
Frans: So that was pretty so interesting, but pretty straightforward.</p>
<p>86
00:11:03.830 --&gt; 00:11:11.610
Frans: And then I added, stuff like, get the diagonal as a vector, etc, that kind of thing and getting a skew diagonal.</p>
<p>87
00:11:11.920 --&gt; 00:11:21.890
Frans: Also, I find that I wanted to. If you have a matrix of floats, you want to round them off to some decimal place which is very nice</p>
<p>88
00:11:22.040 --&gt; 00:11:48.269
Frans: for later manipulation. I find I needed upper triangular matrices. So if any of these things, these are just different forms of matrices, so upper triangular is all the elements above. The diagonal is non-zero and the one below are 0 kind of thing, and as that is, and lower triangle is triangular is the opposite.</p>
<p>89
00:11:48.770 --&gt; 00:11:53.205
Frans: And we have the famous identity matrix. So</p>
<p>90
00:11:54.660 --&gt; 00:12:07.240
Frans: if this is so, I I'm assuming some level of linear algebra background here. Assumption.</p>
<p>91
00:12:08.370 --&gt; 00:12:16.309
Frans: Then oh, checking if it is an identity, that kind of thing. Okay, so that's pretty much</p>
<p>92
00:12:16.410 --&gt; 00:12:24.000
Frans: sort of what you would think would it would have as a standard library then? Now.</p>
<p>93
00:12:24.200 --&gt; 00:12:27.420
Frans: my! Oh, in this transpose.</p>
<p>94
00:12:30.900 --&gt; 00:12:35.089
Frans: of course. Now this raises very interesting</p>
<p>95
00:12:35.640 --&gt; 00:12:50.880
Frans: when you write this because you have to keep in mind that you have a flat vector storing the stuff. So if you have to do a transpose, you have to carefully work with what they call strides.</p>
<p>96
00:12:51.610 --&gt; 00:12:53.380
Frans: In other words,</p>
<p>97
00:12:55.690 --&gt; 00:13:05.180
Frans: it is normally the offset that you would get to an element in a specific row and column in a flat vector, considering a flat, vector.</p>
<p>98
00:13:06.510 --&gt; 00:13:10.689
Frans: we will talk more about strides when we get to tenses.</p>
<p>99
00:13:11.050 --&gt; 00:13:11.810
Frans: Okay.</p>
<p>100
00:13:11.940 --&gt; 00:13:31.359
Frans: so this was sort of sub matrix. And you can see there's some tests here in a way. You know, I wrote a macro for declaring a matrix like that which is pretty straightforward, and then to get the sub matrix sticking to having this inclusive ranges that you can specify</p>
<p>101
00:13:31.430 --&gt; 00:13:43.310
Frans: from this row to that row, and from this column to this this column inclusive, and it'll give you the sub matrix out of this chunk of bigger matrix, anyway. So that's sort of</p>
<p>102
00:13:43.980 --&gt; 00:13:45.730
Frans: what's going on here.</p>
<p>103
00:13:46.890 --&gt; 00:13:52.510
Frans: Of course, this whole process also to keep in mind is that this is me.</p>
<p>104
00:13:53.530 --&gt; 00:13:59.419
Frans: As you work with iterators, more and more it becomes clearer and</p>
<p>105
00:13:59.540 --&gt; 00:14:02.300
Frans: probably less clunky working with it.</p>
<p>106
00:14:02.680 --&gt; 00:14:03.530
Frans: Okay?</p>
<p>107
00:14:06.200 --&gt; 00:14:31.759
Frans: So also doing stuff like inserting a row, inserting a column, etc. Etc. Then, of course, there becomes augmentation as we adding a sub matrix on top as the description is up top here, the top left corner of a larger matrix. So when we when I start writing matrix, how can I say routines? This becomes important.</p>
<p>108
00:14:32.480 --&gt; 00:14:43.590
Frans: determinant over 2 by 2 and then converting a real to a complex matrix. Okay, so now we start seeing why I started with complex. Because I want you to work</p>
<p>109
00:14:43.930 --&gt; 00:14:50.749
Frans: my 1st aim in doing with this, or the 1st sort of goal that I had was working with complex matrices.</p>
<p>110
00:14:51.300 --&gt; 00:15:13.380
Frans: and there was a very specific reason that I wanted to do it, which I'll show later, or just now put it that way. So now with matrices, you have very famous things like Lu decompositions with Gauss elimination. So this was so now it became really interesting. And I mean, I really actually</p>
<p>111
00:15:13.800 --&gt; 00:15:20.900
Frans: love this stuff sadly, I do other things in life as well.</p>
<p>112
00:15:21.230 --&gt; 00:15:28.340
Frans: This a side note. Humorous side note, anyway. So so that was sort of</p>
<p>113
00:15:29.570 --&gt; 00:15:34.759
Frans: this. I think this was my 1st big achievement. Was it lu decomposition?</p>
<p>114
00:15:36.920 --&gt; 00:15:41.400
Frans: With a partial pivot, fascinating stuff.</p>
<p>115
00:15:41.520 --&gt; 00:16:03.260
Frans: So what was also what I really liked about this is I did, applied math degree long ago. But I you know you completely forget things, because if you don't work with it or not completely forget, but it's so far removed, and what was very nice is, I had to go and sort of read up on how these things work, especially</p>
<p>116
00:16:03.400 --&gt; 00:16:22.099
Frans: from a numerical computing point of view, because that is different to a sort of straightforward, academic, theoretical application of matrices. Because, you know, computing isn't exact. So you always have rounding errors, and you always have to work to a certain precision.</p>
<p>117
00:16:22.330 --&gt; 00:16:25.190
Frans: Anyway, that was linear solving.</p>
<p>118
00:16:25.620 --&gt; 00:16:33.020
Frans: Have I got too complex yet? Sorry sorry about that. I just want to go up this.</p>
<p>119
00:16:33.570 --&gt; 00:16:37.899
Frans: And we saw a real square matrix. No, we're still unreal.</p>
<p>120
00:16:38.410 --&gt; 00:16:40.819
Frans: Okay? So at some point.</p>
<p>121
00:16:48.230 --&gt; 00:16:50.729
Frans: sorry, it must be completely boring</p>
<p>122
00:16:51.480 --&gt; 00:16:55.720
Frans: sort of looking at what I did, quite amazed that I wrote it all.</p>
<p>123
00:16:57.770 --&gt; 00:17:05.419
Frans: Okay. So ultimately, the point was what to calculate eigenvalues of a matrix.</p>
<p>124
00:17:06.140 --&gt; 00:17:21.600
Frans: So and here I established then complex matrix specializations, that where your generic item is a complex matrix of</p>
<p>125
00:17:21.829 --&gt; 00:17:26.040
Frans: T, which you know satisfies numb traits.</p>
<p>126
00:17:30.390 --&gt; 00:17:38.150
Frans: So there was just some things here, and then I think the ultimate is where I do.</p>
<p>127
00:17:39.371 --&gt; 00:17:44.489
Frans: There's a random, complex matrix. By the way, kind of things is where I actually</p>
<p>128
00:17:45.960 --&gt; 00:17:48.319
Frans: own a complex conjugate.</p>
<p>129
00:17:49.440 --&gt; 00:17:52.770
Frans: So this is all to do with complex matrices. And</p>
<p>130
00:17:53.680 --&gt; 00:18:01.819
Frans: this was also beautiful to do complex matrix. QR decomposition using householder transforms.</p>
<p>131
00:18:02.160 --&gt; 00:18:08.325
Frans: This was fantastic. So, by the way, all of this has been</p>
<p>132
00:18:09.260 --&gt; 00:18:13.869
Frans: how can I say ratified against Matlab</p>
<p>133
00:18:15.560 --&gt; 00:18:20.830
Frans: because I wanted to make sure that I'm not putting nonsense out there.</p>
<p>134
00:18:28.210 --&gt; 00:18:31.269
Frans: this is QR complex.</p>
<p>135
00:18:32.990 --&gt; 00:18:44.350
Frans: QR decomposition with householder transforms. So this is all used when you're trying to find the eigenvalues of a matrix. I just want to go right down where I actually do the</p>
<p>136
00:18:46.520 --&gt; 00:18:50.909
Frans: that's the household that transform scar, duck, decomposition</p>
<p>137
00:18:56.570 --&gt; 00:18:58.500
Gabor Szabo: Yeah, I have a question. Franz</p>
<p>138
00:18:58.500 --&gt; 00:18:59.380
Frans: Yes.</p>
<p>139
00:18:59.380 --&gt; 00:19:00.393
Gabor Szabo: Do you?</p>
<p>140
00:19:01.680 --&gt; 00:19:07.819
Gabor Szabo: So, besides writing the the crate, did you make any use of it?</p>
<p>141
00:19:07.820 --&gt; 00:19:15.380
Frans: No, no, no. So so the that's for yourself or yeah. So I'm hoping</p>
<p>142
00:19:16.220 --&gt; 00:19:28.349
Frans: to use it at some point. But at the moment this was purely, as I said in the beginning, for myself, as an entertainment, as something fascinating for me to do. And and</p>
<p>143
00:19:28.450 --&gt; 00:19:43.880
Frans: I enjoy mathematics. And I enjoy solving complex software problems. And a lot of this coding is is</p>
<p>144
00:19:44.490 --&gt; 00:19:54.709
Frans: I. Maybe I'm just old and slow. But I found it very involved and and quite a lot of pencil sketches had to be done</p>
<p>145
00:19:55.260 --&gt; 00:19:58.510
Frans: to figure out how to do this.</p>
<p>146
00:19:58.830 --&gt; 00:20:06.440
Gabor Szabo: I mean, I we use generics and all kind of interesting parts of of rust.</p>
<p>147
00:20:06.600 --&gt; 00:20:13.509
Gabor Szabo: Yes. How did you? Did did you implement anything similar in in CC plus earlier</p>
<p>148
00:20:14.060 --&gt; 00:20:15.890
Frans: No, I've either.</p>
<p>149
00:20:15.890 --&gt; 00:20:20.959
Gabor Szabo: How do you compare what the feeling of of writing rush? That's what I'm trying to ask</p>
<p>150
00:20:21.190 --&gt; 00:20:33.960
Frans: Much, much more difficult. And look, I mean, obviously, I've written C plus plus for what 20 years, you know. So and template programming template libraries is is</p>
<p>151
00:20:34.350 --&gt; 00:20:41.179
Frans: is pretty because you have all these these restrictions, these these things.</p>
<p>152
00:20:41.360 --&gt; 00:21:01.450
Frans: you know making. And if you so, for example, if you are doing an eigen eigenvalue decomposition you are using previous QR or Lu decompositions that you've written to actually facilitate that finding that eigenvalue and</p>
<p>153
00:21:01.700 --&gt; 00:21:24.719
Frans: you have to be so. How can I say? Careful to have the right traits from the bottom up? Otherwise you can't, you know, when you get to the top one. You don't satisfy the traits required to to do it. Kind of thing. If if that makes some sort of sense, I just find it very.</p>
<p>154
00:21:25.200 --&gt; 00:21:49.570
Frans: I mean, I appreciate what it's trying to do here in terms of forcing you to be very, very strict. What you can do. And obviously that is the selling point of rust. Well, one of the selling points of rust is the is safety, and and this really forces you to use it in a very specific way.</p>
<p>155
00:21:50.130 --&gt; 00:22:10.590
Frans: So I do appreciate that. But I may. I mean, look, I'm a youngster in rust if you can put it like that. So maybe that's why I find it difficult, but I found it much more involved than than C plus plus. And of course, and I had to learn the whole iterator setup.</p>
<p>156
00:22:10.860 --&gt; 00:22:15.950
Frans: You know what you can do with iterators, what it actually means. And and</p>
<p>157
00:22:16.330 --&gt; 00:22:26.499
Frans: you know, in in c plus plus, you would have just done as I said. Pointer. Arithmetic, you know, on, on dynamic arrays, or something or static arrays doesn't matter, but</p>
<p>158
00:22:26.660 --&gt; 00:22:30.999
Frans: I think it would be pretty much more straightforward.</p>
<p>159
00:22:32.640 --&gt; 00:22:37.470
Frans: So so this? Why, this was challenging for me to be honest, you know</p>
<p>160
00:22:37.710 --&gt; 00:22:43.045
Gabor Szabo: Do you want to go over the the details of one of the functions to see? So we can. We can,</p>
<p>161
00:22:43.300 --&gt; 00:22:47.157
Frans: Well, I'm I'm just trying to get to</p>
<p>162
00:22:47.640 --&gt; 00:22:51.220
Gabor Szabo: For a simple function, and then, maybe later on, a more complex one.</p>
<p>163
00:22:51.630 --&gt; 00:22:52.110
Frans: Okay.</p>
<p>164
00:22:52.110 --&gt; 00:22:54.929
Gabor Szabo: So so we can have a feeling of of a</p>
<p>165
00:22:54.930 --&gt; 00:22:55.630
Frans: Yeah.</p>
<p>166
00:22:55.630 --&gt; 00:22:56.880
Gabor Szabo: How this code looks like</p>
<p>167
00:22:57.360 --&gt; 00:23:01.159
Frans: Mother, okay. So we out there. So I just want to</p>
<p>168
00:23:01.160 --&gt; 00:23:04.340
Gabor Szabo: I suppose I don't know. Difficult</p>
<p>169
00:23:04.340 --&gt; 00:23:08.539
Frans: Okay, yeah, I transpose this shit.</p>
<p>170
00:23:18.680 --&gt; 00:23:25.519
Frans: There we go. Okay, okay, so this is</p>
<p>171
00:23:26.400 --&gt; 00:23:32.560
Frans: so remember, vector matrix is a flat vector</p>
<p>172
00:23:32.830 --&gt; 00:23:40.880
Frans: so basically, what I do is when I come into this function, I just declare a mutable vector</p>
<p>173
00:23:41.050 --&gt; 00:23:51.370
Frans: a generic vector of type T, which is what the original type is, and it's declared with the capacity of the one that I'm entering in. So</p>
<p>174
00:23:53.280 --&gt; 00:24:03.450
Frans: just to go back to something I said previously is that I was learning as well. So there may be some way of doing this in place.</p>
<p>175
00:24:03.640 --&gt; 00:24:16.490
Frans: But this I just declared a new vector, kind of a result vector, which you can see. I later wrap it into the the matrix that I return, if you like.</p>
<p>176
00:24:17.110 --&gt; 00:24:23.100
Frans: So and then so for each row</p>
<p>177
00:24:25.310 --&gt; 00:24:31.320
Frans: index in the number of columns. So we have number of columns. So this is for each item in the row.</p>
<p>178
00:24:37.140 --&gt; 00:24:39.670
Frans: I have to really scratch my brain here.</p>
<p>179
00:24:44.560 --&gt; 00:25:00.700
Frans: Oh, that's right. I use the skip iter to actually skip the actual offset so that I don't want to actually use this example because this doesn't really show using</p>
<p>180
00:25:00.830 --&gt; 00:25:03.370
Frans: skip, and</p>
<p>181
00:25:03.720 --&gt; 00:25:12.029
Frans: the the iterator function skip and step by which I actually use quite a lot. So anyway. But we can continue with this.</p>
<p>182
00:25:12.340 --&gt; 00:25:15.819
Frans: Then we have. We just</p>
<p>183
00:25:16.680 --&gt; 00:25:23.319
Frans: use a skip it iterator to get to the correct one. Because, remember, if you have.</p>
<p>184
00:25:23.570 --&gt; 00:25:30.109
Frans: where is the example? Here, there we go. So we want to transpose that. So that is the row</p>
<p>185
00:25:30.620 --&gt; 00:25:32.929
Gabor Szabo: And we want to make the row</p>
<p>186
00:25:33.070 --&gt; 00:25:39.100
Frans: The 1st column, right? So you've got to go through the 1st row and write the 1st column.</p>
<p>187
00:25:39.540 --&gt; 00:26:08.629
Frans: But the problem being that you're writing it into a row dominant, vector which is what this result vector, is. So you've got to go and say, if I transpose this, you've got 1, 2, 7 going down and 3, 4, 8 going down. Okay, so you have one and 3 being the 1st row now. So one and 3 will be the 1st 2 elements of the new vector</p>
<p>188
00:26:11.640 --&gt; 00:26:13.690
Frans: here that I'm writing.</p>
<p>189
00:26:16.230 --&gt; 00:26:26.350
Frans: So I I. So you can see in the result. Vector sorry I'll be with you. Now, we actually, we actually just build it up, row by row.</p>
<p>190
00:26:28.200 --&gt; 00:26:28.820
Gabor Szabo: Right.</p>
<p>191
00:26:31.090 --&gt; 00:26:32.489
Frans: Yes, go ask a question</p>
<p>192
00:26:32.490 --&gt; 00:26:39.690
Gabor Szabo: No, I was. I was just wondering if if if the transpose is not just taking the</p>
<p>193
00:26:40.250 --&gt; 00:26:44.599
Gabor Szabo: Xy element in the matrix and put it in. Put it in the YX</p>
<p>194
00:26:44.600 --&gt; 00:26:52.729
Frans: Right. Yes, you can. So if you which, if you have a way of accessing the elements XY,</p>
<p>195
00:26:53.000 --&gt; 00:26:56.640
Frans: which I do have up here, but I'm trying to</p>
<p>196
00:26:56.640 --&gt; 00:26:59.800
Gabor Szabo: An array. Right? The whole thing is just one longer</p>
<p>197
00:26:59.800 --&gt; 00:27:06.580
Frans: Well, well, it's it's resembling an array, but it is stored as a flat vector that that</p>
<p>198
00:27:06.580 --&gt; 00:27:07.880
Gabor Szabo: Vector, sorry. Correct.</p>
<p>199
00:27:07.880 --&gt; 00:27:25.889
Frans: Yeah, flat. Vector so the thing is that I can write this by just saying, for each row, for each column, swap, go get element Xy, and make it element. Yx, and I have the accessors.</p>
<p>200
00:27:26.390 --&gt; 00:27:30.819
Frans: I think I've got it. Sorry. Let me just find it up here.</p>
<p>201
00:27:33.410 --&gt; 00:27:35.800
Frans: Where is? Oh, there index.</p>
<p>202
00:27:36.430 --&gt; 00:27:37.559
Frans: So I've got</p>
<p>203
00:27:37.790 --&gt; 00:27:51.299
Frans: index and index mutable, which will give me access to the the actual XY coordinate, if you like, or the row column coordinate, and then just make just using index to set it to</p>
<p>204
00:27:51.470 --&gt; 00:27:53.630
Frans: to Yx, if you like.</p>
<p>205
00:27:54.050 --&gt; 00:27:58.930
Frans: But that means that you are calling this routines many times.</p>
<p>206
00:27:59.260 --&gt; 00:28:01.090
Frans: Okay in a loop.</p>
<p>207
00:28:01.420 --&gt; 00:28:11.079
Frans: So I would rather, for the sake of efficiency and speed. When I look for which I've lost now.</p>
<p>208
00:28:20.070 --&gt; 00:28:41.300
Frans: I would rather do it directly on the vector and pull chunks out of it than actually. So I'm saving a little bit. Okay, not much, I guess. But this to me, is more efficient than just sitting in 2 for loops and and swapping rows and columns around row and column items around.</p>
<p>209
00:28:42.530 --&gt; 00:28:46.300
Frans: I could be wrong, but that was just my thought on this</p>
<p>210
00:28:50.230 --&gt; 00:28:52.450
Frans: sort of happy Gabor</p>
<p>211
00:28:53.320 --&gt; 00:28:58.680
Gabor Szabo: I'm trying to understand. Yeah, the skipper. What? What is that</p>
<p>212
00:29:00.180 --&gt; 00:29:03.020
Frans: This is, I defined it up here.</p>
<p>213
00:29:11.810 --&gt; 00:29:30.510
Frans: So that is just a way of defining an iterator that skips a certain step size through so you could. Instead of using this. And as I said this, I used in the beginning, and later on I use the iterative actual iter functions step by and skip.</p>
<p>214
00:29:30.690 --&gt; 00:29:33.580
Frans: which is, which would do the same thing as this</p>
<p>215
00:29:35.330 --&gt; 00:29:36.120
Gabor Szabo: Okay.</p>
<p>216
00:29:38.630 --&gt; 00:29:45.700
Frans: So what I'm actually saying subtly is that this would probably needs to be rewritten.</p>
<p>217
00:29:48.700 --&gt; 00:30:04.450
Frans: But for now it works okay. Because and it will become clear. Why, I just sort of went on without really being too fussed about this. Okay, so I don't.</p>
<p>218
00:30:04.640 --&gt; 00:30:06.050
Frans: Okay, hang on.</p>
<p>219
00:30:06.450 --&gt; 00:30:10.980
Frans: Let's get some order here, go!</p>
<p>220
00:30:11.350 --&gt; 00:30:12.679
Frans: Where was that again?</p>
<p>221
00:30:13.250 --&gt; 00:30:14.770
Frans: Can't remember. There we go.</p>
<p>222
00:30:15.100 --&gt; 00:30:16.799
Frans: Okay. So</p>
<p>223
00:30:17.570 --&gt; 00:30:28.179
Frans: that's a very easy function, which, as you rightly say, probably needs to be rewritten. I'm just trying to think if there's not something else that is probably better.</p>
<p>224
00:30:29.950 --&gt; 00:30:33.139
Frans: Sub matrix. You see. Yeah.</p>
<p>225
00:30:33.260 --&gt; 00:30:40.280
Frans: okay. So again, the idea is, you want to grab a chunk out of this. Okay, that's not.</p>
<p>226
00:30:40.660 --&gt; 00:30:42.920
Frans: You want to grab</p>
<p>227
00:30:42.920 --&gt; 00:30:43.450
Gabor Szabo: Rectangle.</p>
<p>228
00:30:43.450 --&gt; 00:30:57.590
Frans: From here here. Yeah, you want to grab a little block out of it, and the way you specify it, you say inclusive. I want to from column 3 to column 7, and from Sorry row.</p>
<p>229
00:30:57.720 --&gt; 00:31:06.859
Frans: row, row column. Always work, row column. So row 3, 2, including row 7, column 2. So you can. It's a little slice out of there.</p>
<p>230
00:31:10.720 --&gt; 00:31:14.199
Frans: So basically, we just check that. It's the correct rows.</p>
<p>231
00:31:14.540 --&gt; 00:31:15.530
Frans: Right?</p>
<p>232
00:31:15.690 --&gt; 00:31:19.100
Frans: Iterate. Get an index going enumerate.</p>
<p>233
00:31:19.230 --&gt; 00:31:22.759
Frans: Then we will skip.</p>
<p>234
00:31:26.070 --&gt; 00:31:42.990
Frans: So we want to position ourselves. So if you imagine just visually, if you want to extract a chunk out of here and remember that it's stored row dominant. You want to 1st get to this row, and you can just strip out</p>
<p>235
00:31:43.160 --&gt; 00:31:47.740
Frans: the number of row elements if you like.</p>
<p>236
00:31:47.860 --&gt; 00:31:57.340
Frans: because they would, they would be adjacent in the to each other in the storage. Vector so this is this will be straightforward</p>
<p>237
00:31:57.470 --&gt; 00:31:58.409
Frans: if you like.</p>
<p>238
00:31:58.810 --&gt; 00:32:01.041
Frans: So you would</p>
<p>239
00:32:02.670 --&gt; 00:32:18.170
Frans: remember this all up here before you get to this element here. This all will be in a flat. Vector so it's a row. Then the next row next row. So you've got to skip the number of columns times up to this row.</p>
<p>240
00:32:18.410 --&gt; 00:32:22.830
Frans: and then you have to skip what the index is that you want to extract.</p>
<p>241
00:32:23.210 --&gt; 00:32:26.400
Frans: So you want to skip 3 rows</p>
<p>242
00:32:26.540 --&gt; 00:32:29.400
Frans: times how many columns is in a row.</p>
<p>243
00:32:29.550 --&gt; 00:32:41.559
Frans: so that, and then you want to add on another little piece until you get here. So that positions you here. So I think you can see that exactly what I've done here.</p>
<p>244
00:32:42.140 --&gt; 00:32:46.410
Frans: the problem, not the problem. But something that</p>
<p>245
00:32:46.710 --&gt; 00:32:56.590
Frans: probably could be changed is that I'm using 0 index. Sorry one indexing for use. But</p>
<p>246
00:32:56.690 --&gt; 00:33:00.270
Frans: obviously it starts at 0. It's 0 indexed.</p>
<p>247
00:33:00.520 --&gt; 00:33:05.830
Frans: So that's why I always have these minus one nonsense, and it gets a bit</p>
<p>248
00:33:06.520 --&gt; 00:33:18.489
Frans: tedious. But anyway, Beta estimate the number of columns times the number of rows above the element. And then, plus where the the column is that we want to extract.</p>
<p>249
00:33:20.020 --&gt; 00:33:24.030
Frans: you can see calls. Start is the 1st one here in the range.</p>
<p>250
00:33:24.950 --&gt; 00:33:28.020
Frans: Okay, so is, is that sort of reasonably clear</p>
<p>251
00:33:28.360 --&gt; 00:33:29.700
Gabor Szabo: Yeah, I think so.</p>
<p>252
00:33:30.450 --&gt; 00:33:33.470
Frans: What I'm doing right? So then.</p>
<p>253
00:33:33.470 --&gt; 00:33:36.420
Gabor Szabo: We're using assert to to verify the</p>
<p>254
00:33:37.510 --&gt; 00:33:38.200
Frans: Yes.</p>
<p>255
00:33:38.420 --&gt; 00:33:51.300
Frans: Well, this is just to make sure that I'm not specifying in my rows and columns something that would sit outside. You know that there isn't enough rows for it to sit in here.</p>
<p>256
00:33:51.540 --&gt; 00:33:52.429
Frans: if you like.</p>
<p>257
00:33:54.990 --&gt; 00:34:03.689
Frans: In other words, I'm not. I'm not wanting to extract this submatrix that is larger in some dimension than the matrix. I'm given</p>
<p>258
00:34:04.520 --&gt; 00:34:05.230
Gabor Szabo: Right.</p>
<p>259
00:34:05.800 --&gt; 00:34:08.346
Frans: Alright. So that's all the sort of</p>
<p>260
00:34:09.250 --&gt; 00:34:12.260
Frans: stuff that I this says that I do there.</p>
<p>261
00:34:14.860 --&gt; 00:34:23.259
Frans: So then, the step by jeez, I'm trying to think what I did here.</p>
<p>262
00:34:26.800 --&gt; 00:34:33.600
Frans: I know I extract little vectors, and then I flatten them. Obviously, this is what's happening here.</p>
<p>263
00:34:34.132 --&gt; 00:34:35.098
Frans: Sorry about that.</p>
<p>264
00:34:35.560 --&gt; 00:34:42.690
Frans: Step by. So I get to the right position. Then I start iterating.</p>
<p>265
00:34:51.400 --&gt; 00:34:57.200
Frans: just thinking, why am I not iterating by one stepping by 1 1st of all?</p>
<p>266
00:35:03.860 --&gt; 00:35:09.729
Frans: Oh, well, guys, sorry I should have spent more time prepping it so I can give better answers</p>
<p>267
00:35:11.410 --&gt; 00:35:16.200
Gabor Szabo: It's fun reading code, even if it even if it's yours.</p>
<p>268
00:35:16.730 --&gt; 00:35:23.520
Frans: Yeah, it's it's it's as I said, I haven't spent time on it, and I've been so in deep in</p>
<p>269
00:35:24.050 --&gt; 00:35:29.630
Frans: trying to find a memory leak on a big golang server. And it's</p>
<p>270
00:35:29.810 --&gt; 00:35:33.599
Frans: it's yeah. My mind has just not been on this at all.</p>
<p>271
00:35:35.780 --&gt; 00:35:57.839
Frans: okay, anyway, if there's real interest. We can come back to this at some point later, when I will make time from the beginning of April, I have more time again, so maybe we can make another arrangement. I can look at this so maybe see this as a sort of a high level view to start off with.</p>
<p>272
00:35:57.980 --&gt; 00:36:03.260
Frans: anyway. So the moving on from this.</p>
<p>273
00:36:05.090 --&gt; 00:36:10.300
Frans: which I hadn't really considered in the beginning. But it became obvious</p>
<p>274
00:36:10.560 --&gt; 00:36:30.679
Frans: that if I wanted to something that would be actually useful in terms of machine learning, I would have to move into tensors. So tensors is just a higher dimensional form of a matrix or a higher dimensional form. A matrix is a higher dimensional form of a vector</p>
<p>275
00:36:30.960 --&gt; 00:36:40.019
Frans: and tensor is then a step up from that so generic N dimensions or rank.</p>
<p>276
00:36:43.790 --&gt; 00:36:45.740
Frans: So this is where</p>
<p>277
00:36:46.500 --&gt; 00:36:54.380
Frans: I actually did the last, my last work, and it's also probably the most from a rust perspective, the most mature.</p>
<p>278
00:36:56.310 --&gt; 00:37:04.740
Frans: So again, I declare, a tensor object generic tensor object using a flat data structure.</p>
<p>279
00:37:07.785 --&gt; 00:37:16.550
Frans: I have the shape of the matrix. Okay, now, I just want to actually hold there and and interrupt myself again and say that</p>
<p>280
00:37:17.310 --&gt; 00:37:19.400
Frans: what I actually</p>
<p>281
00:37:19.630 --&gt; 00:37:31.460
Frans: was trying to do, and I actually had to go back and change the names a bit here because I had the right idea. But I had different names for this. I think I had dims here instead of shape.</p>
<p>282
00:37:31.780 --&gt; 00:37:40.189
Frans: But then I've done quite a bit of work in with tensorflow in, in python, etc. And</p>
<p>283
00:37:40.590 --&gt; 00:37:44.839
Frans: and in the array, and numpy sorry.</p>
<p>284
00:37:45.210 --&gt; 00:38:00.589
Frans: So I had the back of my mind. It suddenly came to me. I want to write something in rust that somebody with a python machining background would feel comfortable in well, reasonably comfortable in using.</p>
<p>285
00:38:00.720 --&gt; 00:38:05.880
Frans: I don't know if that's a pipe dream. But that's sort of where I was going with this.</p>
<p>286
00:38:06.020 --&gt; 00:38:08.569
Frans: So that's why I changed this to shape</p>
<p>287
00:38:09.390 --&gt; 00:38:13.459
Frans: and strides I had from the beginning. So</p>
<p>288
00:38:14.780 --&gt; 00:38:30.030
Frans: let's the go. So again, I'm sitting with row dominance. But whereas previously in a matrix, you have a row, followed by a row, followed by a row. You now have a more complex setup, where you can have</p>
<p>289
00:38:30.540 --&gt; 00:38:35.619
Frans: in dimensions nonspecific. In other words.</p>
<p>290
00:38:36.060 --&gt; 00:38:45.810
Frans: you. You can access the the way that you access an element becomes very much more obtuse</p>
<p>291
00:38:46.090 --&gt; 00:38:55.260
Frans: if I can put it like that. And so that's where why, in the beginning, when I establish the struct I calculate strides</p>
<p>292
00:38:55.520 --&gt; 00:39:05.800
Frans: now, strides is a way that you can use to calculate offset in the vector to get to an element</p>
<p>293
00:39:06.030 --&gt; 00:39:14.780
Frans: of a certain coordinate. Given a coordinate, you can use strides to get to that element, I will demonstrate it shortly. How this works.</p>
<p>294
00:39:16.395 --&gt; 00:39:17.370
Frans: So</p>
<p>295
00:39:18.050 --&gt; 00:39:36.500
Frans: that was pretty straightforward, and in the next line comes to exactly what I've been talking about. So if you have an object declared like this with when you declare a new one, it automatically calculates the strides because it has got the dimensions, the shape, if you like.</p>
<p>296
00:39:37.070 --&gt; 00:39:51.790
Frans: So basically, a stride, is the index of a coordinate. And you can see the coordinate you specify as a, vector because it can be of any dimension</p>
<p>297
00:39:52.030 --&gt; 00:40:06.499
Frans: up to say, 1520, 30. Whatever pick a number. So obviously a good way is to present it as a vector you could probably find other ways of doing this. So here I specify, coordinate as a. Vector</p>
<p>298
00:40:06.640 --&gt; 00:40:07.770
Frans: and</p>
<p>299
00:40:07.950 --&gt; 00:40:19.079
Frans: we can. We can look at an example. I see I don't have an example up here. But yeah, we can look an example. So. But more importantly, you can see that I take the data, which is a vector.</p>
<p>300
00:40:19.240 --&gt; 00:40:27.120
Frans: And I stepped through the coordinates that I were given the spectre. I stepped through it.</p>
<p>301
00:40:27.310 --&gt; 00:40:46.150
Frans: and at the same time I'm stepping through the strides because the number of strides. This vector equals the number of coordinates. And I just do accumulated multiplication. So strides are set up that I can actually get exactly to the offset</p>
<p>302
00:40:46.260 --&gt; 00:40:48.999
Frans: in the vector for this coordinate.</p>
<p>303
00:40:51.230 --&gt; 00:41:01.619
Frans: it takes a bit of thinking, maybe to visual right? You can't really visualize because you're starting to work in. You know, you don't have 2 dimensions as in the matrix.</p>
<p>304
00:41:02.020 --&gt; 00:41:10.629
Frans: But this is, if you think about it long enough, it will become obvious. Well, not obvious, but</p>
<p>305
00:41:10.830 --&gt; 00:41:11.990
Frans: what I'm doing.</p>
<p>306
00:41:14.830 --&gt; 00:41:23.189
Frans: So so there's just a mutable setting that you can assign values back.</p>
<p>307
00:41:25.205 --&gt; 00:41:26.690
Frans: Right?</p>
<p>308
00:41:27.000 --&gt; 00:41:29.150
Frans: So here is the sort of</p>
<p>309
00:41:29.410 --&gt; 00:41:36.050
Frans: generic implementation of tensors where you have stuff like.</p>
<p>310
00:41:37.735 --&gt; 00:41:40.570
Frans: Oh, no. Sorry. My apologies, that's not</p>
<p>311
00:41:44.750 --&gt; 00:41:45.927
Frans: yeah. That is</p>
<p>312
00:41:46.850 --&gt; 00:41:58.639
Frans: what am I saying now, here, standard functions. So anyway, this is just what I wrote, because I got tired of. I wanted to display tenses properly.</p>
<p>313
00:41:58.930 --&gt; 00:42:02.689
Frans: in other words, like python would.</p>
<p>314
00:42:05.095 --&gt; 00:42:08.398
Frans: So this is the sort of</p>
<p>315
00:42:09.370 --&gt; 00:42:15.580
Frans: display that I that I wrote formatting it properly.</p>
<p>316
00:42:16.730 --&gt; 00:42:19.170
Frans: We'll get to that in a moment as well.</p>
<p>317
00:42:19.480 --&gt; 00:42:24.209
Frans: I'll actually write. We can do a real time example of of using this.</p>
<p>318
00:42:25.200 --&gt; 00:42:31.139
Frans: I'm much more comfortable talking about tenses, because it's the last thing I did. So it's probably more recent in my mind.</p>
<p>319
00:42:31.980 --&gt; 00:42:44.889
Frans: recent being a month and a bit ago. Okay, so these are the general functions new declaring it. So you specify a shape, you specify basically all the dimensions in the vector and then you give it the data. Vector</p>
<p>320
00:42:45.840 --&gt; 00:42:54.400
Frans: so the data vector is flat, but the shape gives it its tensor characteristics if you like.</p>
<p>321
00:42:55.330 --&gt; 00:43:12.430
Frans: So you can see when you declare new, you, I can easily calculate the strides, because I have the dimensions and the strides are simply just an accumulated multiplication of</p>
<p>322
00:43:16.820 --&gt; 00:43:22.610
Frans: for each one. You calculate one less, I think.</p>
<p>323
00:43:27.770 --&gt; 00:43:31.860
Frans: and you put it into the strides. So this is what I'm doing here.</p>
<p>324
00:43:32.070 --&gt; 00:43:36.640
Frans: Yeah. So I'm starting at one where index is one.</p>
<p>325
00:43:36.840 --&gt; 00:43:41.920
Frans: So this the zeroth stride is skipping. 0.</p>
<p>326
00:43:43.750 --&gt; 00:43:47.540
Frans: Sorry one. Yeah. Started one skip one</p>
<p>327
00:43:49.450 --&gt; 00:43:54.700
Frans: and then accumulate everyone sort of familiar with this syntax.</p>
<p>328
00:43:54.840 --&gt; 00:43:57.849
Frans: the fold, the initial value, and the closure.</p>
<p>329
00:44:01.400 --&gt; 00:44:04.499
Frans: What I do find very.</p>
<p>330
00:44:05.570 --&gt; 00:44:14.409
Frans: I don't want to use the word annoying, but in a way it is is this sort of dereferencing</p>
<p>331
00:44:14.820 --&gt; 00:44:17.629
Frans: and and and cloning</p>
<p>332
00:44:19.590 --&gt; 00:44:37.580
Frans: And again. I know that's that's the that's the rust. Safety guarantees that things, you know will disappear when they need to disappear or go out of scope. But still writing the code, for it can sometimes</p>
<p>333
00:44:37.710 --&gt; 00:44:42.070
Frans: get very, very challenging, I find.</p>
<p>334
00:44:43.925 --&gt; 00:44:44.600
Frans: Anyway.</p>
<p>335
00:44:44.600 --&gt; 00:44:45.260
Gabor Szabo: Awesome.</p>
<p>336
00:44:45.582 --&gt; 00:44:46.870
Frans: Sorry. That's my dog.</p>
<p>337
00:44:47.640 --&gt; 00:44:48.150
Gabor Szabo: No problem.</p>
<p>338
00:44:48.470 --&gt; 00:44:57.150
Frans: Getting excited there, anyway. So this is just setting up the new new tensor. And then so you have shape strides and the actual database.</p>
<p>339
00:44:57.400 --&gt; 00:44:58.120
Frans: Yeah.</p>
<p>340
00:45:04.170 --&gt; 00:45:07.480
Frans: You can also. Okay. So</p>
<p>341
00:45:07.780 --&gt; 00:45:11.829
Frans: just now, to sort of add on to the discussion about</p>
<p>342
00:45:12.000 --&gt; 00:45:23.659
Frans: find writing something that would start to be slightly, vaguely, vaguely familiar to python users. So there's a tensor library in python called Tensory.</p>
<p>343
00:45:24.965 --&gt; 00:45:29.320
Frans: I don't know if anybody has looked at. I mean go you you</p>
<p>344
00:45:29.320 --&gt; 00:45:29.760
Gabor Szabo: Good.</p>
<p>345
00:45:29.760 --&gt; 00:45:31.930
Frans: Do some python as well. Yeah.</p>
<p>346
00:45:32.690 --&gt; 00:45:40.680
Frans: so tensely is quite an advanced library in terms of using tenses for numeric computing.</p>
<p>347
00:45:40.940 --&gt; 00:45:58.699
Frans: So it's not not like tensorflow, where you specifically, maybe, you know, writing a neural network, and you're training it, etc. That kind of thing. It's more you can do what they call tensor contraction, which we'll get to in a moment.</p>
<p>348
00:45:58.750 --&gt; 00:46:28.699
Frans: and you can do factorized tensor into more as the sum of more usable tensors or even usable matrices. You can sort of change it and and make it. They're all sort of numerical numerical tricks to to make it easier to work with tensors and to manipulate them, and to understand what you're actually trying to do. So</p>
<p>349
00:46:28.800 --&gt; 00:46:35.730
Frans: having said that, I've never really worked with it directly myself.</p>
<p>350
00:46:40.690 --&gt; 00:46:44.200
Frans: Okay, so we get to subtensor.</p>
<p>351
00:46:44.958 --&gt; 00:46:47.650
Frans: Right? So one of the</p>
<p>352
00:46:51.680 --&gt; 00:46:56.339
Frans: One of the big things that I discovered right in the beginning</p>
<p>353
00:46:56.580 --&gt; 00:47:06.300
Frans: is that because you are in matrices. It's very easy. You are working with 2 dimensions, and there's only 2 dimensions, and that's always 2 dimensions. No problem.</p>
<p>354
00:47:07.120 --&gt; 00:47:10.840
Frans: If you are writing a generic tensor that can be anything.</p>
<p>355
00:47:11.680 --&gt; 00:47:19.669
Frans: Then it almost forces you to start using at nested functions within to do things.</p>
<p>356
00:47:19.880 --&gt; 00:47:23.070
Frans: So this also was like a very</p>
<p>357
00:47:23.190 --&gt; 00:47:28.600
Frans: tricky concept to get used to, because</p>
<p>358
00:47:29.150 --&gt; 00:47:36.559
Frans: you could almost think as a tensor where you are. If you want to get to an element you have to.</p>
<p>359
00:47:36.710 --&gt; 00:47:43.979
Frans: How can I put it visually? You can. You must drill down the dimensions until you get to the actual element.</p>
<p>360
00:47:44.130 --&gt; 00:47:54.729
Frans: So that's sort of very strange may sound very strange. But if you write the code, one starts to understand that's sort of what is happening.</p>
<p>361
00:47:54.820 --&gt; 00:48:14.720
Frans: So, for example, here, if you want to extract, get a subtensor of a tensor. You 1st have to. You have to work on all the dimension levels, and at each one you've got to drill down to the required dimension and extract an element</p>
<p>362
00:48:15.180 --&gt; 00:48:21.509
Frans: that sounds very strange now that I say it out loud. But that's really the thought process that's gone on here</p>
<p>363
00:48:21.880 --&gt; 00:48:27.420
Gabor Szabo: Yeah, after 3 dimensions. It's it's getting a bit hairy.</p>
<p>364
00:48:27.600 --&gt; 00:48:33.549
Frans: Yeah. Well, 3 dimensions you could probably still visualize. Yes, with you know. XYZ</p>
<p>365
00:48:33.700 --&gt; 00:48:39.060
Gabor Szabo: Or ZI don't know what you guys call Z in South Africa. We call it Z.</p>
<p>366
00:48:41.500 --&gt; 00:49:01.749
Frans: Zeros standard stuff, you know to this is, if you just want to. So this is all. What happened is then I started looking at tensely. And I say, what did what does it have? And I want to do the same stuff. So Zeros is just to create</p>
<p>367
00:49:01.910 --&gt; 00:49:24.670
Frans: a tensor of this, these dimensions or shape, if you like, so that's probably shape would be a better thing to put in there, and they all just filled with zeros. These are all filled with ones. These are filled with a certain value. T, and this is filled with a certain value range that starts at T</p>
<p>368
00:49:24.840 --&gt; 00:49:25.930
Frans: and go up.</p>
<p>369
00:49:28.240 --&gt; 00:49:29.130
Frans: Yeah.</p>
<p>370
00:49:29.130 --&gt; 00:49:34.309
Gabor Szabo: Yeah, I think dimensions would would say that like it has 3 dimensions, or 4, or whatever right</p>
<p>371
00:49:34.310 --&gt; 00:49:36.919
Frans: Yeah. Yeah. But it's just it's</p>
<p>372
00:49:36.920 --&gt; 00:49:39.309
Gabor Szabo: Described, actually</p>
<p>373
00:49:39.430 --&gt; 00:49:45.379
Frans: It's it's just that in in python and and tensory and and even, you know, numpy, they use shape.</p>
<p>374
00:49:45.560 --&gt; 00:50:09.049
Frans: So I sort of you know there's if if I wanted to make a product that I sort of can really, commercially market or sell or punt, you know, not even commercially, but in seriousness. I would have to go through this and make it all and standardize it, and and and make it much more. How can I say rigorous?</p>
<p>375
00:50:09.510 --&gt; 00:50:16.890
Frans: That's the one thing. The other thing is, I'm sure that a lot of optimization can be done which I'm</p>
<p>376
00:50:17.070 --&gt; 00:50:30.078
Frans: if in a rust perspective, not I haven't gone down that road at all, and which probably needs to be gone down. So I'm not making any. I mean, I've done no benchmarking against anything else. So</p>
<p>377
00:50:30.730 --&gt; 00:50:37.939
Frans: you know, there's probably there's a lot of work that needs to be done for this to be a robust, rigorous library, for sure.</p>
<p>378
00:50:39.420 --&gt; 00:50:44.680
Gabor Szabo: I mean, we are getting close to the, to the, to the 1 h due to</p>
<p>379
00:50:45.290 --&gt; 00:50:50.820
Frans: Do I am. Oh, I'm rambling on endlessly. My apologies, anyway, so</p>
<p>380
00:50:50.820 --&gt; 00:50:52.819
Gabor Szabo: Yeah, I have to wrap up soon, I guess.</p>
<p>381
00:50:52.820 --&gt; 00:51:04.640
Frans: Yeah, so so random and stuff like that. And I think the biggest and the the most difficult thing that I've done up to date was contracting a tensor.</p>
<p>382
00:51:04.960 --&gt; 00:51:05.930
Frans: and</p>
<p>383
00:51:06.120 --&gt; 00:51:25.789
Frans: that so using Einstein's summation notation, I don't know if anybody's familiar with that. So you have basically 2 tenses. And you basically want to contract a tensor ijkl with Mkni, which means you're taking the 3rd dimension</p>
<p>384
00:51:25.980 --&gt; 00:51:28.730
Frans: and contracting it with the second dimension.</p>
<p>385
00:51:29.170 --&gt; 00:51:49.360
Frans: And you're taking the 1st dimension and of the left hand tensor. And you're contracting with the right hand. And what you get basically contraction, you are shrinking the dimensions you are Melding. If I can use that word, adding these 2</p>
<p>386
00:51:49.760 --&gt; 00:51:56.929
Frans: tensors together, and you will end up with a tensor of dimensions. J.</p>
<p>387
00:51:57.300 --&gt; 00:51:59.120
Frans: LMN.</p>
<p>388
00:51:59.550 --&gt; 00:52:12.779
Frans: Right so, and contraction was extremely difficult until it the penny drops. So yes, okay. So, Einstein, notation is just a way of writing it out understandably that that</p>
<p>389
00:52:12.930 --&gt; 00:52:16.550
Frans: tensor algebraus use.</p>
<p>390
00:52:16.820 --&gt; 00:52:22.980
Frans: But the actual underlying routine is the contraction routine, and that</p>
<p>391
00:52:24.120 --&gt; 00:52:33.350
Frans: once you realize that a tensor you have to drill down through all the dimensions, and at the end you end up with a matrix</p>
<p>392
00:52:34.350 --&gt; 00:52:45.949
Frans: at the bottom of drilling down, and once you have that sort of idea in your head, then it's just a question of rearranging</p>
<p>393
00:52:48.410 --&gt; 00:52:51.100
Frans: finding the the correct</p>
<p>394
00:52:51.430 --&gt; 00:52:58.419
Frans: going through the dimensional drill down to find the correct element in the matrix underneath.</p>
<p>395
00:52:58.870 --&gt; 00:53:14.579
Frans: That doesn't sound very nice. But anyway, that's what it happens, anyway. So so that's basically is is sort of where I'm at. As I said, contraction was the biggest thing. Oh,</p>
<p>396
00:53:15.260 --&gt; 00:53:21.029
Frans: Almost the 1st thing I did with tensors is I wanted to do a creation. Macro</p>
<p>397
00:53:22.050 --&gt; 00:53:26.990
Frans: and I had to resort to.</p>
<p>398
00:53:27.660 --&gt; 00:53:40.330
Frans: This was very interesting. I had to resort to writing a separate crate that contains a what's this tensor? What's this? Macro called again.</p>
<p>399
00:53:41.170 --&gt; 00:53:51.880
Frans: Somebody help me here. It's it's not, you know your normal macros, or you can write it in your in your crate. But this is a specific execution, Macro. Process, Macro, sorry.</p>
<p>400
00:53:52.030 --&gt; 00:53:52.700
Frans: Yeah.</p>
<p>401
00:53:53.470 --&gt; 00:53:59.840
Frans: And that's the 1st time that I had to use a nested function.</p>
<p>402
00:54:00.180 --&gt; 00:54:06.249
Frans: Think, here, here is it here</p>
<p>403
00:54:07.460 --&gt; 00:54:11.730
Frans: flatten array? Yes, I used flatten array.</p>
<p>404
00:54:25.880 --&gt; 00:54:37.260
Frans: It's the 1st time I had to use it. So what I was trying to achieve here, and this is so. If we go back to the tensor library, which uses that macro in that crate</p>
<p>405
00:54:37.550 --&gt; 00:54:41.440
Frans: is that you can establish tenses by doing this.</p>
<p>406
00:54:41.790 --&gt; 00:54:43.620
Frans: And that is fantastic.</p>
<p>407
00:54:44.000 --&gt; 00:54:53.240
Frans: I love that because and your community, I mean, this is a like a 12 dimensional tensor.</p>
<p>408
00:54:53.380 --&gt; 00:54:57.829
Frans: you know, which you can establish like. So this is just a stupid example.</p>
<p>409
00:54:57.990 --&gt; 00:55:22.109
Frans: But you can see, and that establishes the shape of that and the strides of that. And that's the actual day test of the flat. Vector anyway, that's about it. So I would love to. You know, if you guys at any point want to chat more about how I did it, I'm happy to have future interaction</p>
<p>410
00:55:22.610 --&gt; 00:55:30.729
Frans: on a 1 to one or one to in a group session, but only from April onwards, because at the moment things are hectic on my side.</p>
<p>411
00:55:31.150 --&gt; 00:55:33.399
Frans: that's it. That's a wrap for me.</p>
<p>412
00:55:33.400 --&gt; 00:55:38.660
Gabor Szabo: Well, thank you. Thank you. April. Is not that far? It's it's like 2 weeks, right? So</p>
<p>413
00:55:38.930 --&gt; 00:55:51.300
Frans: Yes, no, exactly. But that's why it's a bit tense at the moment, because there's lots of pressure, and and there's a there's a substantial bonus involved. If I sort things out so you can understand</p>
<p>414
00:55:52.591 --&gt; 00:56:12.020
Gabor Szabo: Good. So so thank you very much for your for your presentation. By the way, your your information. I I put the link to the to the git repository in the chat, and that if you'll be under the video as well, you will find that and the link to your. I think your Linkedin page. So people will be able to contact you if if interested.</p>
<p>415
00:56:12.110 --&gt; 00:56:25.790
Gabor Szabo: So thank you very much for your presentation and for everyone who who listened, and for everyone who watched the video, and just remember to like the video and follow the channel. Thank you very much. Bye, bye.</p>
<p>416
00:56:25.790 --&gt; 00:56:28.479
Frans: Thanks. Gabor, thanks, guys. Cheers. Bye-bye.</p>
]]></content>
    <author>
      <name>Gábor Szabó</name>
    </author>
  </entry>

</feed>

