<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Training on jub0bs.com</title>
    <link>//jub0bs.com/training/</link>
    <description>Recent content in Training on jub0bs.com</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <copyright>&lt;a href=&#34;https://creativecommons.org/licenses/by-nc/4.0/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;CC BY-NC 4.0&lt;/a&gt;</copyright>
    <lastBuildDate>Fri, 10 Apr 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="//jub0bs.com/training/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Generics and iterators in Go</title>
      <link>//jub0bs.com/training/generics-and-iterators-in-go/</link>
      <pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate>
      <guid>//jub0bs.com/training/generics-and-iterators-in-go/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://go.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;//jub0bs.com/images/go-logo-blue.svg&#34; alt=&#34;logo&#34; title=&#34;Go&#39;s logo&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This course serves as an introduction to generics and iterators, two closely&#xA;related features of &lt;a href=&#34;https://go.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;the Go programming language&lt;/a&gt;. Generics hold the&#xA;promise efficient and reusable data structures and functions without&#xA;sacrificing correctness. As for iterators, which are built on generics, they&#xA;promote flexibility and performance.&lt;/p&gt;&#xA;&lt;h2 id=&#34;duration&#34;&gt;Duration &lt;a href=&#34;#duration&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;2 days (14 hours)&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites &lt;a href=&#34;#prerequisites&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Fluency in English&lt;/li&gt;&#xA;&lt;li&gt;Experience with Go and a good understanding of functions, interfaces, and methods&lt;/li&gt;&#xA;&lt;li&gt;A basic knowledge of Git&lt;/li&gt;&#xA;&lt;li&gt;A personal computer (preferably running macOS or Linux) on which the&#xA;following tools have been installed (ahead of the course):&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Go 1.26+&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Visual Studio Code&lt;/a&gt; and its &lt;a href=&#34;https://code.visualstudio.com/docs/languages/go&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go extension&lt;/a&gt;, or your&#xA;preferred IDE or text editor&lt;/li&gt;&#xA;&lt;li&gt;Git&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;A stable Internet connection&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;outline&#34;&gt;Outline &lt;a href=&#34;#outline&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;h3 id=&#34;day-1-generics&#34;&gt;Day 1: Generics &lt;a href=&#34;#day-1-generics&#34;&gt;¶&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Preamble&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Generics (a.k.a. parametric polymorphism)&lt;/li&gt;&#xA;&lt;li&gt;Use cases for generics&lt;/li&gt;&#xA;&lt;li&gt;A brief history of the advent of generics in Go&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Type parameters&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Syntax&lt;/li&gt;&#xA;&lt;li&gt;Naming conventions&lt;/li&gt;&#xA;&lt;li&gt;Type arguments and instantiation&lt;/li&gt;&#xA;&lt;li&gt;Type inference&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generic functions&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Syntax&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;slices&lt;/code&gt; and &lt;code&gt;maps&lt;/code&gt; packages&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generic types&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Syntax&lt;/li&gt;&#xA;&lt;li&gt;Methods of generic types&lt;/li&gt;&#xA;&lt;li&gt;Current restrictions on methods of generic types&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Generic type aliases&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Refresher about type aliases&lt;/li&gt;&#xA;&lt;li&gt;Syntax&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Type constraints&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A kind of meta-type expressed as interfaces&lt;/li&gt;&#xA;&lt;li&gt;Interfaces viewed as a set of types&lt;/li&gt;&#xA;&lt;li&gt;The predefined &lt;code&gt;any&lt;/code&gt; type constraint&lt;/li&gt;&#xA;&lt;li&gt;The predefined &lt;code&gt;comparable&lt;/code&gt; type constraint&lt;/li&gt;&#xA;&lt;li&gt;Beware of comparable types composed of values for which equality is non-reflexive&lt;/li&gt;&#xA;&lt;li&gt;Type union&lt;/li&gt;&#xA;&lt;li&gt;Set of types based on a common underlying type (e.g. &lt;code&gt;~string&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;cmp&lt;/code&gt; package and the &lt;code&gt;cmp.Ordered&lt;/code&gt; type constraint&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;golang.org/x/exp/constraints&lt;/code&gt; package&lt;/li&gt;&#xA;&lt;li&gt;Restrictions on type constraints&lt;/li&gt;&#xA;&lt;li&gt;To constrain or not to constrain: that is the question&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Advanced techniques&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pointer-type constraints&lt;/li&gt;&#xA;&lt;li&gt;Recursive type constraints&lt;/li&gt;&#xA;&lt;li&gt;Phantom types&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;When not to use generics&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Alternative approaches: reflectionm, code generation&lt;/li&gt;&#xA;&lt;li&gt;A case study of generics abuse&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning resources&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Labs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Concurrent programming in Go</title>
      <link>//jub0bs.com/training/concurrent-programming-in-go/</link>
      <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate>
      <guid>//jub0bs.com/training/concurrent-programming-in-go/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://go.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;//jub0bs.com/images/go-logo-blue.svg&#34; alt=&#34;logo&#34; title=&#34;Go&#39;s logo&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This short course (recently refreshed for &lt;a href=&#34;https://tip.golang.org/doc/go1.26&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go 1.26&lt;/a&gt;) aims at&#xA;demystifying Go&amp;rsquo;s main concurrency features: goroutines, channels, mutexes,&#xA;select statements, and contexts.  Through a series of practical exercises,&#xA;you&amp;rsquo;ll learn how to use concurrency to your advantage and avoid its many&#xA;pitfalls.&lt;/p&gt;&#xA;&lt;h2 id=&#34;duration&#34;&gt;Duration &lt;a href=&#34;#duration&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;p&gt;1 day (7 hours)&lt;/p&gt;&#xA;&lt;h2 id=&#34;prerequisites&#34;&gt;Prerequisites &lt;a href=&#34;#prerequisites&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Fluency in English&lt;/li&gt;&#xA;&lt;li&gt;Experience with the basics of Go but not necessarily with its concurrency features&lt;/li&gt;&#xA;&lt;li&gt;A basic knowledge of Git&lt;/li&gt;&#xA;&lt;li&gt;A personal computer (preferably running macOS or Linux) on which the following tools have been installed (ahead of the course):&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Go 1.26+&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://code.visualstudio.com/&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Visual Studio Code&lt;/a&gt; and its &lt;a href=&#34;https://code.visualstudio.com/docs/languages/go&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go extension&lt;/a&gt;, or your preferred IDE or text editor&lt;/li&gt;&#xA;&lt;li&gt;Git&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;A stable Internet connection&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;outline&#34;&gt;Outline &lt;a href=&#34;#outline&#34;&gt;¶&lt;/a&gt;&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Presentation of the namecheck project&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;namecheck: a CLI tool for checking the validity and availability of usernames on social media (GitHub, Reddit, etc.)&lt;/li&gt;&#xA;&lt;li&gt;Motivations for developing such a tool&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Introduction to concurrency&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Concurrency: the art of composing a program in order to delineate independent tasks&lt;/li&gt;&#xA;&lt;li&gt;Concurrency vs. parallelism: close but distinct&lt;/li&gt;&#xA;&lt;li&gt;Concurrency enables parallelism and promises free performance gains as the number of cores increases&lt;/li&gt;&#xA;&lt;li&gt;Amdahl&amp;rsquo;s law and Gunther&amp;rsquo;s law: parallelism&amp;rsquo;s diminishing returns&lt;/li&gt;&#xA;&lt;li&gt;Go&amp;rsquo;s concurrency trifecta: goroutines, channels, et &lt;code&gt;select&lt;/code&gt; statements&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goroutines&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Goroutines: featherweight threads&lt;/li&gt;&#xA;&lt;li&gt;The Go scheduler&lt;/li&gt;&#xA;&lt;li&gt;Starting goroutines with the &lt;code&gt;go&lt;/code&gt; keyword&lt;/li&gt;&#xA;&lt;li&gt;The golden rule: don&amp;rsquo;t start a goroutine if you can&amp;rsquo;t explain when it will terminate&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;main&lt;/code&gt; function doesn&amp;rsquo;t wait for other goroutines to terminate&lt;/li&gt;&#xA;&lt;li&gt;Wait groups&lt;/li&gt;&#xA;&lt;li&gt;Synchronization bugs and race conditions&lt;/li&gt;&#xA;&lt;li&gt;Concurrency safety&lt;/li&gt;&#xA;&lt;li&gt;Data races&lt;/li&gt;&#xA;&lt;li&gt;Race detector&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Channels&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Shared-memory concurrency vs. message-passing concurrency&lt;/li&gt;&#xA;&lt;li&gt;Share memory by communicating&lt;/li&gt;&#xA;&lt;li&gt;Channels: the preferred mechanism for communicating between goroutines&lt;/li&gt;&#xA;&lt;li&gt;Naming conventions&lt;/li&gt;&#xA;&lt;li&gt;Channels are values just like any other&lt;/li&gt;&#xA;&lt;li&gt;The zero value of channel types&lt;/li&gt;&#xA;&lt;li&gt;Initializing a channel via the &lt;code&gt;make&lt;/code&gt; builtin&lt;/li&gt;&#xA;&lt;li&gt;Capacity of a channel&lt;/li&gt;&#xA;&lt;li&gt;Channels are FIFO&lt;/li&gt;&#xA;&lt;li&gt;On the importance of choosing a channel&amp;rsquo;s capacity judiciously&lt;/li&gt;&#xA;&lt;li&gt;Sending a value to a channel&lt;/li&gt;&#xA;&lt;li&gt;Receiving a value from a channel&lt;/li&gt;&#xA;&lt;li&gt;Lifting ambiguity at receiption with the comma-ok idiom&lt;/li&gt;&#xA;&lt;li&gt;Deadlock&lt;/li&gt;&#xA;&lt;li&gt;Goroutine leak&lt;/li&gt;&#xA;&lt;li&gt;Closing a channel&lt;/li&gt;&#xA;&lt;li&gt;Good and bad reasons to close a channel&lt;/li&gt;&#xA;&lt;li&gt;Ranging over a channel&lt;/li&gt;&#xA;&lt;li&gt;Directional channels&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;HTTP server&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Introduction to the net/http package&lt;/li&gt;&#xA;&lt;li&gt;A simple &amp;ldquo;Hello, World!&amp;rdquo; server&lt;/li&gt;&#xA;&lt;li&gt;What about Web frameworks?&lt;/li&gt;&#xA;&lt;li&gt;Beware: handlers are invoked concurrently&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;A short detour in the land of shared-memory concurrency&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Communicating by sharing memory&lt;/li&gt;&#xA;&lt;li&gt;Mutexes and critical sections&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;sync.Mutex&lt;/code&gt; type&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Select statements&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Multiplexing channel communications&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;select&lt;/code&gt; keyword&lt;/li&gt;&#xA;&lt;li&gt;Event loop: a &lt;code&gt;select&lt;/code&gt; statement nested in a loop&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Canceling goroutines&lt;/strong&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The need to force goroutines to terminate&lt;/li&gt;&#xA;&lt;li&gt;Emit and detect a cancellation signal: the basic technique&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;context.Context&lt;/code&gt; type&lt;/li&gt;&#xA;&lt;li&gt;Emit and detect a cancellation signal: the modern approach&lt;/li&gt;&#xA;&lt;li&gt;Cancelable channel send&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;context.Background()&lt;/code&gt; and &lt;code&gt;context.TODO()&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Deriving contexts&lt;/li&gt;&#xA;&lt;li&gt;Cancellation signals propagate down the tree of contexts&lt;/li&gt;&#xA;&lt;li&gt;Embrace &amp;ldquo;cancel culture&amp;rdquo;: design most of your functions as cancelable&lt;/li&gt;&#xA;&lt;li&gt;Contexts on the client side and on the (Web) server side&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Learning resources&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Labs:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to Web security</title>
      <link>//jub0bs.com/training/websec/</link>
      <pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate>
      <guid>//jub0bs.com/training/websec/</guid>
      <description>&lt;p&gt;Under construction&lt;/p&gt;</description>
    </item>
    <item>
      <title>Introduction to Go</title>
      <link>//jub0bs.com/training/introduction-to-go/</link>
      <pubDate>Wed, 08 Apr 2026 00:00:00 +0000</pubDate>
      <guid>//jub0bs.com/training/introduction-to-go/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://go.dev&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;&lt;img src=&#34;//jub0bs.com/images/go-logo-blue.svg&#34; alt=&#34;logo&#34; title=&#34;Go&#39;s logo&#34;&gt;&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;If you have programming experience with another language and would like to get&#xA;started with Go, look no further than this course (recently refreshed for &lt;a href=&#34;https://tip.golang.org/doc/go1.26&#34; target=&#34;_blank&#34; rel=&#34;noopener&#34;&gt;Go&#xA;1.26&lt;/a&gt;).  Covering basic syntax, object orientation, and concurrency&#xA;fundamentals, it promises to set you on a path to proficiency with the Go&#xA;programming language.  Far from being merely theoretical, the course is&#xA;punctuated by practical exercices aiming at iteratively improving a CLI tool&#xA;ultimately turned into a small Web application.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
