<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Shalom Nyende on Medium]]></title>
        <description><![CDATA[Stories by Shalom Nyende on Medium]]></description>
        <link>https://medium.com/@shalom.nyende?source=rss-2d14fa14879b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*loRcyg9ERKQLoQtO-RZbsw.jpeg</url>
            <title>Stories by Shalom Nyende on Medium</title>
            <link>https://medium.com/@shalom.nyende?source=rss-2d14fa14879b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 13:34:44 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@shalom.nyende/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Zero to One in Rust: Ep 2 — rustc, rustup and all their cargo.]]></title>
            <link>https://medium.com/@shalom.nyende/zero-to-one-in-rust-ep-2-rustc-rustup-and-all-their-cargo-12f17f0d5fa6?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/12f17f0d5fa6</guid>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[rustlang]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Sun, 19 Nov 2023 12:05:03 GMT</pubDate>
            <atom:updated>2023-11-19T12:05:03.860Z</atom:updated>
            <content:encoded><![CDATA[<h2>Zero to One in Rust: Ep 2 — rustc, rustup and all their cargo.</h2><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*xb3UpfJyzAU4dSvq" /><figcaption>Photo by <a href="https://unsplash.com/@schaffler?utm_source=medium&amp;utm_medium=referral">michael schaffler</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Hello <em>Rustaceans</em>, welcome to the second episode of this series. In case you missed the first episode, check it <a href="https://medium.com/@shalom.nyende/zero-to-one-in-rust-ep-1-lets-get-rusty-0f6dd2bd512d"><strong><em>here</em></strong></a>.</p><h3>Quick Recap</h3><p>During the last episode, we were able to:</p><blockquote>1. Set up our dev environment (<a href="https://doc.rust-lang.org/cargo/">cargo</a>, rustc).</blockquote><blockquote>2. Write our first Rust <em>hello world</em> program.</blockquote><blockquote>3. Compile and run the program using rustc</blockquote><p>In this episode, we dive into some more detail, where we explore the elements of the Rust Ecosystem.</p><p>Let’s dive right in.</p><h3>The Rust Ecosystem</h3><p>From the previous episode, we interacted with a number of elements in the Rust toolchain, namely rustc, rustup and cargo.</p><h3>rustc</h3><p>At the heart of the Rust ecosystem is rustc, the Rust compiler. It&#39;s responsible for translating Rust code into machine-readable instructions. rustc ensures strong memory safety, preventing common bugs like null pointer dereferencing and data races. It enforces ownership, borrowing, and lifetimes, allowing developers to write efficient, safe, and concurrent code.</p><p>You can directly use rustc to compile Rust programs by invoking it from the command line. For example:</p><pre>➜  ~ rustc your_program.rs</pre><p>The above command compiles the Rust source code in the your_program.rs file into an executable, that you can then run to execute.</p><h3>rustup</h3><p>rustup is Rust’s toolchain manager, allowing easy installation and management of different versions of Rust. It simplifies the process of switching between Rust toolchain channels, i.e stable, beta, and nightly builds. rustup also manages associated tools like cargo, the package manager and build system for Rust.</p><p>rustup is the equivalent of nvm in the NodeJS ecosystem, pyenv + virtualenv in Python, rbenv or rvm in the Ruby world, and gvm from Go-land.</p><p>As mentioned above, there are typically three Rust release channels — stable, beta and nightly. Rust maintains a pretty rapid release cycle — with features being released <strong><em>every six weeks</em></strong> (I am not sure what Rust’s philosophy is on the six weeks release cycle, but I have seen a similar release cycle in <a href="https://basecamp.com/shapeup/0.3-chapter-01#six-week-cycles"><strong><em>Shapeup</em></strong></a>, a technique developed by our good friends over there at <a href="https://basecamp.com/"><strong>Basecamp</strong></a><strong>. </strong>Check it out).</p><ul><li><strong><em>Stable Channel</em></strong>: The stable channel provides a version of Rust that is considered stable for general use. It is recommended for most users, especially those who prioritize stability over having the absolute latest language features. Code written and compiled on the stable channel is expected to have long-term compatibility. This is the default channel, unless you switch to either of the other two channels.</li><li><strong><em>Beta Channel</em></strong>: The beta channel contains versions of Rust that are in the testing phase before being marked as stable. Features and changes that have been stabilized in the nightly channel are usually available in the beta channel for wider testing by developers. This channel allows users to experiment with upcoming features while providing feedback and testing before they become stable.</li><li><strong><em>Nightly Channel</em></strong>: The nightly channel is where the most bleeding-edge features and changes are available. This channel receives updates daily and includes the latest work being done on the Rust compiler and language. It’s primarily used by contributors, early adopters, and those who want to experiment with the newest features. However, code written on the nightly channel might not be stable or fully compatible with future versions.</li></ul><p>To identify which channel/toolchain you are running in, issue:</p><pre>➜  ~ rustup show<br>Default host: x86_64-apple-darwin<br>rustup home:  /Users/shalomz/.rustup<br><br>stable-x86_64-apple-darwin (default)<br>rustc 1.73.0 (cc66ad468 2023-10-03)</pre><p>To switch between the various toolchains, issue:</p><pre>➜  hello_rust git:(main) ✗ rustup default &lt;toolchain&gt;</pre><p>Where toolchain is either stable, nightly, beta or any one of the available toolchains.</p><h3>cargo</h3><p>cargo is Rust&#39;s package manager and build tool. It simplifies the process of creating, building, and managing Rust projects, handling dependencies, and ensuring a consistent and reproducible build environment.</p><p>Rust packages are referred to as crates, and are usually held in <a href="https://crates.io/">https://crates.io</a>.</p><p>cargo is Python’s pip + pypi and NodeJS npm or yarn .</p><p>You can use cargo to build your Rust programs, generate project structure as well as run tests.</p><ul><li>To check what version of cargo you are running on, issue:</li></ul><pre>➜  ~ cargo --version<br><br>cargo 1.73.0 (9c4383fb5 2023-08-26)</pre><h3>Project Setup: hello_rust</h3><p>Time to meet our new cargo managed project: hello_rust.</p><pre>➜  ~ cargo new hello_rust<br><br>Created binary (application) `hello_rust` package<br><br>➜  ls<br><br>hello_rust<br><br>➜  cd hello_rust<br><br>➜  hello_rust git:(main) ✗ ls -al<br>total 16<br>drwxr-xr-x  6 shalomz  staff  192 Nov 19 12:55 .<br>drwxr-xr-x  3 shalomz  staff   96 Nov 19 12:55 ..<br>drwxr-xr-x  9 shalomz  staff  288 Nov 19 12:55 .git<br>-rw-r--r--  1 shalomz  staff    8 Nov 19 12:55 .gitignore<br>-rw-r--r--  1 shalomz  staff  179 Nov 19 12:55 Cargo.toml<br>drwxr-xr-x  3 shalomz  staff   96 Nov 19 12:55 src<br></pre><h4>So, what just happened?</h4><p>Well, we just instantiated our first project — hello_rust. By issuing cargo new hello_rust, the following happened:</p><ol><li>Created a new project and folder named hello_rust</li><li>Created four items inside the hello_rust folder:</li></ol><ul><li>.git (folder)</li><li>.gitignore (file)</li><li>Cargo.toml (file</li><li>src (folder)</li></ul><p>Obviously, .git and .gitignore are concerned with Version Control. That is outside the scope of this series, so we move our focus to the other two: Cargo.toml and the src folder.</p><pre>➜  hello_rust git:(main) ✗ cat Cargo.toml<br>[package]<br>name = &quot;hello_rust&quot;<br>version = &quot;0.1.0&quot;<br>edition = &quot;2021&quot;<br><br># See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html<br><br>[dependencies]</pre><h4>Anatomy of Cargo.toml</h4><p>The [package] section basically indicates that it wields information as pertaining to the configuration of our package.</p><p><strong><em>name:</em></strong> is the name of our program — hello_rust</p><p><strong><em>version:</em></strong> is its version — 0.1.0</p><p><strong><em>edition:</em></strong> indicates which <a href="https://doc.rust-lang.org/book/appendix-05-editions.html">edition</a> the Rust compiler should use for our code. As at the time of writing, there are three Rust editions — Rust 2015, Rust 2018 and Rust 2021. We are using Rust 2021 for our project.</p><p>The [dependencies] section indicates the packages (crates, in Rustland) that our project needs to run. Since we do not need any at the moment, it is empty for now.</p><h4>Into the source: Exploring src</h4><p>Navigating into the src folder, we can see one file: main.rs</p><pre>➜  hello_rust git:(main) ✗ cd src<br>➜  src git:(main) ✗ ls<br>main.rs</pre><p>Let’s explore the contents of the Rust program main.rs:</p><pre>➜  src git:(main) ✗ cat main.rs<br><br>fn main() {<br>    println!(&quot;Hello, world!&quot;);<br>}</pre><p>Remember our first Rust program in Episode 1? See anything similar?</p><h4>Building with cargo</h4><p>We built and ran our first program using rustc. In this episode, we are going to explore building and running with cargo instead.</p><p>For cargo to build and run our programs, we should always ensure they are within the src folder.</p><p>From within our hello_rust folder, run cargo build:</p><pre>➜  src git:(main) ✗ cd ..<br><br>➜  hello_rust git:(main) ✗ pwd<br><br>/Users/shalomz/Projects/rs/hello_rust<br><br>➜  hello_rust git:(main) ✗ cargo build<br>   Compiling hello_rust v0.1.0 (/Users/shalomz/Projects/rs/hello_rust)<br>    Finished dev [unoptimized + debuginfo] target(s) in 7.65s</pre><h4>What happened?</h4><ol><li>Running cargo build generates two additional items:</li></ol><ul><li>Cargo.lock (file. This file keeps track of the exact versions of dependencies within our project. Automatically managed by cargo)</li><li>target (folder)</li></ul><p>The target folder contains:</p><ul><li>CACHEDIR.TAG (file)</li><li>debug (folder)</li></ul><p>Running cargo build uses the debug profile by default, and hence our generated binary will be found inside the debug folder.</p><pre>➜  hello_rust git:(main) ✗ ls<br>Cargo.lock Cargo.toml src        target<br><br>➜  hello_rust git:(main) ✗ cd target<br><br>➜  target git:(main) ✗ ls<br>CACHEDIR.TAG debug<br><br><br>➜  target git:(main) ✗ cd debug<br><br>➜  debug git:(main) ✗ ls -al<br>total 912<br>drwxr-xr-x  10 shalomz  staff     320 Nov 19 13:55 .<br>drwxr-xr-x@  5 shalomz  staff     160 Nov 19 13:55 ..<br>-rw-r--r--   1 shalomz  staff       0 Nov 19 13:55 .cargo-lock<br>drwxr-xr-x   3 shalomz  staff      96 Nov 19 13:55 .fingerprint<br>drwxr-xr-x   2 shalomz  staff      64 Nov 19 13:55 build<br>drwxr-xr-x  10 shalomz  staff     320 Nov 19 13:55 deps<br>drwxr-xr-x   2 shalomz  staff      64 Nov 19 13:55 examples<br>-rwxr-xr-x   1 shalomz  staff  462632 Nov 19 13:55 hello_rust<br>-rw-r--r--   1 shalomz  staff     113 Nov 19 13:55 hello_rust.d</pre><p>Our interest should be drawn to the hello_rust executable that we can then run like this:</p><pre>➜  debug git:(main) ✗ ./hello_rust<br>Hello, world!</pre><p>Apparently, building and running our programs this way is not ideal — we can use cargo runto improve this.</p><p>From within the hello_rust folder, issue cargo run:</p><pre>➜  hello_rust git:(main) ✗ cargo run<br>    Finished dev [unoptimized + debuginfo] target(s) in 0.08s<br>     Running `target/debug/hello_rust`<br>Hello, world!</pre><p>cargo run builds the program then runs it. Easy, right?</p><blockquote>To build with the release profile, explore cargo build --release.</blockquote><h4>Wrapping Up</h4><p>In this episode, we have explored rustc, rustup and cargo.</p><p>We have seen how each one is useful to us in building and compiling our Rust programs.</p><p>Furthermore, we have been drawn to:</p><ul><li>Rust channels and release cycles.</li><li>How to set up projects using cargo new.</li><li>General anatomy of Cargo.toml files.</li><li>Build projects using cargo build</li><li>Run our Rust projects in one go with cargo run</li></ul><p>See you in the next one. Stay Rusty!</p><blockquote>The question of whether computers can think is like the question of whether submarines can swim. — Edsger Dijkstra</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=12f17f0d5fa6" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zero to One in Rust — Ep. 1: Let’s Get Rusty]]></title>
            <link>https://medium.com/@shalom.nyende/zero-to-one-in-rust-ep-1-lets-get-rusty-0f6dd2bd512d?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/0f6dd2bd512d</guid>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[rustlang]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Tue, 17 Oct 2023 22:58:54 GMT</pubDate>
            <atom:updated>2023-10-17T22:58:54.071Z</atom:updated>
            <content:encoded><![CDATA[<h3>Zero to One in Rust — Ep. 1: Let’s Get Rusty</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*Q2IGM-XV3piM6gu_" /><figcaption>Photo by <a href="https://unsplash.com/@jack_1?utm_source=medium&amp;utm_medium=referral">Rémi Jacquaint</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>As at the time of publishing, Rust has been voted as the most loved Programming Language on StackOverflow for 8 years in a row.</p><p>Rust is a promise of robust and efficient code. It’s a language designed for the modern world, addressing the ever-present challenges of software development. But, like any journey, it starts with a single step. Allow me to walk with you in this journey.</p><p>This episode will introduce you to Rust, why you should care about Rust as well as how to set up your environment and write your first <em>“hello world”</em>.</p><p>The aim is to be concise, and that’s exactly how we shall do this.</p><h3>Why Rust?</h3><p>In the rapidly evolving landscape of programming languages, Rust stands out for a multitude of reasons. Here are a few:</p><ul><li><strong><em>Memory Safety</em></strong>: Rust was built from the ground up to provide robust memory safety. It practically eliminates null pointer dereferencing, data races, and other common sources of crashes and vulnerabilities. When you write Rust, you can trust your code to be safe.</li><li><strong><em>Performance</em></strong>: Rust’s zero-cost abstractions and fine-grained control over system resources make it a top choice for systems programming, embedded systems, and high-performance applications. You don’t have to choose between safety and performance; Rust offers both.</li><li><strong><em>Concurrency</em></strong>: Rust’s ownership and borrowing system allows for safe and efficient concurrency without the usual pitfalls of race conditions and data races. You can write concurrent code with confidence.</li><li><strong><em>Community and Ecosystem</em></strong>: The Rust community is vibrant and welcoming. You’ll find a rich ecosystem of libraries and tools, all backed by a community committed to open-source collaboration and quality.</li></ul><h3>Setting Up Your Environment</h3><h4>Install Rust</h4><p>For *Nix users, it is recommended to install Rust usingrustup.</p><p>On your terminal, run:</p><pre>curl --proto &#39;=https&#39; --tlsv1.2 -sSf https://sh.rustup.rs | sh</pre><p>The current version of Rust as at the time of publishing is1.73.0 and that’s what we install. If you already installed Rust before, update it by running:</p><pre>rustup update</pre><p>For Windows users, please refer <a href="https://forge.rust-lang.org/infra/other-installation-methods.html"><strong><em>here</em></strong></a>.</p><h4>Meet Cargo</h4><p>The rustup installation comes with cargo, Rust’s build tool and package manager. For those coming in from the JS world, cargo is like yarn or npm.</p><p>In summary, we use cargo to build our Rust code and dependencies. More on cargo in the next episodes.</p><p>To ensure you have cargo installed, run:</p><pre>$ cargo --version<br> <br>cargo 1.73.0 (9c4383fb5 2023-08-26)</pre><h3>Hello World</h3><p>To ensure our toolchain is all tied together, we are going to write our first line of code: the <em>hello world.</em></p><p>First, let’s make sure we have installed Rust properly:</p><pre>$ rustc --version<br><br> rustc 1.73.0 (cc66ad468 2023-10-03)</pre><h4>Setup Project Structure</h4><p>Let’s begin by setting up a directory to hold our code:</p><pre>mkdir ~/zero-to-one-rust<br><br>cd ~/zero-to-one-rust<br><br>mkdir ep1<br><br>cd ep1</pre><p>Inside the directory, let’s create our first Rust file, main.rs</p><pre>touch main.rs</pre><p>Inside it, let’s add our code:</p><pre>fn main(){<br>  println!(&quot;Hello, world&quot;);<br>}</pre><h4>Compiling &amp; Running</h4><p>To run the code, you have to first compile it.</p><pre>$ rustc main.rs<br>$ ./main<br><br>Hello, world</pre><h4>Conclusion</h4><p>To keep things short and sweet, let’s wrap up Episode 1 here. Over the next few episodes, we shall explore the anatomy of Rust functions, syntax and concepts in Rust.</p><p>Until next time, stay Rusty.</p><blockquote>If we forget, we’ll waste memory. If we do it too early, we’ll have an invalid variable. If we do it twice, that’s a bug too — Steve Klabnik</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0f6dd2bd512d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Zero to One in Rust — Overview]]></title>
            <link>https://medium.com/@shalom.nyende/zero-to-one-in-rust-overview-df135771a1dc?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/df135771a1dc</guid>
            <category><![CDATA[rust]]></category>
            <category><![CDATA[rustlang]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Sat, 14 Oct 2023 10:23:39 GMT</pubDate>
            <atom:updated>2023-10-14T10:23:39.280Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Cih1x8cHv41i_mAFrMrHaA@2x.jpeg" /><figcaption>Photo by Thomas Tastet on Unsplash</figcaption></figure><h3>A workman is as good as his tools</h3><p>Programming languages are just but tools. You can solve a myriad of problems using most of the available programming languages.</p><p>Each language thrives in different areas and struggles in others. It all boils down to a workman knowing his tools and which ones to use for which job.</p><p>As such, here is my own extension of the saying:</p><blockquote>A workman is as good as his tools, and his ability to correctly identify which one to use for the different problems at hand.</blockquote><h3>Rust</h3><p>Those who have known me for a while can attest to the fact that I am a huge Python fan. I have utilized (and still continue to utilize) Python to solve lots of problems around me on a daily basis. Matter of fact, I actually contribute to the python open source community once in a while.</p><p>So, why Rust?</p><p>I do not wish to be embroiled in Programming Language fights (hey GoLang friends, I see you! ) so I will rest the case with one statement: Rust is yet another programming language that you can use to solve your problems. It is not a silver bullet — none is, so contextualize your problem before jumping to use Rust, or any other language in earnest.</p><p>This will be a 7 part series that I will share to mirror my journey from zero to one in Rust.</p><p>I hope to provide a step by step guide on mastering the Rust fundamentals that can be used as a launching pad for engineers looking to take off in their Rustlang journeys.</p><p>Feel free to follow me to get notified as soon as I post.</p><blockquote>In other news: are you looking for a space to work from, for those days when your home office just doesn’t cut it? Or are you a startup with no designated office spaces yet? Well, <a href="https://launchpadke.com/">Launchpad</a> by Impact Africa Network is exactly what you need. Check them out! The address is 29 Westlands Avenue, Nairobi, KE.</blockquote><p>See you in the series.</p><p>Let’s get Rusty. Over and out.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=df135771a1dc" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Art of Problem Solving]]></title>
            <link>https://medium.com/@shalom.nyende/the-art-of-problem-solving-ffc1d5dc986c?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/ffc1d5dc986c</guid>
            <category><![CDATA[code]]></category>
            <category><![CDATA[algorithms]]></category>
            <category><![CDATA[python]]></category>
            <category><![CDATA[problem-solving]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Sat, 24 Jun 2023 15:43:30 GMT</pubDate>
            <atom:updated>2023-06-24T15:43:30.915Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*9Rp9NXs1Uvs_Dgh2" /><figcaption>Photo by <a href="https://unsplash.com/@lunarts?utm_source=medium&amp;utm_medium=referral">Volodymyr Hryshchenko</a> on <a href="https://unsplash.com/?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><pre>Given a time series of the price of a stock ticker symbol at millisecond granularity e.g. [12, 23, 34, 55, 2, 51]<br>Objective:<br>Find the best time to buy and sell, given the time series, and the maximum profit<br>Assumptions:<br>1. You may only buy and sell at most once<br>2. You may only sell after you buy<br>Return a tuple of the best time to buy, the best time to sell as well as the maximum profit<br><br>Test Cases:<br>[12, 23, 34, 55, 2, 51] should return (4, 5, 49)</pre><p><em>Hey engineers, does the above excerpt sound familiar? I bet it does!</em></p><p>In the course of human existence, problems do arise as an inseparable part of our life’s rich tapestry. A complex equation here, an intricate puzzle there, or a difficult situation here— we have all faced challenging situations in our day to days. I have learned to take problems head-on and use them as opportunities for growth.</p><p>As a software engineer, you are always faced with technical problems — be it in interviews or at work.</p><p>Consider the above problem: <strong><em>finding the best time to buy and sell assets given a time series of the price of a stock ticker symbol.</em></strong></p><p>Simple problem, right?</p><h3>The Approach</h3><p>Just by reading through the problem statement, you may instantly begin to develop probable paths of action to solve this problem.</p><p>I have, over time, learned that despite the constant urge to instantly dive into start writing the code, this may not be the best approach.</p><blockquote><strong>Disclaimer</strong>: I don’t claim to have invented the techniques highlighted below. My intention is to tell you how I approach (most) problems and what has worked for me so far😜</blockquote><p>In summary, I have come to resort to the following approach:</p><ol><li><strong>Understand</strong> the problem and state it clearly.</li><li>Establish the <strong>Inputs and Outputs</strong>. Look through the provided inputs and outputs. Make sure they align with the problem statement.</li><li><strong>Edge cases</strong>. Be sure to add test cases for inputs that should capture the edge cases.</li><li><strong>Algorithm</strong> — Establish a solution for the problem statement in (1) above in English. Focus on correctness first</li><li><strong>Code</strong> — Implement the solution and feed it with the test inputs and edge cases. Capture and fix bugs if any.</li><li><strong>Analysis</strong> <strong>and</strong> <strong>Optimization</strong>— How efficient is the algorithm? How do we optimize its performance?</li></ol><h4>1. Understand The Problem</h4><p>We first need to understand the problem at hand and clearly at that. More often than not, it helps to express the problem in our own words.</p><blockquote>A problem well stated is a problem half solved.</blockquote><blockquote>— John Dewey</blockquote><p>Here, we also need to define the function signature. The body of the function will be empty to start with (unless you have been provided with a function signature as part of the problem).</p><p>The function name should be descriptive of the purpose of the function.</p><p>For instance:</p><pre>def find_best_buy_sell_time(): # Empty for now<br>    ...</pre><p>We obtain the parameters for this function (a listof prices — price_list) and the expected return value (a tupleof the best buy time, best sell time, and max profit) from the problem statement:</p><pre>from typing import List, Tuple<br><br>def find_best_buy_sell_time(price_list: List[int]) -&gt; Tuple[int, int, int]:<br>    &quot;&quot;&quot;<br>    Given a python list representing a time series of the price of a stock ticker symbol at millisecond granularity, find the best time to buy and sell and the maximum profit.<br>    Rules:<br>    1. You can only buy and sell at most once<br>    2. You may only sell after you buy<br>    3. The buying price does not necessarily have to be the minimum in the list. You should make some profit<br><br>    Args:<br>        price_list (List[int]): The price list<br><br>    Returns:<br>        Tuple[int, int, int]: The tuple containing the best time to buy, the best time to sell and the maximum profit<br>    &quot;&quot;&quot;<br>    ...</pre><h4>2. Establish Inputs and Outputs</h4><p>We then proceed to retrieve the provided inputs and expected outputs from the problem statement, if any.</p><p>In addition to this, we should define additional inputs and expected outputs for cases not covered by the provided test cases. <strong><em>There are always edge cases</em></strong>, and we should always strive to provide solutions that cover all the bases. Murphy’s law applies here folks.</p><blockquote>Anything that can go wrong will go wrong.</blockquote><p>It is recommended to do this at this moment since by now, you do have a clear understanding of the problem and can define what outputs should be expected given a set of inputs. This makes it easier to identify the edge cases beforehand.</p><p>You could define the input and output test cases in a list of dictionary scenarios to ensure visibility:</p><pre>from typing import List, Tuple<br><br>def find_best_buy_sell_time(price_list: List[int]) -&gt; Tuple[int, int, int]:<br>    &quot;&quot;&quot;<br>    Given a python list representing a time series of the price of a stock ticker symbol at millisecond granularity, find the best time to buy and sell and the maximum profit.<br>    Rules:<br>    1. You can only buy and sell at most once<br>    2. You may only sell after you buy<br>    3. The buying price does not necessarily have to be the minimum in the list. You should make some profit<br><br>    Args:<br>        price_list (List[int]): The price list<br><br>    Returns:<br>        Tuple[int, int, int]: The tuple containing the best time to buy, the best time to sell and the maximum profit<br>    &quot;&quot;&quot;<br>    ...<br><br><br>tests = []<br>test = {<br>    &#39;input&#39;: [12, 23, 34, 55, 2, 51],<br>    &#39;output&#39;: (4, 5, 49)<br>}<br>tests.append(test) # Append other tests here. Summarized for brevity.<br># You will then proceed to run the test cases into your function </pre><h4>3. Identify Edge Cases</h4><p>We then proceed to define test cases for the edge cases.</p><p><strong><em>PS: It is NOT MANDATORY to always exhaustively identify ALL the edge cases at the first run. You can always revisit this step and add more edge cases.</em></strong></p><p>We need a clear understanding of the programming language and its data structures since that knowledge helps us pre-empt some common errors, for example, in Python, whenever we are dealing with alist or a dictionary we need to ensure we take care of common exceptions such as <a href="https://docs.python.org/3/library/exceptions.html#IndexError">IndexError</a>, <a href="https://docs.python.org/3/library/exceptions.html#ValueError">ValueError</a>, etc.</p><p>Some edge cases could include:</p><p><em>i. The </em><em>price_list list may be empty.</em></p><p><em>ii. The </em><em>price_list may contain values with no combination that results in a profit.</em></p><p><em>iii. Sometimes, there may be scenarios whereby the buying price does not necessarily have to be the minimum in the </em><em>price_list list.</em></p><p>We append the edge case scenarios to the tests list.</p><h4>4. Write the Algorithm (Plain English)</h4><p>Since this is the first iteration, we are aiming for <strong><em>correctness</em></strong> — meaning that our proposed solution, given the defined scenarios and tests, should solve the problem without fail. Our proposed solution should just <strong><em>work. We can focus on fine-tuning it for efficiency later.</em></strong></p><p>Here, we think of the simplest and most obvious solution:</p><ol><li>Initialize max_profit, buy_timeand sell_timeat 0. Initialize an emptyprofits dictionary</li><li>Iterate over the elements of the price_list list</li><li>For each element, capture the profit of buying that element and selling the other elements and store that in the profits dictionary</li><li>At the end of the iteration, find the key with the highest profit value from the profits` dictionary and return its associated buying_time, selling_time, and max_profit.</li></ol><p>Writing down the algorithm in plain English helps us to think clearly about all the factors in question. As such, the clearer we piece down our thoughts here, the easier it then becomes for us to churn out the associated code.</p><h4>5. Code</h4><p>For those of us who have been itching to write some code, now is the time.</p><p>Here, we should proceed to implement our solution by filling in the function skeleton we defined in step (1) above:</p><pre>def find_best_buy_sell_time(price_list: List[int]) -&gt; Tuple[int, int, int]:<br>    &quot;&quot;&quot;<br>    Given a python list representing a time series of the price of a stock ticker symbol at millisecond granularity, find the best time to buy and sell and the maximum profit.<br>    Rules:<br>    1. You can only buy and sell at most once<br>    2. You may only sell after you buy<br>    3. The buying price does not necessarily have to be the minimum in the list. You should make some profit<br><br>    Args:<br>        price_list (List[int]): The price list<br><br>    Returns:<br>        Tuple[int, int, int]: The tuple containing the best time to buy, the best time to sell and the maximum profit<br>    &quot;&quot;&quot;<br>    profits: Dict[<br>        int, Dict[int, int]<br>    ] = {}  # Dictionary to store all possible profits for each buying and selling pair<br>    <br>    # breakpoint() Start debugger<br>    for i in range(len(price_list)):<br>        buy_price: int = price_list[i]<br>        profits[<br>            i<br>        ] = (<br>            {}<br>        )  # Create a nested dictionary to store profits for the current buying time<br><br>        for j in range(i + 1, len(price_list)):<br>            sell_price: int = price_list[j]<br>            profit: int = sell_price - buy_price<br><br>            if profit &gt; 0:<br>                profits[i][j] = profit  # Store the profit in the nested dictionary<br>    print(profits)<br>    # Find the highest profit and corresponding buying/selling times<br>    max_profit: int = 0<br>    buy_time: int = 0<br>    sell_time: int = 0<br><br>    for buy, sell_dict in profits.items():<br>        for sell, profit in sell_dict.items():<br>            if profit &gt; max_profit:<br>                max_profit = profit<br>                buy_time = buy<br>                sell_time = sell<br><br>    return (buy_time, sell_time, max_profit)<br><br>tests = []<br>test_1 = {<br>    &#39;input&#39;: [12, 23, 34, 55, 2, 51],<br>    &#39;output&#39;: (4, 5, 49)<br>}<br>tests.append(test1) <br>test_2 = {<br>    &#39;input&#39;: [],<br>    &#39;output&#39;: (0, 0, 0) # Assuming there are no elements in the list<br>}<br>tests.append(test_2)<br><br># Append other tests here. Summarized for brevity.<br># You will then proceed to run the test cases into your function<br># This code does not cater for all the cases. It only serves as a pointer</pre><p>We then proceed to run our test cases to validate the logic in our solution.</p><p>Should we find any failing test cases, we should revisit our function and update our code to cater for those scenarios.</p><blockquote>Given the above function, can you already identify a possible scenario that will fail? Don’t be shy — let’s engage in the comments section😁.</blockquote><h4>6. <strong>Analysis</strong> <strong>and</strong> <strong>Optimization</strong></h4><p>The next step we need to take is to analyze our defined algorithm’s complexity and optimize it.</p><p>Here, we concern ourselves with the <strong><em>time</em></strong> and <strong><em>space</em></strong> complexities of the algorithm.</p><p>We shall explore <strong><em>complexity</em></strong> in another follow up post.</p><p>You can read more on it <a href="https://www.freecodecamp.org/news/big-o-cheat-sheet-time-complexity-chart/#:~:text=Big%20O%2C%20also%20known%20as,as%20the%20input%20size%20grows.">here</a>.</p><h4>Conclusion</h4><p>Throughout this post, we have delved into the intricacies of problem-solving by exploring a 6-step technique.</p><p>I acknowledge that it is not a silver bullet, but it should be sufficient for most scenarios — whether you are tackling a technical interview or solving that task at work.</p><p>I appreciate your thoughts and feedback.</p><blockquote>If your only tool is a hammer, then every problem looks like a nail.</blockquote><blockquote>— Abraham Maslow</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ffc1d5dc986c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[From Python to Beyond: A Memoir]]></title>
            <link>https://medium.com/@shalom.nyende/from-python-to-beyond-a-memoir-1afc7432b7fa?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/1afc7432b7fa</guid>
            <category><![CDATA[python]]></category>
            <category><![CDATA[engineering-mangement]]></category>
            <category><![CDATA[django]]></category>
            <category><![CDATA[software-engineering]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Sun, 04 Jun 2023 13:04:19 GMT</pubDate>
            <atom:updated>2023-06-04T13:04:19.750Z</atom:updated>
            <content:encoded><![CDATA[<h3>My Memoirs : From Python to Beyond</h3><p>As I typed the very first print(‘hello world’) statement and hit <em>run</em> on my battered Dell Latitude E5400 laptop, (the said machine truly deserves a standing ovation😁) my eyes lit up with excitement. I was following along Mark Lutz’ masterpiece — <a href="https://www.amazon.com/Learning-Python-5th-Mark-Lutz/dp/1449355730"><strong><em>Learning Python </em></strong></a><strong><em>(5th Edition).</em></strong></p><p>The year was 2014, and I was a meagre 2nd year Computer Science student. And that, ladies and gentlemen, is how I thrust myself into the world of Python and software engineering.</p><p>It feels so yesterday now, although it has been a solid 9-years-later. I now write more structured code, running across multiple servers and doing more than just echoing a simple hello world on the console. With this, my focus has shifted to writing solutions that are more performant, scalable and maintainable.</p><p>It has and still continues to be a learning journey. Every day is an opportunity to grasp new information and I have made this my mission — to understand as much as possible about my line of work, and how to do things better.</p><blockquote>“Learning never exhausts the mind; it only ignites the flame of curiosity and fuels the desire for knowledge.” — Unknown</blockquote><h3>My Journey</h3><p>I will highlight my journey in two broad steps:</p><h4>1. Campus</h4><p>The first stint I had at Python was my campus’ group project. This was during my 2nd year. <strong><em>Introduction to OOP</em></strong> by Mr. Odiyo (I was at Egerton University, Njoro) and the subsequent group project, you know the drill.</p><p>I have no idea how, but together with my buddies Silas, Epiphany and Cyrus, we somehow settled on Python (Django) for our group project, instead of Java — which the course work was based on. The project was a simple document management system that included a couple of “cool” features like Optical Character Recognition (OCR). We dubbed it docusys. The codebase is still somewhere within my old Github profile. Amateur, clunky even— but got the job done.</p><p>Our presentation was mired in a myriad of tough questions — mainly revolving around our choice of Python, and not Java. Of course, we being naive, argued our way out of the conversation by pulling out the “<strong><em>Python is short and concise</em></strong>” card. I mean, you obviously can get hello world on your console faster in Python than in Java, eh?</p><p>I subsequently went on to build multiple other interesting projects in Python and Django. There was so much to learn, and YouTube was (and still is) a very good friend during those moments. I learnt a lot, from basic problem solving, first principles all the way to reverse engineering and debugging code written by others. All these have proven useful over the years.</p><p>My campus journey culminated in my final year project — a real time code sharing platform, complete with real time chat and comments. In hindsight, I got lots of things wrong (as far as building scalable and performant code is concerned), but we live and learn. And such is life.</p><h4>2. Post-campus</h4><p>I got my very first engagements before completing campus, but let’s focus on how the journey went immediately after school.</p><p>I got two interviews, all within days apart from each other. The first interview was organised by Savannah Informatics. They were recruiting on behalf of Safaricom, I believe. Now, back then, Java was largely the standard — especially for established entities like Safaricom and a majority of the banks.</p><p>You can imagine the shock on my face when I got presented with a Java-centric written interview. All those years of me throwing shade on Java flashed before my eyes, and all I could feel was deep regret on why I neglected the language. I settled down and scribbled away the much I could remember. Luckily, most programming languages are founded on the same principles. I obviously struggled with the syntax, but eventually got into the second round — a practical session at Safaricom HQ in Westlands. Requirement: Carry your laptop.</p><p>At this point, I still am with my old and faithful servant — the Dell Latitude E5440. Its health had deteriorated significantly, and getting it to power on at the first attempt was more on luck. A hit or miss. All interviewees were given access to internet, and a simple (simple might be relative, but here goes) problem statement — to implement a CRUD API, test it using Postman and submit the code and Postman collection for evaluation. I smiled. There was no way I was failing this one. Just no way.</p><p>Needless to say, I did not make it. Two hours later, after settling down, I was still fumbling with my laptop. My not-so-faithful servant had decided to not wake up when I needed it the most. My footsteps were heavy that evening, as I trudged sluggishly to the bus stage to board a <em>matatu</em> to town, knowing I had blown that chance. Well, I had another interview in two days, and I consoled myself that I still had another opportunity elsewhere, and that I there was no way I was gonna code in Java anyway😁. A classical example of Aesop’s proverbial fox that misses the grapes and calls them bitter.</p><p>I mauled the second interview, which, luckily, was in Python, and my journey took off. The rest, as they say, is history.</p><p>Several months later, I decided to go freelance. Interacting with other engineers from other countries really does open your eyes in all aspects in terms of culture, knowledge and experience.</p><p>For the past two and a half years, I have been leading an Engineering team. The journey is interesting and exciting, since there is more to learn every single day. Taking such a drastic change — from being an individual contributor to providing leadership to teams working on multiple diverse projects — is not an easy feat (comes with its fair share of challenges), but I have benefited from lots of help from amazing people. I am looking forward to writing a bit more on this over the next few months.</p><p>Over the years, I have dabbled in med-tech, fintech, blockchain, data and DevOps. All along, I have leaned heavily on Python and its ecosystem to build out infrastructure — from consuming APIs, to exposing APIs, to developing reusable modules and libraries, to implementing Infrastructure as Code (IaC) tools.</p><p>I contribute to the Open Source community whenever I have the time, and am the chief nut behind <em>dfuse-python — </em>A Python wrapper for interfacing with dfuse, which, quoting from their website, <strong><em>empowers developers with capabilities to build modern blockchain applications with fast, fluid interfaces that deliver exceptional user experience. </em></strong>Go ahead and `pipenv install dfuse` it. Code is <a href="https://github.com/chmod77/dfuse-python">here</a>.</p><p>I also contribute to the <em>django-localflavor</em> codebase — where I implement the Kenya-specific Django helpers.</p><p>Whenever I am not learning on how to be a better Engineering lead, you will catch me exploring a couple of interesting tools and languages, especially within the Rustlang ecosystem.</p><p>Above all else, I have learnt to appreciate the hunger to learn, ask (meaningfully intelligent) questions as well as benefit from the experiences of others.</p><p>Stay hungry. Stay foolish.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=1afc7432b7fa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My 2023 Update]]></title>
            <link>https://medium.com/@shalom.nyende/my-2023-update-df6367866e9d?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/df6367866e9d</guid>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Thu, 09 Mar 2023 18:30:33 GMT</pubDate>
            <atom:updated>2023-03-09T18:30:33.805Z</atom:updated>
            <content:encoded><![CDATA[<p>Dear readers,</p><p>It has been quite some time since I posted anything here.</p><p>A lot has changed over the past two-three years, and I have taken slightly a different path in my career.</p><p>I got an opportunity to transition to leading a young and growing Engineering Team at Impact Africa Network. I have had a lot to learn and unlearn.</p><p>I intend to revisit writing, and I will be sharing a clear path soon enough.</p><p>Cheers!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=df6367866e9d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Getting going on EOSIO: Part 0]]></title>
            <link>https://medium.com/@shalom.nyende/getting-going-on-eosio-part-0-8aa3534bd4fe?source=rss-2d14fa14879b------2</link>
            <guid isPermaLink="false">https://medium.com/p/8aa3534bd4fe</guid>
            <category><![CDATA[eosio]]></category>
            <category><![CDATA[blockchain]]></category>
            <dc:creator><![CDATA[Shalom Nyende]]></dc:creator>
            <pubDate>Fri, 20 Sep 2019 01:50:30 GMT</pubDate>
            <atom:updated>2019-09-20T01:50:30.071Z</atom:updated>
            <content:encoded><![CDATA[<h3>Introduction</h3><p>Hello there! Welcome to this series. It is meant to be an introductory piece, for those getting into EOSIO.</p><p>We shall go over a number of concepts as relates to EOSIO, though some of them are not EOSIO-specific, and are applicable in other similar technologies.</p><p>I will take a dumb approach, and will assume that you are not familiar with EOSIO concepts. Feel free to skip to consequent parts, as you deem fit. This article will be updated continuously with the addition of each new part of the series.</p><p>So, let’s dive right in!</p><h3>Wait, what exactly is EOSIO?</h3><p>So, before we get ahead of ourselves, let’s first identify what EOSIO is:</p><blockquote>EOSIO is software that introduces a blockchain architecture designed to enable vertical and horizontal scaling of decentralized applications (the “EOSIO Software”) and can be used to launch private and public blockchain networks. This is achieved through an operating system-like construct upon which applications can be built. – https://developers.eos.io/eosio-home/docs/10-big-picture</blockquote><p>EOSIO is a <a href="https://en.m.wikipedia.org/wiki/Blockchain"><strong><em>Blockchain</em></strong></a> platform developed to host and run <a href="https://en.m.wikipedia.org/wiki/Decentralized_application"><strong><em>decentralized applications</em></strong></a> in a scalable manner.</p><p><strong><em>Vertical scaling</em></strong>: this means adding more power/resources (CPU, memory) to a setup to increase throughput.</p><p><strong><em>Horizontal scaling</em></strong>: this entails adding more machines/nodes to the pool to increase throughput.</p><h3>Ah, and what exactly is this “blockchain” thing?</h3><p>It looks like, in our haste to jump into EOSIO, we may have skipped the core concept: Blockchain.</p><p><strong><em>PS: if you are already familiar with what blockchain is, feel free to skip this section.</em></strong></p><p>Blockchain is basically a digital ledger, containing records (referred to as “blocks”) that are cryptographically linked to each other.</p><p>Evidently, the advantage of Blockchain technology is that it offers <strong><em>security</em></strong>, <strong><em>immutability</em></strong>, <strong><em>traceability</em></strong> and <strong><em>no single point of failure.</em></strong></p><p>For in-depth introductions to what this Blockchain animal is, check out the following links:</p><ul><li><a href="https://www.google.com/url?sa=i&amp;source=web&amp;cd=&amp;ved=0ahUKEwiXoKCH0Z3kAhUtyoUKHeQuDwMQzPwBCAM&amp;url=https%3A%2F%2Fwww.geeksforgeeks.org%2Fblockchain-technology-introduction%2F&amp;psig=AOvVaw0-fWg6yGuMpK0zSsjxNMOw&amp;ust=1566809148991052">Introduction to Blockchain technology | Set 1 - GeeksforGeeks</a></li><li><a href="https://hackernoon.com/blockchain-technology-explained-introduction-meaning-and-applications-edbd6759a2b2">Blockchain Technology Explained: Introduction, Meaning, and Applications | HackerNoon</a></li><li><a href="https://medium.com/coinmonks/a-simple-introduction-to-blockchain-technology-90abc29f266e">A simple introduction to Blockchain technology</a></li></ul><iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FSSo_EIwHSd4%3Ffeature%3Doembed&amp;display_name=YouTube&amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DSSo_EIwHSd4&amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FSSo_EIwHSd4%2Fhqdefault.jpg&amp;key=a19fcc184b9711e1b4764040d3dc5c07&amp;type=text%2Fhtml&amp;schema=youtube" width="854" height="480" frameborder="0" scrolling="no"><a href="https://medium.com/media/2932a409612280b76a35f72196523626/href">https://medium.com/media/2932a409612280b76a35f72196523626/href</a></iframe><h3>Why EOSIO?</h3><p>In this section, we shall highlight the prominent features of EOSIO.</p><h4>1. C++/WASM Virtual Machine</h4><p>To develop applications to run on the EOSIO environment (smart contracts), you will use C++. This is a very mature language that is already being used by many developers and entities globally.</p><p>In addition to this, EOSIO uses a web assembly (WASM) virtual machine to execute the smart contract code.</p><p><strong><em>Smart contract – this is a piece of code that can execute on a blockchain and keep the state of contract execution as a part of the immutable history of that blockchain instance.</em></strong></p><h4>2. Scalability</h4><p>The EOSIO software has been implemented in a way that makes it possible to achieve a high throughput. Currently, EOSIO has been proved to sustain over 4000 transactions per second (TPS).</p><p>High throughputs are attractive to enterprises processing huge numbers of transactions per second.</p><h4>3. Speed – EOSIO is faaast!</h4><p>EOSIO has been designed to have low transaction confirmation latency (<strong><em>500ms</em></strong>). As such you do not have to wait for an entire 30 minutes for confirmation that your transfer has gone through😊.</p><h4>4. Permissions</h4><p>EOSIO has an elaborate accounts and permissions system.</p><p>Account names are normally 12 characters long, though there are exceptions. Accompanying this account name system, is the permissions system.</p><p>EOSIO allows users to create custom permissions (that can only be used to perform certain actions, for example) or even split authorities across multiple accounts with different authority weights (<strong><em>multi-signature</em></strong>, or, as commonly known, <strong><em>multi-sig</em></strong>).</p><p><em>For a comprehensive walkthrough on permissions, check out </em><a href="https://www.eoscanada.com/en/an-overview-of-multisig-and-permissions-on-eosio"><em>these series</em></a><em> by </em><a href="https://medium.com/u/ef13e36d781a"><em>EOS Canada</em></a><em>.</em></p><h3>The building blocks of EOSIO</h3><h4>1. Nodeos</h4><p>This is the core EOSIO daemon, responsible for p2p networking, smart contract execution as well as data persistence. <em>(You can read more on EOSIO data persistence solutions </em><a href="https://link.medium.com/Y1jdLxTdsZ"><strong><em>here</em></strong></a><em>, thanks to </em><a href="https://medium.com/u/20ab184d6ddf"><em>cc32d9</em></a><em>)</em></p><p>Nodeos is usually run with various plugins to achieve the various functionalities.</p><h4>2. Keosd</h4><p>This handles key management on EOSIO.</p><h4>3. Cleos</h4><p>This is a command line (CLI) tool for interacting with the EOSIO ecosystem. It provides functionality such as pushing transactions, getting information from the chain <em>et cetera et cetera.</em></p><p>There are a number of other tools to interact with EOSIO, such as EOSJS (JavaScript SDK used to interact with EOSIO via the RPC API), <a href="http://eosc.app/">eosc</a> by <a href="https://medium.com/u/ef13e36d781a">EOS Canada </a>and <a href="https://github.com/eosnewyork/eospy">pycleos</a> by <a href="https://medium.com/u/a66a458fd08b">EOS New York.</a></p><h4>Wrapping it up</h4><p>Phew! That must have been quite a ride.</p><p>For the technically oriented readers, there were no bones to chew here, and you may have found this piece quite a bore.</p><p>Nevertheless, sit tight and wait for the consequent parts. I assure you, we shall have fun!</p><p><strong><em>PS: Watch out for part 1 – where we shall reveal what we shall build in the course of this series.</em></strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8aa3534bd4fe" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>