<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ramin Farajpour Cami</title>
    <description>The latest articles on DEV Community by Ramin Farajpour Cami (@raminfp).</description>
    <link>https://dev.to/raminfp</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F734215%2F0e03f8b4-fe7d-407b-a622-35ea68382a10.jpeg</url>
      <title>DEV Community: Ramin Farajpour Cami</title>
      <link>https://dev.to/raminfp</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/raminfp"/>
    <language>en</language>
    <item>
      <title>Trait-Driven Rust Architecture</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Sat, 30 Aug 2025 06:22:37 +0000</pubDate>
      <link>https://dev.to/raminfp/trait-driven-rust-architecture-1ife</link>
      <guid>https://dev.to/raminfp/trait-driven-rust-architecture-1ife</guid>
      <description>&lt;h1&gt;
  
  
  Trait-Driven Rust Architecture
&lt;/h1&gt;

&lt;p&gt;This project demonstrates clean architecture principles in Rust using traits, structured error handling, and domain modeling. It's designed to showcase professional Rust development patterns and best practices.&lt;/p&gt;

&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trait-first Architecture&lt;/strong&gt;: Contracts separated from implementation details

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Feature-gated Serialization&lt;/strong&gt;: Choose your serialization format (JSON or Bincode)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robust Error Handling&lt;/strong&gt;: Clear error management using &lt;code&gt;thiserror&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain Modeling&lt;/strong&gt;: Business models with state enums&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Clean Layering&lt;/strong&gt;: Well-separated application layers&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Building and Running
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run tests with bincode serialization&lt;/span&gt;
cargo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--features&lt;/span&gt; bincode

&lt;span class="c"&gt;# Run tests with JSON serialization  &lt;/span&gt;
cargo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--features&lt;/span&gt; json

&lt;span class="c"&gt;# Run CLI application with bincode&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--bin&lt;/span&gt; cli &lt;span class="nt"&gt;--features&lt;/span&gt; &lt;span class="s2"&gt;"cli bincode"&lt;/span&gt;

&lt;span class="c"&gt;# Run CLI application with JSON&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--bin&lt;/span&gt; cli &lt;span class="nt"&gt;--features&lt;/span&gt; &lt;span class="s2"&gt;"cli json"&lt;/span&gt;

&lt;span class="c"&gt;# Check syntax and compilation&lt;/span&gt;
cargo check &lt;span class="nt"&gt;--features&lt;/span&gt; bincode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;traity-app/
├── src/
│   ├── lib.rs              # Main library entry point
│   ├── prelude.rs          # Common imports and re-exports
│   ├── error.rs            # ErrorCode definitions and Result types
│   ├── traits/             # Trait definitions
│   │   ├── serialize.rs    # MySerialize/MyDeserialize traits
│   │   └── owner.rs        # Owner trait for access control
│   ├── domain/             # Domain models and business logic
│   │   ├── user.rs         # User struct and methods
│   │   ├── vault.rs        # Vault struct with business rules
│   │   └── state.rs        # VaultState enum for state management
│   └── infra/              # Infrastructure layer
│       └── storage.rs      # Storage trait and implementations
├── bin/
│   └── cli.rs              # Command-line interface example
└── tests/
    └── integration.rs      # Integration tests
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Learning Concepts
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Trait-based Design Pattern
&lt;/h3&gt;

&lt;p&gt;Traits in Rust define shared behavior without specifying implementation details:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;MySerialize&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="n"&gt;try_serialize&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;io&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;writer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;W&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;trait&lt;/span&gt; &lt;span class="n"&gt;Owner&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;OwnerId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Copy&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;Eq&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;Debug&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;owner_id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;Self&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;OwnerId&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why use traits?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt;: Different types can implement the same behavior differently

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Testability&lt;/strong&gt;: Easy to mock dependencies in tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extensibility&lt;/strong&gt;: Add new implementations without changing existing code&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Feature-gated Implementations
&lt;/h3&gt;

&lt;p&gt;Rust's feature flags allow conditional compilation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[cfg(feature&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"bincode"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;bincode_impls&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation using bincode for binary serialization&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[cfg(feature&lt;/span&gt; &lt;span class="nd"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"json"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;  
&lt;span class="k"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;json_impls&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Implementation using JSON for text serialization&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Reduced dependencies&lt;/strong&gt;: Only compile what you need

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Flexibility&lt;/strong&gt;: Choose serialization format at compile time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Binary vs. human-readable trade-offs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. State Management with Enums
&lt;/h3&gt;

&lt;p&gt;Rust enums are powerful for modeling business states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;VaultState&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Uninitialized&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;bool&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="n"&gt;Closed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Usage with pattern matching&lt;/span&gt;
&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;Vault&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;deposit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;u64&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.state&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nn"&gt;VaultState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="py"&gt;.balance&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                &lt;span class="nf"&gt;Ok&lt;/span&gt;&lt;span class="p"&gt;(())&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="nn"&gt;VaultState&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Active&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;frozen&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;ErrorCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;VaultFrozen&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="k"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;Err&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;ErrorCode&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InvalidState&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Type safety&lt;/strong&gt;: Compiler ensures all states are handled

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clarity&lt;/strong&gt;: Business rules are explicit in code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Easy to add new states and transitions&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Structured Error Handling
&lt;/h3&gt;

&lt;p&gt;Using &lt;code&gt;thiserror&lt;/code&gt; for clean error definitions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#[derive(Debug,&lt;/span&gt; &lt;span class="nd"&gt;Error)]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;enum&lt;/span&gt; &lt;span class="n"&gt;ErrorCode&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;#[error(&lt;/span&gt;&lt;span class="s"&gt;"Invalid data format"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;InvalidData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[error(&lt;/span&gt;&lt;span class="s"&gt;"Missing required field: {0}"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="nf"&gt;MissingField&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;'static&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;

    &lt;span class="nd"&gt;#[error(&lt;/span&gt;&lt;span class="s"&gt;"Not owner of this resource"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;NotOwner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[error(&lt;/span&gt;&lt;span class="s"&gt;"Vault is currently frozen"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;VaultFrozen&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;

    &lt;span class="nd"&gt;#[error(&lt;/span&gt;&lt;span class="s"&gt;"Invalid state for this operation"&lt;/span&gt;&lt;span class="nd"&gt;)]&lt;/span&gt;
    &lt;span class="n"&gt;InvalidState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Best practices:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Descriptive messages&lt;/strong&gt;: Help users understand what went wrong

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Categorization&lt;/strong&gt;: Group related errors for better handling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context&lt;/strong&gt;: Include relevant information in error variants&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Clone and Build
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone &amp;lt;your-repo&amp;gt;
&lt;span class="nb"&gt;cd &lt;/span&gt;traity-app
cargo build &lt;span class="nt"&gt;--features&lt;/span&gt; bincode
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Run Tests
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Test core functionality&lt;/span&gt;
cargo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--features&lt;/span&gt; bincode &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--nocapture&lt;/span&gt;

&lt;span class="c"&gt;# Test with different serialization&lt;/span&gt;
cargo &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;--features&lt;/span&gt; json &lt;span class="nt"&gt;--&lt;/span&gt; &lt;span class="nt"&gt;--nocapture&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Try the CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Create a new vault and perform operations&lt;/span&gt;
cargo run &lt;span class="nt"&gt;--bin&lt;/span&gt; cli &lt;span class="nt"&gt;--features&lt;/span&gt; &lt;span class="s2"&gt;"cli bincode"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Github : &lt;a href="https://github.com/raminfp/trait-driven-rust-architecture" rel="noopener noreferrer"&gt;https://github.com/raminfp/trait-driven-rust-architecture&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Learning Resources
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Essential Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/book/" rel="noopener noreferrer"&gt;The Rust Book&lt;/a&gt; - Start here for Rust fundamentals

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/stable/rust-by-example/" rel="noopener noreferrer"&gt;Rust by Example&lt;/a&gt; - Hands-on examples&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.lurklurk.org/effective-rust/" rel="noopener noreferrer"&gt;Effective Rust&lt;/a&gt; - Best practices and idioms&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Advanced Topics
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://rust-unofficial.github.io/patterns/" rel="noopener noreferrer"&gt;Rust Design Patterns&lt;/a&gt; - Common patterns in Rust

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://doc.rust-lang.org/nomicon/" rel="noopener noreferrer"&gt;The Rustonomicon&lt;/a&gt; - Advanced unsafe Rust concepts&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://rust-lang.github.io/async-book/" rel="noopener noreferrer"&gt;Async Rust&lt;/a&gt; - Asynchronous programming&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

</description>
      <category>rust</category>
      <category>architecture</category>
      <category>design</category>
      <category>learning</category>
    </item>
    <item>
      <title>Design of a Push Notification Service</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Sun, 20 Jul 2025 06:25:37 +0000</pubDate>
      <link>https://dev.to/raminfp/design-of-a-push-notification-service-4589</link>
      <guid>https://dev.to/raminfp/design-of-a-push-notification-service-4589</guid>
      <description>&lt;p&gt;&lt;em&gt;A comprehensive system design for handling 1 billion notifications per day&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Table of Contents
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;System Requirements&lt;/li&gt;
&lt;li&gt;Capacity Estimation&lt;/li&gt;
&lt;li&gt;API Design&lt;/li&gt;
&lt;li&gt;Database Design&lt;/li&gt;
&lt;li&gt;High-Level Architecture&lt;/li&gt;
&lt;li&gt;Component Design&lt;/li&gt;
&lt;li&gt;Trade-offs &amp;amp; Technology Choices&lt;/li&gt;
&lt;li&gt;Failure Scenarios &amp;amp; Mitigation&lt;/li&gt;
&lt;li&gt;Future Improvements&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  System Requirements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Functional Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Message Targeting&lt;/strong&gt;: Ability to target messages based on user attributes, device, and other relevant criteria&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Delivery Scheduling&lt;/strong&gt;: System should manage delivery times, potentially scheduling notifications for optimal impact&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Personalization&lt;/strong&gt;: Notifications should be customizable for individual user preferences and characteristics&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localization&lt;/strong&gt;: The system must support multiple languages and regional settings&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User Engagement Tracking&lt;/strong&gt;: Capability to track how users interact with notifications to facilitate continuous improvement&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance Monitoring&lt;/strong&gt;: Tools to monitor the speed and reliability of notification delivery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prioritization&lt;/strong&gt;: Capability to prioritize notifications, such as prioritizing OTPs over promotional messages&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Non-Functional Requirements
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Scalability&lt;/strong&gt;: Handle high volume of notifications and users, scaling dynamically as demand increases&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reliability&lt;/strong&gt;: High availability and fault tolerance to ensure continuous operation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Performance&lt;/strong&gt;: Fast response times for incoming notification requests and timely delivery&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt;: Secure handling and storage of user data and notification content&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Maintainability&lt;/strong&gt;: Ease of updating the system and integrating with other services&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Capacity Estimation
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Daily Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 billion&lt;/td&gt;
&lt;td&gt;Target volume&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notifications per Second&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~11,574&lt;/td&gt;
&lt;td&gt;Assuming constant traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Active Users&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;100 million&lt;/td&gt;
&lt;td&gt;Concurrent connection handling required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Average Notification Size&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;500 bytes&lt;/td&gt;
&lt;td&gt;Including headers and payload&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Data Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;5.79 MB/s&lt;/td&gt;
&lt;td&gt;Sustained data transfer rate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Storage Requirements&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Scalable&lt;/td&gt;
&lt;td&gt;For user preferences, engagement tracking, and logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  API Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Send Notification
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /notifications/send
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Your OTP is 6789"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"priority"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"en"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"device_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"device123"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notification_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Notification sent successfully."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Update User Preferences
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /users/{user_id}/preferences/update
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"preferences"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"language"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"es"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"marketing_notifications"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Preferences updated successfully."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Fetch Notification Status
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET /notifications/{notification_id}/status
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notification_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"delivered"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"delivered_at"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-04-14T12:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Track User Engagement
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;POST /engagements/track
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"notification_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"12345"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"clicked"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"success"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"message"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Engagement recorded successfully."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Database Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Entity-Relationship Diagram
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufp3g4m761l58ofiia49.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufp3g4m761l58ofiia49.png" alt=" " width="800" height="2117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Approach:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; for &lt;code&gt;USER&lt;/code&gt; and &lt;code&gt;NOTIFICATION&lt;/code&gt; data (strong consistency, ACID properties)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apache Cassandra&lt;/strong&gt; for &lt;code&gt;ENGAGEMENT&lt;/code&gt; data (high write throughput, scalability)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Design Decisions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;USER table&lt;/strong&gt; stores preferences and profile information with referential integrity&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;NOTIFICATION table&lt;/strong&gt; maintains delivery status and metadata for audit trails
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ENGAGEMENT table&lt;/strong&gt; captures all user interactions for analytics and optimization&lt;/li&gt;
&lt;li&gt;Partitioning strategy based on user_id for horizontal scalability&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  High-Level Architecture
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furumyubv01jvr4qyedcb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Furumyubv01jvr4qyedcb.png" alt=" " width="800" height="607"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Request Flow Sequence
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjtjricj88pxe4m1m6pl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkjtjricj88pxe4m1m6pl.png" alt=" " width="800" height="592"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Component Design
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Message Queue (Apache Kafka)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pn5s3ed89u0s5lozaxd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7pn5s3ed89u0s5lozaxd.png" alt=" " width="800" height="1146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Distributed Architecture&lt;/strong&gt;: Horizontal scaling with multiple brokers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Priority Queuing&lt;/strong&gt;: Separate topics for different priority levels&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Partitioning Strategy&lt;/strong&gt;: By user_id hash for load distribution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Durability&lt;/strong&gt;: Configurable replication factor for fault tolerance&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Delivery Service
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbsxl2d4v0k7fur28ijee.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbsxl2d4v0k7fur28ijee.png" alt=" " width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Implementation Details:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker Pattern&lt;/strong&gt;: Prevent cascade failures&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Exponential Backoff&lt;/strong&gt;: &lt;code&gt;delay = base_delay * (2^attempt) + jitter&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Batch Processing&lt;/strong&gt;: Group notifications for efficiency&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform-Specific Handling&lt;/strong&gt;: Dedicated services for iOS, Android, Web&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Tracking Service
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwehxzlouvxygd9v4gvk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwehxzlouvxygd9v4gvk.png" alt=" " width="800" height="3008"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Analytics Capabilities:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real-time Processing&lt;/strong&gt;: Apache Flink for stream processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sliding Window Analysis&lt;/strong&gt;: 1min, 5min, 1hour, 1day windows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Metrics Tracked&lt;/strong&gt;: Click-through rates, conversion rates, engagement scores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pattern Detection&lt;/strong&gt;: Anomaly detection for unusual engagement patterns&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Trade-offs &amp;amp; Technology Choices
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Message Queue: Apache Kafka vs RabbitMQ
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Apache Kafka&lt;/th&gt;
&lt;th&gt;RabbitMQ&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Very High (1M+ msgs/sec)&lt;/td&gt;
&lt;td&gt;⚠️ Moderate (100K msgs/sec)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Durability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Excellent (persistent logs)&lt;/td&gt;
&lt;td&gt;✅ Good (persistent queues)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ High operational overhead&lt;/td&gt;
&lt;td&gt;✅ Lower complexity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ordering&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Per-partition ordering&lt;/td&gt;
&lt;td&gt;⚠️ Limited ordering guarantees&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Horizontal scaling&lt;/td&gt;
&lt;td&gt;⚠️ Vertical scaling preferred&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Choice: Kafka&lt;/strong&gt; - Better suited for high-throughput, distributed environments&lt;/p&gt;

&lt;h3&gt;
  
  
  Database Strategy: Hybrid Approach
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Data Type&lt;/th&gt;
&lt;th&gt;Database&lt;/th&gt;
&lt;th&gt;Rationale&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;User Data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;ACID properties, complex queries, referential integrity&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Notifications&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;PostgreSQL&lt;/td&gt;
&lt;td&gt;Transaction support, status consistency&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Engagement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cassandra&lt;/td&gt;
&lt;td&gt;High write throughput, eventual consistency acceptable&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Microservices Architecture
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent scaling of delivery services per platform&lt;/li&gt;
&lt;li&gt;Technology diversity (different languages/frameworks)&lt;/li&gt;
&lt;li&gt;Fault isolation and resilience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Challenges:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Increased operational complexity&lt;/li&gt;
&lt;li&gt;Network latency between services&lt;/li&gt;
&lt;li&gt;Distributed transaction challenges&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Failure Scenarios &amp;amp; Mitigation
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Message Queue Overload
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: Queue becomes overwhelmed during traffic spikes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation Strategies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Rate Limiting&lt;/strong&gt;: Token bucket algorithm at API Gateway&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-scaling&lt;/strong&gt;: Kubernetes HPA based on queue depth&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker&lt;/strong&gt;: Fail fast when queue is full&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Backpressure&lt;/strong&gt;: Gradual throttling of incoming requests&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsyl94a14gtlpjqwq40ly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsyl94a14gtlpjqwq40ly.png" alt=" " width="800" height="146"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Database Bottlenecks
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: High read/write operations cause latency&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation Strategies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Read Replicas&lt;/strong&gt;: Route read queries to replicas&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Database Sharding&lt;/strong&gt;: Partition by user_id&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Redis Caching&lt;/strong&gt;: Cache frequently accessed data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Connection Pooling&lt;/strong&gt;: PgBouncer for PostgreSQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. External Service Failures
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Scenario&lt;/strong&gt;: APNS/FCM services are down or rate-limiting&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mitigation Strategies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Exponential Backoff&lt;/strong&gt;: Progressive retry delays&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dead Letter Queue&lt;/strong&gt;: Store failed messages for later processing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Alternative Providers&lt;/strong&gt;: Fallback to secondary providers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Circuit Breaker&lt;/strong&gt;: Stop calling failing services temporarily&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Machine Learning Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Adaptive Delivery Timing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Analyze user behavior patterns to determine optimal send times&lt;/li&gt;
&lt;li&gt;Personalize delivery schedules based on engagement history&lt;/li&gt;
&lt;li&gt;A/B testing framework for notification strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Implementation&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Pseudocode for ML-based timing
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;predict_optimal_time&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;user_features&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_engagement_history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;timezone_offset&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_user_timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;model_prediction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ml_model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user_features&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;adjust_for_timezone&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;model_prediction&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;timezone_offset&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Advanced Personalization
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Content Personalization&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dynamic message content based on user preferences&lt;/li&gt;
&lt;li&gt;Sentiment analysis for tone adjustment&lt;/li&gt;
&lt;li&gt;Multi-variate testing for message optimization&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Location-Based Services
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Geofencing Integration&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trigger notifications based on user location&lt;/li&gt;
&lt;li&gt;Proximity-based promotional campaigns&lt;/li&gt;
&lt;li&gt;Location-aware content delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Performance Enhancements
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Edge Computing&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deploy notification services at edge locations&lt;/li&gt;
&lt;li&gt;Reduce latency for global users&lt;/li&gt;
&lt;li&gt;Implement intelligent request routing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Real-time Analytics&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Stream processing for instant feedback&lt;/li&gt;
&lt;li&gt;Live dashboards for notification performance&lt;/li&gt;
&lt;li&gt;Automated alerting for system anomalies&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Monitoring &amp;amp; Observability
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Key Metrics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Metrics&lt;/th&gt;
&lt;th&gt;Target SLA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Throughput&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Messages/second&lt;/td&gt;
&lt;td&gt;&amp;gt; 15,000/sec&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;End-to-end delivery time&lt;/td&gt;
&lt;td&gt;&amp;lt; 5 seconds&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reliability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Delivery success rate&lt;/td&gt;
&lt;td&gt;&amp;gt; 99.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Engagement&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Click-through rate&lt;/td&gt;
&lt;td&gt;Monitor trends&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;System Health&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Error rate&lt;/td&gt;
&lt;td&gt;&amp;lt; 0.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Alerting Strategy
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fet5u9z6ktb4x3npkow82.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fet5u9z6ktb4x3npkow82.png" alt=" " width="800" height="689"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;This push notification service design provides a robust, scalable foundation for handling billions of notifications while maintaining high performance, reliability, and user engagement. The architecture leverages modern distributed systems patterns and technologies to ensure the system can grow with increasing demands while providing rich analytics and personalization capabilities.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>softwareengineering</category>
      <category>cloudstorage</category>
      <category>kafka</category>
    </item>
    <item>
      <title>go fiber multi core</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Sun, 24 Nov 2024 05:11:13 +0000</pubDate>
      <link>https://dev.to/raminfp/go-fiber-multi-core-3fnj</link>
      <guid>https://dev.to/raminfp/go-fiber-multi-core-3fnj</guid>
      <description></description>
      <category>go</category>
    </item>
    <item>
      <title>Design a real-time data processing</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Thu, 03 Oct 2024 07:32:34 +0000</pubDate>
      <link>https://dev.to/raminfp/design-a-real-time-data-processing-2j8d</link>
      <guid>https://dev.to/raminfp/design-a-real-time-data-processing-2j8d</guid>
      <description>&lt;h2&gt;
  
  
  What is Real-Time Data Processing?
&lt;/h2&gt;

&lt;p&gt;The real-time data processing refers to the ability to handle and analyze data as soon as it enters the system, allowing for immediate insights and actions. This approach is crucial in scenarios where timely decision-making is essential, such as &lt;code&gt;fraud detection&lt;/code&gt;, &lt;code&gt;stock trading&lt;/code&gt;, &lt;code&gt;monitoring systems&lt;/code&gt; or  &lt;code&gt;anti viruses&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This system allows for immediate detection of potential fraud, real-time updates to user accounts, and quick access to transaction analytics, significantly improving both security and user experience in financial services.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benefits:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Immediate insights for faster decision-making&lt;/li&gt;
&lt;li&gt;Ability to detect and respond to events as they happen&lt;/li&gt;
&lt;li&gt;Improved operational efficiency and customer experience&lt;/li&gt;
&lt;li&gt;Capacity to handle high-volume, high-velocity data&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Challenges:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Ensuring low latency across the entire pipeline&lt;/li&gt;
&lt;li&gt;Handling data consistency and fault tolerance&lt;/li&gt;
&lt;li&gt;Scaling the system to accommodate growing data volumes&lt;/li&gt;
&lt;li&gt;Managing the complexity of distributed systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Detailed Flow:
&lt;/h4&gt;

&lt;p&gt;Functional Requirements and Associated Technologies:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Ingestion:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capability to ingest data from various sources like IoT devices, sensors, and log files in real time  and all events.&lt;/li&gt;
&lt;li&gt;Tech Example: Apache Kafka for streaming data ingestion.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stream Processing:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability to process data streams in real time, enabling actions based on incoming data.&lt;/li&gt;
&lt;li&gt;Tech Example: Apache Flink for processing data streams with low latency.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complex Event Processing (CEP):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Support for detecting patterns or sequences of events to trigger action.&lt;/li&gt;
&lt;li&gt;Tech Example: FlinkCEP for implementing complex event detection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Real-time Analytics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capability to perform real-time analytics on incoming data, allowing users to visualize and make decisions instantly.&lt;/li&gt;
&lt;li&gt;Tech Example: Apache Druid for real-time data visualization and querying.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Storage:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Efficient storage of incoming data for both real-time processing and historical analysis.&lt;/li&gt;
&lt;li&gt;Tech Example: Apache Cassandra or Amazon Kinesis Data Firehose for storing streams of data.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Fault Tolerance and Recovery:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure the system can handle failures gracefully and recover from them with minimal data loss.&lt;/li&gt;
&lt;li&gt;Tech Example: Kafka's replication features for fault tolerance.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ability to scale horizontally to handle increased loads without degradation in performance.&lt;/li&gt;
&lt;li&gt;Tech Example: Kubernetes to orchestrate scaling of various components in the system.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Monitoring and Alerting:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement monitoring tools to alert operators about unusual traffic patterns or system performance.&lt;/li&gt;
&lt;li&gt;Tech Example: Prometheus and Grafana for monitoring and alert systems.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Management System&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implement handling user-specific data, which may include 

&lt;ul&gt;
&lt;li&gt;User profiles (username, email, passwords)&lt;/li&gt;
&lt;li&gt;User settings&lt;/li&gt;
&lt;li&gt;User activity logs&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tech Example: PostgreSQL&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh2irm4h2eb7v5zglhc7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvh2irm4h2eb7v5zglhc7.png" alt="Image description" width="800" height="467"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this diagram:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data Sources are the various inputs such as IoT devices or logs that feed data into the system.&lt;/li&gt;
&lt;li&gt;Data Ingestion Mechanism could be something like Kafka that collects this data.&lt;/li&gt;
&lt;li&gt;The Stream Processing Engine is responsible for processing the incoming data on the fly.&lt;/li&gt;
&lt;li&gt;From this engine, Real-time Analytics takes place to generate insights.&lt;/li&gt;
&lt;li&gt;Dashboard displays these insights for users.&lt;/li&gt;
&lt;li&gt;Complex Event Processing allows for identifying patterns and triggering actions based on those patterns.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To manage users in a real-time data processing system, you typically need a database that can handle high availability, scalability, and quick read/write operations. Here are a few options that you might consider:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Relational Database:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MySQL or PostgreSQL: Both are mature relational databases that can provide ACID transactions, which are important for user management. They are great for complex queries involving relationships, but may not scale as easily for extremely high write loads compared to NoSQL options.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;NoSQL Database:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MongoDB: A document-oriented NoSQL database that allows for flexible schema design and can easily scale horizontally. It's a great fit for managing user data, particularly when the data format is less rigid.&lt;/li&gt;
&lt;li&gt;Cassandra: If you have a large volume of user data with a need for high write availability and fault tolerance, Cassandra offers the ability to handle high write and read throughput.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Key-Value Store:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Redis: An in-memory key-value store that can be used for storing user sessions, caching user data for quick access, or even managing real-time features like user notifications.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Graph Database:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Neo4j: If user relationships matter significantly (e.g., social networking applications), a graph database can help manage and query relationships efficiently.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's an example decision process:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you need strong consistency and relationships between users (like user authentication, roles, and permissions), a relational database such as PostgreSQL may be best.&lt;/li&gt;
&lt;li&gt;If you're expecting a very high volume of user data with a focus on scalability and fast access, a NoSQL database like MongoDB or Cassandra might be preferable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How do Kafka, Flink, and Druid work for example {"data": "1"} if this data is for user A and processed in the system ?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's take a closer look at how Apache Kafka, Apache Flink, and Apache Druid work together in a real-time data processing pipeline, using example of the data &lt;code&gt;{"data": "1"}&lt;/code&gt; that is associated with user A.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Flow Overview:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Data Ingestion with Kafka: Kafka acts as the message broker that ingests data from various sources into streams.&lt;/li&gt;
&lt;li&gt;Stream Processing with Flink: Flink processes the data streams in real-time and can perform complex operations or transformations.&lt;/li&gt;
&lt;li&gt;Analytical Querying with Druid: Druid serves as the analytical data store to provide quick access to processed data for querying and visualization.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Detailed Process:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apache Kafka (Data Ingestion)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The data &lt;code&gt;{"data": "1"}&lt;/code&gt; for user A is published to a Kafka topic, let's call it "user_data".&lt;/li&gt;
&lt;li&gt;Kafka stores this message in a distributed, fault-tolerant manner.&lt;/li&gt;
&lt;li&gt;The message is now available for consumption by downstream systems like Flink.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apache Flink (Stream Processing)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flink sets up a consumer to read from the Kafka "user_data" topic.&lt;/li&gt;
&lt;li&gt;As new messages arrive, Flink processes them in real-time.&lt;/li&gt;
&lt;li&gt;Flink could perform various operations, such as:

&lt;ul&gt;
&lt;li&gt;Enriching the data (e.g., adding a timestamp)&lt;/li&gt;
&lt;li&gt;Filtering or transforming the data&lt;/li&gt;
&lt;li&gt;Aggregating data over time windows&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For example, Flink might transform the data to: &lt;code&gt;{"user": "A", "data": 1, "timestamp": 1633036800}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Apache Druid (Analytics and Querying)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The processed data from Flink is ingested into Druid.&lt;/li&gt;
&lt;li&gt;Druid stores this data in a columnar format optimized for fast analytical queries.&lt;/li&gt;
&lt;li&gt;Users can now perform real-time queries on this data, such as:

&lt;ul&gt;
&lt;li&gt;Count of events for user A&lt;/li&gt;
&lt;li&gt;Average of 'data' values for user A over the last hour&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Druid provides a SQL-like interface for querying this data efficiently.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example Query Flow:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Data enters Kafka: &lt;code&gt;{"data": "1"}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Flink processes and enriches: &lt;code&gt;{"user": "A", "data": 1, "timestamp": 1633036800}&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Data is stored in Druid&lt;/li&gt;
&lt;li&gt;A user runs a query: "What's the sum of 'data' for user A in the last 24 hours?"&lt;/li&gt;
&lt;li&gt;Druid quickly computes and returns the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This pipeline allows for real-time data processing and analytics, enabling quick insights from large volumes of streaming data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step-by-step Interaction:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Publishing Data to Kafka:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The system publishes the data &lt;code&gt;{"data": "1", "user_id": "A"}&lt;/code&gt; to a Kafka topic, which could be called &lt;code&gt;user-data-topic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;The message will include all pertinent information, such as the user's ID and the data value.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stream Processing with Flink:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flink consumes the messages from the Kafka topic &lt;code&gt;user-data-topic&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Flink processes the data, which could include filtering for specific user IDs, aggregating data, or performing transformations.&lt;/li&gt;
&lt;li&gt;For example, Flink might transform the incoming JSON object, store it in a specific format, or calculate metrics.&lt;/li&gt;
&lt;li&gt;If the processing logic facilitates event detection, it could trigger alerts or further actions based on certain conditions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Storing Processed Data in Druid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flink can then write or stream the processed data to Druid, which acts as a time-series data store optimized for real-time analytics.&lt;/li&gt;
&lt;li&gt;Druid is particularly good at handling large datasets with fast query capabilities, allowing users to visualize and query this information quickly.&lt;/li&gt;
&lt;li&gt;For instance, Druid could store the results of an aggregation like the number of occurrences of data type "1" for each user.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In a well-designed real-time data processing system, user data should be isolated so that user B cannot access the data associated with user A. This data isolation ensures privacy and security for each user. Here's how this can be enforced throughout the pipeline involving Kafka, Flink, and Druid:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Data Privacy in Kafka:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Topic Segregation: If the application requires strong privacy, consider creating separate Kafka topics based on user groups or roles. However, in most cases, data for all users can be maintained in a single topic, while access control is enforced at the processing level.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Access Control in Flink:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Data Filtering: When Flink processes messages from Kafka, it can implement filtering logic to ensure that operations are only applied to data associated with a specific user. For example, any aggregation or transformation performed will be scoped to the user making the request.&lt;/li&gt;
&lt;li&gt;Contextual Processing: Ensure that Flink jobs include a user context in their processing so they can differentiate which user's data is being worked on during transformation or calculation.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security in Druid:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Row-Level Security: Druid can implement row-level security, which allows it to control access to specific data records based on user permissions. User A's data will only be accessible to User A or roles that are authorized for that data.&lt;/li&gt;
&lt;li&gt;Access Control Lists (ACLs): Druid can use ACLs to manage which users have permissions to query certain datasets, ensuring isolated data access.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example of User Data Isolation:
&lt;/h3&gt;

&lt;p&gt;To illustrate, consider the following scenario:&lt;/p&gt;

&lt;p&gt;User A inputs data &lt;code&gt;{"data": "1", "user_id": "A"}&lt;/code&gt;, and User B inputs &lt;code&gt;{"data": "2", "user_id": "B"}&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When the data is sent to Kafka, both messages are placed in the same topic.&lt;/li&gt;
&lt;li&gt;Flink processes them, applying logic that ensures computations or manipulations are based only on &lt;code&gt;user_id: "A"&lt;/code&gt; for User A's requests and &lt;code&gt;user_id: "B"&lt;/code&gt; for User B's requests.&lt;/li&gt;
&lt;li&gt;When data is queried or visualized in Druid, the access is controlled to guarantee User A only sees results pertaining to their own activities and not User B's.&lt;/li&gt;
&lt;/ol&gt;

&lt;h1&gt;
  
  
  Complex Event Processing (CEP)
&lt;/h1&gt;

&lt;p&gt;CEP is a powerful capability within real-time data processing systems that allows for the analysis of events as they occur and the identification of meaningful patterns or sequences of events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Process:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Event Generation:
&lt;/h3&gt;

&lt;p&gt;Each transaction by users (e.g., transfers, purchases) is recorded and sent as an event to the CEP engine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"event_type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"transaction"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="nl"&gt;"user_id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; 
  &lt;/span&gt;&lt;span class="nl"&gt;"timestamp"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2023-10-01T12:00:00Z"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pattern Definition:
&lt;/h3&gt;

&lt;p&gt;Define patterns in the CEP system, such as:&lt;br&gt;
          "Trigger alert if a user makes more than three transactions exceeding $500 within a 5-minute window."&lt;/p&gt;

&lt;h3&gt;
  
  
  Event Processing:
&lt;/h3&gt;

&lt;p&gt;The CEP engine listens for incoming transaction events and analyzes them against the defined patterns.&lt;/p&gt;

&lt;h3&gt;
  
  
  Action Triggering:
&lt;/h3&gt;

&lt;p&gt;If a user meets the defined conditions for suspicious activity (e.g., three transactions over $500 in quick succession), the CEP triggers the following actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Alert Notification:&lt;/strong&gt; Send an alert to the monitoring team for further investigation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Block Transaction:&lt;/strong&gt; Automatically flag or block subsequent transactions for that user until manual review.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58rlbmbyyljt9drfzn2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F58rlbmbyyljt9drfzn2v.png" alt="Image description" width="800" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Real-time data processing has become an indispensable tool in today's fast-paced, data-driven world. By enabling organizations to ingest, process, and analyze data as it's generated, these systems provide immediate insights that drive quick decision-making and action. We've explored the key components of such systems, including data ingestion with Kafka, stream processing with Flink, and analytics with Druid, as well as the critical role of Complex Event Processing in detecting patterns and triggering actions.&lt;/p&gt;

</description>
      <category>systemdesign</category>
      <category>apachekafka</category>
      <category>programming</category>
      <category>kubernetes</category>
    </item>
    <item>
      <title>How to write your building tools for multiple applications with cargo</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Thu, 11 Jan 2024 06:28:10 +0000</pubDate>
      <link>https://dev.to/raminfp/how-to-write-your-building-tools-for-multiple-applications-with-cargo-44o9</link>
      <guid>https://dev.to/raminfp/how-to-write-your-building-tools-for-multiple-applications-with-cargo-44o9</guid>
      <description>&lt;p&gt;
  &lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k2vdov4g2s7c0bcvyfo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5k2vdov4g2s7c0bcvyfo.jpg" alt="Floki the boat builder " width="800" height="999"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;h4&gt;
  
  
  How to write your building tools for multiple applications with cargo [cargo-floki]
&lt;/h4&gt;

&lt;p&gt;(You can have multiple outputs of multiple applications at the same time by executing a command.)&lt;/p&gt;

&lt;p&gt;Building a tool for managing the build process of multiple applications can be quite complex,&lt;br&gt;
and writing build tools in Rust involves creating a program that automates various tasks related to building,&lt;br&gt;
testing, and packaging your Rust projects.&lt;/p&gt;
&lt;h4&gt;
  
  
  How to install cargo-floki :
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--path&lt;/span&gt; &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h5&gt;
  
  
  Usage:
&lt;/h5&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt; cargo floki &lt;span class="nt"&gt;--help&lt;/span&gt;
Usage: cargo-floki &lt;span class="o"&gt;[&lt;/span&gt;OPTIONS] &amp;lt;COMMAND&amp;gt;

Commands:
  init    Adds a default floki.toml file to current directory
  build   Compile the client and server
  clean   Remove the target directories &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;in &lt;/span&gt;app, client and server&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;test    &lt;/span&gt;Run the cargo tests &lt;span class="k"&gt;for &lt;/span&gt;app, client and server
  update  Run the cargo update &lt;span class="k"&gt;for &lt;/span&gt;app, client and server
  run     Run app
  doc     Docs
  &lt;span class="nb"&gt;help    &lt;/span&gt;Print this message or the &lt;span class="nb"&gt;help &lt;/span&gt;of the given subcommand&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt;

Options:
  &lt;span class="nt"&gt;-r&lt;/span&gt;, &lt;span class="nt"&gt;--release&lt;/span&gt;          Build artifacts &lt;span class="k"&gt;in &lt;/span&gt;release mode, with optimizations
  &lt;span class="nt"&gt;-v&lt;/span&gt;, &lt;span class="nt"&gt;--verbose&lt;/span&gt;...       Verbosity &lt;span class="o"&gt;(&lt;/span&gt;none: errors &amp;amp; warnings, &lt;span class="nt"&gt;-v&lt;/span&gt;: verbose, &lt;span class="nt"&gt;--vv&lt;/span&gt;: very verbose, &lt;span class="nt"&gt;--vvv&lt;/span&gt;: output everything&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-c&lt;/span&gt;, &lt;span class="nt"&gt;--config&lt;/span&gt; &amp;lt;CONFIG&amp;gt;  Path to configuration file &lt;span class="o"&gt;(&lt;/span&gt;defaults to &lt;span class="s1"&gt;'./floki.toml'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="nt"&gt;-h&lt;/span&gt;, &lt;span class="nt"&gt;--help&lt;/span&gt;             Print &lt;span class="nb"&gt;help&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Below is a basic outline of how you might approach building such a tool:&lt;/p&gt;
&lt;h4&gt;
  
  
  Project Structure:
&lt;/h4&gt;

&lt;p&gt;Create a standardized project structure to ensure consistency across different applications. This can simplify the build process by having a predictable layout.&lt;/p&gt;

&lt;p&gt;We have 2 project for my example &lt;code&gt;app&lt;/code&gt; and &lt;code&gt;client&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;tree
&lt;span class="nb"&gt;.&lt;/span&gt;
├── app &lt;span class="o"&gt;(&lt;/span&gt;Project 1&lt;span class="o"&gt;)&lt;/span&gt;
│   ├── Cargo.toml
│   └── src
│       └── lib.rs  
└── client &lt;span class="o"&gt;(&lt;/span&gt;Project 2&lt;span class="o"&gt;)&lt;/span&gt;
    ├── Cargo.toml
    └── src
        └── main.rs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Configuration:
&lt;/h4&gt;

&lt;p&gt;Allow for configuration options so users can customize the build process for their specific needs.&lt;br&gt;
Consider using configuration files, environment variables, or a configuration management system.&lt;/p&gt;

&lt;p&gt;I define project path &lt;code&gt;app&lt;/code&gt; and &lt;code&gt;client&lt;/code&gt; and generate &lt;code&gt;floki.toml&lt;/code&gt; :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki init
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;floki.toml 
&lt;span class="o"&gt;[&lt;/span&gt;floki]
main_service &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"floki_projects/app"&lt;/span&gt;
client_service &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"floki_projects/client"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Logging and Reporting:
&lt;/h4&gt;

&lt;p&gt;Implement logging and reporting features to provide detailed feedback during the build process. This helps developers identify and fix issues more efficiently.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki &lt;span class="nt"&gt;-v&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Testing:
&lt;/h4&gt;

&lt;p&gt;Implement testing for your build tool itself to ensure reliability and stability.&lt;/p&gt;

&lt;p&gt;I write a test for &lt;code&gt;app&lt;/code&gt; project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nb"&gt;test
    &lt;/span&gt;Finished &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.02s
     Running unittests src/main.rs &lt;span class="o"&gt;(&lt;/span&gt;cargo-floki/target/debug/deps/client-5bd14cdeb41d4264&lt;span class="o"&gt;)&lt;/span&gt;

running 0 tests

&lt;span class="nb"&gt;test &lt;/span&gt;result: ok. 0 passed&lt;span class="p"&gt;;&lt;/span&gt; 0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s

&lt;span class="nv"&gt;$ &lt;/span&gt;cargo &lt;span class="nb"&gt;test
    &lt;/span&gt;Finished &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.01s
     Running unittests src/lib.rs &lt;span class="o"&gt;(&lt;/span&gt;cargo-floki/target/debug/deps/app-f55b4b7fb682729e&lt;span class="o"&gt;)&lt;/span&gt;

running 1 &lt;span class="nb"&gt;test
test &lt;/span&gt;tests::test_add ... ok

&lt;span class="nb"&gt;test &lt;/span&gt;result: ok. 1 passed&lt;span class="p"&gt;;&lt;/span&gt; 0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s

   Doc-tests app

running 0 tests

&lt;span class="nb"&gt;test &lt;/span&gt;result: ok. 0 passed&lt;span class="p"&gt;;&lt;/span&gt; 0 failed&lt;span class="p"&gt;;&lt;/span&gt; 0 ignored&lt;span class="p"&gt;;&lt;/span&gt; 0 measured&lt;span class="p"&gt;;&lt;/span&gt; 0 filtered out&lt;span class="p"&gt;;&lt;/span&gt; finished &lt;span class="k"&gt;in &lt;/span&gt;0.00s


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Documentation:
&lt;/h4&gt;

&lt;p&gt;Provide comprehensive documentation to help users understand how to configure and use the build tool effectively.&lt;/p&gt;

&lt;p&gt;Generate documentation for all projects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki doc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Continuous Integration (CI) Integration:
&lt;/h4&gt;

&lt;p&gt;Ensure compatibility with popular CI/CD systems like Jenkins, Travis CI, GitLab CI, or GitHub Actions. This facilitates automated builds and deployments.&lt;/p&gt;

&lt;p&gt;Build all projects that cleans, build, testing the project directory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki build
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki &lt;span class="nt"&gt;-r&lt;/span&gt; build
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki clean
&lt;span class="nv"&gt;$ &lt;/span&gt;cargo floki update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All these steps are for ease of work and speed of application development.&lt;/p&gt;

&lt;p&gt;Github code : &lt;a href="https://github.com/raminfp/cargo-floki" rel="noopener noreferrer"&gt;https://github.com/raminfp/cargo-floki&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to rust binding for libFuzzer</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Fri, 03 Nov 2023 08:15:13 +0000</pubDate>
      <link>https://dev.to/raminfp/how-to-rust-binding-for-libfuzzer-4991</link>
      <guid>https://dev.to/raminfp/how-to-rust-binding-for-libfuzzer-4991</guid>
      <description>&lt;h3&gt;
  
  
  How to Rust bindings for libFuzzer
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;You can use the Rust fuzz ecosystem, which provides a convenient way to integrate fuzz testing into your Rust projects&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Here's a step-by-step guide on how to create Rust bindings for libFuzzer:&lt;/p&gt;

&lt;h4&gt;
  
  
  What is &lt;code&gt;libfuzzer&lt;/code&gt;?
&lt;/h4&gt;

&lt;p&gt;&lt;em&gt;libFuzzer is a highly efficient coverage-guided fuzz testing tool that is part of the LLVM (Low-Level Virtual Machine) project. Fuzz testing, or fuzzing, is a software testing technique in which a program is subjected to a large volume of random, invalid, or unexpected input data to discover vulnerabilities, crashes, or other issues.&lt;/em&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Download &lt;code&gt;libfuzzer&lt;/code&gt; C++ source code :
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/fuzzer" rel="noopener noreferrer"&gt;https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/fuzzer&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Rust version
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;17:40] raminfp@zenbook: &lt;span class="nv"&gt;$ &lt;/span&gt;rustc &lt;span class="nt"&gt;-vV&lt;/span&gt;
rustc 1.75.0-nightly &lt;span class="o"&gt;(&lt;/span&gt;75b064d26 2023-11-01&lt;span class="o"&gt;)&lt;/span&gt;
binary: rustc
commit-hash: 75b064d26970ca8e7a487072f51835ebb057d575
commit-date: 2023-11-01
host: x86_64-unknown-linux-gnu
release: 1.75.0-nightly
LLVM version: 17.0.4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Building for libfuzzer c++ code in the &lt;code&gt;build.rs&lt;/code&gt;
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;Build&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;fs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;read_dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"libfuzzer"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"listable source directory"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;de&lt;/span&gt;&lt;span class="nf"&gt;.expect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"file in directory"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="nf"&gt;.path&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
            &lt;span class="nf"&gt;.filter&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="nf"&gt;.extension&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.map&lt;/span&gt;&lt;span class="p"&gt;(|&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;"cpp"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="py"&gt;.collect&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;Vec&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;sources&lt;/span&gt;&lt;span class="nf"&gt;.iter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="nf"&gt;.to_str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="nf"&gt;.unwrap&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-std=c++11"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-fno-omit-frame-pointer"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.flag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"-w"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.cpp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="nf"&gt;.compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"libfuzzer.a"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Add wrapper function &lt;code&gt;LLVMFuzzerTestOneInput&lt;/code&gt; This wrapper function is designed to call a Rust function &lt;code&gt;rust_fuzzer_test_input&lt;/code&gt; with input data obtained from the fuzzer.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;slice&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;from_raw_parts&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;rust_fuzzer_test_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nd"&gt;#[no_mangle]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;LLVMFuzzerTestOneInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;usize&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;from_raw_parts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

    &lt;span class="k"&gt;unsafe&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;rust_fuzzer_test_input&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Now starting fuzzing your libs with libfuzzer in rust.
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cargo new --bin example
$ cd example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Then add a dependency on the fuzzer
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[dependencies]&lt;/span&gt;
&lt;span class="py"&gt;myfuzzer&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="py"&gt;path&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;".."&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="py"&gt;your_crate_libs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"*"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  And change code in your case ex: &lt;code&gt;src/main.rs&lt;/code&gt; to fuzz my code:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="nd"&gt;#![no_main]&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="k"&gt;crate&lt;/span&gt; &lt;span class="n"&gt;myfuzzer&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nd"&gt;#[export_name=&lt;/span&gt;&lt;span class="s"&gt;"rust_fuzzer_test_input"&lt;/span&gt;&lt;span class="nd"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;pub&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;fuzz&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;u8&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// your fuzz code here&lt;/span&gt;
    &lt;span class="c1"&gt;// println!("{:?}", data);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;b"A"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;panic!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Oops!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Finally, run the following commands:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;04:09] raminfp@zenbook:example &lt;span class="o"&gt;(&lt;/span&gt;main&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="c"&gt;# pwd&lt;/span&gt;
/home/raminfp/Projects/Develop/libfuzzer/example
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;03:18] raminfp@zenbook:example &lt;span class="c"&gt;# cargo rustc -- \&lt;/span&gt;
    &lt;span class="nt"&gt;-C&lt;/span&gt; &lt;span class="nv"&gt;passes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'sancov-module'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-C&lt;/span&gt; llvm-args&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-sanitizer-coverage-level=3'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-C&lt;/span&gt; llvm-args&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'-sanitizer-coverage-inline-8bit-counters'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-Z&lt;/span&gt; &lt;span class="nv"&gt;sanitizer&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;address
&lt;span class="nv"&gt;$ &lt;/span&gt;./target/debug/example
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Output:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;03:55] raminfp@zenbook:example &lt;span class="c"&gt;# ./target/debug/example&lt;/span&gt;
INFO: Seed: 1157038402
INFO: Loaded 1 modules   &lt;span class="o"&gt;(&lt;/span&gt;239 inline 8-bit counters&lt;span class="o"&gt;)&lt;/span&gt;: 239 &lt;span class="o"&gt;[&lt;/span&gt;0x5556c7f79a80, 0x5556c7f79b6f&lt;span class="o"&gt;)&lt;/span&gt;, 
INFO: &lt;span class="nt"&gt;-max_len&lt;/span&gt; is not provided&lt;span class="p"&gt;;&lt;/span&gt; libFuzzer will not generate inputs larger than 4096 bytes
INFO: A corpus is not provided, starting from an empty corpus
&lt;span class="c"&gt;#2  INITED ft: 15 corp: 1/1b exec/s: 0 rss: 36Mb&lt;/span&gt;
&lt;span class="c"&gt;#5  NEW    ft: 17 corp: 2/66b exec/s: 0 rss: 36Mb L: 65/65 MS: 3 CopyPart-CopyPart-InsertRepeatedBytes-&lt;/span&gt;
&lt;span class="c"&gt;#58 REDUCE ft: 17 corp: 2/44b exec/s: 0 rss: 36Mb L: 43/43 MS: 3 InsertByte-InsertRepeatedBytes-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#72 REDUCE ft: 17 corp: 2/25b exec/s: 0 rss: 36Mb L: 24/24 MS: 4 InsertByte-InsertByte-ChangeByte-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#78 REDUCE ft: 17 corp: 2/24b exec/s: 0 rss: 36Mb L: 23/23 MS: 1 EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#80 REDUCE ft: 17 corp: 2/15b exec/s: 0 rss: 36Mb L: 14/14 MS: 2 CopyPart-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#81 REDUCE ft: 17 corp: 2/14b exec/s: 0 rss: 36Mb L: 13/13 MS: 1 EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#133    REDUCE ft: 17 corp: 2/11b exec/s: 0 rss: 36Mb L: 10/10 MS: 2 ChangeBit-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#171    REDUCE ft: 17 corp: 2/8b exec/s: 0 rss: 36Mb L: 7/7 MS: 3 ChangeBinInt-ChangeBit-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#182    REDUCE ft: 17 corp: 2/6b exec/s: 0 rss: 36Mb L: 5/5 MS: 1 EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#184    REDUCE ft: 17 corp: 2/5b exec/s: 0 rss: 36Mb L: 4/4 MS: 2 InsertByte-EraseBytes-&lt;/span&gt;
&lt;span class="c"&gt;#196    REDUCE ft: 17 corp: 2/3b exec/s: 0 rss: 36Mb L: 2/2 MS: 2 ChangeByte-EraseBytes-&lt;/span&gt;
thread &lt;span class="s1"&gt;'&amp;lt;unnamed&amp;gt;'&lt;/span&gt; panicked at src/main.rs:9:9:
Oops!
note: run with &lt;span class="sb"&gt;`&lt;/span&gt;&lt;span class="nv"&gt;RUST_BACKTRACE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1&lt;span class="sb"&gt;`&lt;/span&gt; environment variable to display a backtrace
&lt;span class="o"&gt;==&lt;/span&gt;&lt;span class="nv"&gt;44905&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt; ERROR: libFuzzer: deadly signal
    &lt;span class="c"&gt;#0 0x5556c7e6eaf1 in __sanitizer_print_stack_trace /rustc/llvm/src/llvm-project/compiler-rt/lib/asan/asan_stack.cpp:87:3&lt;/span&gt;
    &lt;span class="c"&gt;#1 0x5556c7eac540 in fuzzer::Fuzzer::CrashCallback() /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:233:38&lt;/span&gt;
    &lt;span class="c"&gt;#2 0x5556c7eac3c6 in fuzzer::Fuzzer::StaticCrashSignalCallback() /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:206:19&lt;/span&gt;
    &lt;span class="c"&gt;#3 0x5556c7edb561 in fuzzer::CrashHandler(int, siginfo_t*, void*) /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerUtilPosix.cpp:36:36&lt;/span&gt;
    &lt;span class="c"&gt;#4 0x7efed284251f  (/lib/x86_64-linux-gnu/libc.so.6+0x4251f) (BuildId: a43bfc8428df6623cd498c9c0caeb91aec9be4f9)&lt;/span&gt;
    &lt;span class="c"&gt;#5 0x7efed28969fb in __pthread_kill_implementation nptl/./nptl/pthread_kill.c:43:17&lt;/span&gt;
    &lt;span class="c"&gt;#6 0x7efed28969fb in __pthread_kill_internal nptl/./nptl/pthread_kill.c:78:10&lt;/span&gt;
    &lt;span class="c"&gt;#7 0x7efed28969fb in pthread_kill nptl/./nptl/pthread_kill.c:89:10&lt;/span&gt;
    &lt;span class="c"&gt;#8 0x7efed2842475 in gsignal signal/../sysdeps/posix/raise.c:26:13&lt;/span&gt;
    &lt;span class="c"&gt;#9 0x7efed28287f2 in abort stdlib/./stdlib/abort.c:79:7&lt;/span&gt;
    &lt;span class="c"&gt;#10 0x5556c7ef8226 in std::sys::unix::abort_internal::haadb6d01b1ce5dcc /rustc/75b064d26970ca8e7a487072f51835ebb057d575/library/std/src/sys/unix/mod.rs:376:14&lt;/span&gt;
    &lt;span class="c"&gt;#11 0x5556c7ddf7a6 in std::process::abort::hb7281d0b80ebbd50 /rustc/75b064d26970ca8e7a487072f51835ebb057d575/library/std/src/process.rs:2279:5&lt;/span&gt;
    &lt;span class="c"&gt;#12 0x5556c7e945c5 in myfuzzer::test_input_wrap::_$u7b$$u7b$closure$u7d$$u7d$::h2f53ba4c17f7bd40 /home/raminfp/Projects/Develop/libfuzzer-rs/src/lib.rs:19:22&lt;/span&gt;
    &lt;span class="c"&gt;#13 0x5556c7e94495 in core::option::Option$LT$T$GT$::map::h90a0dc092a0a2b55 /rustc/75b064d26970ca8e7a487072f51835ebb057d575/library/core/src/option.rs:1066:29&lt;/span&gt;
    &lt;span class="c"&gt;#14 0x5556c7e94419 in LLVMFuzzerTestOneInput /home/raminfp/Projects/Develop/libfuzzer-rs/src/lib.rs:16:5&lt;/span&gt;
    &lt;span class="c"&gt;#15 0x5556c7eadc73 in fuzzer::Fuzzer::ExecuteCallback(unsigned char const*, unsigned long) /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:515:15&lt;/span&gt;
    &lt;span class="c"&gt;#16 0x5556c7ead6d1 in fuzzer::Fuzzer::RunOne(unsigned char const*, unsigned long, bool, fuzzer::InputInfo*, bool*) /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:440:18&lt;/span&gt;
    &lt;span class="c"&gt;#17 0x5556c7eae727 in fuzzer::Fuzzer::MutateAndTestOne() /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:648:25&lt;/span&gt;
    &lt;span class="c"&gt;#18 0x5556c7eaf3ae in fuzzer::Fuzzer::Loop(std::vector&amp;lt;std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt;, fuzzer::fuzzer_allocator&amp;lt;std::__cxx11::basic_string&amp;lt;char, std::char_traits&amp;lt;char&amp;gt;, std::allocator&amp;lt;char&amp;gt; &amp;gt; &amp;gt; &amp;gt; const&amp;amp;) /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerLoop.cpp:775:21&lt;/span&gt;
    &lt;span class="c"&gt;#19 0x5556c7e9b3ac in fuzzer::FuzzerDriver(int*, char***, int (*)(unsigned char const*, unsigned long)) /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerDriver.cpp:754:10&lt;/span&gt;
    &lt;span class="c"&gt;#20 0x5556c7e94962 in main /home/raminfp/Projects/Develop/libfuzzer-rs/libfuzzer/FuzzerMain.cpp:20:30&lt;/span&gt;
    &lt;span class="c"&gt;#21 0x7efed2829d8f in __libc_start_call_main csu/../sysdeps/nptl/libc_start_call_main.h:58:16&lt;/span&gt;
    &lt;span class="c"&gt;#22 0x7efed2829e3f in __libc_start_main csu/../csu/libc-start.c:392:3&lt;/span&gt;
    &lt;span class="c"&gt;#23 0x5556c7de07f4 in _start (/home/raminfp/Projects/Develop/libfuzzer-rs/example/target/debug/example+0x127f4) (BuildId: 12917cdb5ef03b01c21eb307af3c31bd5867b94e)&lt;/span&gt;

NOTE: libFuzzer has rudimentary signal handlers.
      Combine libFuzzer with AddressSanitizer or similar &lt;span class="k"&gt;for &lt;/span&gt;better crash reports.
SUMMARY: libFuzzer: deadly signal
MS: 1 ChangeByte-&lt;span class="p"&gt;;&lt;/span&gt; base unit: adc83b19e793491b1c6ea0fd8b46cd9f32e592fc
0x41,
A
&lt;span class="nv"&gt;artifact_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'./'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; Test unit written to ./crash-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b
Base64: &lt;span class="nv"&gt;QQ&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Crash file:
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;
&lt;span class="o"&gt;[&lt;/span&gt;03:20] raminfp@zenbook:example &lt;span class="c"&gt;# exa&lt;/span&gt;
Cargo.lock  Cargo.toml  crash-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b  src  target


&lt;span class="o"&gt;[&lt;/span&gt;03:20] raminfp@zenbook:example &lt;span class="c"&gt;# hexdump crash-6dcd4ce23d88e2ee9568ba546c007c63d9131c1b&lt;/span&gt;
0000000 0041                                   
0000001
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Thanks,&lt;/p&gt;

&lt;p&gt;Source code : &lt;a href="https://github.com/raminfp/libfuzzer-rs" rel="noopener noreferrer"&gt;https://github.com/raminfp/libfuzzer-rs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>fuzzing</category>
      <category>fuzz</category>
      <category>rust</category>
      <category>vulnerabilities</category>
    </item>
    <item>
      <title>Task scheduler interval in the rust</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Tue, 17 Oct 2023 09:52:38 +0000</pubDate>
      <link>https://dev.to/raminfp/task-scheduler-interval-in-the-rust-3bma</link>
      <guid>https://dev.to/raminfp/task-scheduler-interval-in-the-rust-3bma</guid>
      <description>&lt;h4&gt;
  
  
  Tasks Schedule
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Task scheduler in code that runs a function at specific intervals,
&lt;/h5&gt;

&lt;h4&gt;
  
  
  Example
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;task_schedule&lt;/span&gt;&lt;span class="p"&gt;::{&lt;/span&gt;&lt;span class="n"&gt;schedule_tasks&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;task_schedule&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;utils&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_without_params&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am running sec task."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_min&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am running min task."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_hours&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am running hours task."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_days&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am running days task."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_week&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"I am running week task."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_with_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;i32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Task with parameters: a = {}, b = {}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;task_with_params_wrapper&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;task_with_params&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nd"&gt;vec!&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_without_params&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_seconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_with_params_wrapper&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_minutes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_min&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_hours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_hours&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_days&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_days&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
        &lt;span class="nn"&gt;ScheduledTask&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;convert_duration_to_weeks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;task_week&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="k"&gt;fn&lt;/span&gt;&lt;span class="p"&gt;()),&lt;/span&gt;
    &lt;span class="p"&gt;];&lt;/span&gt;

    &lt;span class="nf"&gt;schedule_tasks&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;tasks&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Output
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
Task with parameters: a &lt;span class="o"&gt;=&lt;/span&gt; 42, b &lt;span class="o"&gt;=&lt;/span&gt; Hello
I am running sec task.
I am running sec task.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Github : &lt;a href="https://github.com/raminfp/schedule-tasks" rel="noopener noreferrer"&gt;https://github.com/raminfp/schedule-tasks&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>tasks</category>
      <category>job</category>
    </item>
    <item>
      <title>A small library for writing line-oriented command interpreters in the Rust</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Sat, 14 Oct 2023 13:19:24 +0000</pubDate>
      <link>https://dev.to/raminfp/a-small-library-for-writing-line-oriented-command-interpreters-in-the-rust-4phl</link>
      <guid>https://dev.to/raminfp/a-small-library-for-writing-line-oriented-command-interpreters-in-the-rust-4phl</guid>
      <description>&lt;h2&gt;
  
  
  cli-rs
&lt;/h2&gt;

&lt;h4&gt;
  
  
  What is line-oriented command interpreters?
&lt;/h4&gt;

&lt;p&gt;A line-oriented command interpreter, also known as a command-line interpreter or shell, is a software program or interface that allows users to interact with a computer or operating system by entering text-based commands. Users type commands and arguments in a sequential, line-by-line manner, and the interpreter processes these commands and carries out the requested operations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight rust"&gt;&lt;code&gt;&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cell&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;cli_rs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;CommandHandler&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;cli_rs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cli&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;cmd&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;cli_rs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;about&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;cli_rs&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;QuitCommand&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;HelpCommand&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;CommandHandler&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;HelpCommand&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nd"&gt;println!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Help"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;impl&lt;/span&gt; &lt;span class="n"&gt;CommandHandler&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;QuitCommand&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_cmd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Rc&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;RefCell&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Cmd&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nn"&gt;std&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nn"&gt;process&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;let&lt;/span&gt; &lt;span class="k"&gt;mut&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nn"&gt;Cmd&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="py"&gt;.intro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;Some&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Welcome to Rust command interpreter!"&lt;/span&gt;&lt;span class="nf"&gt;.to_string&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;HelloCommand&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"quit"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;QuitCommand&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"help"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;HelpCommand&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.add_command&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"about"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nn"&gt;Rc&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nn"&gt;about&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="n"&gt;AboutCommand&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="nf"&gt;.cmdloop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Output
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# cargo run&lt;/span&gt;
    Finished dev &lt;span class="o"&gt;[&lt;/span&gt;unoptimized + debuginfo] target&lt;span class="o"&gt;(&lt;/span&gt;s&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in &lt;/span&gt;0.03s
     Running &lt;span class="sb"&gt;`&lt;/span&gt;target/debug/cmd-rs&lt;span class="sb"&gt;`&lt;/span&gt;
Welcome to Rust &lt;span class="nb"&gt;command &lt;/span&gt;interpreter!
&lt;span class="o"&gt;[&lt;/span&gt;cli-rs] &lt;span class="nb"&gt;help
&lt;/span&gt;Help
&lt;span class="o"&gt;[&lt;/span&gt;cli-rs] hello world! 
Hello world!
&lt;span class="o"&gt;[&lt;/span&gt;cli-rs] about
About me
&lt;span class="o"&gt;[&lt;/span&gt;cli-rs] quit

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/raminfp/cli-rs" rel="noopener noreferrer"&gt;https://github.com/raminfp/cli-rs&lt;/a&gt;&lt;/p&gt;

</description>
      <category>rust</category>
      <category>interpreter</category>
      <category>programming</category>
    </item>
    <item>
      <title>Symbolic Execution Fuzzing With KLEE</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Tue, 10 Oct 2023 12:23:16 +0000</pubDate>
      <link>https://dev.to/raminfp/symbolic-execution-fuzzing-with-klee-41lo</link>
      <guid>https://dev.to/raminfp/symbolic-execution-fuzzing-with-klee-41lo</guid>
      <description>&lt;h4&gt;
  
  
  What is Symbolic Execution?
&lt;/h4&gt;

&lt;p&gt;symbolic execution is a means of analyzing a program to determine what inputs cause each part of a program to execute. &lt;br&gt;
An interpreter follows the program, assuming symbolic values for inputs rather than obtaining actual inputs as normal execution of the program would.&lt;/p&gt;
&lt;h4&gt;
  
  
  KLEE Symbolic Execution Engine
&lt;/h4&gt;

&lt;p&gt;KLEE is a dynamic symbolic execution engine built on top of the LLVM compiler infrastructure&lt;/p&gt;
&lt;h4&gt;
  
  
  How to install KLEE with Docker
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/klee/klee.git
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;klee
&lt;span class="nv"&gt;$ &lt;/span&gt;docker build &lt;span class="nt"&gt;-t&lt;/span&gt; klee/klee &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;-ti&lt;/span&gt; &lt;span class="nt"&gt;--ulimit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'stack=-1:-1'&lt;/span&gt; klee/klee
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h4&gt;
  
  
  Let's me start fuzzing OSS(Open Source Software)
&lt;/h4&gt;

&lt;p&gt;1- Download source code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/kokke/tiny-bignum-c
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Add main to code &lt;code&gt;bn.c&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;From 174727a8d41cf1276849e5d4524f8cd4c4955afd Mon Sep 17 00:00:00 2001
From: raminfp &amp;lt;ramin.blackhat@gmail.com&amp;gt;
Date: Sun, 18 Jul 2021 03:04:40 +0000
Subject: &lt;span class="o"&gt;[&lt;/span&gt;PATCH] Change code &lt;span class="k"&gt;for &lt;/span&gt;fuzzing KLEE

&lt;span class="nt"&gt;---&lt;/span&gt;
 bn.c | 42 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 42 insertions&lt;span class="o"&gt;(&lt;/span&gt;+&lt;span class="o"&gt;)&lt;/span&gt;

diff &lt;span class="nt"&gt;--git&lt;/span&gt; a/bn.c b/bn.c
index 6526ea7..f71474d 100644
&lt;span class="nt"&gt;---&lt;/span&gt; a/bn.c
+++ b/bn.c
@@ &lt;span class="nt"&gt;-663&lt;/span&gt;,3 +663,45 @@ static void _rshift_one_bit&lt;span class="o"&gt;(&lt;/span&gt;struct bn&lt;span class="k"&gt;*&lt;/span&gt; a&lt;span class="o"&gt;)&lt;/span&gt;
 &lt;span class="o"&gt;}&lt;/span&gt;


+void factorial&lt;span class="o"&gt;(&lt;/span&gt;struct bn&lt;span class="k"&gt;*&lt;/span&gt; n, struct bn&lt;span class="k"&gt;*&lt;/span&gt; res&lt;span class="o"&gt;)&lt;/span&gt;
+&lt;span class="o"&gt;{&lt;/span&gt;
+  struct bn tmp&lt;span class="p"&gt;;&lt;/span&gt;
+
+  /&lt;span class="k"&gt;*&lt;/span&gt; Copy n -&amp;gt; tmp &lt;span class="k"&gt;*&lt;/span&gt;/
+  bignum_assign&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;tmp, n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+  /&lt;span class="k"&gt;*&lt;/span&gt; Decrement n by one &lt;span class="k"&gt;*&lt;/span&gt;/
+  bignum_dec&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  
+  /&lt;span class="k"&gt;*&lt;/span&gt; Begin summing products: &lt;span class="k"&gt;*&lt;/span&gt;/
+  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="o"&gt;(!&lt;/span&gt;bignum_is_zero&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;))&lt;/span&gt;
+  &lt;span class="o"&gt;{&lt;/span&gt;
+    /&lt;span class="k"&gt;*&lt;/span&gt; res &lt;span class="o"&gt;=&lt;/span&gt; tmp &lt;span class="k"&gt;*&lt;/span&gt; n &lt;span class="k"&gt;*&lt;/span&gt;/
+    bignum_mul&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;tmp, n, res&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+    /&lt;span class="k"&gt;*&lt;/span&gt; n -&lt;span class="o"&gt;=&lt;/span&gt; 1 &lt;span class="k"&gt;*&lt;/span&gt;/
+    bignum_dec&lt;span class="o"&gt;(&lt;/span&gt;n&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+    
+    /&lt;span class="k"&gt;*&lt;/span&gt; tmp &lt;span class="o"&gt;=&lt;/span&gt; res &lt;span class="k"&gt;*&lt;/span&gt;/
+    bignum_assign&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;tmp, res&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  &lt;span class="o"&gt;}&lt;/span&gt;
+
+  /&lt;span class="k"&gt;*&lt;/span&gt; res &lt;span class="o"&gt;=&lt;/span&gt; tmp &lt;span class="k"&gt;*&lt;/span&gt;/
+  bignum_assign&lt;span class="o"&gt;(&lt;/span&gt;res, &amp;amp;tmp&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="o"&gt;}&lt;/span&gt;
+
+int main&lt;span class="o"&gt;()&lt;/span&gt;
+&lt;span class="o"&gt;{&lt;/span&gt;
+  struct bn num&lt;span class="p"&gt;;&lt;/span&gt;
+  struct bn result&lt;span class="p"&gt;;&lt;/span&gt;
+  char buf[8192]&lt;span class="p"&gt;;&lt;/span&gt;
+
+  klee_make_symbolic&lt;span class="o"&gt;(&lt;/span&gt;buf, sizeof&lt;span class="o"&gt;(&lt;/span&gt;buf&lt;span class="o"&gt;)&lt;/span&gt;, &lt;span class="s2"&gt;"buf"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  klee_assume&lt;span class="o"&gt;(&lt;/span&gt;buf[sizeof&lt;span class="o"&gt;(&lt;/span&gt;buf&lt;span class="o"&gt;)&lt;/span&gt; - 1] &lt;span class="o"&gt;==&lt;/span&gt; 0&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  bignum_from_int&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;num, 100&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  factorial&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;num, &amp;amp;result&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+  bignum_to_string&lt;span class="o"&gt;(&lt;/span&gt;&amp;amp;result, buf, sizeof&lt;span class="o"&gt;(&lt;/span&gt;buf&lt;span class="o"&gt;))&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
+
+  &lt;span class="k"&gt;return &lt;/span&gt;0&lt;span class="p"&gt;;&lt;/span&gt;
+&lt;span class="o"&gt;}&lt;/span&gt;
+
&lt;span class="nt"&gt;--&lt;/span&gt; 
2.17.1

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3- Compile with Clang&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;clang &lt;span class="nt"&gt;-emit-llvm&lt;/span&gt; &lt;span class="nt"&gt;-O0&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; bn.c
&lt;span class="nv"&gt;$ &lt;/span&gt;llvm-dis ./bn.bc
&lt;span class="nv"&gt;$ &lt;/span&gt;vim bn.ll
&lt;span class="nv"&gt;$ &lt;/span&gt;klee bn.bc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4- Crashed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lw2uicq963omvq5076x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lw2uicq963omvq5076x.png" alt="BUG" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5- Details&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;klee@500746a23210:~/tiny-bignum-c&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;klee-out-0/test000001.ptr.err
Error: memory error: out of bound pointer
File: bn.c
Line: 157
assembly.ll line: 521
State: 2
Stack: 
        &lt;span class="c"&gt;#000000521 in bignum_to_string (n=93858042189952, str=93858042462208, nbytes=8192) at bn.c:157&lt;/span&gt;
        &lt;span class="c"&gt;#100002836 in main () at bn.c:703&lt;/span&gt;
Info: 
        address: 93858042470400
        next: object at 22510123060032 of size 1536
                MO40[1536] &lt;span class="o"&gt;(&lt;/span&gt;no allocation info&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>fuzzing</category>
      <category>klee</category>
      <category>security</category>
      <category>vulnerabilities</category>
    </item>
    <item>
      <title>Fuzzer Development With Rust</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Tue, 12 Sep 2023 12:12:19 +0000</pubDate>
      <link>https://dev.to/raminfp/fuzzer-development-with-rust-2eh4</link>
      <guid>https://dev.to/raminfp/fuzzer-development-with-rust-2eh4</guid>
      <description>&lt;h2&gt;
  
  
  Fuzzer Development With Rust (Basic)
&lt;/h2&gt;




&lt;h3&gt;
  
  
  Each researcher needs to be able to develop their own fuzzing tools. For this reason, I have started teaching how to develop fuzzing tools from scratch in this project so that researchers can use their own fuzzer to discover security vulnerabilities of open source tools, libraries and code that companies develop internally.
&lt;/h3&gt;




&lt;h3&gt;
  
  
  In this training, we have explained all the concepts along with examples in the rust programming language so that the desired concepts can be understood correctly.
&lt;/h3&gt;




&lt;h2&gt;
  
  
  &lt;em&gt;Table of Contents&lt;/em&gt;
&lt;/h2&gt;

&lt;h2&gt;
  
  
  Chapter 1. Corpus
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/corpus" rel="noopener noreferrer"&gt;Basic Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/general_corpus" rel="noopener noreferrer"&gt;General Corpus&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/seed_corpus" rel="noopener noreferrer"&gt;Seed Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/targeted_corpus" rel="noopener noreferrer"&gt;Targeted Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/hybrid_corpus" rel="noopener noreferrer"&gt;Hybrid Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/generative_corpus" rel="noopener noreferrer"&gt;Generative Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/in_memory_corpus" rel="noopener noreferrer"&gt;In Memory Corpus&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Corpus/disk_based_corpus" rel="noopener noreferrer"&gt;Disk Based Corpus&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chapter 2. Mutation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/arithmetic_mutate" rel="noopener noreferrer"&gt;Arithmetic Mutate&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/bitmask_mutation" rel="noopener noreferrer"&gt;Bitmask Mutation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/gen_rand_mutation" rel="noopener noreferrer"&gt;Gen rand Mutation&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/gen_rand_mutation_byte" rel="noopener noreferrer"&gt;Gen Rand Mutation Byte&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/mutated_seed_files" rel="noopener noreferrer"&gt;Mutated Seed Files&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Mutation/token_mutation" rel="noopener noreferrer"&gt;Token Mutation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chapter 3. Monitor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/log_fuzzing_events" rel="noopener noreferrer"&gt;Log fuzzing events&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/log_test_cases" rel="noopener noreferrer"&gt;Log test cases&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/panic_crash" rel="noopener noreferrer"&gt;Panic Crash&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/sysinfo_test" rel="noopener noreferrer"&gt;Sysinfo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/track_statistics" rel="noopener noreferrer"&gt;Track statistics&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/use_profiling" rel="noopener noreferrer"&gt;Use profiling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Monitor/sanity_checks" rel="noopener noreferrer"&gt;Sanity Checks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chapter 4. Coverage
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/basic_feedback_driven" rel="noopener noreferrer"&gt;Basic Feedback Driven&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/block_coverage" rel="noopener noreferrer"&gt;Block Coverage&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/branch_coverage" rel="noopener noreferrer"&gt;Branch Coverage&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/feedback_driven_fuzzing" rel="noopener noreferrer"&gt;Corpus/Mutate Feedback Driven&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/function_coverage" rel="noopener noreferrer"&gt;Function Coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/loop_coverage" rel="noopener noreferrer"&gt;Loop Coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/path_coverage" rel="noopener noreferrer"&gt;Path Coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/predicate_coverage" rel="noopener noreferrer"&gt;Predicate Coverage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Coverage/statement_coverage" rel="noopener noreferrer"&gt;Statement Coverage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chapter 5. Executor
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Executor/fork-based_fuzzer" rel="noopener noreferrer"&gt;Fork Based Fuzzer&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Executor/target_input" rel="noopener noreferrer"&gt;Target Input&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Executor/wget_fuzzer" rel="noopener noreferrer"&gt;Wget Fuzzer&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Executor/thread_level_parallelism" rel="noopener noreferrer"&gt;Thread-level Parallelism&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust/tree/main/Executor/process_level_parallelism" rel="noopener noreferrer"&gt;Process-level Parallelism&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;&lt;a href="https://github.com/raminfp/fuzzer-development-with-rust" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thanks.&lt;br&gt;
Ramin&lt;/p&gt;

</description>
      <category>fuzzer</category>
      <category>fuzzing</category>
      <category>rust</category>
      <category>security</category>
    </item>
    <item>
      <title>How to fuzz java code with jazzer?</title>
      <dc:creator>Ramin Farajpour Cami</dc:creator>
      <pubDate>Fri, 22 Jul 2022 17:09:00 +0000</pubDate>
      <link>https://dev.to/raminfp/how-to-fuzz-java-code-with-jazzar-2kgi</link>
      <guid>https://dev.to/raminfp/how-to-fuzz-java-code-with-jazzar-2kgi</guid>
      <description>&lt;h3&gt;
  
  
  What is fuzzing?
&lt;/h3&gt;

&lt;p&gt;Modern fuzzing solutions analyze the structure of the code they are testing and generate thousands of automated test cases per second. The process is designed to reach as many new program states as possible with the generated inputs . In addition, the fuzzer also marks the individual paths followed by these inputs and thus receives detailed feedback on the test coverage achieved when executing the source code. In this way, fuzzers learn more about the structure of the expected input with each iteration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Type Of Fuzzing
&lt;/h3&gt;

&lt;p&gt;1- Dumb Fuzzer&lt;br&gt;
2- Generation Fuzzer&lt;br&gt;
3- Coverage Guided Fuzzer&lt;/p&gt;
&lt;h3&gt;
  
  
  What is &lt;code&gt;Dumb Fuzzer&lt;/code&gt; ?
&lt;/h3&gt;

&lt;p&gt;Dumb fuzzer works without having any knowledge about the data attempts to &lt;code&gt;random input&lt;/code&gt;, also no understanding of file format/network protocol is required. also can take lot of time (depending up on your luck).&lt;/p&gt;

&lt;p&gt;Ex &lt;a href="https://gitlab.com/akihe/radamsa" rel="noopener noreferrer"&gt;Radmasa&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What is &lt;code&gt;Generation Fuzzer&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;In contrast to Dumb Fuzzers, here an understanding of the file format / protocol is very important. It’s about “generating” the inputs from the scratch based on the specification/format.&lt;/p&gt;

&lt;p&gt;Ex ( &lt;a href="https://github.com/MozillaSecurity/peach" rel="noopener noreferrer"&gt;Peach&lt;/a&gt;, &lt;a href="https://github.com/OpenRCE/sulley" rel="noopener noreferrer"&gt;Sulley&lt;/a&gt; )&lt;/p&gt;
&lt;h3&gt;
  
  
  What is &lt;code&gt;Coverage Guided Fuzzer&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;Coverage guided fuzzing&lt;/code&gt; uses program instrumentation to trace the code coverage and monitors program flow by using instrumentation. no knowledge of the file format is required and It modifies the file using its own algorithms and check for new code path coverage/crash.&lt;/p&gt;

&lt;p&gt;Ex ( &lt;a href="https://github.com/google/AFL" rel="noopener noreferrer"&gt;AFL&lt;/a&gt;, &lt;a href="https://github.com/googleprojectzero/winafl" rel="noopener noreferrer"&gt;WinAFL&lt;/a&gt;, &lt;a href="https://github.com/google/honggfuzz" rel="noopener noreferrer"&gt;HonggFuzz&lt;/a&gt;, &lt;a href="https://llvm.org/docs/LibFuzzer.html" rel="noopener noreferrer"&gt;LibFuzzer&lt;/a&gt;, &lt;a href="https://github.com/CodeIntelligenceTesting/jazzer" rel="noopener noreferrer"&gt;Jazzer&lt;/a&gt; )&lt;/p&gt;
&lt;h3&gt;
  
  
  What is &lt;code&gt;Jazzer&lt;/code&gt;?
&lt;/h3&gt;

&lt;p&gt;Today, we will dive into the Java world and check out the most popular Java fuzzing solution, Jazzer is used to automatically generate malicious inputs for Java programs.&lt;/p&gt;
&lt;h3&gt;
  
  
  Tools setup :
&lt;/h3&gt;

&lt;p&gt;We will now go through the process of installing Jazzer so you can easily follow along on my VM machine (Ubuntu 20.04).&lt;/p&gt;

&lt;p&gt;Jazzer has the following dependencies when being built from source:&lt;/p&gt;

&lt;p&gt;1- Install Bazel 4 or later&lt;br&gt;
 2- Install JDK 8 or later (e.g. OpenJDK)&lt;br&gt;
 3- Install Clang and LLD 9.0 or later&lt;/p&gt;
&lt;h4&gt;
  
  
  Compilation :
&lt;/h4&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/CodeIntelligenceTesting/jazzer
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;jazzer
&lt;span class="nv"&gt;$ &lt;/span&gt;./bazelisk-linux-amd64 run //:jazzer                                                                                                                                                                                               
Starting &lt;span class="nb"&gt;local &lt;/span&gt;Bazel server and connecting to it...
INFO: Analyzed target //:jazzer &lt;span class="o"&gt;(&lt;/span&gt;79 packages loaded, 1410 targets configured&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
INFO: Found 1 target...
Target //:jazzer up-to-date:
  bazel-bin/jazzer
INFO: Elapsed &lt;span class="nb"&gt;time&lt;/span&gt;: 43.920s, Critical Path: 7.21s
INFO: 83 processes: 4 internal, 79 linux-sandbox.
INFO: Build completed successfully, 83 total actions
INFO: Build completed successfully, 83 total actions
driver/jazzer_driver: error &lt;span class="k"&gt;while &lt;/span&gt;loading shared libraries: libjvm.so: cannot open shared object file: No such file or directory

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;We have a error &lt;br&gt;
&lt;code&gt;libjvm.so: cannot open shared object file: No such file or directory&lt;/code&gt; &lt;br&gt;
If you have this error for solution we should define &lt;code&gt;LD_LIBRARY_PATH&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://enos.itcollege.ee/~jpoial/allalaadimised/jdk15/jdk-15.0.2_linux-x64_bin.tar.gz

&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$LD_LIBRARY_PATH&lt;/span&gt;:/home/ubuntu/jdk-15.0.2/lib/server/

&lt;span class="nv"&gt;$ &lt;/span&gt;./bazelisk-linux-amd64 run //:jazzer  
INFO: Analyzed target //:jazzer &lt;span class="o"&gt;(&lt;/span&gt;0 packages loaded, 0 targets configured&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
INFO: Found 1 target...
Target //:jazzer up-to-date:
  bazel-bin/jazzer
INFO: Elapsed &lt;span class="nb"&gt;time&lt;/span&gt;: 0.205s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
Java HotSpot&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; 64-Bit Server VM warning: Sharing is only supported &lt;span class="k"&gt;for &lt;/span&gt;boot loader classes because bootstrap classpath has been appended
INFO: Loaded 8 hooks from com.code_intelligence.jazzer.sanitizers.Deserialization
INFO: Loaded 1 hooks from com.code_intelligence.jazzer.sanitizers.ReflectiveCall
Missing argument &lt;span class="nt"&gt;--target_class&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;fuzz_target_class&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Choose your java lib or code for fuzzing (Ex : &lt;a href="https://github.com/mifmif/Generex" rel="noopener noreferrer"&gt;generex&lt;/a&gt;)
&lt;/h3&gt;

&lt;p&gt;1- Add &lt;code&gt;"com.github.mifmif:generex:1.0.2"&lt;/code&gt; lib to &lt;code&gt;nano maven.bzl&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;
&lt;span class="n"&gt;load&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"@rules_jvm_external//:specs.bzl"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"maven"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;

&lt;span class="no"&gt;JAZZER_API_VERSION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"0.10.0"&lt;/span&gt;
&lt;span class="no"&gt;JAZZER_API_COORDINATES&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"com.code-intelligence:jazzer-api:%s"&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="no"&gt;JAZZER_API_VERSION&lt;/span&gt;

&lt;span class="err"&gt;#&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="no"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;**:&lt;/span&gt; &lt;span class="nc"&gt;These&lt;/span&gt; &lt;span class="nc"&gt;Maven&lt;/span&gt; &lt;span class="n"&gt;dependencies&lt;/span&gt; &lt;span class="n"&gt;have&lt;/span&gt; &lt;span class="n"&gt;known&lt;/span&gt; &lt;span class="n"&gt;vulnerabilities&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;are&lt;/span&gt; &lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="n"&gt;used&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="n"&gt;that&lt;/span&gt;
&lt;span class="err"&gt;#&lt;/span&gt;              &lt;span class="nc"&gt;Jazzer&lt;/span&gt; &lt;span class="n"&gt;finds&lt;/span&gt; &lt;span class="n"&gt;these&lt;/span&gt; &lt;span class="n"&gt;issues&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="no"&gt;DO&lt;/span&gt; &lt;span class="no"&gt;NOT&lt;/span&gt; &lt;span class="no"&gt;USE&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="no"&gt;MAVEN_ARTIFACTS&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
    &lt;span class="s"&gt;"junit:junit:4.12"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"org.apache.commons:commons-imaging:1.0-alpha2"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.mikesamuel:json-sanitizer:1.2.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.google.code.gson:gson:2.8.6"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.fasterxml.jackson.core:jackson-core:2.12.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.fasterxml.jackson.core:jackson-databind:2.12.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.12.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.alibaba:fastjson:1.2.75"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"com.beust:klaxon:5.5"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"javax.validation:validation-api:2.0.1.Final"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"javax.xml.bind:jaxb-api:2.3.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"javax.el:javax.el-api:3.0.1-b06"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="s"&gt;"org.hibernate:hibernate-validator:5.2.4.Final"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

    &lt;span class="s"&gt;"com.github.mifmif:generex:1.0.2"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;

    &lt;span class="n"&gt;maven&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.apache.logging.log4j"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"log4j-api"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"2.14.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;testonly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;True&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;
    &lt;span class="n"&gt;maven&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;artifact&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"org.apache.logging.log4j"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"log4j-core"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"2.14.1"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;testonly&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;True&lt;/span&gt;&lt;span class="o"&gt;),&lt;/span&gt;

&lt;span class="o"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2- Editing &lt;code&gt;$ nano examples/BUILD.bazel&lt;/code&gt; to this :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="n"&gt;java_fuzz_target_test&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"GenerexFuzzer"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;srcs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s"&gt;"src/main/java/com/example/GenerexFuzzer.java"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;target_class&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"com.example.GenerexFuzzer"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;deps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;
        &lt;span class="s"&gt;"@maven//:com_github_mifmif_generex"&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;],&lt;/span&gt;
&lt;span class="o"&gt;)&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3- Create java file for fuzzing &lt;code&gt;GenerexFuzzer.java&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;nano /home/jazzer/examples/src/main/java/com/example/GenerexFuzzer.java
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add my code for fuzzing by Jazzer&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kn"&gt;package&lt;/span&gt; &lt;span class="nn"&gt;com.example&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.code_intelligence.jazzer.api.FuzzedDataProvider&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;com.mifmif.common.regex.Generex&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Found the issues.&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;GenerexFuzzer&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;fuzzerTestOneInput&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;FuzzedDataProvider&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Generex&lt;/span&gt; &lt;span class="n"&gt;generex&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Generex&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;consumeRemainingAsString&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;generex&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;random&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;IllegalArgumentException&lt;/span&gt; &lt;span class="n"&gt;ignored&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4- Now starting for fuzzing :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;./bazelisk-linux-amd64 run //examples:GenerexFuzzer
INFO: Analyzed target //examples:GenerexFuzzer &lt;span class="o"&gt;(&lt;/span&gt;0 packages loaded, 0 targets configured&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
INFO: Found 1 target...
Target //examples:GenerexFuzzer up-to-date:
  bazel-bin/examples/GenerexFuzzer
INFO: Elapsed &lt;span class="nb"&gt;time&lt;/span&gt;: 0.121s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
INFO: Build completed successfully, 1 total action
&lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PAGER&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="p"&gt;/usr/bin/less&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$0&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1
Executing tests from //examples:GenerexFuzzer
&lt;span class="nt"&gt;-----------------------------------------------------------------------------&lt;/span&gt;
Java HotSpot&lt;span class="o"&gt;(&lt;/span&gt;TM&lt;span class="o"&gt;)&lt;/span&gt; 64-Bit Server VM warning: Sharing is only supported &lt;span class="k"&gt;for &lt;/span&gt;boot loader classes because bootstrap classpath has been appended
INFO: Loaded 8 hooks from com.code_intelligence.jazzer.sanitizers.Deserialization
INFO: Loaded 1 hooks from com.code_intelligence.jazzer.sanitizers.ReflectiveCall
INFO: Loaded 8649 no-throw method signatures
INFO: Instrumented com.example.GenerexFuzzer &lt;span class="o"&gt;(&lt;/span&gt;took 42 ms, size +37%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: libFuzzer ignores flags that start with &lt;span class="s1"&gt;'--'&lt;/span&gt;
INFO: Running with entropic power schedule &lt;span class="o"&gt;(&lt;/span&gt;0xFF, 100&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt;
INFO: Seed: 2735196724
INFO: Loaded 1 modules   &lt;span class="o"&gt;(&lt;/span&gt;512 inline 8-bit counters&lt;span class="o"&gt;)&lt;/span&gt;: 512 &lt;span class="o"&gt;[&lt;/span&gt;0x7fcec02c9010, 0x7fcec02c9210&lt;span class="o"&gt;)&lt;/span&gt;, 
INFO: Loaded 1 PC tables &lt;span class="o"&gt;(&lt;/span&gt;512 PCs&lt;span class="o"&gt;)&lt;/span&gt;: 512 &lt;span class="o"&gt;[&lt;/span&gt;0x7fce8abfe010,0x7fce8ac00010&lt;span class="o"&gt;)&lt;/span&gt;, 
INFO: &lt;span class="nt"&gt;-max_len&lt;/span&gt; is not provided&lt;span class="p"&gt;;&lt;/span&gt; libFuzzer will not generate inputs larger than 4096 bytes
INFO: Instrumented com.mifmif.common.regex.Generex &lt;span class="o"&gt;(&lt;/span&gt;took 16 ms, size +49%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented com.mifmif.common.regex.util.Iterable &lt;span class="o"&gt;(&lt;/span&gt;took 1 ms, size +0%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented com.mifmif.common.regex.util.Iterator &lt;span class="o"&gt;(&lt;/span&gt;took 0 ms, size +0%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: New number of inline 8-bit counters: 1024
INFO: Instrumented dk.brics.automaton.RegExp &lt;span class="o"&gt;(&lt;/span&gt;took 17 ms, size +104%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.RegExp&lt;span class="nv"&gt;$Kind&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;took 2 ms, size +42%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.RegExp&lt;span class="nv"&gt;$1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;took 1 ms, size +102%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.BasicAutomata &lt;span class="o"&gt;(&lt;/span&gt;took 11 ms, size +130%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: New number of inline 8-bit counters: 2048
INFO: Instrumented dk.brics.automaton.Automaton &lt;span class="o"&gt;(&lt;/span&gt;took 9 ms, size +82%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.State &lt;span class="o"&gt;(&lt;/span&gt;took 2 ms, size +55%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.Transition &lt;span class="o"&gt;(&lt;/span&gt;took 2 ms, size +74%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: Instrumented dk.brics.automaton.TransitionComparator &lt;span class="o"&gt;(&lt;/span&gt;took 1 ms, size +97%&lt;span class="o"&gt;)&lt;/span&gt;
INFO: A corpus is not provided, starting from an empty corpus
&lt;span class="c"&gt;#2      INITED cov: 71 ft: 71 corp: 1/1b exec/s: 0 rss: 114Mb&lt;/span&gt;
&lt;span class="c"&gt;#3      NEW    cov: 176 ft: 191 corp: 2/3b lim: 4 exec/s: 0 rss: 114Mb L: 2/2 MS: 1 CopyPart-&lt;/span&gt;
&lt;span class="c"&gt;#5      NEW    cov: 178 ft: 286 corp: 3/6b lim: 4 exec/s: 0 rss: 114Mb L: 3/3 MS: 2 ChangeByte-InsertByte-&lt;/span&gt;
&lt;span class="c"&gt;#10     NEW    cov: 178 ft: 378 corp: 4/10b lim: 4 exec/s: 0 rss: 114Mb L: 4/4 MS: 5 InsertByte-ChangeBit-ChangeBinInt-InsertByte-CopyPart-&lt;/span&gt;
&lt;span class="c"&gt;#21     NEW    cov: 181 ft: 384 corp: 5/13b lim: 4 exec/s: 0 rss: 114Mb L: 3/4 MS: 1 ChangeBit-&lt;/span&gt;
&lt;span class="c"&gt;#6375   NEW    cov: 975 ft: 4248 corp: 243/1071b lim: 8 exec/s: 6375 rss: 154Mb L: 7/8 MS: 1 CrossOver-&lt;/span&gt;
&lt;span class="c"&gt;#6391   NEW    cov: 975 ft: 4250 corp: 244/1079b lim: 8 exec/s: 6391 rss: 154Mb L: 8/8 MS: 1 CopyPart-&lt;/span&gt;

&lt;span class="o"&gt;==&lt;/span&gt; Java Exception: com.code_intelligence.jazzer.api.FuzzerSecurityIssueLow: Stack overflow &lt;span class="o"&gt;(&lt;/span&gt;truncated to likely cause&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
Caused by: java.lang.StackOverflowError
        at java.base/java.util.TimSort.countRunAndMakeAscending&lt;span class="o"&gt;(&lt;/span&gt;TimSort.java:355&lt;span class="o"&gt;)&lt;/span&gt;
        at java.base/java.util.TimSort.sort&lt;span class="o"&gt;(&lt;/span&gt;TimSort.java:220&lt;span class="o"&gt;)&lt;/span&gt;
        at java.base/java.util.Arrays.sort&lt;span class="o"&gt;(&lt;/span&gt;Arrays.java:1232&lt;span class="o"&gt;)&lt;/span&gt;
        at dk.brics.automaton.State.getSortedTransitionArray&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;
        at dk.brics.automaton.State.getSortedTransitions&lt;span class="o"&gt;(&lt;/span&gt;Unknown Source&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:340&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
        at com.mifmif.common.regex.Generex.prepareRandom&lt;span class="o"&gt;(&lt;/span&gt;Generex.java:366&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;LibFuzzer crashing input :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;MS: 2 ChangeBit-CMP- DE: &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="s2"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="s2"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="s2"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="s2"&gt;05"&lt;/span&gt;-&lt;span class="p"&gt;;&lt;/span&gt; base unit: b5d43fd7e3064418d903c4d27d2238f390e23c62
0x7e,0x2f,0x7d,0x0,0x0,0x0,0x5,
~/&lt;span class="o"&gt;}&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;00&lt;span class="se"&gt;\x&lt;/span&gt;00&lt;span class="se"&gt;\x&lt;/span&gt;00&lt;span class="se"&gt;\x&lt;/span&gt;05
&lt;span class="nv"&gt;artifact_prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'/root/.cache/bazel/_bazel_root/c82b104c68f93e19e57160becd18f8f0/execroot/jazzer/bazel-out/k8-opt/testlogs/examples/GenerexFuzzer/test.outputs/'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; Test unit written to /root/.cache/bazel/_bazel_root/c82b104c68f93e19e57160becd18f8f0/execroot/jazzer/bazel-out/k8-opt/testlogs/examples/GenerexFuzzer/test.outputs/crash-101076ac3391a62fb4622589093c2543063de037
Base64: &lt;span class="nv"&gt;fi99AAAABQ&lt;/span&gt;&lt;span class="o"&gt;==&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Congratulations! We found &lt;code&gt;Stack overflow&lt;/code&gt; Vulnerability.&lt;/p&gt;

&lt;p&gt;I hope enjoy,&lt;br&gt;
Thanks, Ramin&lt;/p&gt;

</description>
      <category>fuzzing</category>
      <category>security</category>
      <category>java</category>
      <category>jazzer</category>
    </item>
  </channel>
</rss>
