Julien Blanchard $home https://julienblanchard.com Setting up a 9front CPU server on a Raspberry Pi 4 Some notes setting up a pi4 as a 9front cpu server Fri, 01 Mar 2024 17:52:00 +0200 https://julienblanchard.com/articles/setting-up-a-9front-cpu-server-on-a-raspberry-pi-4 https://julienblanchard.com/articles/setting-up-a-9front-cpu-server-on-a-raspberry-pi-4 Smolmail An experiment with email Tue, 14 Jul 2022 14:18:00 +0200 https://julienblanchard.com/articles/smolmail https://julienblanchard.com/articles/smolmail C styles A collection of interesting C style guides found here and there. If you know other style guides please let me know! Tue, 01 Jun 2021 14:18:00 +0200 https://julienblanchard.com/c-styles/ https://julienblanchard.com/c-styles/ Journaling my life at work using Github <p>Following this <a href="https://lobste.rs/s/j9dkuv/do_you_journal_about_your_workday_why_what">post</a> on lobste.rs and the interest that some manifested after I mentioned it on twitter, I wanted to write about something I’m doing for about 6 months now which is journaling my days at work.</p> <p>It started while chatting with my friend <a href="https://twitter.com/fcogez">Flavien</a> who was asking how he could have a TODO list with reccuring tasks.</p> <p>Half-jockingly I said use Github issues with a <a href="https://github.com/blog/2111-issue-and-pull-request-templates">template</a>. Thinking more about it I thought it could be a great idea and I should try this in practice.</p> <h2 id="my-daily-routine">My daily routine</h2> <p>Regarding my daily tasks, I’ve mostly been a low-tech person with pen and paper crossing out what I had done. But this process is quite inefficient regarding reccuring tasks. Also keeping up with what was left to do from the other days is not really optimal. Tried some TODO/GTD apps too but it didn’t catch.</p> <p>These days I try to keep a journal of what I do at work using Github issues. I chose Github since I use it everyday so I figured this would be a great place to store this “me vs. work” stuff.</p> <p>Every morning I open a new issue in a private repo with the date as the title. The repository is not public, perhaps one day it will. I’ve got mixed feelings with opening it, it’s my private life but journaling in the open could be an interesting experiment too.</p> <p>There is an ISSUE_TEMPLATE file in the repository. It contains my daily routine tasks and a placeholder for what I intend to do today and another one for tasks I did that were not planned.</p> <p>The template looks like this:</p> <div class="highlighter-rouge"><pre class="highlight"><code>Today here are the tasks I'd like to complete: - [ ] Check Slack for urgencies - [ ] Check X status - [ ] Check New Relic - [ ] Check Sentry - [ ] Check Y I also did: - [ ] </code></pre> </div> <p>So every morning with my coffee I make a quick standup with myself and it ends up with something like:</p> <div class="highlighter-rouge"><pre class="highlight"><code>Today here are the tasks I'd like to complete: - [ ] Check Slack for urgencies - [ ] Check X status - [ ] Check New Relic - [ ] Check Sentry - [ ] Check Y - [ ] Project 42 - [ ] a sub task - [ ] another subtask - [ ] and another subtask - [ ] Fix bug #66 I also did: - [ ] </code></pre> </div> <p>I then add a label with my current mood and if I’m working remotely or not.</p> <p>During the day I check every task I completed and eventually add un-planned tasks. At the end of the day I’m left with:</p> <div class="highlighter-rouge"><pre class="highlight"><code>Today here are the tasks I'd like to complete: - [x] Check Slack for urgencies - [x] Check X status - [x] Check New Relic - [x] Check Sentry - [x] Check Y - [ ] Project 42 - [x] a sub task - [x] another subtask - [ ] and another subtask - [x] Fix bug #66 I also did: - [x] Free-up space on Jenkins - [x] Some Open source stuff - [x] Fixed a bug for a customer </code></pre> </div> <p>When the day is over it’s time for a bit of reflection over it and I’ll tag the issue with some labels to rate it. So far I have 12 of them:</p> <p><img src="/assets/images/labels.png" alt="Github labels list" style="width: 200px;" /></p> <p>The <code class="highlighter-rouge">productivity</code> labels are purely subjective, it’s just how I feel at the end of the day not how much I accomplished quantitatively. The mood I set in the morning can be adjusted if I feel like it was not the right one too.</p> <p>I usually close the issue but leave the tab open so that I can copy paste the unfinished tasks for the next issue.</p> <h2 id="whats-next">What’s next?</h2> <p>The closed issues list is pretty nice with all the labels and the progress bar</p> <p><img src="/assets/images/issues.png" alt="Github issues list" style="height: 200px;" /></p> <p>but I haven’t found a real use for them yet except a sense of completion (or not) at the end of the day.</p> <p>Since I have an API with pre-formatted data at hand using Github, I’m thinking about making a visualisation interface with some graphs and try to get some insights. It would be a nice side-project to play with some new front-end tools too (Purescript I’m looking at you).</p> <p>The idea would be not only to have a fancy TODO list but also to try to self-quantitize my life as a worker. Trying to extract tendencies from this data would be great. For example if it’s been 20 days I’ve been setting my <code class="highlighter-rouge">Mood</code> to <code class="highlighter-rouge">Bad</code> and my <code class="highlighter-rouge">Productivity</code> to <code class="highlighter-rouge">Bad</code> then perhaps it’s time for a deeper reflection and a big change, this kind of stuff. It could also help for the 1-to-1s with my manager perhaps.</p> <p>I also thought about some elisp or a script I could write to automate my process a bit but I’m not sure it would really add value. My issue routine is a moment of reflection, I’m not sure I want to speed it up right now.</p> <p>That’s it for my daily routine. If you have thoughts, comments or ideas of improvement don’t hesitate to open an issue <a href="https://github.com/julienXX/julienxx.github.com/issues">here</a>.</p> Tue, 25 Jul 2017 19:18:00 +0200 http://julienblanchard.com/2017/journaling-my-life-with-github/ http://julienblanchard.com/2017/journaling-my-life-with-github/ Getting started with F# and .NET Core <p><strong>TLDR</strong>: F# and .NET Core are really cool, you should give them a try.</p> <p>I recently got interested in the .NET world thanks to my colleagues who are doing C# at $WORK. My last experience with Microsoft technologies was during my school years doing ASP Classic and it was not a great one but .NET Core is now a multi-platform, open-source .NET and it has a functional language: F#.</p> <p>F# was designed by <a href="https://twitter.com/dsyme">Don Syme</a>. It’s open-source and maintained by the <a href="http://fsharp.org">F# Software Foundation</a> and individual contributors with some working at Microsoft.</p> <p>I’m really fond of functional languages like Haskell or OCaml so I took F# for a test-drive to see what I could benefit from it.</p> <h1 id="core-vs-mono-vs-standard">Core vs Mono vs Standard</h1> <p>A bit of terminology first.</p> <p><strong>.NET Framework</strong> is Windows-only and is what you usually think about what .NET is.</p> <p><strong>Mono</strong> is a cross-platform implementation of .NET Framework from Xamarin (which Microsoft bought).</p> <p>Microsoft chose to rewrite .NET to be truly cross-platform and stripped some APIs that were not considered core. The new product is <strong>.NET Core</strong>. So .NET Core is a smaller cross-platform .NET Framework.</p> <p><strong>.NET Standard</strong> aims to unify a set of APIs that all .NETs (Framework, Mono and Core) must implement.</p> <p><strong>.NET Native</strong> is a new initiative to compile code to native CPU instructions instead of using the CLR to compile to intermediate language.</p> <p>Unfortunately resources for using F# with .NET Core are still very sparse, most examples are tailored for the .NET Framework or Mono so here are some notes on what I learned so far. Hope it helps.</p> <h1 id="installation">Installation</h1> <p>First get .Net Core from <a href="https://www.microsoft.com/net/core">here</a> and follow installation instructions.</p> <h4 id="the-basics">The basics</h4> <p>.NET Core provides a great command line tool: <code class="highlighter-rouge">dotnet</code>.</p> <p>Creating a new project:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ mkdir project λ <span class="nb">cd </span>project λ dotnet new console -lang f#</code></pre></figure> <p>Adding a package:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet add package Newtonsoft.Json</code></pre></figure> <p>Restoring (installing) packages:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet restore</code></pre></figure> <p>Building the app:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet build</code></pre></figure> <p>Running the app:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet run</code></pre></figure> <p>Publishing an app:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet publish</code></pre></figure> <p>Publishing with a specific framework and runtime:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet publish --framework netcoreapp1.1 --runtime osx.10.11-x64</code></pre></figure> <p>.NET Core projects used to have a <code class="highlighter-rouge">project.json</code> configuration file but it’s been replaced by an XML file with a <code class="highlighter-rouge">.fsproj</code> extension in order to gain better compatibility with <code class="highlighter-rouge">MsBuild</code>.</p> <p>Moving to this new format allows to build and restore multiple projects simultaneously thanks to solution files. A solution file is useful when you want to link projects together. When using <code class="highlighter-rouge">dotnet restore</code> at the solution file level, all packages in that solution will be restored instead of having to do it for every one of them.</p> <p>Adding a project to a solution:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ dotnet sln todo.sln add todo-app/todo-app.fsproj</code></pre></figure> <h1 id="tooling">Tooling</h1> <p>There are a few additional tools you can use besides <code class="highlighter-rouge">dotnet</code> CLI.</p> <h4 id="paket">Paket</h4> <p><a href="https://fsprojects.github.io/Paket/">Paket</a> is a dependency manager for .NET projects. It works with <a href="https://www.nuget.org/">NuGet</a> packages (like dotnet add packages) and also Git repositories references or HTTP resources. It seems to better solve dependency issues than the standard NuGet way.</p> <p>It’s quite simple to add to your Core project. Download it for your platorm then <code class="highlighter-rouge">paket init</code> will generate a paket.dependecies file. <code class="highlighter-rouge">paket install</code> will install those dependencies.</p> <h4 id="fake">Fake</h4> <p><a href="https://fake.build/">Fake</a> is F# Make. Similar to Rake in the Ruby world it’s a DSL you can use for all your build or deploy needs for example.</p> <h4 id="ionide">Ionide</h4> <p><a href="http://ionide.io/">Ionide</a> is a Visual Studio Code/Atom package for F# development with everything you’d find in a modern IDE like syntax highlighting, autocompletion, type at point… Really an awesome package if you’re using these editors.</p> <h4 id="omnisharp">Omnisharp</h4> <p>For Emacs users like me, <a href="http://www.omnisharp.net/">OmniSharp</a> is a cross-platform tool that brings Intellisense for a lot of editors (Emacs, Vim, Sublime…). Combined with <code class="highlighter-rouge">fsharp-mode</code> this makes a pretty nice development environment.</p> <h4 id="forge">Forge</h4> <p><a href="http://forge.run">Forge</a> is a project/solution management tool. It’s useful for creating a project without an IDE but it seems it’s not needed for .NET Core projects. If you’re working on a Mono project this is a nice addition to your toolbelt.</p> <h4 id="web-stuff">Web stuff</h4> <p>In C# you would usually use ASP.NET Core (aka Rails.NET) or eventually <a href="://nancyfx.org">Nancy</a> a Sinatra-like framework for your web services needs. It’s possible to use them with F# but a better alternative exists: <a href="https://suave.io/">Suave</a>.</p> <p><a href="https://twitter.com/tamizhvendan">Tamizh Vendan</a> has written a good book on Suave: <a href="http://products.tamizhvendan.in/fsharp-applied/">F# Applied</a>.</p> <h1 id="f-the-language">F# the language</h1> <p>F# looks a lot like OCaml with a few goodies. I’m not going to detail the syntax, just highlight some features of the language that I really like.</p> <p>Go check <a href="https://fsharpforfunandprofit.com/posts/fsharp-in-60-seconds/">F# syntax in 60 seconds</a> for a quick overview of the syntax.</p> <h4 id="use-c-libs">Use C# libs</h4> <p>One of the best benefits of using F# is the amount of quality .NET libraries available. Most of these are written in C# but you can use them in F# quite easily.</p> <p>Since it’s my first attempt to learn .NET programming, I found that learning a bit of C# can be helpful to understand how to use libraries and stuff. The <a href="https://www.packtpub.com/application-development/c-7-and-net-core-modern-cross-platform-development-second-edition">C# 7 and .NET Core: Modern Cross-Platform Development</a> book was an easy read and simple enough approach to learn more about the ecosystem.</p> <h4 id="smooth-operators">Smooth Operators</h4> <p>The pipe operator <code class="highlighter-rouge">|&gt;</code> (that Elixir borrowed from F#) lets you pass the result of the function on the left onto the other function as its first argument.</p> <p><strong>Note</strong>: the F# REPL is launched with <code class="highlighter-rouge">fsharpi</code>, <code class="highlighter-rouge">;;</code> are needed to end statements in the REPL.</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">..</span><span class="mi">10</span><span class="p">]</span> <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">filter</span> <span class="p">(</span><span class="k">fun</span> <span class="n">n</span> <span class="p">-&gt;</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="p">=</span> <span class="mi">0</span><span class="o">);;</span> <span class="k">val</span> <span class="n">it</span> <span class="p">:</span> <span class="kt">int</span> <span class="kt">list</span> <span class="p">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">;</span> <span class="mi">4</span><span class="p">;</span> <span class="mi">6</span><span class="p">;</span> <span class="mi">8</span><span class="p">;</span> <span class="mi">10</span><span class="p">]</span></code></pre></figure> <p><code class="highlighter-rouge">&lt;|</code> takes the function on the left and applies it to the value on the right.</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="k">let</span> <span class="n">double</span> <span class="n">n</span> <span class="p">=</span> <span class="n">n</span> <span class="p">*</span> <span class="mi">2</span><span class="p">;;</span> <span class="k">val</span> <span class="n">double</span> <span class="p">:</span> <span class="n">n</span><span class="p">:</span><span class="kt">int</span> <span class="p">-&gt;</span> <span class="kt">int</span> <span class="p">&gt;</span> <span class="n">printfn</span> <span class="s2">"The double of 16 is %d"</span> <span class="o">&lt;|</span> <span class="n">double</span> <span class="mi">16</span><span class="p">;;</span> <span class="nc">The</span> <span class="n">double</span> <span class="k">of</span> <span class="mi">16</span> <span class="n">is</span> <span class="mi">32</span> <span class="k">val</span> <span class="n">it</span> <span class="p">:</span> <span class="kt">unit</span> <span class="p">=</span> <span class="bp">()</span></code></pre></figure> <p>The composition operator <code class="highlighter-rouge">&gt;&gt;</code> lets you ‘compose’ functions together.</p> <p>Let’s define two functions <code class="highlighter-rouge">triple</code> and <code class="highlighter-rouge">square</code>:</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="k">let</span> <span class="n">triple</span> <span class="n">n</span> <span class="p">=</span> <span class="n">n</span> <span class="p">*</span> <span class="mi">3</span><span class="p">;;</span> <span class="k">val</span> <span class="n">double</span> <span class="p">:</span> <span class="n">n</span><span class="p">:</span><span class="kt">int</span> <span class="p">-&gt;</span> <span class="kt">int</span></code></pre></figure> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="k">let</span> <span class="n">square</span> <span class="n">n</span> <span class="p">=</span> <span class="n">n</span> <span class="p">*</span> <span class="n">n</span><span class="p">;;</span> <span class="k">val</span> <span class="n">square</span> <span class="p">:</span> <span class="n">n</span><span class="p">:</span><span class="kt">int</span> <span class="p">-&gt;</span> <span class="kt">int</span></code></pre></figure> <p>We can compose the two functions like:</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="k">let</span> <span class="n">tripleSquare</span> <span class="p">=</span> <span class="n">triple</span> <span class="o">&gt;&gt;</span> <span class="n">square</span><span class="p">;;</span> <span class="k">val</span> <span class="n">tripleSquare</span> <span class="p">:</span> <span class="p">(</span><span class="kt">int</span> <span class="p">-&gt;</span> <span class="kt">int</span><span class="p">)</span></code></pre></figure> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="n">tripleSquare</span> <span class="mi">2</span><span class="p">;;</span> <span class="k">val</span> <span class="n">it</span> <span class="p">:</span> <span class="kt">int</span> <span class="p">=</span> <span class="mi">36</span></code></pre></figure> <p>The <code class="highlighter-rouge">&lt;&lt;</code> operator takes two functions and applies the function on the right before the one the left of the operator.</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="p">&gt;</span> <span class="k">let</span> <span class="n">isOdd</span> <span class="n">n</span> <span class="p">=</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="p">=</span> <span class="mi">1</span><span class="p">;;</span> <span class="k">val</span> <span class="n">isOdd</span> <span class="p">:</span> <span class="n">n</span><span class="p">:</span><span class="kt">int</span> <span class="p">-&gt;</span> <span class="kt">bool</span> <span class="p">&gt;</span> <span class="p">[</span><span class="mi">1</span><span class="p">..</span><span class="mi">10</span><span class="p">]</span> <span class="o">|&gt;</span> <span class="nn">List</span><span class="p">.</span><span class="n">filter</span> <span class="p">(</span><span class="n">not</span> <span class="o">&lt;&lt;</span> <span class="n">isOdd</span><span class="o">);;</span> <span class="k">val</span> <span class="n">it</span> <span class="p">:</span> <span class="kt">int</span> <span class="kt">list</span> <span class="p">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">;</span> <span class="mi">4</span><span class="p">;</span> <span class="mi">6</span><span class="p">;</span> <span class="mi">8</span><span class="p">;</span> <span class="mi">10</span><span class="p">]</span></code></pre></figure> <h4 id="async-and-parallel">Async and Parallel</h4> <p>Asynchronous workflows can be easily constructed using <code class="highlighter-rouge">async { ... }</code>. It’s also possible to have some computations composed in parallel using the <code class="highlighter-rouge">fork-join</code> combinator <code class="highlighter-rouge">Async.Parallel</code>.</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="k">let</span> <span class="n">task1</span> <span class="p">=</span> <span class="n">async</span> <span class="p">{</span> <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">1000</span> <span class="n">printfn</span> <span class="s2">"task1 finished!"</span> <span class="n">return</span> <span class="mi">5</span> <span class="p">}</span> <span class="k">let</span> <span class="n">task2</span> <span class="p">=</span> <span class="n">async</span> <span class="p">{</span> <span class="k">do</span><span class="o">!</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Sleep</span> <span class="mi">500</span> <span class="n">printfn</span> <span class="s2">"task2 finished!"</span> <span class="n">return</span> <span class="mi">2</span> <span class="p">}</span> <span class="p">[</span><span class="n">task1</span><span class="p">;</span> <span class="n">task2</span><span class="p">]</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">Parallel</span> <span class="o">|&gt;</span> <span class="nn">Async</span><span class="p">.</span><span class="nc">RunSynchronously</span> <span class="o">|&gt;</span> <span class="n">printfn</span> <span class="s2">"%A"</span></code></pre></figure> <p>outputs:</p> <figure class="highlight"><pre><code class="language-ocaml" data-lang="ocaml"><span class="n">task2</span> <span class="n">finished</span><span class="o">!</span> <span class="n">task1</span> <span class="n">finished</span><span class="o">!</span> <span class="p">[|</span><span class="mi">5</span><span class="p">;</span> <span class="mi">2</span><span class="p">|]</span> <span class="k">val</span> <span class="n">task1</span> <span class="p">:</span> <span class="nc">Async</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="k">val</span> <span class="n">task2</span> <span class="p">:</span> <span class="nc">Async</span><span class="p">&lt;</span><span class="kt">int</span><span class="p">&gt;</span> <span class="k">val</span> <span class="n">it</span> <span class="p">:</span> <span class="kt">unit</span> <span class="p">=</span> <span class="bp">()</span></code></pre></figure> <p>This example executes both async tasks <code class="highlighter-rouge">task1</code> and <code class="highlighter-rouge">task2</code> concurrently and wait for both to finish before printing the results.</p> <h4 id="mailboxes">Mailboxes</h4> <p>Another concurrency primitive available in F# is mailboxes. F# can natively handle message-based concurrency thanks to its mailbox processors. It somewhat brings Erlang’s actor model to F#.</p> <p>Basically actors are lightweight constructs that have a queue and can send messages to other actors and process incoming messages sent to them from the queue.</p> <p>This great <a href="http://www.codemag.com/article/1707051">article</a> by <a href="https://twitter.com/rachelreese">Rachel Reese</a> explores the subject if you want to dig deeper.</p> <h1 id="some-additional-resources">Some additional resources</h1> <p>It’s quite hard to find good resources updated for <strong>.NET Core</strong> with examples so I’ve setup a <a href="https://github.com/julienXX/GettingStartedWithFSharpAndDotNetCore">Github Repository</a> with some basic tasks I needed to do like using a database or parsing JSON. I’ll try to update it whenever I manage to do something that was difficult to find existing resources for.</p> <p>There is a really friendly <a href="https://fsharp.slack.com">Slack</a> that you should join.</p> <p><a href="https://fsharpforfunandprofit.com">F# for fun and profit</a> is a superb collection of resources on F#. There is an <a href="https://www.gitbook.com/book/swlaschin/fsharpforfunandprofit/details">ebook</a> compiling all the posts too.</p> <p>This <a href="https://github.com/thangchung/awesome-dotnet-core">Awesome dotnet core repo</a> lists some libs, tools and resources for development with .NET Core but not specifically F#.</p> <p>Regarding books <a href="https://www.apress.com/us/book/9781484207413">Expert F#</a> is great and assumes no prior .NET knowledge.</p> <p><a href="https://twitter.com/odytrice">Ody Mbegbu</a> has made a nice intro <a href="https://www.youtube.com/watch?v=2xG31sUsCdc">video</a> to getting started with .NET Core using F#.</p> <h1 id="conclusion">Conclusion</h1> <p>F# is a nicely designed functional language (that can do OOP too but I didn’t try it yet). Most of the resources are newbie friendly and avoid words like <code class="highlighter-rouge">functors</code> and <code class="highlighter-rouge">monads</code>. In general I find them more geared toward practical usage which is pretty nice sometimes.</p> <p>The main issue with .NET Core at the moment (1.x) is that there are still a lot of missing APIs which lead to incompatible libraries like <a href="http://fsharp.github.io/FSharp.Data/">FSharp.Data</a> but the good news is that the upcoming .NET Core release later this year (2.x) will bring something like 20000 more APIs and most of the libs should be compatible or easily adaptable then.</p> <p>For me F# is a great language with a robust eco-system. It has all the FP features that matters the most to me: a strong type system, pattern-matching and good concurrency primitives. Its interoperability with C# could be a gateway to more functional programming in my company. I’m currently rewriting some of our slow Ruby services with it and I wish this will demonstrate its value to my co-workers.</p> <p>Hope this article helped clearing up a bit how to work with F# and .NET Core. Don’t hesitate to post your questions or remarks <a href="https://github.com/julienXX/julienxx.github.com/issues">here</a>.</p> Mon, 24 Jul 2017 23:10:00 +0200 http://julienblanchard.com/2017/getting-started-with-fsharp-and-dotnet-core/ http://julienblanchard.com/2017/getting-started-with-fsharp-and-dotnet-core/ Fancy Rust development with Emacs <p><a href="https://www.rustup.rs">Rustup</a> beta was released this week. As a member of the Church of Emacs I needed to update my config a bit. This inspired me to write this post on how to setup your Emacs as a great Rust IDE.</p> <h1 id="installing-rust">Installing Rust</h1> <p>Thanks to <code class="highlighter-rouge">rustup</code> installing Rust on your system is now even easier. First do:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ curl https://sh.rustup.rs -sSf | sh</code></pre></figure> <p>When prompted choose <code class="highlighter-rouge">1) Proceed with installation (default)</code> unless you have some special requirements.</p> <p><code class="highlighter-rouge">rustup</code> was previously named <code class="highlighter-rouge">multirust</code>. It will create a <code class="highlighter-rouge">~/.multirust</code> directory to store rust <a href="https://github.com/rust-lang-nursery/rustup.rs#toolchain-specification">toolchains</a>.</p> <p>The binaries and tools will be installed in <code class="highlighter-rouge">~/.cargo</code>. Make sure that you have <code class="highlighter-rouge">~/.cargo/bin</code> in your PATH otherwise add it with:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell"><span class="nb">export </span><span class="nv">PATH</span><span class="o">=</span><span class="s2">"</span><span class="nv">$HOME</span><span class="s2">/.cargo/bin:</span><span class="nv">$PATH</span><span class="s2">"</span></code></pre></figure> <p>By default your projects will use the stable toolchain (Rust 1.8 at the time of this writing).</p> <p><code class="highlighter-rouge">rustup</code> has a lot of functionalities which you can find more about on the github <a href="https://github.com/rust-lang-nursery/rustup.rs">page</a>.</p> <h1 id="crates-and-packages-youll-need">Crates and packages you’ll need</h1> <p>For this part I assume you already have a working emacs and that you know how to install packages and organize your configuration.</p> <h2 id="rust-mode">rust-mode</h2> <p><code class="highlighter-rouge">rust-mode</code> handles syntax highlighting, indentation and various settings for you.</p> <p>Just <code class="highlighter-rouge">M-x package-install rust-mode</code>.</p> <h2 id="cargoel">cargo.el</h2> <p><a href="http://doc.crates.io/index.html">Cargo</a> is Rust package manager. <code class="highlighter-rouge">cargo.el</code> is a minor mode which allows us to run cargo commands from emacs like:</p> <ul> <li><code class="highlighter-rouge">C-c C-c C-b</code> to run <code class="highlighter-rouge">cargo build</code></li> <li><code class="highlighter-rouge">C-c C-c C-r</code> to run <code class="highlighter-rouge">cargo run</code></li> <li><code class="highlighter-rouge">C-c C-c C-t</code> to run <code class="highlighter-rouge">cargo test</code></li> </ul> <p>and many others.</p> <p>As for installation, nothing fancy just <code class="highlighter-rouge">M-x package-install cargo</code> and add:</p> <figure class="highlight"><pre><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'rust-mode-hook</span> <span class="ss">'cargo-minor-mode</span><span class="p">)</span></code></pre></figure> <p><img src="/assets/images/cargo-run.gif" alt="Cargo run" /></p> <h2 id="rustfmt">rustfmt</h2> <p><a href="https://github.com/rust-lang-nursery/rustfmt">rustfmt</a> formats your code according to community style guidelines just like <code class="highlighter-rouge">gofmt</code> in the Go language world. It’s automatically handled by rust-mode.</p> <p>First install the <code class="highlighter-rouge">rustfmt</code> crate:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ cargo install rustfmt</code></pre></figure> <p>I use <code class="highlighter-rouge">C-c &lt;tab&gt;</code> a lot in my emacs to automatically indent the current buffer so it would be nice if the same key combination would run <code class="highlighter-rouge">rustfmt</code> which also fixes indentation. So I simply added:</p> <figure class="highlight"><pre><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'rust-mode-hook</span> <span class="p">(</span><span class="k">lambda</span> <span class="p">()</span> <span class="p">(</span><span class="nv">local-set-key</span> <span class="p">(</span><span class="nv">kbd</span> <span class="s">"C-c &lt;tab&gt;"</span><span class="p">)</span> <span class="nf">#'</span><span class="nv">rust-format-buffer</span><span class="p">)))</span></code></pre></figure> <p><img src="/assets/images/rustfmt.gif" alt="rustfmt" /></p> <p>The <code class="highlighter-rouge">ìndent-buffer</code> function I mentioned if you ever need it:</p> <figure class="highlight"><pre><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="nb">defun</span> <span class="nv">indent-buffer</span> <span class="p">()</span> <span class="s">"Indent current buffer according to major mode."</span> <span class="p">(</span><span class="nv">interactive</span><span class="p">)</span> <span class="p">(</span><span class="nv">indent-region</span> <span class="p">(</span><span class="nv">point-min</span><span class="p">)</span> <span class="p">(</span><span class="nv">point-max</span><span class="p">)))</span></code></pre></figure> <h2 id="racer">racer</h2> <p><a href="https://github.com/phildawes/racer">Racer</a> is a code completion and source code navigation tool for Rust.</p> <p>Install the racer crate:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ cargo install racer</code></pre></figure> <p>Rust source code is needed for auto-completion so clone it somewhere:</p> <figure class="highlight"><pre><code class="language-shell" data-lang="shell">λ git clone git@github.com:rust-lang/rust.git</code></pre></figure> <p>To use racer within emacs, do a <code class="highlighter-rouge">M-x package-install racer</code> and set it up like:</p> <figure class="highlight"><pre><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="k">setq</span> <span class="nv">racer-cmd</span> <span class="s">"~/.cargo/bin/racer"</span><span class="p">)</span> <span class="c1">;; Rustup binaries PATH</span> <span class="p">(</span><span class="k">setq</span> <span class="nv">racer-rust-src-path</span> <span class="s">"/Users/julien/Code/rust/src"</span><span class="p">)</span> <span class="c1">;; Rust source code PATH</span> <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'rust-mode-hook</span> <span class="nf">#'</span><span class="nv">racer-mode</span><span class="p">)</span> <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'racer-mode-hook</span> <span class="nf">#'</span><span class="nv">eldoc-mode</span><span class="p">)</span> <span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'racer-mode-hook</span> <span class="nf">#'</span><span class="nv">company-mode</span><span class="p">)</span></code></pre></figure> <p>Note that <code class="highlighter-rouge">racer</code> relies on <a href="https://company-mode.github.io">company-mode</a> so install it if you haven’t.</p> <p><img src="/assets/images/racer.gif" alt="racer" /></p> <h2 id="flycheck-rust">flycheck-rust</h2> <p><a href="http://www.flycheck.org/en/latest/">flycheck</a> is my prefered solution for on the fly syntax checking. It will compile your code in background and highlight the problematic parts.</p> <p>Let’s <code class="highlighter-rouge">M-x package-install flycheck-rust</code> and then set it up like:</p> <figure class="highlight"><pre><code class="language-emacs-lisp" data-lang="emacs-lisp"><span class="p">(</span><span class="nv">add-hook</span> <span class="ss">'flycheck-mode-hook</span> <span class="nf">#'</span><span class="nv">flycheck-rust-setup</span><span class="p">)</span></code></pre></figure> <p><img src="/assets/images/flycheck.gif" alt="flycheck" /></p> <h1 id="wrapping-up">Wrapping up</h1> <p>That’s all, you now have some great Rust support in your emacs with syntax highlighting, cargo handling, code formatting, errors highlighting, code-completion and source navigation. Happy Rust hacking!</p> Sat, 14 May 2016 17:10:00 +0200 http://julienblanchard.com/2016/fancy-rust-development-with-emacs/ http://julienblanchard.com/2016/fancy-rust-development-with-emacs/ Rust on AWS Lambda <p><a href="http://aws.amazon.com/lambda/">AWS Lambda</a> is an amazing event-based compute service capable of running a function without worrying about the underlying infrastructure. Currently it supports Node.js, Java (and JVM based langs) &amp; Python. It’s a brilliant tool for micro-services.</p> <p>In this article I’ll show you how to run some Rust code on AWS Lambda even if Rust is not officially supported.</p> <h2 id="our-micro-service">Our micro-service</h2> <p>We will create a simple service that will determine if a string is a valid email address.</p> <p>Let’s start a new cargo project:</p> <div class="highlighter-rouge"><pre class="highlight"><code>λ cargo new email-checker --bin </code></pre> </div> <p>We will need the <code class="highlighter-rouge">regex</code> crate. In <code class="highlighter-rouge">Cargo.toml</code>:</p> <div class="language-toml highlighter-rouge"><pre class="highlight"><code><span class="nn">[dependencies]</span> <span class="py">regex</span> <span class="p">=</span> <span class="s">"0.1.41"</span> </code></pre> </div> <p>Then our service implementation in <code class="highlighter-rouge">src/main.rs</code>:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">extern</span> <span class="n">crate</span> <span class="n">regex</span><span class="p">;</span> <span class="k">use</span> <span class="nn">regex</span><span class="p">::</span><span class="n">Regex</span><span class="p">;</span> <span class="k">use</span> <span class="nn">std</span><span class="p">::</span><span class="n">env</span><span class="p">;</span> <span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Starting email-checker..."</span><span class="p">);</span> <span class="c">// Create an email regular expression</span> <span class="k">let</span> <span class="n">re</span> <span class="o">=</span> <span class="nn">Regex</span><span class="p">::</span><span class="nf">new</span><span class="p">(</span><span class="n">r</span><span class="s">"^</span><span class="err">\</span><span class="s">w+([-+.']</span><span class="err">\</span><span class="s">w+)*@</span><span class="err">\</span><span class="s">w+([-.]</span><span class="err">\</span><span class="s">w+)*</span><span class="err">\</span><span class="s">.</span><span class="err">\</span><span class="s">w+([-.]</span><span class="err">\</span><span class="s">w+)*$"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="c">// Match the first argument against the regular expression</span> <span class="k">match</span> <span class="nn">env</span><span class="p">::</span><span class="nf">args</span><span class="p">()</span><span class="nf">.nth</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span> <span class="c">// We have an argument</span> <span class="nf">Some</span><span class="p">(</span><span class="n">email</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="k">if</span> <span class="n">re</span><span class="nf">.is_match</span><span class="p">(</span><span class="o">&amp;</span><span class="n">email</span><span class="p">)</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"{} is a valid email."</span><span class="p">,</span> <span class="n">email</span><span class="p">);</span> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"{} is NOT a valid email."</span><span class="p">,</span> <span class="n">email</span><span class="p">);</span> <span class="p">}</span> <span class="p">}</span> <span class="c">// No argument provided</span> <span class="nb">None</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Please provide a string to test."</span><span class="p">);</span> <span class="k">return</span><span class="p">;</span> <span class="p">}</span> <span class="p">};</span> <span class="p">};</span> </code></pre> </div> <h2 id="generate-a-rust-binary">Generate a Rust binary</h2> <p>My machine is running OS X, AWS Lambda runs Linux. I tried to cross-compile a Linux binary on Darwin but that was too much of a hassle. In order to get the same environment as my lambda function will run on, I simply created an EC2 t2.micro instance to compile my code.</p> <p>Create an Amazon Linux EC2 instance, ssh onto it and run:</p> <div class="highlighter-rouge"><pre class="highlight"><code>λ sudo yum install git λ sudo yum groupinstall "Development Tools" </code></pre> </div> <p>to get a working development environment. Then clone your email-checker repo and run:</p> <div class="highlighter-rouge"><pre class="highlight"><code>λ cargo build --release λ cp target/release/email-checker ./email-checker-linux </code></pre> </div> <p>We now have a working Linux binary w00t! Commit and push the binary to your repo, you can terminate the instance.</p> <h2 id="the-nodejs-wrapper">The Node.js wrapper</h2> <p>Since Rust is not supported by AWS Lambda, we will write a simple Javascript module that will spawn a child process with our Rust binary. That’s the main trick of this article :). Note that we could ship a Haskell, Go, OCaml or whatever binary the same way.</p> <p>Let’s create a main.js at the root of our project:</p> <div class="language-javascript highlighter-rouge"><pre class="highlight"><code><span class="kd">var</span> <span class="nx">child_process</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">'child_process'</span><span class="p">);</span> <span class="nx">exports</span><span class="p">.</span><span class="nx">handler</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span><span class="nx">event</span><span class="p">,</span> <span class="nx">context</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// event is the JSON we provide to our lambda function. More on this later.</span> <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">event</span><span class="p">[</span><span class="s2">"email"</span><span class="p">]);</span> <span class="c1">// spawn a child process with our email-checker-linux binary and the event["email"] value for our argument.</span> <span class="kd">var</span> <span class="nx">proc</span> <span class="o">=</span> <span class="nx">child_process</span><span class="p">.</span><span class="nx">spawn</span><span class="p">(</span><span class="s1">'./email-checker-linux'</span><span class="p">,</span> <span class="p">[</span> <span class="nx">event</span><span class="p">[</span><span class="s2">"email"</span><span class="p">]</span> <span class="p">],</span> <span class="p">{</span> <span class="na">stdio</span><span class="p">:</span> <span class="s1">'inherit'</span> <span class="p">});</span> <span class="nx">proc</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">'close'</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">code</span><span class="p">)</span> <span class="p">{</span> <span class="k">if</span><span class="p">(</span><span class="nx">code</span> <span class="o">!==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="nx">context</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="k">new</span> <span class="nb">Error</span><span class="p">(</span><span class="s2">"Process exited with non-zero status code"</span><span class="p">));</span> <span class="p">}</span> <span class="nx">context</span><span class="p">.</span><span class="nx">done</span><span class="p">(</span><span class="kc">null</span><span class="p">);</span> <span class="p">});</span> <span class="p">}</span> </code></pre> </div> <h2 id="packaging-our-service">Packaging our service</h2> <p>In order to upload our code to AWS lambda, we just have to create a zip file containing our <code class="highlighter-rouge">main.js</code> and our <code class="highlighter-rouge">email-checker-linux</code> binary.</p> <h2 id="creating-a-lambda-function">Creating a lambda function</h2> <p>Log in to the AWS console, click on <code class="highlighter-rouge">Lambda</code> in the <code class="highlighter-rouge">Compute</code> section and click <code class="highlighter-rouge">Get started now</code>. We are then shown a list of lambda functions blueprints. We will not use a blueprint for our example so click <code class="highlighter-rouge">Skip</code>. Next we need to configure our lambda function.</p> <p>Fill in the name of the function, its description and choose the Node.js runtime.</p> <p><img src="/assets/images/lambda1.png" alt="Setup lambda function" /></p> <p>In the <code class="highlighter-rouge">Lambda function code</code> section, choose <code class="highlighter-rouge">Upload a .ZIP file</code> and upload the file we created previously.</p> <p>In <code class="highlighter-rouge">Lambda function handler and role</code>, use <code class="highlighter-rouge">main.handler</code> for the handler and choose the <code class="highlighter-rouge">Basic execution role</code>. This will open a popup prompting you to create a new <code class="highlighter-rouge">IAM Role</code>, just allow with the default settings.</p> <p><img src="/assets/images/lambda2.png" alt="Setup IAM role" style="width: 400px; display: block; margin-left: auto; margin-right: auto;" /></p> <p>Back on our function setup, leave the <code class="highlighter-rouge">Advanced settings</code> as is and click <code class="highlighter-rouge">Next</code>.</p> <p>Finally, we can review and create the function. Congratulations you created your first AWS Lambda function.</p> <h2 id="testing-our-lambda-function">Testing our lambda function</h2> <p>On the lambda function screen click <code class="highlighter-rouge">Actions</code> then <code class="highlighter-rouge">Configure test event</code>. Here we can write some JSON that will be received by our Node.js handler as the event parameter.</p> <div class="language-json highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w"> </span><span class="nt">"email"</span><span class="p">:</span><span class="w"> </span><span class="s2">"karl@marx.com"</span><span class="w"> </span><span class="p">}</span><span class="w"> </span></code></pre> </div> <p>Click <code class="highlighter-rouge">Save and test</code>. This will execute our lambda function. If you click <code class="highlighter-rouge">Monitoring</code>, you can see that we ran our function once.</p> <p><img src="/assets/images/lambda3.png" alt="Lambda monitoring" style="width: 200px; display: block; margin-left: auto; margin-right: auto;" /></p> <p>To view the result, click <code class="highlighter-rouge">View logs in CloudWatch</code>. We’re presented with a list of log lines.</p> <p><img src="/assets/images/lambda4.png" alt="Log lines" /></p> <p>Click the first line and boom <code class="highlighter-rouge">karl@marx.com</code> is indeed a valid email.</p> <p><img src="/assets/images/lambda5.png" alt="Lambda function result" /></p> <h2 id="what-can-we-do-from-here">What can we do from here?</h2> <p>Our email checking micro-service is still lacking an interface, we could use <a href="https://aws.amazon.com/api-gateway/">Amazon API gateway</a> to create a simple endpoint where we could POST the string we want to check and return a proper response for example.</p> <p>That’s it! We successfully ran some Rust code on AWS Lambda. Have fun Rustaceans :)</p> <p><em>You can find the full code and the Linux binary <a href="https://github.com/julienXX/email-checker">here</a>.</em></p> Tue, 17 Nov 2015 16:10:00 +0100 http://julienblanchard.com/2015/rust-on-aws-lambda/ http://julienblanchard.com/2015/rust-on-aws-lambda/ Using Resque with Rust <p><img src="/assets/images/workers.jpg" alt="Resque workers of the World, unite!" /></p> <p><em>Disclaimer: I’m not a Rust expert by any means so please tell me if there is something I can improve in the examples below. I’m not going to explain how Rust works. If you’re not familiar with it I highly encourage you to read <a href="https://doc.rust-lang.org/book/">the Rust Book</a></em></p> <p><a href="https://github.com/blog/542-introducing-resque">Resque</a> is a popular solution in the Ruby world to process background jobs. The great thing with it is the fact it uses Redis as a backend, making it easy to share jobs with workers written in other languages.</p> <p>In this article we’ll see how we can write a fully functional Resque worker in Rust. This will allow us to either use Resque entirely with Rust, enqueue a job in Ruby and perform it with Rust or vice versa.</p> <p>The full code for the following examples can be found <a href="https://github.com/julienXX/rust-resque-example">here</a>.</p> <h2 id="how-does-resque-work">How does Resque work?</h2> <p>Resque jobs are enqueued in a Redis list using the <code class="highlighter-rouge">RPUSH</code> command. A Resque job is represented internally with a JSON string containing two keys, one for the job class name and one for its arguments (or payload in Resque terms).</p> <div class="language-json highlighter-rouge"><pre class="highlight"><code><span class="p">{</span><span class="w"> </span><span class="err">'class':</span><span class="w"> </span><span class="err">'JobClass',</span><span class="w"> </span><span class="err">'args':</span><span class="w"> </span><span class="err">[</span><span class="w"> </span><span class="err">arg1,</span><span class="w"> </span><span class="err">arg2</span><span class="w"> </span><span class="err">]</span><span class="w"> </span><span class="p">}</span><span class="w"> </span></code></pre> </div> <p>Available queues are defined in a <code class="highlighter-rouge">resque:queues</code> <code class="highlighter-rouge">Redis SET</code> whose entries are the queue name like <code class="highlighter-rouge">some_queue_name</code>.</p> <p>Enqueueing a job is done by issueing a <code class="highlighter-rouge">RPUSH</code> command with a payload to some queue.</p> <p>Knowing that let’s enqueue our first job from Rust.</p> <h2 id="enqueing-a-resque-job">Enqueing a Resque job</h2> <p>Let’s pretend we need to enqueue a Resque job in order to send a confirmation email.</p> <p>First we need to start a new project with:</p> <div class="highlighter-rouge"><pre class="highlight"><code>λ cargo new rust-worker --bin </code></pre> </div> <p>First we will need to add some crates. In your Cargo.toml add:</p> <div class="language-toml highlighter-rouge"><pre class="highlight"><code><span class="nn">[dependencies]</span> <span class="py">rustc-serialize</span> <span class="p">=</span> <span class="s">"0.3.16"</span> <span class="nn">[dependencies.redis]</span> <span class="py">git</span> <span class="p">=</span> <span class="s">"https://github.com/mitsuhiko/redis-rs.git"</span> <span class="py">tag</span> <span class="p">=</span> <span class="s">"0.5.1"</span> </code></pre> </div> <p>Next let’s use those crates. In our main.rs:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">extern</span> <span class="n">crate</span> <span class="n">redis</span><span class="p">;</span> <span class="k">extern</span> <span class="n">crate</span> <span class="n">rustc_serialize</span><span class="p">;</span> <span class="k">use</span> <span class="nn">redis</span><span class="p">::</span><span class="n">Commands</span><span class="p">;</span> <span class="k">use</span> <span class="nn">rustc_serialize</span><span class="p">::</span><span class="n">Encodable</span><span class="p">;</span> <span class="k">use</span> <span class="nn">rustc_serialize</span><span class="p">::</span><span class="n">json</span><span class="p">;</span> </code></pre> </div> <p>For our example we need to define a Job struct with with two fields: a class that will be a String and args that will be a vector of Strings.</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="err">#</span><span class="p">[</span><span class="nf">derive</span><span class="p">(</span><span class="n">RustcEncodable</span><span class="p">,</span> <span class="n">Debug</span><span class="p">)]</span> <span class="k">pub</span> <span class="k">struct</span> <span class="n">Job</span> <span class="p">{</span> <span class="n">class</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span> <span class="n">args</span><span class="p">:</span> <span class="nb">Vec</span><span class="o">&lt;</span><span class="nb">String</span><span class="o">&gt;</span> <span class="p">}</span> </code></pre> </div> <p>This struct needs the <code class="highlighter-rouge">RustcEncodable</code> trait so that we can encode it in JSON and the <code class="highlighter-rouge">Debug</code> trait for printing purposes so we’ll derive them.</p> <p>Next, we will define an <code class="highlighter-rouge">enqueue</code> function that will take a <code class="highlighter-rouge">Job</code> as input and return a <code class="highlighter-rouge">Redis Result</code>:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">enqueue</span><span class="p">(</span><span class="n">job</span><span class="p">:</span> <span class="n">Job</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">redis</span><span class="p">::</span><span class="n">RedisResult</span><span class="o">&lt;</span><span class="n">Job</span><span class="o">&gt;</span> <span class="p">{</span> <span class="c">// Connect to a local Redis</span> <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="nd">try!</span><span class="p">(</span><span class="nn">redis</span><span class="p">::</span><span class="nn">Client</span><span class="p">::</span><span class="nf">open</span><span class="p">(</span><span class="s">"redis://127.0.0.1/"</span><span class="p">));</span> <span class="k">let</span> <span class="n">conn</span> <span class="o">=</span> <span class="nd">try!</span><span class="p">(</span><span class="n">client</span><span class="nf">.get_connection</span><span class="p">());</span> <span class="c">// Encode our Job in JSON</span> <span class="k">let</span> <span class="n">json_job</span> <span class="o">=</span> <span class="nn">json</span><span class="p">::</span><span class="nf">encode</span><span class="p">(</span><span class="o">&amp;</span><span class="n">job</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="c">// Add our queue in resque:queues Set</span> <span class="nd">try!</span><span class="p">(</span><span class="n">conn</span><span class="nf">.sadd</span><span class="p">(</span><span class="s">"resque:queues"</span><span class="p">,</span> <span class="s">"rust_test_queue"</span><span class="p">));</span> <span class="c">// Push our job in the resque:queue:rust_test_queue list</span> <span class="nd">try!</span><span class="p">(</span><span class="n">conn</span><span class="nf">.rpush</span><span class="p">(</span><span class="s">"resque:queue:rust_test_queue"</span><span class="p">,</span> <span class="n">json_job</span><span class="p">));</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Enqueued job: {:?}"</span><span class="p">,</span> <span class="n">job</span><span class="p">);</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">job</span><span class="p">)</span> <span class="p">}</span> </code></pre> </div> <p>Finally we create and enqueue a job in our main function:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="c">// Create a Job</span> <span class="k">let</span> <span class="n">job</span><span class="p">:</span> <span class="n">Job</span> <span class="o">=</span> <span class="n">Job</span> <span class="p">{</span> <span class="n">class</span><span class="p">:</span> <span class="s">"SignupEmail"</span><span class="nf">.to_owned</span><span class="p">(),</span> <span class="n">args</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="s">"user@example.com"</span><span class="nf">.to_owned</span><span class="p">()]</span> <span class="p">};</span> <span class="c">// Enqueue our job</span> <span class="k">match</span> <span class="nf">enqueue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span> <span class="p">{</span> <span class="nf">Ok</span><span class="p">(</span><span class="n">job</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Enqueued job: {:?}"</span><span class="p">,</span> <span class="n">job</span><span class="p">),</span> <span class="nf">Err</span><span class="p">(</span><span class="n">_</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="p">{</span> <span class="cm">/* handle failure here */</span> <span class="p">}</span> <span class="p">}</span> <span class="p">}</span> </code></pre> </div> <p><img src="http://i.imgbox.com/GmeAjSnN.png" alt="Resque screenshot" /></p> <p>Great! We successfully enqueued a job that can be performed through Resque.</p> <p>Now onto the perform part.</p> <h2 id="performing-a-resque-job">Performing a Resque job</h2> <p>A Resque worker will try to <code class="highlighter-rouge">reserve</code> a job by polling a queue with the <code class="highlighter-rouge">LPOP</code> command until it gets something to perform.</p> <p>Let’s implement that.</p> <p>We need a reserve function that will check if a job is present in a queue:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">reserve</span><span class="p">()</span> <span class="k">-&gt;</span> <span class="nn">redis</span><span class="p">::</span><span class="n">RedisResult</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"--: Checking rust_test_queue"</span><span class="p">);</span> <span class="c">// Connect to a local Redis</span> <span class="k">let</span> <span class="n">client</span> <span class="o">=</span> <span class="nd">try!</span><span class="p">(</span><span class="nn">redis</span><span class="p">::</span><span class="nn">Client</span><span class="p">::</span><span class="nf">open</span><span class="p">(</span><span class="s">"redis://127.0.0.1/"</span><span class="p">));</span> <span class="k">let</span> <span class="n">conn</span> <span class="o">=</span> <span class="nd">try!</span><span class="p">(</span><span class="n">client</span><span class="nf">.get_connection</span><span class="p">());</span> <span class="c">// Check if a job is present in the queue</span> <span class="k">let</span> <span class="n">res</span> <span class="o">=</span> <span class="n">conn</span><span class="nf">.lpop</span><span class="p">(</span><span class="s">"resque:queue:rust_test_queue"</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="c">// Perform the job or return</span> <span class="k">match</span> <span class="n">res</span> <span class="p">{</span> <span class="nf">Some</span><span class="p">(</span><span class="n">job</span><span class="p">)</span> <span class="k">=&gt;</span> <span class="nf">perform</span><span class="p">(</span><span class="n">job</span><span class="p">),</span> <span class="nb">None</span> <span class="k">=&gt;</span> <span class="k">return</span> <span class="nf">Ok</span><span class="p">(()),</span> <span class="p">}</span> <span class="p">}</span> </code></pre> </div> <p>We also need to have a function that waits a few seconds to mimic Resque behaviour:</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">wait_a_bit</span><span class="p">()</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"--: Sleeping for 5.0 seconds"</span><span class="p">);</span> <span class="nn">std</span><span class="p">::</span><span class="nn">thread</span><span class="p">::</span><span class="nf">sleep_ms</span><span class="p">(</span><span class="mi">5000</span><span class="p">);</span> <span class="p">}</span> </code></pre> </div> <p>In order to perform our job, we need to decode the JSON String retrieved from the Resque queue and then do something useful like sending an email in our case.</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">perform</span><span class="p">(</span><span class="n">json_job</span><span class="p">:</span> <span class="nb">String</span><span class="p">)</span> <span class="k">-&gt;</span> <span class="nn">redis</span><span class="p">::</span><span class="n">RedisResult</span><span class="o">&lt;</span><span class="p">()</span><span class="o">&gt;</span> <span class="p">{</span> <span class="nd">println!</span><span class="p">(</span><span class="s">"Found job: {:?}"</span><span class="p">,</span> <span class="n">json_job</span><span class="p">);</span> <span class="c">// Decode JSON</span> <span class="k">let</span> <span class="n">job</span><span class="p">:</span> <span class="n">Job</span> <span class="o">=</span> <span class="nn">json</span><span class="p">::</span><span class="nf">decode</span><span class="p">(</span><span class="o">&amp;*</span><span class="n">json_job</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="c">// Send our email with something like:</span> <span class="c">// send_email(job.args.first());</span> <span class="c">// not implemented here.</span> <span class="nf">Ok</span><span class="p">(())</span> <span class="p">}</span> </code></pre> </div> <p>Our Job struct must derive the <code class="highlighter-rouge">RustcDecodable</code> trait to be decodable. I’m decoding <code class="highlighter-rouge">&amp;*json_job</code> since <code class="highlighter-rouge">json::decode</code> expects a <code class="highlighter-rouge">&amp;str</code> and not a <code class="highlighter-rouge">String</code>.</p> <p>Now let’s update our <code class="highlighter-rouge">main()</code> function to enqueue a job, perform it and wait for other jobs to come.</p> <div class="language-rust highlighter-rouge"><pre class="highlight"><code><span class="k">fn</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span> <span class="k">let</span> <span class="n">job</span><span class="p">:</span> <span class="n">Job</span> <span class="o">=</span> <span class="n">Job</span> <span class="p">{</span> <span class="n">class</span><span class="p">:</span> <span class="s">"SignupEmail"</span><span class="nf">.to_owned</span><span class="p">(),</span> <span class="n">args</span><span class="p">:</span> <span class="nd">vec!</span><span class="p">[</span><span class="s">"user@example.com"</span><span class="nf">.to_owned</span><span class="p">()]</span> <span class="p">};</span> <span class="nf">enqueue</span><span class="p">(</span><span class="n">job</span><span class="p">)</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="k">loop</span> <span class="p">{</span> <span class="nf">reserve</span><span class="p">()</span><span class="nf">.unwrap</span><span class="p">();</span> <span class="nf">wait_a_bit</span><span class="p">();</span> <span class="p">}</span> <span class="p">}</span> </code></pre> </div> <p>Time to try our worker.</p> <div class="language-console highlighter-rouge"><pre class="highlight"><code>λ cargo build Compiling rust-resque-example v0.1.0 (file:///Users/julien/Code/rust-resque-example) λ cargo run Running `target/debug/rust-resque-example` Enqueued job: Job { class: "SignupEmail", args: ["user@example.com"] } --: Checking rust_test_queue Found job: Job { class: "SignupEmail", args: ["user@example.com"] } --: Checking rust_test_queue --: Sleeping for 5.0 seconds --: Checking rust_test_queue --: Sleeping for 5.0 seconds </code></pre> </div> <p>And it works! We successfully enqueued and performed a job in Resque from Rust.</p> <h2 id="whats-missing">What’s missing?</h2> <p>Our implementation still needs to be Resque web compatible (display workers, failed jobs…). It also needs to be deployed alongside our Ruby workers but that’s for another article :)</p> <p><em>Thanks a lot to the reviewers: Flavien, Marc, Steve &amp; Yohan.</em></p> Thu, 29 Oct 2015 15:30:00 +0100 http://julienblanchard.com/2015/using-resque-with-rust/ http://julienblanchard.com/2015/using-resque-with-rust/ How I upgraded my Ruby with Contracts <p>Toying with many languages made me discover new approaches and techniques. For example, Haskell taught me about <a href="http://learnyouahaskell.com/making-our-own-types-and-typeclasses">Types</a> and Erlang/Elixir enlightened me on <a href="http://learnyousomeerlang.com/syntax-in-functions">Pattern-matching</a>.</p> <p>Professionally I mainly code with Ruby and I dreamed of having an advanced type system and some pattern-matching. I discovered this brilliant gem <a href="https://github.com/egonSchiele/contracts.ruby">Contracts.ruby</a> by <a href="http://adit.io">Aditya Bhargava</a> and in this article I will try to present <a href="https://en.wikipedia.org/wiki/Design_by_contract">Design by Contracts</a> through the use of this gem.</p> <h2 id="what-is-a-contract">What is a contract?</h2> <p>A contract ensures what kind of input a method expects (pre-condition), what it outputs (post-condition). It will define how our method behaves but also check its behavior.</p> <p>The gem <code class="highlighter-rouge">Contracts.ruby</code> allows us to decorate our methods with code that will check that the inputs and outputs correspond to what the contract specifies. Of course, one is not obliged to annotate each method but I think that specifying a contract for your public API can only be beneficial.</p> <h2 id="a-first-example">A first example</h2> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">Num</span><span class="p">,</span> <span class="no">Num</span> <span class="o">=&gt;</span> <span class="no">Num</span> <span class="k">def</span> <span class="nf">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="k">end</span> </code></pre> </div> <p>The contract of my method is <strong>Contract Num Num =&gt; Num</strong>, meaning that the <em>add</em> method takes two numbers as input and returns a number. Simple, right?</p> <p>You will object that ok, it’s documentation, I could just add a comment. But since this is a contract, the Contracts.ruby gem will help ensure that it is respected.</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="nb">require</span> <span class="s1">'contracts'</span> <span class="k">class</span> <span class="nc">Foo</span> <span class="kp">include</span> <span class="no">Contracts</span> <span class="no">Contract</span> <span class="no">Num</span><span class="p">,</span> <span class="no">Num</span> <span class="o">=&gt;</span> <span class="no">Num</span> <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">add</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="k">end</span> <span class="k">end</span> </code></pre> </div> <p><em>Foo.add(1, 2)</em> obviously returns 3 but <em>Foo.add(1, ‘2’)</em> will return:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">ParamContractError</span><span class="p">:</span> <span class="no">Contract</span> <span class="n">violation</span> <span class="k">for</span> <span class="n">argument</span> <span class="mi">2</span> <span class="n">of</span> <span class="mi">2</span><span class="p">:</span> <span class="no">Expected</span><span class="p">:</span> <span class="no">Num</span><span class="p">,</span> <span class="no">Actual</span><span class="p">:</span> <span class="s2">"2"</span> <span class="no">Value</span> <span class="n">guarded</span> <span class="ss">in: </span><span class="no">Foo</span><span class="o">::</span><span class="n">add</span> <span class="no">With</span> <span class="no">Contract</span><span class="p">:</span> <span class="no">Num</span><span class="p">,</span> <span class="no">Num</span> <span class="o">=&gt;</span> <span class="no">Num</span> </code></pre> </div> <p>The error highlights that the contract of the method <em>add</em> wasn’t respected because the second parameter we sent, ‘2’, isn’t of the type <em>Num</em>.</p> <p>Note that you must always specify the type of the value returned even if the method does not return anything:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">String</span> <span class="o">=&gt;</span> <span class="kp">nil</span> <span class="k">def</span> <span class="nf">hello</span><span class="p">(</span><span class="nb">name</span><span class="p">)</span> <span class="nb">puts</span> <span class="s2">"hello, </span><span class="si">#{</span><span class="nb">name</span><span class="si">}</span><span class="s2">!"</span> <span class="k">end</span> </code></pre> </div> <p>If our method returns many values, its signature will be</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">Num</span> <span class="o">=&gt;</span> <span class="p">[</span><span class="no">Num</span><span class="p">,</span> <span class="no">Num</span><span class="p">]</span> </code></pre> </div> <h2 id="types-at-our-disposal">Types at our disposal</h2> <p>Besides the classics <strong>Num</strong>, <strong>String</strong>, <strong>Bool</strong>, we can use more interesting types like:</p> <ul> <li><strong>Any</strong> when we have no type constraint</li> <li><strong>None</strong> when you need no argument</li> <li><strong>Or</strong> if our argument can be of different types, for example <strong>Or[Fixnum, Float]</strong></li> <li><strong>Not</strong> if our argument can’t be of a certain type, like <strong>Not[nil]</strong></li> <li><strong>Maybe</strong> if our argument is optionnal, example <strong>Maybe[String]</strong></li> </ul> <p>And many others that you will discover in the documentation.</p> <h2 id="advanced-types-contracts">Advanced Types Contracts</h2> <p>We can use contracts with advanced types like lists:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">ArrayOf</span><span class="p">[</span><span class="no">Num</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="no">Num</span> <span class="k">def</span> <span class="nf">multiply</span><span class="p">(</span><span class="n">vals</span><span class="p">)</span> <span class="n">vals</span><span class="p">.</span><span class="nf">reduce</span><span class="p">(:</span><span class="o">*</span><span class="p">)</span> <span class="k">end</span> </code></pre> </div> <p>The contract of <em>multiply</em> method indicates that it wants a list of values of the type Num. Therefore <em>multiply([2, 4, 16])</em> is valid but <em>multiply([2, 4, ‘foo’])</em> is not.</p> <p>Hashes:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="p">({</span> <span class="ss">nom: </span><span class="no">String</span><span class="p">,</span> <span class="ss">age: </span><span class="no">Num</span><span class="p">,</span> <span class="ss">ville: </span><span class="no">String</span> <span class="p">})</span> <span class="o">=&gt;</span> <span class="kp">nil</span> </code></pre> </div> <p>Methods:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">ArrayOf</span><span class="p">[</span><span class="no">Any</span><span class="p">],</span> <span class="no">Proc</span> <span class="o">=&gt;</span> <span class="no">ArrayOf</span><span class="p">[</span><span class="no">Any</span><span class="p">]</span> </code></pre> </div> <p>If you use Ruby 2.x keyword arguments, the contract will look like:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="no">KeywordArgs</span><span class="p">[</span><span class="ss">foo: </span><span class="no">String</span><span class="p">,</span> <span class="ss">bar: </span><span class="no">Num</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="no">String</span> </code></pre> </div> <p>We can also define our own contracts with <em>synonyms</em>:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Token</span> <span class="o">=</span> <span class="no">String</span> <span class="no">Client</span> <span class="o">=</span> <span class="no">Or</span><span class="p">[</span><span class="no">Hash</span><span class="p">,</span> <span class="kp">nil</span><span class="p">]</span> <span class="no">Contract</span> <span class="no">Token</span> <span class="o">=&gt;</span> <span class="no">Client</span> <span class="k">def</span> <span class="nf">authenticate</span><span class="p">(</span><span class="n">token</span><span class="p">)</span> </code></pre> </div> <p>Our <em>authenticate</em> method is thus more clear as to what it expects and what it does. A <em>Token</em> of type <em>String</em> is desired as input and it returns a <em>Client</em> which can be a <em>Hash</em> or nothing (nil).</p> <h2 id="pattern-matching">Pattern-matching</h2> <p>Pattern-matching will, for a given value, test if it matches a pattern or not. If this is the case an action is triggered. It’s a bit like Java method overloading. One could imagine it as a giant switch case but much more elegant.</p> <p>A simple example with calculation (not effective at all) of the Fibonacci sequence:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="mi">0</span> <span class="o">=&gt;</span> <span class="mi">0</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="mi">0</span> <span class="k">end</span> <span class="no">Contract</span> <span class="mi">1</span> <span class="o">=&gt;</span> <span class="mi">1</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="mi">1</span> <span class="k">end</span> <span class="no">Contract</span> <span class="no">Num</span> <span class="o">=&gt;</span> <span class="no">Num</span> <span class="k">def</span> <span class="nf">fib</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">fib</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="k">end</span> </code></pre> </div> <p>For a given argument, each method will be tried in order. The first method that does not generate an error will be used.</p> <p>A little more real-world™ example, the management of an HTTP response based on its status code:</p> <div class="language-ruby highlighter-rouge"><pre class="highlight"><code><span class="no">Contract</span> <span class="mi">200</span><span class="p">,</span> <span class="no">JsonString</span> <span class="o">=&gt;</span> <span class="no">JsonString</span> <span class="k">def</span> <span class="nf">handle_response</span><span class="p">(</span><span class="n">status</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span> <span class="n">transform_response</span><span class="p">(</span><span class="n">response</span><span class="p">)</span> <span class="k">end</span> <span class="no">Contract</span> <span class="no">Num</span><span class="p">,</span> <span class="no">JsonString</span> <span class="o">=&gt;</span> <span class="no">JsonString</span> <span class="k">def</span> <span class="nf">handle_response</span><span class="p">(</span><span class="n">status</span><span class="p">,</span> <span class="n">response</span><span class="p">)</span> <span class="n">response</span> <span class="k">end</span> </code></pre> </div> <p>If the HTTP response code is 200 it will transform the answer, otherwise we will simply return the response.</p> <h2 id="conclusion">Conclusion</h2> <p>There are many benefits. Contracts allow us to have greater consistency in our inputs and outputs. The flow of data in our system is clearer. And most the type errors of our system can be detected and fixed quickly. Additionally it’s easier to understand what a method does, needs and returns. It also provides some kind of documentation that would always be up to date :p.</p> <p>I think we can thus save a lot of unit tests on the type of the argument(s) received by a method and focus on what it produces with this contract system. Refactoring also becomes a lot easier with this kind of safety.</p> <p>I hope this article has convinced you of the value of contracts and pattern-matching in your daily Ruby and also gave you the urge to explore other languages ​​with other paradigms.</p> Mon, 13 Jul 2015 19:18:00 +0200 http://julienblanchard.com/2015/contracts-with-ruby/ http://julienblanchard.com/2015/contracts-with-ruby/