<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Practical Engineering Notes on Rusty Eddy</title><link>https://rustyeddy.com/</link><description>Recent content in Practical Engineering Notes on Rusty Eddy</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 04 Jun 2026 18:30:51 -0700</lastBuildDate><atom:link href="https://rustyeddy.com/index.xml" rel="self" type="application/rss+xml"/><item><title>Software is Hard</title><link>https://rustyeddy.com/software/software-is-hard/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/software-is-hard/</guid><description>A section opener explaining why software projects drift and how use cases, Kanban, testing, review, and release discipline make them predictable.</description></item><item><title>OttO: A Go-Based IoT Edge Gateway Architecture</title><link>https://rustyeddy.com/iot/iot-edge-gateway/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-edge-gateway/</guid><description>A practical architecture overview of OttO, the Go-based IoT edge gateway used by the Organic Gardener project.</description></item><item><title>Use Cases</title><link>https://rustyeddy.com/software/use-cases/</link><pubDate>Fri, 27 Sep 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/use-cases/</guid><description>&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;Use cases are the first concrete step after recognizing that
&lt;a href="https://rustyeddy.com/software/software-is-hard/"&gt;software is hard&lt;/a&gt;. Before writing a single line
of code, we need to understand what we are building — and more importantly,
&lt;em&gt;why&lt;/em&gt; someone would use it. Use cases give us that foundation.&lt;/p&gt;
&lt;p&gt;A use case is a single, focused story that describes one way a user achieves
a specific goal with the system. Keep them in plain language, from the user&amp;rsquo;s
point of view, with no technical jargon. A good use case has a clear success
condition: you can observe or measure when it worked.&lt;/p&gt;</description></item><item><title>Use Cases to Tasks</title><link>https://rustyeddy.com/software/use-cases-to-tasks/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/use-cases-to-tasks/</guid><description>&lt;p&gt;A use case describes value from the user&amp;rsquo;s point of view. A task describes a
piece of work a developer can finish. Confusing those two is one of the
fastest ways to turn a software plan into a vague backlog.&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why This Matters&lt;/h2&gt;
&lt;p&gt;Use cases are useful only if they turn into work the team can plan, build, and
verify. Translating them into small tasks keeps the connection between user
value and implementation visible.&lt;/p&gt;</description></item><item><title>Organizing Software Projects with Kanban</title><link>https://rustyeddy.com/software/kanban/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/kanban/</guid><description>A practical guide to using Kanban cards, WIP limits, task sizing, and exit criteria to keep software projects visible and predictable.</description></item><item><title>Version Control Systems</title><link>https://rustyeddy.com/software/version-control-systems/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/version-control-systems/</guid><description>A practical guide to using Git history, branches, pull requests, and tags as the permanent record of a software project.</description></item><item><title>ESP32 Collection Station Architecture for IoT Sensor Networks</title><link>https://rustyeddy.com/iot/iot-sensor-station/</link><pubDate>Thu, 13 Jan 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-sensor-station/</guid><description>A device-side architecture note for ESP32 collection stations in the Organic Gardener IoT system.</description></item><item><title>Test Driven Software Development</title><link>https://rustyeddy.com/software/test-driven-software-development/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/test-driven-software-development/</guid><description>A practical guide to test-driven development and the role of unit, integration, system, and acceptance tests in a reliable release process.</description></item><item><title>Peer Reviews</title><link>https://rustyeddy.com/software/peer-review/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/peer-review/</guid><description>A practical guide to code review: what authors should prepare, what reviewers should check, and how pull requests fit into release quality.</description></item><item><title>Wireframes and Storyboards</title><link>https://rustyeddy.com/software/wireframes-and-storyboards/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/wireframes-and-storyboards/</guid><description>A practical guide to using storyboards for user flows and wireframes for screen decisions before implementation begins.</description></item><item><title>Release Process</title><link>https://rustyeddy.com/software/release-process/</link><pubDate>Thu, 21 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/release-process/</guid><description>A practical release process for turning reviewed and tested code into versioned, recoverable software artifacts.</description></item><item><title>Panasonic Avionics</title><link>https://rustyeddy.com/resume/jobs/panasonic/</link><pubDate>Fri, 01 Dec 2023 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/panasonic/</guid><description>&lt;p&gt;Member of Technical Staff working on connected systems at aviation scale. The
work combines production software engineering, networked systems, multicast
behavior, operational reliability, and coordination across hardware, platform,
and application teams.&lt;/p&gt;
&lt;p&gt;The role builds on my background in multicast routing, embedded systems, Linux,
and distributed software: making connected systems understandable, testable,
and maintainable when they have to operate in real environments.&lt;/p&gt;</description></item><item><title>Sugo Music Dashboard</title><link>https://rustyeddy.com/resume/clients/sugo-music/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sugo-music/</guid><description>&lt;p&gt;Sugo Music is an online Music publishing platform for Artists by
artists. It was my responsibility to manage the software process,
build and test the backend and manage the front-end development in
React.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Go, React, REST API, HTTP, HTML, JavaScript, Webapp, fullstack&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>University of Southern California ~ MSCS</title><link>https://rustyeddy.com/resume/edu/usc/</link><pubDate>Tue, 02 Jan 1996 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/edu/usc/</guid><description/></item><item><title>Sahara Networks</title><link>https://rustyeddy.com/resume/clients/sahara-networks/</link><pubDate>Wed, 27 Jan 2021 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sahara-networks/</guid><description>&lt;p&gt;Sahara Networks is building something truly unique, connecting
microcontrollers and IoT devices across the network allowing virtual
circuits to be created. I help design, develop and lead the design and
implementation of the network protocol that delivers high speed
digital I/O signals across a &amp;ldquo;device network&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Backend, C/C++, nodejs, TCP/IP and Raspberry Pi&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Radian Laser</title><link>https://rustyeddy.com/resume/clients/radian-laser/</link><pubDate>Mon, 01 Jul 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/radian-laser/</guid><description>&lt;p&gt;Radian is a small, fast moving startup that sells Laser Engravers and
Cutters. I manage five software projects, including two Web
Applications for the control and calibration of the Laser system. I
am also responsible for the successful delivery and maintenance of the
products Firmware and Fleet Management system.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C/C++, Go &amp;amp; Python, embedded systems and microservices.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cloud Trek</title><link>https://rustyeddy.com/resume/clients/alchemy/</link><pubDate>Sat, 01 Apr 2017 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/alchemy/</guid><description>&lt;p&gt;Alchemy Networks is an independently owned service provider. I automated
the provisioning of their Private Cloud Service offering. I was an
individual contributor on this project. I collaborated with another
developer.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Ansible, Linux, Python, Websockets, Networking&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>DirecTV / AT&amp;T</title><link>https://rustyeddy.com/resume/clients/att/</link><pubDate>Thu, 01 Dec 2016 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/att/</guid><description>&lt;p&gt;I was hired by DirecTV (and subsequently AT&amp;amp;T) to help lead the new
Software Defined Networking (SDN) team. We were tasked with replacing
the companies aging production Video Distribution Network with a new
modernized design. Project goals included:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Replace aged network with modern SDN solution&lt;/li&gt;
&lt;li&gt;Solution to incrementally replace existing production network&lt;/li&gt;
&lt;li&gt;Development would build on industry standard OpenSource solutions&lt;/li&gt;
&lt;li&gt;Had to be Reliable and Scalable&lt;/li&gt;
&lt;li&gt;Linux, OpenFlow, Java and Python&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Sierra Hydrographics</title><link>https://rustyeddy.com/resume/clients/sierra-hydrog/</link><pubDate>Sat, 02 Jan 2010 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/sierra-hydrog/</guid><description>&lt;p&gt;Led the design and development of automated data collection for
hydrological gauging stations. Data is gathered by pulling data from
line of sight telemetry radios and NOAA/LRGS satellite ground
stations. Data is fed to timeseries server for hydrological
calculations and alert monitoring.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Timeseries database, C/C++, PHP, Python and Java.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Green Hills Software</title><link>https://rustyeddy.com/resume/clients/green-hills/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/green-hills/</guid><description>&lt;p&gt;I worked on a small team that added multicast forwarding to the &lt;em&gt;Integrity&lt;/em&gt; RTOS
kernel. Modified multicast routing daemon to run on same operating
system allowing the product to serve as the foundation for a military
grade network switch/router. Added IPv6 Neighbor Discovery to the
suite of routing protocols.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;C/C++ and Network Routing Protocols; Real Time OS.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>The IMS Company</title><link>https://rustyeddy.com/resume/clients/ims-company/</link><pubDate>Fri, 21 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/clients/ims-company/</guid><description>&lt;p&gt;Led a project to replicate entertainment media (music, video and
games) from a single media source to hundreds of in­flight
entertainment units with minimal redundancy. Contributed to the
design and development of an inflight entertainment server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Perl, Python, C/C++ and Java&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Cisco Systems</title><link>https://rustyeddy.com/resume/jobs/cisco-systems/</link><pubDate>Wed, 01 Feb 2006 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/cisco-systems/</guid><description>&lt;p&gt;Original member of the Multicast Routing team. Team of 12 responsible
for the design, implementation and testing the complete suite of
Multicast Routing protocols for the Cisco Carrier Routing System
(CRS). Worked this project from early design through product launch
into maintenance.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Computer Networks, Multicast Routing, C/C++, Real Time, Distributed
Systems&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>California State University, Long Beach</title><link>https://rustyeddy.com/resume/edu/csulb/</link><pubDate>Tue, 02 Jan 1996 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/edu/csulb/</guid><description/></item><item><title>USC ~ ISI</title><link>https://rustyeddy.com/resume/jobs/usc-isi/</link><pubDate>Thu, 20 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/usc-isi/</guid><description>&lt;p&gt;Led the effort to add IGMP/PIM and Multicast Routing Information
Base (MRIB) to the Open Source &lt;em&gt;GateD&lt;/em&gt; suite of routing protocols.
Mentored graduate students and others that would eventually become
prominent members of the computer networking community.&lt;/p&gt;</description></item><item><title>Retix</title><link>https://rustyeddy.com/resume/jobs/retix/</link><pubDate>Tue, 01 Aug 1995 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/retix/</guid><description>&lt;p&gt;Promoted to lead the team of 6 engineers that developed and
automated test plans for L2 switches, OSPF, RIP and BGP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Implemented an automated test framework and led junior engineers
in developing the automated test suites. C; C++; Perl; TCL&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provided 3rd level customer support, serious customer problems that
could not be resolved by customer support or field engineers became
my teams responsibility to diagnose and determine solutions and
workarounds was required.&lt;/p&gt;</description></item><item><title>Rockwell, Intl. Space Systems Division</title><link>https://rustyeddy.com/resume/jobs/rockwell/</link><pubDate>Mon, 03 Jan 1994 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/rockwell/</guid><description>&lt;p&gt;Led a team of 5 Sysadmins responsible for the use and well being of
Engineering Departments 300+ UNIX workstations, servers (Sun, HP, DEC)
and network.&lt;/p&gt;
&lt;p&gt;On a team that Developed a Real Time OS that was embedded in a variety
of space and military projects.&lt;/p&gt;</description></item><item><title>California State University ~ Chancelors Office</title><link>https://rustyeddy.com/resume/jobs/csu-chancelor/</link><pubDate>Tue, 01 Aug 1995 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/jobs/csu-chancelor/</guid><description>&lt;p&gt;I was hired to install and manage the departments first AT&amp;amp;T Unix
Mini-computers, UUNET connection and write a bulletin board system for
California State Educators.&lt;/p&gt;</description></item><item><title>Exposing a Go App as Claude MCP Tools</title><link>https://rustyeddy.com/notes/mcp-claude-tools/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/mcp-claude-tools/</guid><description>&lt;p&gt;The Model Context Protocol (MCP) lets Claude call external tools defined by
your application. Instead of pasting data into a chat window or writing one-off
scripts to query your system, you define tools with typed schemas, start an
MCP server, and Claude can call them directly — in Claude Code, Claude Desktop,
or any MCP-compatible client.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/rustyeddy/trader"&gt;Trader&lt;/a&gt; project uses this to expose
its Forex trading engine as Claude tools: query your OANDA account, review open
trades, run a backtest against historical data, and — when explicitly enabled —
place or close orders.&lt;/p&gt;</description></item><item><title>Fixed-Point Numeric Types in Go Financial Software</title><link>https://rustyeddy.com/software/numeric-types-financial-software/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/numeric-types-financial-software/</guid><description>A practical guide to fixed-point arithmetic in Go for prices, money, pips, API boundaries, and trading-system correctness.</description></item><item><title>The Strategy Pattern in a Backtesting Engine</title><link>https://rustyeddy.com/software/strategy-pattern-backtesting/</link><pubDate>Fri, 22 May 2026 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/software/strategy-pattern-backtesting/</guid><description>A practical design for keeping trading strategy logic portable across backtests and live execution by returning plans instead of touching brokers directly.</description></item><item><title>The Five Layers of a Practical IoT System</title><link>https://rustyeddy.com/iot/iot-system-architecture-explained/</link><pubDate>Sat, 15 Nov 2025 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-system-architecture-explained/</guid><description>A practical five-layer model for IoT architecture, grounded in the OttO edge runtime and the Gardener reference application.</description></item><item><title>Building an IoT Device Abstraction Layer in Go</title><link>https://rustyeddy.com/iot/building-iot-device-manager-in-go/</link><pubDate>Sun, 02 Nov 2025 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/building-iot-device-manager-in-go/</guid><description>&lt;p&gt;IoT applications get hard to maintain when hardware code and application
logic are tangled together. A prototype can read one GPIO pin or one I2C
sensor directly. A real system has sensors, actuators, timing loops, message
publishing, local storage, APIs, dashboards, and failures that happen at the
edge.&lt;/p&gt;
&lt;p&gt;The useful boundary is a device abstraction layer: hardware-specific drivers
stay below it, application logic stays above it, and the two communicate
through small interfaces.&lt;/p&gt;</description></item><item><title>Adafruit Soil Moisture Sensor Notes for IoT Projects</title><link>https://rustyeddy.com/notes/soil-moisture-adafruit/</link><pubDate>Wed, 13 Mar 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/soil-moisture-adafruit/</guid><description>&lt;h1 id="adafruit-soil-moisture-sensor-notes-for-iot-projects"&gt;Adafruit Soil Moisture Sensor Notes for IoT Projects&lt;/h1&gt;
&lt;p&gt;Notes on using the Adafruit STEMMA soil moisture sensor after unreliable
results from cheap capacitive sensors in an ESP32 garden project.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rustyeddy/iotesp"&gt;https://github.com/rustyeddy/iotesp&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cheap capacitive soil moisture sensors are attractive for garden automation
because they are inexpensive and easy to find. In practice, the ones I tried
were inconsistent enough that they became a distraction from the larger system
design — and that is the whole point of this note. When the sensor is one small
part of a larger system (collection stations, an edge gateway, MQTT data flow,
REST APIs, and a dashboard), a slightly more expensive sensor that behaves
predictably is cheaper than spending days debugging noisy readings.&lt;/p&gt;</description></item><item><title>Soil Moisture Sensors for IoT Garden Projects</title><link>https://rustyeddy.com/notes/soil-moisture-sensor/</link><pubDate>Thu, 15 Feb 2024 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/soil-moisture-sensor/</guid><description>Practical notes on soil moisture sensor reliability, calibration, protection, and sensor choice for a self-watering garden project.</description></item><item><title>IoT System Architecture (Device to Cloud)</title><link>https://rustyeddy.com/iot/iot-system-architecture-device-to-cloud/</link><pubDate>Fri, 13 Jan 2023 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-system-architecture-device-to-cloud/</guid><description>&lt;p&gt;This page is a diagram-first overview of the IoT architecture used throughout
the projects on this site. It is for engineers who need to decide where device
logic ends, where edge coordination begins, and how telemetry, control, APIs,
storage, and user interfaces fit together.&lt;/p&gt;
&lt;p&gt;The goal is not to present a single correct design. The goal is to show a
reasonable baseline that can grow beyond demos without locking the system to
one board, one sensor, one database, or one user interface.&lt;/p&gt;</description></item><item><title>Self-Watering Garden: An IoT Architecture Case Study</title><link>https://rustyeddy.com/iot/self-watering-garden/</link><pubDate>Wed, 25 May 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/self-watering-garden/</guid><description>A practical case study showing how a self-watering garden can be designed as an IoT system with clear device, gateway, API, and dashboard boundaries.</description></item><item><title>Using Go timers for MQTT testing</title><link>https://rustyeddy.com/notes/go-timers-testing-mqtt/</link><pubDate>Mon, 02 May 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/go-timers-testing-mqtt/</guid><description>&lt;p&gt;This article uses a Go timer and the Go select statement to test our
MQTT publish and subscribe in a single simple test statement. A quick
note on the &lt;code&gt;go testing&lt;/code&gt; package: it is much like the JUnit where
tests using a particular naming convention &lt;code&gt;TestXXX(t *testing.T) {}&lt;/code&gt; will be run automatically with easy to reports having been
generated.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The Problem&lt;/h2&gt;
&lt;p&gt;The following code snippet is directly from the
&lt;a href="https://rustyeddy.com/iot/iot-edge-gateway/"&gt;IoTe&lt;/a&gt; edge gateway project. One of the
primary features of IoTe is the ability to send and receive MQTT
messages.&lt;/p&gt;</description></item><item><title>REST APIs for IoT Gateways: Control, Configuration, and Telemetry Access</title><link>https://rustyeddy.com/iot/iot-gateway-rest/</link><pubDate>Wed, 30 Mar 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-gateway-rest/</guid><description>A practical REST API design note for IoT gateways, covering Go handlers, JSON responses, endpoint boundaries, testing, and common API pitfalls.</description></item><item><title>Adding MQTT to the IoT Gateway</title><link>https://rustyeddy.com/iot/iot-gateway-mqtt/</link><pubDate>Tue, 29 Mar 2022 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/iot/iot-gateway-mqtt/</guid><description>A practical MQTT implementation note for the OttO IoT gateway, covering topic design, subscriptions, callbacks, testing, and memory boundaries.</description></item><item><title>Go timers to remove stale sensor stations</title><link>https://rustyeddy.com/notes/go-timers/</link><pubDate>Tue, 03 Nov 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/go-timers/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;This article introduces Go timers as the mechanism the
&lt;a href="https://github.com/rustyeddy/iota"&gt;IoTa gateway&lt;/a&gt; uses to identify
&lt;em&gt;stale&lt;/em&gt; IoT stations. Modifying the Station with with a new &lt;em&gt;Go
timestamp&lt;/em&gt; field will allow IoTe to determine how long it has been
since the last time it has heard from a given Station.&lt;/p&gt;
&lt;p&gt;If the last &lt;em&gt;refresh&lt;/em&gt; time for a particular station has been longer
than the &lt;em&gt;timeout&lt;/em&gt; period the Station will be marked as &lt;em&gt;stale&lt;/em&gt;.&lt;/p&gt;</description></item><item><title>Career Summary</title><link>https://rustyeddy.com/resume/summary/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/summary/</guid><description>&lt;p&gt;I am a software engineer focused on networking, embedded systems, IoT, Go, and
distributed systems. I build production software for connected devices,
automation, networked services, and systems that need to keep working outside a
lab.&lt;/p&gt;
&lt;p&gt;My background includes aerospace software, multicast routing, embedded systems,
Linux automation, consulting, and connected products at scale. I am strongest
where software architecture meets real hardware, real networks, and small teams
that need practical delivery.&lt;/p&gt;</description></item><item><title>Skills and Interests</title><link>https://rustyeddy.com/resume/skills/</link><pubDate>Thu, 02 Jan 2020 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/skills/</guid><description>&lt;ul&gt;
&lt;li&gt;Go, C/C++, Python and JavaScript (and many others..)&lt;/li&gt;
&lt;li&gt;Computer Networks, Multicast Video Distribution&lt;/li&gt;
&lt;li&gt;Distributed systems and realtime communications&lt;/li&gt;
&lt;li&gt;DevOps, cloud automation and continuous delivery&lt;/li&gt;
&lt;li&gt;Fullstack software development, reactive front-ends with VueJS&lt;/li&gt;
&lt;li&gt;MicroServices: REST APIs, Websockets, etc.&lt;/li&gt;
&lt;li&gt;Linux Systems and OpenSource Software&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why Choose Go for Your Project?</title><link>https://rustyeddy.com/notes/why-choose-go/</link><pubDate>Sun, 22 Sep 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/why-choose-go/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;h2 id="go-is-simple"&gt;Go is simple&lt;/h2&gt;
&lt;p&gt;Go is easy to learn to program with and it is free! Go is &lt;em&gt;much&lt;/em&gt;
easier to maintain and deploy than Java.&lt;/p&gt;
&lt;p&gt;Go does not have weird &lt;em&gt;virtual environments&lt;/em&gt; of Python or npm, gulp,
grunt, yarn, webpack (what&amp;rsquo;s next?) convoluted and complex build
environments.&lt;/p&gt;
&lt;h2 id="go-is-fast"&gt;Go is Fast&lt;/h2&gt;
&lt;p&gt;It smokes most other languages, except the grand mother of Unix
programming &lt;em&gt;C&lt;/em&gt;. The Go programming language is almost as fast
(performant geeky folks like to say) as C.&lt;/p&gt;</description></item><item><title>Red Eye Video Server</title><link>https://rustyeddy.com/notes/redeye/</link><pubDate>Fri, 24 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/redeye/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;The Red Eye project is a service definition rapper around inexpensive
cameras attached to inexpesive micro-controllers that take pretty good
video.&lt;/p&gt;
&lt;p&gt;The video streams are built using the GStreamer library. The camera
native capabilities are used to extract as high quailty, realtime
images possible.&lt;/p&gt;
&lt;p&gt;The video streams will be consumed by one or more sinks, including but
not limited to Files, cloud storage, High Def Display and Computer
Vision libraries.&lt;/p&gt;</description></item><item><title>Skid Steering</title><link>https://rustyeddy.com/notes/skid-steering/</link><pubDate>Wed, 15 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/skid-steering/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;Skid steering basics&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Based on &lt;em&gt;fixed direction wheels[1] or tracks&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;There are two &lt;em&gt;groups&lt;/em&gt; or &lt;em&gt;sides&lt;/em&gt; of wheels: left and right&lt;/li&gt;
&lt;li&gt;All wheels in a group MUST always point in the same direction&lt;/li&gt;
&lt;li&gt;All wheels in a group MUST always rotate at the same rate&lt;/li&gt;
&lt;li&gt;Direction is determined by the speed of the two wheel groups
&lt;ul&gt;
&lt;li&gt;To move straight all motors rotate at the same rate&lt;/li&gt;
&lt;li&gt;Forward and Reverse are determined by positive and negative values&lt;/li&gt;
&lt;li&gt;Turning is achieved by varying the throttle on the right and left&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="example"&gt;Example&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;Skidder&lt;/code&gt; class has the following API, as you can see all of
the movements we desire can be accomplished with a single API call
&lt;code&gt;skidder.set_throttle(left_throttle, right_throttle)&lt;/code&gt;,
does not get much simpler than this!&lt;/p&gt;</description></item><item><title>Raspberry Pi Motor Control Software</title><link>https://rustyeddy.com/notes/rpi-motor-control-service/</link><pubDate>Tue, 14 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/rpi-motor-control-service/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;This software adds a Skid Steer motor control software to the
&lt;a href="http://github.com/mobilerobot-io/rpid"&gt;Raspberry Pi Device Server&lt;/a&gt;
device server. RPID adds motor controls accessible via both MQTT and
REST APIs, as well as directly with the Skidder python library.&lt;/p&gt;</description></item><item><title>MQTT for Controller Communication</title><link>https://rustyeddy.com/notes/mqtt-comm/</link><pubDate>Fri, 03 May 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/mqtt-comm/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;The MQTT message bus is a simple but critical element of our MBR
software design. MQTT provides what is known as a &lt;em&gt;publish/subscribe&lt;/em&gt;
or &lt;em&gt;pubsub&lt;/em&gt; communications model. This model of machine to machine
communication has some attractive benefits for realtime driving
algorithms that we will discuss in this post.&lt;/p&gt;</description></item><item><title>Streaming Video is Complicated</title><link>https://rustyeddy.com/notes/streaming-video/</link><pubDate>Mon, 29 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;I need to stream live video from a moving vehicle with a connected
camera and a possibly connected Wi-Fi network.&lt;/p&gt;
&lt;h2 id="live-high-resolution-video"&gt;Live High Resolution Video&lt;/h2&gt;
&lt;p&gt;Video will stream from the vehicle to be picked up by &lt;em&gt;video
consumers&lt;/em&gt; and processed as required. Examples of &lt;em&gt;consumers&lt;/em&gt; are
Live Video Display on our (Webapp), OpenCV for vision algorithms.&lt;/p&gt;</description></item><item><title>Streaming Video Tools</title><link>https://rustyeddy.com/notes/streaming-video-tools/</link><pubDate>Tue, 23 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video-tools/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;The grandparents of streaming video, and snapshots, read, writing
and transcoding video and single frame images are &lt;em&gt;ffmpeg&lt;/em&gt;, &lt;em&gt;vlc&lt;/em&gt; and
&lt;em&gt;gstreamer&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Other platforms, such as the wildly cool and inexpensive Raspberry Pi
and attached CSI Camera (Raspberry Pi Camera) have thier own set of
utilities: like raspivid. Or the NVidia Nano with it&amp;rsquo;s gst-streamer
plugins and nvgst-capture/nvgst-playback utilies.&lt;/p&gt;</description></item><item><title>TLV: The Type-Length-Value Protocol</title><link>https://rustyeddy.com/notes/tlv-and-realitime-communication/</link><pubDate>Wed, 17 Apr 2019 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/tlv-and-realitime-communication/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;TLV is a very simple communication protocol that can be used to send
messages around a complex, distributed system.&lt;/p&gt;</description></item><item><title>Streaming Live Video on a Local LAN vs. the Internet</title><link>https://rustyeddy.com/notes/streaming-video-local-network/</link><pubDate>Sun, 23 Dec 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/streaming-video-local-network/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;differences in local vs. internet and streaming video&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;live stream vs. video on demand&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what does real time mean?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what to do with late packets?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;UDP vs. TCP in the local network&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and UDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and RTCP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and RTSP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;RTP and Multicast&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Tools used&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;RTSP is a good option for streaming video in a local setup up, where
minimal delay is the highest priority. However, RTSP does not
typically do very well over the Internet due to the nature of
RTP/UDP.&lt;/p&gt;</description></item><item><title>Publications</title><link>https://rustyeddy.com/resume/pubs/</link><pubDate>Fri, 21 Sep 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/resume/pubs/</guid><description>&lt;p&gt;&lt;strong&gt;Ramesh Govindan, et el.&lt;/strong&gt; &lt;em&gt;&amp;ldquo;An Architecture for Stable, Analyzable
Internet Routing&amp;rdquo;&lt;/em&gt;, IEEE Network Magazine, Jan-Feb 1999.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy, Ramesh Govindan,&lt;/strong&gt; &lt;em&gt;&amp;ldquo;Testing Protocol Implementations
with pkt&amp;rdquo;&lt;/em&gt;, Networld+Interop 99 Engineers Conference Proceedings, June
1999&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy&lt;/strong&gt;, &lt;em&gt;&amp;ldquo;Emulating Multicast Routing Protocols in a Software
Defined Networking (SDN) Controller&amp;rdquo;&lt;/em&gt;, AT&amp;amp;T 2016 Software Symposium&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rusty Eddy&lt;/strong&gt;, &lt;em&gt;&amp;ldquo;Testing Multicast SDN Networks in a Container&amp;rdquo;&lt;/em&gt;,
AT&amp;amp;T 2016 Software Symposium&lt;/p&gt;</description></item><item><title>Inexpensive Motor Controllers for Arduino and Raspberry Pi</title><link>https://rustyeddy.com/notes/motor-controlor-notes/</link><pubDate>Wed, 22 Aug 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/motor-controlor-notes/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;I prefer to use an Arduino with a Motor Controller over say a
Raspberry Pi with a motor-controller. I believe the Arduino has
better support for dedicated Real-time software vs. the Raspberry Pi
and as a superior platform for general computing including running
Control Software. This is how we do it on the West side &amp;hellip;&lt;/p&gt;</description></item><item><title>Control System Design</title><link>https://rustyeddy.com/notes/control-design/</link><pubDate>Sat, 05 May 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/control-design/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;p&gt;Early in the process of building the first set of mobile robots I
discovered that I was not going to settle on a single micro
controller.&lt;/p&gt;
&lt;p&gt;The first two obvious choices being the Arduino or Raspberry Pi, for which
I tried both with a modest level of success. I quickly realized that
I would not be providing my sole focus on either platform, neither was
sufficient for my grand plans for a number of reasons.&lt;/p&gt;</description></item><item><title>IP Multicast Basics</title><link>https://rustyeddy.com/notes/ip-multicast/</link><pubDate>Sat, 03 Feb 2018 00:00:00 +0000</pubDate><guid>https://rustyeddy.com/notes/ip-multicast/</guid><description>&lt;div class="alert alert-secondary border mb-4" role="note"&gt;
 Older project note. Kept for historical context; some implementation details may no longer reflect my current recommendations.
&lt;/div&gt;

&lt;h2 id="ip-multicast-addresses"&gt;IP Multicast addresses&lt;/h2&gt;
&lt;p&gt;The typical IP addresses used by computers networking today are known
as &lt;em&gt;unicast addresses&lt;/em&gt;, meaning that every unicast address as a single
(physical or logical) end point.&lt;/p&gt;
&lt;p&gt;Most all computer networking is &lt;em&gt;point to point&lt;/em&gt; between two specific
IP addresses, you name it: web browsing, email exchange, transfer
files and so much more.&lt;/p&gt;</description></item></channel></rss>