<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Rob Baruch on CyberSpy</title>
    <link>https://cyberspy.io/author/rob-baruch/</link>
    <description>Recent content in Rob Baruch on CyberSpy</description>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Mon, 29 Dec 2025 09:00:00 +0000</lastBuildDate>
    <atom:link href="https://cyberspy.io/author/rob-baruch/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>The Sound of Silence</title>
      <link>https://cyberspy.io/articles/yne/</link>
      <pubDate>Mon, 29 Dec 2025 09:00:00 +0000</pubDate>
      <guid>https://cyberspy.io/articles/yne/</guid>
      <description>&lt;h3 id=&#34;happy-new-year-2026-almost-three-years-of-silence&#34;&gt;Happy New Year 2026! Almost Three Years of Silence&lt;/h3&gt;&#xA;&lt;p&gt;so, i&amp;rsquo;ve been tardy. What&amp;rsquo;s happenned over the last three years that seem to be remarkable? The most natural thing to do is ask an LLM. Let&amp;rsquo;s let it co-author (a markdown file no less) summarizing the most relevant events of the last three years. Here goes!&lt;/p&gt;&#xA;&lt;h1 id=&#34;the-last-three-years-in-review-20232025&#34;&gt;The Last Three Years in Review (2023–2025)&lt;/h1&gt;&#xA;&lt;h3 id=&#34;a-technical-scientific-and-geopolitical-timeline&#34;&gt;A Technical, Scientific, and Geopolitical Timeline&lt;/h3&gt;&#xA;&lt;p&gt;The past three years have been unusually dense with change. Advances in artificial intelligence, renewed great-power competition, supply-chain realignments, and breakthroughs in science have all reshaped how societies operate—and how technologists build systems.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Liquid Soap better than dirty Ice (DarkIce)</title>
      <link>https://cyberspy.io/articles/liquidsoap/</link>
      <pubDate>Fri, 10 Nov 2023 09:00:00 +0000</pubDate>
      <guid>https://cyberspy.io/articles/liquidsoap/</guid>
      <description>&lt;h2 id=&#34;darkice-bugs-are-enough-time-to-soap-up&#34;&gt;DarkIce bugs are Enough! Time to Soap Up&lt;/h2&gt;&#xA;&lt;p&gt;So, over the years, I&amp;rsquo;ve maintained a &lt;code&gt;DarkIce&lt;/code&gt; stream for &lt;code&gt;Icecast2&lt;/code&gt; audio server. Mostly, I do this for DMR radio that I want to stream from my &lt;em&gt;Anytone 878&lt;/em&gt; handset. The challenge is the code is not maintained and is buggy. Configuration is less than desirable as well. So after finally deciding enough was enough (one can only restart a failed daemon so many times), I bit the bullet and went on the hunt for alternatives.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NFC Tagboard - Using NFC Tags, Grafana, and Docker</title>
      <link>https://cyberspy.io/articles/nfctag/</link>
      <pubDate>Sun, 05 Dec 2021 12:26:21 -0400</pubDate>
      <guid>https://cyberspy.io/articles/nfctag/</guid>
      <description>&lt;h2 id=&#34;nfc-tags---tracking--tasks-last-completed&#34;&gt;NFC Tags - Tracking  tasks last completed&lt;/h2&gt;&#xA;&lt;p&gt;Trying to track when you last completed a long-dated task can be challenging. Writing them on a calendar makes for difficult searching. Heavy apps are overkill. So what&amp;rsquo;s a person to do? A simple soltution - use NFC tags which are pre-loaded with custom JSON, drop a little golang server, and Docker persistance with MySQL, along with a Grafana UI to easily manage tracking of tasks.&lt;/p&gt;</description>
    </item>
    <item>
      <title>I&#39;m Back!!! Diving into Rust!</title>
      <link>https://cyberspy.io/articles/imback/</link>
      <pubDate>Mon, 26 Apr 2021 12:26:21 -0400</pubDate>
      <guid>https://cyberspy.io/articles/imback/</guid>
      <description>&lt;h2 id=&#34;noobie-to-rust-lets-get-started&#34;&gt;Noobie to Rust? Let&amp;rsquo;s get started!!&lt;/h2&gt;&#xA;&lt;p&gt;So you want to get into &lt;a href=&#34;https://www.rust-lang.org&#34;&gt;rust&lt;/a&gt;? Sure, why not. Let&amp;rsquo;s do it.&lt;/p&gt;&#xA;&lt;h3 id=&#34;the-setup&#34;&gt;The setup&lt;/h3&gt;&#xA;&lt;p&gt;Assuming you&amp;rsquo;re on a &lt;a href=&#34;https://apple.com&#34;&gt;Mac&lt;/a&gt;, let&amp;rsquo;s get &lt;strong&gt;rust&lt;/strong&gt; up and running so you&amp;rsquo;re ready to rip into learning the language. We&amp;rsquo;ll use &lt;a href=&#34;https://rustup.rs&#34;&gt;rustup&lt;/a&gt; to install rust. This is the best way to manage your rust environment and toolchain. Not only can you manage toolchains using &lt;code&gt;rustup&lt;/code&gt;, but also add-in components to make the experience a lot more enjoyable. More on that later. Not only will &lt;code&gt;rustup&lt;/code&gt; install rust for you, but it will also be useful for maintaining the latest versions of rust. Rust has several toolchains, and using &lt;code&gt;rustup&lt;/code&gt; will make maintaining them a whole lot easier.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Getting func(y) with Channels</title>
      <link>https://cyberspy.io/code/channelfuncs/</link>
      <pubDate>Tue, 10 Dec 2019 09:55:44 -0500</pubDate>
      <guid>https://cyberspy.io/code/channelfuncs/</guid>
      <description>&lt;h2 id=&#34;heres-a-little-golang-puzzle&#34;&gt;Here&amp;rsquo;s a little golang puzzle&lt;/h2&gt;&#xA;&lt;p&gt;Take a look at the function below that computes a mystery value for the function $f(x)$. Any idea what the function is? Take a close look at the first line where we create a channel. Notice that the channel isn&amp;rsquo;t some boring &lt;code&gt;int&lt;/code&gt; or &lt;code&gt;string&lt;/code&gt; channel. No, this is a channel of type &lt;code&gt;func(int, chan int, chan bool)&lt;/code&gt;. Wait what??? That&amp;rsquo;s right, this channel takes a function that takes an integer and two channels as function parameters. We define such a function, &lt;code&gt;x&lt;/code&gt;, right aftewards.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OS X VPN client pppd host route configuration on post-interface connection</title>
      <link>https://cyberspy.io/articles/pppdup/</link>
      <pubDate>Wed, 20 Nov 2019 11:42:17 -0500</pubDate>
      <guid>https://cyberspy.io/articles/pppdup/</guid>
      <description>&lt;h3 id=&#34;vpn-client-ppp-daemon-configuration&#34;&gt;VPN Client PPP daemon configuration&lt;/h3&gt;&#xA;&lt;p&gt;&lt;em&gt;Recipe&lt;/em&gt;: Configure Default Host routes after a specific VPN connection has been established&lt;/p&gt;&#xA;&lt;p&gt;&lt;em&gt;Solution&lt;/em&gt;:&lt;/p&gt;&#xA;&lt;p&gt;In order to configure the host (or network routes, although I&amp;rsquo;m solely interested in routing specific hosts&#xA;between my two sites),  we need to create a file with the following commands in &lt;code&gt;/etc/ppp&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;#!/bin/sh&#xA;&#xA;# VPN_GATEWAY is the remote address of the vpn tunnel&#xA;# when ppp executes this script it will pass several values to it&#xA;# $5 will hold the remote gateway&#xA;&#xA;VPN_GATEWAY=192.168.1.156&#xA;if [ &amp;#34;${5:-}&amp;#34; = &amp;#34;${VPN_GATEWAY}&amp;#34; ]&#xA;then&#xA;                /bin/echo &amp;#34;${5:-} routes added for interface ${5:-}&amp;#34; &amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;&#xA;                /sbin/route add -host 192.168.1.92 -interface ppp0 || (/bin/echo &amp;#34;failed to add route 92&amp;#34; &amp;gt;&amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;)&#xA;                /sbin/route add -host 192.168.1.158 -interface ppp0|| (/bin/echo &amp;#34;failed to add route 158&amp;#34; &amp;gt;&amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;)&#xA;                /sbin/route add -host 192.168.1.56 -interface ppp0|| (/bin/echo &amp;#34;failed to add route 56&amp;#34; &amp;gt;&amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;)&#xA;                /sbin/route add -host 192.168.1.26 -interface ppp0|| (/bin/echo &amp;#34;failed to add route 26&amp;#34; &amp;gt;&amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;)&#xA;else&#xA;                /bin/echo &amp;#34;No routes added for interface ${5:-}&amp;#34; &amp;gt; &amp;#34;/tmp/pppd_ip_up_$$.log&amp;#34;&#xA;fi&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This script must be owned by root and executable. We can create multiple else clauses to configure routes for our remote VPN connection&#xA;based on the remote IP Address. I&amp;rsquo;ve added a log to &lt;code&gt;/tmp&lt;/code&gt; to monitor the process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Baby it&#39;s Cold Outside -- How Cold? Use an SHT31 and See!</title>
      <link>https://cyberspy.io/articles/babyitscold/</link>
      <pubDate>Tue, 29 Jan 2019 11:42:17 -0500</pubDate>
      <guid>https://cyberspy.io/articles/babyitscold/</guid>
      <description>&lt;h1 id=&#34;esp32-and-sht31-temperature-and-humidity-sensor-secure-web-server&#34;&gt;ESP32 and SHT31 Temperature and Humidity Sensor Secure Web Server&lt;/h1&gt;&#xA;&lt;p&gt;In this blog post, I follow-up on the ESP32-IDF development and demonstrate how to incorporate an &lt;a href=&#34;https://i2c.info&#34;&gt;i2c&lt;/a&gt; device to measure the temperature and humidity. Specifically the &lt;a href=&#34;http://www.mouser.com/ds/2/682/Sensirion_Humidity_Sensors_SHT3x_Datasheet_digital-971521.pdf&#34;&gt;SHT31&lt;/a&gt;.  First, let&amp;rsquo;s do it plain-jane vanilla. We&amp;rsquo;ll incorporate the i2c device and simply display the measurements to the serial terminal through the uart. Next, we&amp;rsquo;ll make it more practical and send the data over the wifi network to a service that makes it convenient to visualize the time-series data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Program the Esp32 with ESP-IDF on Mac OS X</title>
      <link>https://cyberspy.io/articles/esp32-on-osx/</link>
      <pubDate>Wed, 23 Jan 2019 22:11:25 -0500</pubDate>
      <guid>https://cyberspy.io/articles/esp32-on-osx/</guid>
      <description>&lt;h2 id=&#34;programming-the-esp32-on-your-mac&#34;&gt;Programming the ESP32 on your Mac!&lt;/h2&gt;&#xA;&lt;p&gt;Go out and buy yourself a cheap little &lt;a href=&#34;https://www.espressif.com/en&#34;&gt;ESP32 SoC&lt;/a&gt; and follow these basic instructions to setup your development environment on your Mac. If you want to do some advanced C-programming to control your ESP32, this is for you. If you&amp;rsquo;d rather use &lt;a href=&#34;https://www.arduino.cc&#34;&gt;Arduino&lt;/a&gt; and play with simple sketches then this is not for you &amp;ndash; google how to use Arduino and off you go!&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-you-will-need&#34;&gt;What you will need&lt;/h2&gt;&#xA;&lt;p&gt;So, of course you&amp;rsquo;ll need an ESP32 SoC development board. I recommend the &lt;a href=&#34;https://www.sparkfun.com/products/13907&#34;&gt;SparkFun Thing&lt;/a&gt;. Lots of other choices, but this blog post will address some of the specific configuration considerations that you&amp;rsquo;ll need to be aware of when you select this particular device.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making some Noise - Teensy, TGA-Pro, and MIDI</title>
      <link>https://cyberspy.io/articles/teensy-tgapro-midi/</link>
      <pubDate>Fri, 04 May 2018 10:34:07 -0400</pubDate>
      <guid>https://cyberspy.io/articles/teensy-tgapro-midi/</guid>
      <description>&lt;h2 id=&#34;making-some-noise-and-maybe-even-music&#34;&gt;Making Some Noise (and maybe even Music)!&lt;/h2&gt;&#xA;&lt;p&gt;In this blog post, I&amp;rsquo;ll share my experiences using the &lt;a href=&#34;https://www.pjrc.com/store/teensy36.html&#34;&gt;Teensy&lt;/a&gt; and &lt;a href=&#34;https://www.tindie.com/products/Blackaddr/arduino-teensy-guitar-audio-shield/&#34;&gt;TGA-Pro Guitar Audio Shield&lt;/a&gt; to process audio - both using an audio processing codec as well as MIDI. I&amp;rsquo;ve also included the Yamaha UX16 USB-to-MIDI controller to aid in patching my MIDI channels into the inputs of the Guitar Audio shield.&lt;/p&gt;&#xA;&lt;h3 id=&#34;teensy---yet-antother-cheap-usb-ucontroller-board&#34;&gt;Teensy - Yet antother cheap USB uController board.&lt;/h3&gt;&#xA;&lt;p&gt;At the hear of this project is the Teensy 3.6 USB Microcontroller development board. This sub-$30 board is a feature-rich micro-controller using the Cortex M4, floating-point unit, digital and analog pins, and lots of communication protocols (USB, i2C, SPI, Serial, Ethernet). What makes this little USB-attached board so useful are the accompanying software elements:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pathocaml - Getting Wacky with Functions And Polymorphism</title>
      <link>https://cyberspy.io/code/pathocaml/</link>
      <pubDate>Mon, 19 Mar 2018 20:21:13 -0400</pubDate>
      <guid>https://cyberspy.io/code/pathocaml/</guid>
      <description>&lt;h3 id=&#34;ocaml-on-the-fringes---you-can-do-that&#34;&gt;OCaml on the Fringes - You &lt;em&gt;can&lt;/em&gt; do that??&lt;/h3&gt;&#xA;&lt;p&gt;So, I got bored this afternoon and was contemplating why I was enjoying diving into OCaml more than say Elixir/Erlang for functional programming. The quality of the language that&amp;rsquo;s most captured my attention is the type system.&lt;/p&gt;&#xA;&lt;p&gt;When you start playing around with the type system in OCaml you can go from some basic definitions of user-defined types to some pretty cool looking constructs. Let&amp;rsquo;s start of with something pretty transparent and move into something that might actually melt your brain.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OCaml OpenGL - Get into Gear!</title>
      <link>https://cyberspy.io/articles/ocamlopengl/</link>
      <pubDate>Tue, 13 Mar 2018 14:41:15 -0400</pubDate>
      <guid>https://cyberspy.io/articles/ocamlopengl/</guid>
      <description>&lt;h2 id=&#34;ocaml-and-opengl---getting-our-functional-programming-into-gear&#34;&gt;OCaml and OpenGL - Getting our Functional Programming into Gear!&lt;/h2&gt;&#xA;&lt;p&gt;In my blog post for this day, I thought I&amp;rsquo;d take a look at the OCaml OpenGL library, &lt;a href=&#34;https://opam.ocaml.org/packages/lablgl/lablgl.1.05/&#34;&gt;lablgl&lt;/a&gt;. If you&amp;rsquo;re not already familair with openGL, I strongly suggest that you take a look at one of the tutorials available online. One that I found to be very informative; although written in &lt;strong&gt;c++&lt;/strong&gt;, is &lt;a href=&#34;http://www.opengl-tutorial.org&#34;&gt;opengl-tutorial&lt;/a&gt;. Nonetheless, in this post, we&amp;rsquo;ll look at some simple, and not so simple examples written in OCaml. But before we can do that, we need to install the requisite &lt;strong&gt;opam&lt;/strong&gt; dependencies. To install &lt;code&gt;lablgl&lt;/code&gt;, simply:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Exercism - Get your Code Deamons Out! Heal Your Body!</title>
      <link>https://cyberspy.io/code/exercism/</link>
      <pubDate>Wed, 28 Feb 2018 15:12:36 -0500</pubDate>
      <guid>https://cyberspy.io/code/exercism/</guid>
      <description>&lt;h2 id=&#34;exercism&#34;&gt;Exercis(m)&lt;/h2&gt;&#xA;&lt;p&gt;The best way to keep the mind, body, and soul sharp is to &lt;strong&gt;exercise&lt;/strong&gt;! No better way to learn new programming paradigms than following this same precept when learning new concepts in an unfamiliar programming language. There are several sites online that afford noobs practice problems - &lt;a href=&#34;https://www.hackerrank.com&#34;&gt;Hackerrank&lt;/a&gt;, &lt;a href=&#34;https://www.kaggle.com&#34;&gt;kaggle&lt;/a&gt; to name a few. But one that I recently  came across, &lt;a href=&#34;http://exercism.io&#34;&gt;exercism.io&lt;/a&gt;, aims to provide not just programming exercises, but a community of folks committed to commenting and sharing both code and criticism on implementations to problem sets across many languages.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Riding the Camel Deeper into the Desert of Code: Records and Variants</title>
      <link>https://cyberspy.io/articles/ocaml-rec-var/</link>
      <pubDate>Sun, 11 Feb 2018 12:41:10 -0500</pubDate>
      <guid>https://cyberspy.io/articles/ocaml-rec-var/</guid>
      <description>&lt;h3 id=&#34;extending-and-encapsulating-data---records-and-variants&#34;&gt;Extending and Encapsulating Data - Records and Variants&lt;/h3&gt;&#xA;&lt;p&gt;Up next on our tour of OCaml are &lt;strong&gt;records&lt;/strong&gt; and &lt;strong&gt;variants&lt;/strong&gt;. If you are familiar with &lt;code&gt;typedef&lt;/code&gt;, &lt;code&gt;struct&lt;/code&gt;, and &lt;code&gt;union&lt;/code&gt; in &lt;strong&gt;c/c++&lt;/strong&gt;, you&amp;rsquo;ll quickly come to understand how to use records and variants in OCaml. We&amp;rsquo;ll start off looking at records, how to define them, use them in functions, and automatically generate common functions from our type definitions. There&amp;rsquo;s more to the eye than what you get in a language like &lt;strong&gt;c&lt;/strong&gt;, so pay close attention as we move through the descriptions below. We&amp;rsquo;ll break it down one at a time so you&amp;rsquo;ll have no problems!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Let&#39;s Get Funky with the Camel</title>
      <link>https://cyberspy.io/articles/ocaml-func/</link>
      <pubDate>Fri, 09 Feb 2018 16:17:20 -0500</pubDate>
      <guid>https://cyberspy.io/articles/ocaml-func/</guid>
      <description>&lt;h2 id=&#34;how-many-ways-can-we-get-funky&#34;&gt;How many ways can we get Fun(ky)&lt;/h2&gt;&#xA;&lt;p&gt;In any programming paradigm, it&amp;rsquo;s critical to understand how we write functions - be they traditional imperative , anonymous , recursive, or functional. In this post, I will break down the different types of functions that you can write in &lt;strong&gt;OCaml&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start by examining the imperative function. Here&amp;rsquo;s a simple function that prints out the phrase &lt;em&gt;Hello World!&lt;/em&gt; $n$ times, once on each line, and returns the value $n$ as its result.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OCaml Hello World and more</title>
      <link>https://cyberspy.io/articles/ocaml-hw/</link>
      <pubDate>Tue, 06 Feb 2018 11:28:00 -0500</pubDate>
      <guid>https://cyberspy.io/articles/ocaml-hw/</guid>
      <description>&lt;h3 id=&#34;well-hello-there&#34;&gt;Well Hello There!&lt;/h3&gt;&#xA;&lt;p&gt;As tradition has it, every new programming language experience must begin with the basic &lt;em&gt;Hello World&lt;/em&gt;. Let&amp;rsquo;s walk the the basics of how to set up our development environment specifically for OCaml and demonstrate how to compile our basic program.&lt;/p&gt;&#xA;&lt;h3 id=&#34;warming-up-our-environment&#34;&gt;Warming up our Environment&lt;/h3&gt;&#xA;&lt;p&gt;Of course we could just use our vanilla editor to enter our OCaml programs, but a more efficient work environment leverages an extensible editor that is &lt;em&gt;aware&lt;/em&gt; of our programming language. Editors like &lt;a href=&#34;*&#34;&gt;sublime&lt;/a&gt;, &lt;a href=&#34;*&#34;&gt;Atom&lt;/a&gt;, and &lt;a href=&#34;*&#34;&gt;Visual Studio Code&lt;/a&gt; are some of the more popular selections. &lt;a href=&#34;*&#34;&gt;Vim&lt;/a&gt; and &lt;a href=&#34;*&#34;&gt;Emacs&lt;/a&gt; are also options, but the new tools tend to support vi/emacs style editing while offering more extensive and expansive features.&lt;/p&gt;</description>
    </item>
    <item>
      <title>OCaml Intro: You can have it all: Object-Oriented, Imperative, and Functional</title>
      <link>https://cyberspy.io/articles/ocaml-intro/</link>
      <pubDate>Thu, 01 Feb 2018 11:27:47 -0500</pubDate>
      <guid>https://cyberspy.io/articles/ocaml-intro/</guid>
      <description>&lt;h2 id=&#34;yapl&#34;&gt;YAPL&lt;/h2&gt;&#xA;&lt;p&gt;So why take the time to delve into yet another programming language? I find at worst, one can expands one&amp;rsquo;s knowledge of existing programming paradigms by studying the language design choices of other languages not used on a daily-basis. Best case, one discovers a new language that is rich in expression and productivity; thereby refining the productivity of the user.&lt;/p&gt;&#xA;&lt;h3 id=&#34;ocaml&#34;&gt;&lt;a href=&#34;https://OCaml.org&#34;&gt;OCaml&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;So, I tripped over this programming language in a rather random and circuitous path. I was watching a super-cool video visualizing how the &lt;a href=&#34;https://www.youtube.com/watch?v=spUNpyF58BY&#34;&gt;Fourier Transform integral&lt;/a&gt; is constructed (by &lt;a href=&#34;https://www.youtube.com/channel/UCYO_jab_esuFRV4b17AJtAw&#34;&gt;3Blue1Brown&lt;/a&gt;). At the end of the video, the sponsor was a well-known, prestigious wall-street boutique, &lt;a href=&#34;https://OCaml.org/docs/cheat_sheets.html&#34;&gt;Jane Street&lt;/a&gt;, famous for hiring the best of the best in mathematics and computer science. So, naturally, I thought I&amp;rsquo;d take a closer peek at their website and discovered that they were big sponsors in OCaml as it underlies their trading and production environments. And down the rabbit hole I went.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GPOTD - Furry Lewis</title>
      <link>https://cyberspy.io/articles/gpotd-2018-01-25/</link>
      <pubDate>Thu, 25 Jan 2018 16:58:00 -0500</pubDate>
      <guid>https://cyberspy.io/articles/gpotd-2018-01-25/</guid>
      <description>&lt;h2 id=&#34;new-blog-series-gpotd-guitar-player-of-the-day&#34;&gt;New Blog Series: GPOTD (Guitar Player of the Day):&lt;/h2&gt;&#xA;&lt;h3 id=&#34;featured-artist-furry-lewis&#34;&gt;Featured Artist: Furry Lewis.&lt;/h3&gt;&#xA;&lt;p&gt;Aside from writing about technical matters, I enjoy writing about music and musicians from time to time. To that end, I want to kick-off a new series &lt;strong&gt;GPOTD&lt;/strong&gt; which features a guitar player that you likely aren&amp;rsquo;t familiar with. Today at the end of my acoustic guitar lesson, my teacher pulled up some music by this lesser-known player of the &lt;a href=&#34;https://en.wikipedia.org/wiki/American_folk_music_revival&#34;&gt;American Folk Music Revival&lt;/a&gt;. And it sounded &lt;em&gt;amazing&lt;/em&gt;! So, I thought I&amp;rsquo;d take a closer look at  the music and the man.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Pothos - A New Take on Data-Flow Frameworks</title>
      <link>https://cyberspy.io/articles/pothossdr/</link>
      <pubDate>Wed, 17 Jan 2018 11:13:11 -0500</pubDate>
      <guid>https://cyberspy.io/articles/pothossdr/</guid>
      <description>&lt;h3 id=&#34;data-flows-like-a-river&#34;&gt;Data-Flows&amp;hellip; &lt;em&gt;like a river&lt;/em&gt;&lt;/h3&gt;&#xA;&lt;p&gt;In today&amp;rsquo;s post, I thought I&amp;rsquo;d take a look at and discuss the &lt;a href=&#34;https://github.com/pothosware/PothosCore/wiki&#34;&gt;Pothos&lt;/a&gt; toolkit, a work-flow tool that improves upon the design principles of &lt;a href=&#34;https://www.gnuradio.org&#34;&gt;gnuradio&lt;/a&gt; and enables real-time data-flow processes for real-time applications.&lt;/p&gt;&#xA;&lt;p&gt;Using a MacBook Pro, an &lt;a href=&#34;https://www.ettus.com/product/details/UN210-KIT&#34;&gt;ettus N210&lt;/a&gt; SDR, and an FM-antenna, I&amp;rsquo;ll show how easy it is to build an FM Receiver to listen to your favorite radio stations on your laptop. While it&amp;rsquo;s an expensive way to tune in to your local DJ, it&amp;rsquo;s a great demonstration of how to use this great kit (written by &lt;a href=&#34;http://www.joshknows.com&#34;&gt;Josh Blum&lt;/a&gt;).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Crypto 101: A Brief Tour of Practical Crypto in Golang</title>
      <link>https://cyberspy.io/articles/crypto101/</link>
      <pubDate>Thu, 14 Dec 2017 10:38:41 -0500</pubDate>
      <guid>https://cyberspy.io/articles/crypto101/</guid>
      <description>&lt;h2 id=&#34;crypto-101&#34;&gt;Crypto 101:&lt;/h2&gt;&#xA;&lt;p&gt;Golang offers a rich collection of packages supporting cryptographic operations. From a beginner&amp;rsquo;s perspective, maybe too many offerings! I offer up an overview of what&amp;rsquo;s available and an introduction to some practical uses of cryptography in Golang. Implementation details are always critical when discussing crypto. We&amp;rsquo;ll discuss some general implications of making poor choices and how such choices can completely undermine any uses of these tools.&lt;/p&gt;&#xA;&lt;h3 id=&#34;what-in-the-box&#34;&gt;What&amp;rsquo; in the box?&lt;/h3&gt;&#xA;&lt;p&gt;The top-level &lt;code&gt;crypto&lt;/code&gt; package is comprised of a little over a dozen sub-packages that offer:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Channel Your Inner Gopher</title>
      <link>https://cyberspy.io/articles/channelyourgopher/</link>
      <pubDate>Wed, 13 Dec 2017 11:44:07 -0500</pubDate>
      <guid>https://cyberspy.io/articles/channelyourgopher/</guid>
      <description>&lt;h3 id=&#34;channeling-your-inner-gopher---literally-reflecting-upon-channels&#34;&gt;Channeling your Inner Gopher - (Literally) Reflecting upon Channels&lt;/h3&gt;&#xA;&lt;p&gt;Many gophers are likely familiar with the communication paradigm, &lt;em&gt;channels&lt;/em&gt;. An elegant solution to communicate (uni or bidirectionally) typed information among go-routines. In it&amp;rsquo;s simplest form, we declare as type-valued channel variable, &lt;strong&gt;make&lt;/strong&gt; it, and then send and receive data through it. Easy enough!&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;package&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; (&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;main&lt;/span&gt;() {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;var&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;simpleChan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; = make(&lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;go&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;func&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;chan&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#75715e&#34;&gt;// send important data to the channel&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                &lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;42&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;                close(&lt;span style=&#34;color:#a6e22e&#34;&gt;c&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        }(&lt;span style=&#34;color:#a6e22e&#34;&gt;simpleChan&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#75715e&#34;&gt;// receive data&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;:=&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;-&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;simpleChan&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#a6e22e&#34;&gt;fmt&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;Printf&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;got %d\n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;num&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In our trivial example above, we create an &lt;code&gt;chan int&lt;/code&gt; typed-channel and initialize it using &lt;code&gt;make&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Once Upon a Reflection: Looking Deeper into Golang reflection</title>
      <link>https://cyberspy.io/articles/reflectinggo/</link>
      <pubDate>Mon, 04 Dec 2017 17:36:31 -0500</pubDate>
      <guid>https://cyberspy.io/articles/reflectinggo/</guid>
      <description>&lt;h3 id=&#34;i-often-reflect-upon-my-code&#34;&gt;I often &lt;em&gt;reflect&lt;/em&gt; upon my code&amp;hellip;&lt;/h3&gt;&#xA;&lt;p&gt;One of the coolest features of the Golang programming language is the &lt;a href=&#34;https://golang.org/pkg/reflect/&#34;&gt;reflect package&lt;/a&gt;. As the package documentation states at the onset of the package:&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Package reflect implements run-time reflection, allowing a program to manipulate objects with arbitrary types. The typical use is to take a value with static type interface{} and extract its dynamic type information by calling TypeOf, which returns a Type.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;On the surface, that all sounds pretty straight-forward. But when you start to think about the types of objects (literally) that you might reflect upon, things can get interesting pretty quickly. It&amp;rsquo;s one thing to dynamically get the type of an object like an &lt;code&gt;Int&lt;/code&gt;, and then extract it&amp;rsquo;s value. But what about dynamically getting access to Methods inside a &lt;code&gt;struct&lt;/code&gt; and then calling it with values created dynamically from an a-priori signature, returning values and extracting those values programatically? Rather quickly, the power of reflection can become overwhelming and even confusion. Moreover, appropriate use-cases of reflection should be well thought out so that we aren&amp;rsquo;t simply&#xA;getting too clever for our own good.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brazilian</title>
      <link>https://cyberspy.io/gallery/brazilian/</link>
      <pubDate>Sun, 03 Dec 2017 21:02:47 -0500</pubDate>
      <guid>https://cyberspy.io/gallery/brazilian/</guid>
      <description>&lt;h3 id=&#34;brazilian-guitarists&#34;&gt;Brazilian Guitarists&lt;/h3&gt;&#xA;&lt;p&gt;Some of my favorite music on the guitar comes from talented Brazilian composers. Favoite among them is &lt;a href=&#34;https://en.wikipedia.org/wiki/Heitor_Villa-Lobos&#34;&gt;Heitor Villa-Lobos&lt;/a&gt;. Indiana University maintains a site dedicated to the &lt;a href=&#34;http://villalobos.iu.edu&#34;&gt;man&lt;/a&gt;. For scholars interested in&#xA;diving deeper, it&amp;rsquo;s a great source of information on the man and the music.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Go Get Interfaced: Enums in Golang</title>
      <link>https://cyberspy.io/code/gogetinterfaces/</link>
      <pubDate>Sat, 02 Dec 2017 09:38:42 -0500</pubDate>
      <guid>https://cyberspy.io/code/gogetinterfaces/</guid>
      <description>&lt;h3 id=&#34;golang-interfaces-and-enums&#34;&gt;Golang, Interfaces, and Enums&lt;/h3&gt;&#xA;&lt;p&gt;So here&amp;rsquo;s a nice golang idiom that I ran across years ago that I found generally useful. Golang, unlike languages like &lt;strong&gt;c&lt;/strong&gt; doesn&amp;rsquo;t natively support enumerations. Instead, constants typically are used when creating a list of enumerations. But, go is a strongly-typed language, so we can do better than simply using constants - we can &lt;em&gt;type&lt;/em&gt; our enumeration with the use of a &lt;code&gt;type&lt;/code&gt; declaration.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-golang&#34; data-lang=&#34;golang&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;type&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;DogState&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;By defining a type for our enumeration, we can consistently pass and return typed-values among our functions operating on our enumeration. Okay, that&amp;rsquo;s all well and good, but what happens when we want to go between &lt;code&gt;uint&lt;/code&gt; values and &lt;code&gt;string&lt;/code&gt; representations of those values; a commonly used paradigm when working with enumerations. One approach would have us write mapping functions that might &lt;code&gt;switch&lt;/code&gt; among the values to return a &lt;code&gt;string&lt;/code&gt;. Or, when going from a &lt;code&gt;string&lt;/code&gt; name of an enumeration to the &lt;code&gt;uint&lt;/code&gt; value, we might use a &lt;code&gt;map[string]&lt;/code&gt;. That&amp;rsquo;s a doable implementation, but there&amp;rsquo;s an easier, and more idiomatic way.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gogo</title>
      <link>https://cyberspy.io/code/gogo/</link>
      <pubDate>Wed, 29 Nov 2017 20:57:33 -0500</pubDate>
      <guid>https://cyberspy.io/code/gogo/</guid>
      <description>&lt;h3 id=&#34;here-we-gogo&#34;&gt;Here we &lt;em&gt;gogo!&lt;/em&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Years ago, I wrote an interesting article that I thought might be worth re-posting (and revising) here on my blog. For a while&#xA;I got into programming in &lt;a href=&#34;https://golang.org&#34;&gt;golang&lt;/a&gt; and in the early going (pun-alert!), there were a lot of idioms that were not well understood by a &lt;em&gt;noob&lt;/em&gt;. One of those paradigms was &lt;em&gt;channels, go-routines, and signals&lt;/em&gt; used simultaneously. Taken separately, they are more easily understood. But when taken together, there can be some confusion. In this article, I address how to properly establish a signal-handler and a channel to terminate go-routines when the user interrupts the program with a signal such as &lt;code&gt;ctrl-c&lt;/code&gt; or &lt;code&gt;kill(1)&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sagreras Book 2, Lesson 11</title>
      <link>https://cyberspy.io/audio/sagreras-book-2-lesson-11/</link>
      <pubDate>Tue, 28 Nov 2017 21:49:07 -0500</pubDate>
      <guid>https://cyberspy.io/audio/sagreras-book-2-lesson-11/</guid>
      <description>&lt;h3 id=&#34;etude-sagreras-lesson-11&#34;&gt;Etude Sagreras Lesson 11&lt;/h3&gt;&#xA;&lt;p&gt;Here&amp;rsquo;s my first cut at recording Sagreras Etude #11. Although the etude &lt;em&gt;feels&lt;/em&gt; like it&amp;rsquo;s easy to play, recording it reveals an altogether unsatisfying experience when played back to the ear.&lt;/p&gt;&#xA;&lt;p&gt;My goal is to show how the exercise evolves over time when practicing it with the intention of not just playing it as a site-reading piece, but rather practicing it with the intention of recording it with more attention beyond mere site-reading. Wish me luck!&lt;/p&gt;</description>
    </item>
    <item>
      <title>Julio Salvador Sagreras</title>
      <link>https://cyberspy.io/audio/sagreras/</link>
      <pubDate>Tue, 28 Nov 2017 16:22:55 -0500</pubDate>
      <guid>https://cyberspy.io/audio/sagreras/</guid>
      <description>&lt;h3 id=&#34;études&#34;&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/%C3%89tude&#34;&gt;Études&lt;/a&gt;&lt;/h3&gt;&#xA;&lt;p&gt;Someone once asked&amp;hellip;&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;How do you get to Carnegie Hall? Practice! Practice! Practice!&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Well, I think the Amtrak is a better way for me to get there at this point in my life!&lt;/p&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve decided to spend time &lt;strong&gt;recording&lt;/strong&gt; &lt;a href=&#34;https://en.wikipedia.org/wiki/Julio_Salvador_Sagreras&#34;&gt;Sagreras&lt;/a&gt; etudes as I&amp;rsquo;m on a push to finish Book II and start Book III by March of 2018.&lt;/p&gt;&#xA;&lt;p&gt;Stay tuned for&lt;/p&gt;</description>
    </item>
    <item>
      <title>Recursion Revisited</title>
      <link>https://cyberspy.io/code/recursion/</link>
      <pubDate>Tue, 28 Nov 2017 15:23:02 -0500</pubDate>
      <guid>https://cyberspy.io/code/recursion/</guid>
      <description>&lt;h3 id=&#34;recursion-from-more-than-one-point-of-view&#34;&gt;Recursion, from more than one point-of-view.&lt;/h3&gt;&#xA;&lt;p&gt;A common programming idiom in computer science is solving a problem by self-reference, also known as recursion. In this post, we look at two different&#xA;implementations of the same problem.&lt;/p&gt;&#xA;&lt;h4 id=&#34;solve-a-recursive-problem-in-two-different-programming-language-paradigms&#34;&gt;Solve a recursive problem in two different programming language paradigms&lt;/h4&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s look at the solution to a simple problem, compute $f(x)=e^{x}$.&lt;/p&gt;&#xA;&lt;p&gt;We will illustrate two separate solutions - one in a procedural language (python), and the other in a functional language (elixir).&lt;/p&gt;&#xA;&lt;p&gt;Let&amp;rsquo;s start off with the functional language. Were does recursion come into play?&lt;/p&gt;&#xA;&lt;p&gt;We define the function $f(x)=e^x$ as the infinite sum,  $\text{ }f(x) = \sum_{n=0}^\infty{\frac{x^n}{n!}}$&lt;/p&gt;&#xA;&lt;p&gt;In our solution below, we define two separate recursive functions, &lt;code&gt;exp/2&lt;/code&gt; and &lt;code&gt;fac/1&lt;/code&gt;. What&amp;rsquo;s interesting to note here is how each of these functions has two separate definitions. This is an aspect of programming in elixir that elegantly uses pattern-matching to return different results depending upon the input. Our two functions nicely dovetail into the base-case and recursive case of a recursive algorithm.&lt;/p&gt;&#xA;&lt;p&gt;For example, looking at &lt;code&gt;exp/2&lt;/code&gt;, the first function definition returns 1 for any value of x (as indicated by the &lt;code&gt;_&lt;/code&gt; preceding the variable) and returns 1. This is the mathematical equivalent of $x^0=1\text{ for any }x$.&lt;/p&gt;&#xA;&lt;p&gt;The second definition of &lt;code&gt;exp/2&lt;/code&gt; is the recursive case. for any value of $n\gt0$. Moreover, we define &lt;code&gt;exp(x, n)&lt;/code&gt; as $\frac{e^x}{n!}$ + &lt;code&gt;exp(x, n-1)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Similarly for the definition of &lt;code&gt;fac/1&lt;/code&gt; we see two definitions; one for $n=0$ and another for all values of $n\gt0$.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
