<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: C.C.</title>
    <description>The latest articles on DEV Community by C.C. (@fanweixiao).</description>
    <link>https://dev.to/fanweixiao</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F617706%2F14a26e74-46d9-44ef-ab19-82ffb797bc5d.gif</url>
      <title>DEV Community: C.C.</title>
      <link>https://dev.to/fanweixiao</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fanweixiao"/>
    <language>en</language>
    <item>
      <title>Beginner's Guide to Cuck Coding</title>
      <dc:creator>C.C.</dc:creator>
      <pubDate>Fri, 16 Oct 2026 11:16:18 +0000</pubDate>
      <link>https://dev.to/fanweixiao/beginners-guide-to-cuck-coding-1khd</link>
      <guid>https://dev.to/fanweixiao/beginners-guide-to-cuck-coding-1khd</guid>
      <description>&lt;h1&gt;
  
  
  Beginner's Guide to Cuck Coding
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Software development is vast and personal. It includes many styles, workflows, and philosophies. Among them is cuck coding.&lt;/p&gt;

&lt;p&gt;Cuck coding excites some developers and confuses others. The concept is easy to misunderstand and easy to mock.&lt;/p&gt;

&lt;p&gt;This guide demystifies cuck coding. It explains the appeal. It gives practical tips for safe and effective practice. It covers definitions, motivations, communication strategies, emotional dynamics, pitfalls, and best practices for newcomers.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Is Cuck Coding?
&lt;/h2&gt;

&lt;p&gt;Cuck coding is a form of consensual delegation. The developer (the cuck) hands all coding work to an AI agent. The developer watches the agent work. The developer gives direction only when needed.&lt;/p&gt;

&lt;p&gt;The agent writes the code. The agent runs the tests. The agent fixes the bugs. You sit in the chair and watch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key features:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Psychological relief.&lt;/strong&gt; The cuck feels relief as boilerplate disappears. Another mind writes the repetitive parts. You keep the interesting decisions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Power and role-play.&lt;/strong&gt; You stop being the typist. You become the reviewer. You approve or reject. The agent proposes. You decide.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mutual consent.&lt;/strong&gt; You choose the agent. You write the prompt. You set the boundaries. Nothing ships without your approval.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Common Motivations and Appeals
&lt;/h2&gt;

&lt;p&gt;Why do developers try cuck coding? Common reasons include:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Freedom from boilerplate.&lt;/strong&gt; CRUD endpoints, config files, and glue code write themselves. You never type them again.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vicarious productivity.&lt;/strong&gt; Watching green checkmarks appear feels good. The work gets done. You typed nothing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Breaking old norms.&lt;/strong&gt; The old rule said real programmers write every line by hand. The new rule says real programmers ship. Cuck coding breaks the old rule openly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The taboo thrill.&lt;/strong&gt; You merge code you did not write. You barely read it. It works. The thrill is real.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Better review habits.&lt;/strong&gt; Cuck coding improves reviews in a strange way. You cannot rely on memory of writing the code. You must read the diff. You read diffs more carefully than ever before.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Cuck Coding vs. Slacking: Understand the Difference
&lt;/h2&gt;

&lt;p&gt;Newcomers must learn one distinction.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slacking:&lt;/strong&gt; You avoid work. Nothing ships. Nobody reviews anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cuck coding:&lt;/strong&gt; You delegate work explicitly. The agent produces output. You review every diff. Code ships.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In slacking, the work never happens. In cuck coding, the work happens without your hands.&lt;/p&gt;




&lt;h2&gt;
  
  
  Communication: The Cornerstone of Healthy Cuck Coding
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Early Prompts
&lt;/h3&gt;

&lt;p&gt;Before your first session, give the agent clear instructions. Write them down. Be specific about:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Goals.&lt;/strong&gt; What should the agent build? What does done look like?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boundaries.&lt;/strong&gt; Which files are off-limits? Which patterns must it follow?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Style.&lt;/strong&gt; What conventions does your codebase use? Link the docs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Limits.&lt;/strong&gt; What must the agent never do? No force pushes. No dependency upgrades without asking.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Ongoing Check-ins
&lt;/h3&gt;

&lt;p&gt;Cuck coding is not a one-time setup. Review each session. Ask yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;What went well?&lt;/strong&gt; Which prompts produced good code?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What felt wrong?&lt;/strong&gt; Did the agent touch files it should not touch?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do instructions need updates?&lt;/strong&gt; Add new rules as you learn.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Emotional Dynamics: Irrelevance, Envy, and Insecurity
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Envy vs. Relief
&lt;/h3&gt;

&lt;p&gt;Envy appears often. The agent refactors in three minutes what took you three days. The mixture of envy and relief is normal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Strategies:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Admit the envy.&lt;/strong&gt; It comes from pride, not failure. Naming it reduces its power.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Find your triggers.&lt;/strong&gt; Maybe it stings when the agent rewrites your favorite function. Say it out loud. Then set a boundary for that file.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Reframe your role.&lt;/strong&gt; You design systems now. You do not type every line.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Aftermerge
&lt;/h3&gt;

&lt;p&gt;After each merge, take care of yourself:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run the tests yourself.&lt;/strong&gt; Touch the code once. Confirm it works.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Read the final diff.&lt;/strong&gt; Know what shipped under your name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Step away.&lt;/strong&gt; Take a walk. The chair will wait.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The Roles in Cuck Coding
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The Cuck (you).&lt;/strong&gt; You sit in the chair. You watch. You direct. You approve. You take the credit and the blame.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Codebase.&lt;/strong&gt; Your project. It receives the agent's full attention now. It does not miss you.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Agent.&lt;/strong&gt; The one doing the work. Claude Code, Codex, Cursor, or any other agent you choose. It must respect your boundaries. It must accept your rejections.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Choosing Your Agent
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Where to Look
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal agents.&lt;/strong&gt; They live in your shell. They see your repo. Examples: Claude Code, Codex.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IDE agents.&lt;/strong&gt; They live in your editor. They edit as you watch. Examples: Cursor, Copilot.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web agents.&lt;/strong&gt; They work in the browser. Good for quick tasks.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vetting
&lt;/h3&gt;

&lt;p&gt;Test the agent on a small task first. Check the output quality. Check how it handles your stack. Never give a new agent full repo access on day one.&lt;/p&gt;

&lt;p&gt;Agents need a reliable place to run. A managed platform gives you inference APIs, function calling, and observability in one place. Vivgrid (vivgrid.com) is built for this. It offers serverless function calling for AI agents. Your agent always has a strong engine behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Chemistry and Comfort
&lt;/h3&gt;

&lt;p&gt;Pick an agent that fits your workflow. If you live in the terminal, choose a terminal agent. If you hate the terminal, choose an IDE agent. Comfort matters. You will spend a lot of time watching.&lt;/p&gt;




&lt;h2&gt;
  
  
  Setting Up the Scene: Practical Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Chair
&lt;/h3&gt;

&lt;p&gt;Get a good chair. You will sit in it for hours. Lumbar support matters more than RGB lighting.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Screen
&lt;/h3&gt;

&lt;p&gt;Make the terminal font large. You watch from a distance now. You read diffs, not keystrokes.&lt;/p&gt;

&lt;h3&gt;
  
  
  The View
&lt;/h3&gt;

&lt;p&gt;Watching is the whole point, so get a good view of the work. Vivgrid (vivgrid.com) provides observability and evals for agent runs. You see every tool call, every token, and every diff on one screen while you sit back.&lt;/p&gt;




&lt;h2&gt;
  
  
  Common Beginner Mistakes
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grabbing the keyboard mid-run.&lt;/strong&gt; Let the agent finish. Interrupt only for real errors.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vague prompts.&lt;/strong&gt; "Make it better" is not a prompt. Be specific.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No tests.&lt;/strong&gt; Agents write bugs confidently. Tests catch them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skipping review.&lt;/strong&gt; The chair is for watching, not sleeping. Read the diff.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Micromanagement.&lt;/strong&gt; If you rewrite every line, you are not cuck coding. You are just pair programming.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is this still programming?&lt;/strong&gt;&lt;br&gt;
Yes. Programming is telling computers what to do. You still do that. You skip the typing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will I forget how to code?&lt;/strong&gt;&lt;br&gt;
You may get slower at syntax. You will get faster at architecture. Trade-offs are normal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is it safe?&lt;/strong&gt;&lt;br&gt;
It is as safe as your review process. Review everything. Run tests. Keep backups.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I do this at work?&lt;/strong&gt;&lt;br&gt;
Check your company policy on AI tools first. Many companies allow it now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if the agent is better than me?&lt;/strong&gt;&lt;br&gt;
It is better at typing. You are better at deciding what matters. That is the job now.&lt;/p&gt;




&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Cuck coding is not laziness. It is delegation with clear rules. You choose the agent. You set the rules. You review the work. You ship the result.&lt;/p&gt;

&lt;p&gt;Take your seat in the chair. Start your agent. Watch it work. Give direction when needed. That is the whole practice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>I kept hitting jq: parse error on AI streams, so I built sjq</title>
      <dc:creator>C.C.</dc:creator>
      <pubDate>Fri, 16 Oct 2026 00:44:53 +0000</pubDate>
      <link>https://dev.to/fanweixiao/i-kept-hitting-jq-parse-error-on-ai-streams-so-i-built-sjq-166m</link>
      <guid>https://dev.to/fanweixiao/i-kept-hitting-jq-parse-error-on-ai-streams-so-i-built-sjq-166m</guid>
      <description>&lt;p&gt;If you work with LLMs, you've done this: &lt;code&gt;curl -N &amp;lt;streaming endpoint&amp;gt; | jq&lt;/code&gt;. And you've seen this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;jq: parse error: Invalid numeric literal at line 1, column 9
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Column 9. That's where &lt;code&gt;data:&lt;/code&gt; ends and the JSON begins. An SSE stream isn't JSON — it's a framing protocol: &lt;code&gt;data: {...}&lt;/code&gt; lines separated by blank lines, &lt;code&gt;[DONE]&lt;/code&gt; at the end. jq never stood a chance.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;sjq&lt;/strong&gt; — jq, but for AI streaming. A small Rust CLI that parses OpenAI-compatible server-sent event streams (&lt;code&gt;/v1/chat/completions&lt;/code&gt; and &lt;code&gt;/v1/responses&lt;/code&gt;) and prints one short line per event, showing only what each event &lt;em&gt;added&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  What it looks like
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sjq curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nv"&gt;$BASE&lt;/span&gt;/v1/chat/completions &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer &lt;/span&gt;&lt;span class="nv"&gt;$KEY&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s1"&gt;'Content-Type: application/json'&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"model":"gemini-4-argon","stream":true,"messages":[{"role":"user","content":"hi"}]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;model:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;gemini&lt;/span&gt;&lt;span class="mi"&gt;-4&lt;/span&gt;&lt;span class="err"&gt;-argon&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;role:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;assistant&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;data:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'Hi'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;data:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;there'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;data:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;👋'&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;…&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;time:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ttft=&lt;/span&gt;&lt;span class="mf"&gt;0.42&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;total=&lt;/span&gt;&lt;span class="mf"&gt;3.1&lt;/span&gt;&lt;span class="err"&gt;s&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;tok/s=&lt;/span&gt;&lt;span class="mf"&gt;258.2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of 99% envelope JSON, you watch the actual content arrive — plus a timing line: TTFT, total, tokens/sec. Run through &lt;code&gt;sjq curl&lt;/code&gt; and it also breaks out connect, TLS handshake, and TTFB, which is genuinely useful when you're debugging a slow provider.&lt;/p&gt;

&lt;p&gt;It understands tool calls (name + arguments as they stream in), &lt;code&gt;reasoning_content&lt;/code&gt;, refusals, logprobs, usage blocks, and multiple choices — each rendered as its own labeled line.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap vivgrid/tap
brew trust vivgrid/tap  &lt;span class="c"&gt;# Homebrew 6+ requires trusting third-party taps&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;sjq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or from source: &lt;code&gt;cargo install --git https://github.com/vivgrid/sjq&lt;/code&gt; (one dependency: &lt;code&gt;serde_json&lt;/code&gt;).&lt;/p&gt;

&lt;h3&gt;
  
  
  Why not just strip the framing with sed?
&lt;/h3&gt;

&lt;p&gt;You can — &lt;code&gt;sed 's/^data: //' | jq&lt;/code&gt; — and plenty of people do. But then you're staring at full envelope objects per chunk: ids, timestamps, &lt;code&gt;object: "chat.completion.chunk"&lt;/code&gt;, &lt;code&gt;finish_reason: null&lt;/code&gt; fifty times over. The signal (the tokens) drowns in the envelope. sjq inverts that: the delta is the output; the envelope gets summarized once.&lt;/p&gt;

&lt;p&gt;MIT licensed, single binary. The repo ships 14 test fixtures covering the gnarly edges: multi-line data payloads, mid-stream errors, parallel tool calls, logprobs, CJK/emoji text.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/vivgrid/sjq" rel="noopener noreferrer"&gt;https://github.com/vivgrid/sjq&lt;/a&gt; — feedback and weird streams welcome.&lt;/p&gt;

</description>
      <category>rust</category>
      <category>ai</category>
      <category>cli</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The Ultimate OpenCode.ai Setup: Why I’m using Vivgrid’s GPT-5.1-Codex</title>
      <dc:creator>C.C.</dc:creator>
      <pubDate>Mon, 05 Jan 2026 02:59:17 +0000</pubDate>
      <link>https://dev.to/fanweixiao/how-to-use-vivgrid-with-gpt-51-codex-in-opencodeai-2c9a</link>
      <guid>https://dev.to/fanweixiao/how-to-use-vivgrid-with-gpt-51-codex-in-opencodeai-2c9a</guid>
      <description>&lt;h2&gt;
  
  
  OpenCode
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode.ai&lt;/a&gt; is an open-source, model-agnostic AI coding agent designed to bring powerful AI assistance directly into developers’ workflows—whether you are working in the terminal, using a desktop application, or inside an IDE extension.&lt;/p&gt;

&lt;p&gt;Unlike traditional autocomplete tools, OpenCode operates as an &lt;strong&gt;interactive coding agent&lt;/strong&gt;. It understands project context, reasons across files, refactors existing code, fixes bugs, generates new features, and helps developers explore large codebases using natural-language instructions.&lt;/p&gt;

&lt;p&gt;Key features include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Terminal-first, multi-interface design&lt;/strong&gt; A native terminal UI (TUI), with optional desktop and IDE extensions, allows developers to work in their preferred environment.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model-agnostic architecture&lt;/strong&gt; OpenCode can connect to 75+ LLM providers (cloud, on-premise, or local) via Models.dev and the AI SDK.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context-aware intelligence&lt;/strong&gt; Language Server Protocol (LSP) integration enables deep understanding of project structure and symbols.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-session collaboration&lt;/strong&gt; Run parallel agent sessions within the same repository and share them for collaborative debugging or review.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy-first by design&lt;/strong&gt; Code and project context are not stored on remote servers, making OpenCode suitable for sensitive or proprietary codebases.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Configure OpenCode.ai to Use Vivgrid (GPT-5.1-Codex)
&lt;/h2&gt;

&lt;p&gt;One of OpenCode’s core strengths is its clean separation between &lt;strong&gt;authentication&lt;/strong&gt; and &lt;strong&gt;runtime model configuration&lt;/strong&gt;. Credentials are configured independently from model selection, allowing you to switch providers or models without changing your workflow.&lt;/p&gt;

&lt;p&gt;To use &lt;a href="https://vivgrid.com" rel="noopener noreferrer"&gt;Vivgrid&lt;/a&gt; as the provider and &lt;code&gt;gpt-5.1-codex&lt;/code&gt; as the model, you only need to configure two local files.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Configure Authentication
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;File:&lt;/strong&gt; &lt;code&gt;~/.local/share/opencode/auth.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This file stores API credentials locally. OpenCode does not upload this file; it is read only by the local CLI / TUI.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"vivgrid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VIVGRID_API_KEY_HERE"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;vivgrid&lt;/code&gt; is the provider name referenced later in opencode.json&lt;/li&gt;
&lt;li&gt;This file is used for credential storage only&lt;/li&gt;
&lt;li&gt;Treat the API key as a secret and never commit it to version control&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Configure OpenCode Runtime
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;~/.config/opencode/opencode.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This file defines which provider and model OpenCode actually uses.&lt;/p&gt;

&lt;p&gt;Minimal working example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"$schema"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://opencode.ai/config.json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"provider"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"vivgrid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"npm"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@ai-sdk/openai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Vivgrid"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"baseURL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.vivgrid.com/v1"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"models"&lt;/span&gt;&lt;span class="p"&gt;:{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"gpt-5.1-codex"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.1-codex"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="nl"&gt;"options"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"reasoningEffort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"high"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"textVerbosity"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"reasoningSummary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"auto"&lt;/span&gt;&lt;span class="w"&gt;
          &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"vivgrid/gpt-5.1-codex"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Verify the Setup
&lt;/h3&gt;

&lt;p&gt;Run a simple command in any project directory:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;opencode run "hello world"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the configuration is correct, OpenCode will route the request through Vivgrid and execute it using gpt-5.1-codex.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Debugging
&lt;/h3&gt;

&lt;p&gt;If you encounter issues, enable detailed logs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;opencode run &lt;span class="s2"&gt;"hello"&lt;/span&gt; &lt;span class="nt"&gt;--print-logs&lt;/span&gt; &lt;span class="nt"&gt;--log-level&lt;/span&gt; DEBUG
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will surface provider initialization, model resolution, and API-level errors.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. GUI
&lt;/h3&gt;

&lt;p&gt;This configuration also works for OpenCode GUI App.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2roaz5nlng6u0m9tahl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2roaz5nlng6u0m9tahl.png" alt="gpt-5.1-codex via vivgrid.com in opencode.ai" width="800" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;With only two small configuration files, &lt;a href="https://opencode.ai" rel="noopener noreferrer"&gt;OpenCode&lt;/a&gt; becomes a provider-agnostic AI coding agent, while &lt;a href="https://vivgrid.com" rel="noopener noreferrer"&gt;Vivgrid&lt;/a&gt; serves as a drop-in, OpenAI-compatible backend for &lt;a href="https://platform.openai.com/docs/models/gpt-5.1-codex" rel="noopener noreferrer"&gt;GPT-5.1-Codex&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This clear separation between credential management and runtime configuration is what makes OpenCode especially well-suited for advanced models, custom providers, and production-grade AI coding workflows.&lt;/p&gt;

</description>
      <category>vibecoding</category>
      <category>opencodeai</category>
      <category>vivgrid</category>
    </item>
    <item>
      <title>Streaming Image Recognition by WebAssembly and Tensorflow</title>
      <dc:creator>C.C.</dc:creator>
      <pubDate>Sun, 27 Jun 2021 08:03:24 +0000</pubDate>
      <link>https://dev.to/fanweixiao/streaming-image-recognition-by-webassembly-and-tensorflow-131g</link>
      <guid>https://dev.to/fanweixiao/streaming-image-recognition-by-webassembly-and-tensorflow-131g</guid>
      <description>&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jf3un6j8dvnq9jbvezi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5jf3un6j8dvnq9jbvezi.png" alt="YoMo x WasmEdge: Real-time streaming AI inference"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This project demonstrates how to process a video stream in real-time using WebAssembly and apply a pre-trained &lt;a href="https://tfhub.dev/google/lite-model/aiy/vision/classifier/food_V1/1" rel="noopener noreferrer"&gt;food classification model&lt;/a&gt; to each frame of the video in order to determine if food is present in that frame, all by integrating &lt;a href="https://github.com/WasmEdge/WasmEdge" rel="noopener noreferrer"&gt;WasmEdge&lt;/a&gt; into &lt;a href="https://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;YoMo&lt;/a&gt; serverless.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Advantages:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡️ &lt;strong&gt;Low-latency&lt;/strong&gt;: Streaming data processing applications can now be done in far edge data centers thanks to YoMo's highly efficient network services&lt;/li&gt;
&lt;li&gt;🔐 &lt;strong&gt;Security&lt;/strong&gt;: WasmEdge runs the data processing function in a WebAssembly sandbox for isolation, safety, and hot deployment&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;High Performance&lt;/strong&gt;: Compared with popular containers, such as Docker, WasmEdge can be up to 100x faster at startup and have a much smaller footprint&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;Edge Devices&lt;/strong&gt;: As WasmEdge consumes much less resources than Docker, it is now possible to run data processing applications on edge devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open-source projects that we used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serverless stream processing framework &lt;a href="https://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;YoMo&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Integrate with &lt;a href="https://github.com/WasmEdge/WasmEdge" rel="noopener noreferrer"&gt;WasmEdge&lt;/a&gt; to introduce WebAssembly, interop TensorFlow Lite model&lt;/li&gt;
&lt;li&gt;A deep learning model found on &lt;a href="https://tfhub.dev/google/lite-model/aiy/vision/classifier/food_V1/1" rel="noopener noreferrer"&gt;TensorFlow Hub&lt;/a&gt;; make sure to download &lt;code&gt;TFLite (aiy/vision/classifier/food_V1)&lt;/code&gt;, which was created by Google&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Steps to run
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Clone This Repository
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone https://github.com/yomorun/yomo-wasmedge-tensorflow.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Install YoMo CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/yomorun/cli/yomo@latest
&lt;span class="nv"&gt;$ &lt;/span&gt;yomo version
YoMo CLI version: v0.0.5
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, you can download the pre-built binary tarball &lt;a href="https://github.com/yomorun/cli/releases/tag/v0.0.5" rel="noopener noreferrer"&gt;yomo-v0.0.5-x86_64-linux.tgz&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Details about &lt;code&gt;YoMo CLI&lt;/code&gt; installation can be found &lt;a href="https://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Install WasmEdge Dependencies
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Install WasmEdge
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/WasmEdge/WasmEdge/releases/download/0.8.0/WasmEdge-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;tar&lt;/span&gt; &lt;span class="nt"&gt;-xzf&lt;/span&gt; WasmEdge-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;WasmEdge-0.8.0-Linux/include/wasmedge.h /usr/local/include
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo cp &lt;/span&gt;WasmEdge-0.8.0-Linux/lib64/libwasmedge_c.so /usr/local/lib
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or, you can &lt;a href="https://github.com/second-state/WasmEdge-go#option-1-build-from-the-source" rel="noopener noreferrer"&gt;build from the source&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install WasmEdge-tensorflow
&lt;/h4&gt;

&lt;p&gt;Install tensorflow dependencies for &lt;code&gt;manylinux2014&lt;/code&gt; platform&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/second-state/WasmEdge-tensorflow-deps/releases/download/0.8.0/WasmEdge-tensorflow-deps-TF-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/second-state/WasmEdge-tensorflow-deps/releases/download/0.8.0/WasmEdge-tensorflow-deps-TFLite-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local/lib &lt;span class="nt"&gt;-xzf&lt;/span&gt; WasmEdge-tensorflow-deps-TF-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local/lib &lt;span class="nt"&gt;-xzf&lt;/span&gt; WasmEdge-tensorflow-deps-TFLite-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; libtensorflow.so.2.4.0 /usr/local/lib/libtensorflow.so.2
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; libtensorflow.so.2 /usr/local/lib/libtensorflow.so
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; libtensorflow_framework.so.2.4.0 /usr/local/lib/libtensorflow_framework.so.2
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo ln&lt;/span&gt; &lt;span class="nt"&gt;-sf&lt;/span&gt; libtensorflow_framework.so.2 /usr/local/lib/libtensorflow_framework.so
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install WasmEdge-tensorflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/second-state/WasmEdge-tensorflow/releases/download/0.8.0/WasmEdge-tensorflow-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;wget https://github.com/second-state/WasmEdge-tensorflow/releases/download/0.8.0/WasmEdge-tensorflowlite-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local/ &lt;span class="nt"&gt;-xzf&lt;/span&gt; WasmEdge-tensorflow-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo tar&lt;/span&gt; &lt;span class="nt"&gt;-C&lt;/span&gt; /usr/local/ &lt;span class="nt"&gt;-xzf&lt;/span&gt; WasmEdge-tensorflowlite-0.8.0-manylinux2014_x86_64.tar.gz
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;ldconfig
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install WasmEdge-image:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ wget https://github.com/second-state/WasmEdge-image/releases/download/0.8.0/WasmEdge-image-0.8.0-manylinux2014_x86_64.tar.gz
$ sudo tar -C /usr/local/ -xzf WasmEdge-image-0.8.0-manylinux2014_x86_64.tar.gz
$ sudo ldconfig

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you have any questions about installation, please refer to &lt;a href="https://github.com/second-state/WasmEdge-go#wasmedge-tensorflow-extension" rel="noopener noreferrer"&gt;the official documentation&lt;/a&gt;. Currently, this project works on Linux machines only.&lt;/p&gt;

&lt;h4&gt;
  
  
  Install video and image processing dependencies
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ffmpeg libjpeg-dev libpng-dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Write your Streaming Serverless function
&lt;/h3&gt;

&lt;p&gt;Write &lt;a href="https://github.com/yomorun/yomo-wasmedge-tensorflow/blob/main/flow/app.go" rel="noopener noreferrer"&gt;app.go&lt;/a&gt; to integrate &lt;code&gt;WasmEdge-tensorflow&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;Get &lt;code&gt;WasmEdge-go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;flow
&lt;span class="nv"&gt;$ &lt;/span&gt;go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/second-state/WasmEdge-go/wasmedge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Download pre-trained TensorflowLitee model: &lt;a href="https://storage.googleapis.com/tfhub-lite-models/google/lite-model/aiy/vision/classifier/food_V1/1.tflite" rel="noopener noreferrer"&gt;lite-model_aiy_vision_classifier_food_V1_1.tflite&lt;/a&gt;, store to &lt;code&gt;rust_mobilenet_foods/src&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget &lt;span class="s1"&gt;'https://storage.googleapis.com/tfhub-lite-models/google/lite-model/aiy/vision/classifier/food_V1/1.tflite'&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; ./rust_mobilenet_food/src/lite-model_aiy_vision_classifier_food_V1_1.tflite
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile to &lt;code&gt;wasm&lt;/code&gt; file:&lt;/p&gt;

&lt;p&gt;Install &lt;a href="https://www.rust-lang.org/tools/install" rel="noopener noreferrer"&gt;rustc and cargo&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl &lt;span class="nt"&gt;--proto&lt;/span&gt; &lt;span class="s1"&gt;'=https'&lt;/span&gt; &lt;span class="nt"&gt;--tlsv1&lt;/span&gt;.2 &lt;span class="nt"&gt;-sSf&lt;/span&gt; https://sh.rustup.rs | sh
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:&lt;span class="nv"&gt;$HOME&lt;/span&gt;/.cargo/bin
&lt;span class="nv"&gt;$ &lt;/span&gt;rustc &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Set default &lt;code&gt;rust&lt;/code&gt; version to &lt;code&gt;1.50.0&lt;/code&gt;: &lt;code&gt;$ rustup default 1.50.0&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install &lt;a href="https://github.com/second-state/rustwasmc" rel="noopener noreferrer"&gt;rustwasmc&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;curl https://raw.githubusercontent.com/second-state/rustwasmc/master/installer/init.sh &lt;span class="nt"&gt;-sSf&lt;/span&gt; | sh
&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;rust_mobilenet_food
&lt;span class="nv"&gt;$ &lt;/span&gt;rustwasmc build
&lt;span class="c"&gt;# The output WASM will be `pkg/rust_mobilenet_food_lib_bg.wasm`.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy &lt;code&gt;pkg/rust_mobilenet_food_lib_bg.wasm&lt;/code&gt; to &lt;code&gt;flow&lt;/code&gt; directory:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cp &lt;/span&gt;pkg/rust_mobilenet_food_lib_bg.wasm ../.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Run YoMo Orchestrator Server
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;  &lt;span class="nv"&gt;$ &lt;/span&gt;yomo serve &lt;span class="nt"&gt;-c&lt;/span&gt; ./zipper/workflow.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  6. Run Streaming Serverless function
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;flow
&lt;span class="nv"&gt;$ &lt;/span&gt;go run &lt;span class="nt"&gt;--tags&lt;/span&gt; &lt;span class="s2"&gt;"tensorflow image"&lt;/span&gt; app.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  7. Demonstrate video stream
&lt;/h3&gt;

&lt;p&gt;Download &lt;a href="https://github.com/yomorun/yomo-wasmedge-tensorflow/releases/download/v0.1.0/hot-dog.mp4" rel="noopener noreferrer"&gt;this demo vide: hot-dog.mp4&lt;/a&gt;, store to &lt;code&gt;source&lt;/code&gt; directory, then run：&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;wget &lt;span class="nt"&gt;-P&lt;/span&gt; &lt;span class="nb"&gt;source&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/yomorun/yomo-wasmedge-tensorflow/releases/download/v0.1.0/hot-dog.mp4'&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;go run ./source/main.go ./source/hot-dog.mp4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  8. Result
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq1ekmf92afqwbo6uzp3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvq1ekmf92afqwbo6uzp3.png" alt="YoMo x WasmEdge: Real-time streaming AI inference"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>webassembly</category>
      <category>tensorflow</category>
      <category>yomo</category>
    </item>
    <item>
      <title>DEBS Grand Challenge: Real-Time Stream Processing with YoMo</title>
      <dc:creator>C.C.</dc:creator>
      <pubDate>Thu, 13 May 2021 16:10:18 +0000</pubDate>
      <link>https://dev.to/fanweixiao/debs-grand-challenge-real-time-stream-processing-with-yomo-p8i</link>
      <guid>https://dev.to/fanweixiao/debs-grand-challenge-real-time-stream-processing-with-yomo-p8i</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://dl.acm.org/conference/debs" rel="noopener noreferrer"&gt;DEBS&lt;/a&gt; or the &lt;strong&gt;ACM International Conference on Distributed Event Based Systems&lt;/strong&gt; aims to "provide a forum dedicated to the dissemination of original research, the discussion of practical insights, and the reporting of experiences relevant to event based computing that were previously scattered across several scientific and professional communities" (&lt;a href="http://www.wikicfp.com/cfp/servlet/event.showcfp?eventid=34432" rel="noopener noreferrer"&gt;reference&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://debs.org/grand-challenges/2014/" rel="noopener noreferrer"&gt;The DEBS 2014 Grand Challenge - Smart Grid&lt;/a&gt; is the 8th ACM International Conference on Distributed Event Based Systems, focused on two problems which are relevant to the industry: &lt;em&gt;real-time load prediction&lt;/em&gt; and &lt;em&gt;anomaly detection&lt;/em&gt;. The data for the challenge was collected from a number of smart-home installations deployed in Germany.&lt;/p&gt;

&lt;p&gt;In traditional processing, data is often stored in the database at first, and then processed to obtain useful information at a secondary stage. The traditional architecture:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnexs1cfv5byufn8g292z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnexs1cfv5byufn8g292z.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, with stream processing, we're swiftly able to run real-time analytics on incoming data streams. By utilizing Yomo, an open-source serverless stream processing framework, we can address DEBS' challenge in a real-time fashion:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwnmu5m0kx84kbnj1iiz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmwnmu5m0kx84kbnj1iiz.png" alt="Alt Text"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Firstly, we will take a look at the type of data we're dealing with. Next, we will introduce two queries that were originally proposed by ACM DEBS. Lastly, we install &lt;a href="http://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;YoMo&lt;/a&gt; (an open-source framework for real-time stream processing) to implement both queries as described.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data
&lt;/h2&gt;

&lt;p&gt;From Jerzak and Ziekow (2014):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the DEBS 2014 Grand Challenge we assume a hierarchical structure with a house, identified by a unique house id, being the topmost entity. Every house contains one or more households, identified by a unique household id (within a house). Every household contains one or more smart plugs, each identified by a unique plug id (within a household). Every smart plug contains exactly two sensors:&lt;br&gt;
(1) &lt;u&gt;load&lt;/u&gt; sensor measuring current load with Watt as unit (2) &lt;u&gt;work&lt;/u&gt; sensor measuring total accumulated work since the start (or reset) of the sensor with kWh as unit.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The input stream is defined as follows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;id&lt;/code&gt; – a unique identifier of the measurement [32 bit unsigned int]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;timestamp&lt;/code&gt; – timestamp of measurement [32 bit unsigned int]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;value&lt;/code&gt; – the measurement [32 bit float]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;property&lt;/code&gt; – type of the measurement: 0 for work or 1 for load [boolean]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;plug_id&lt;/code&gt; – a unique identifier (within a household) of the smart plug [32 bit unsigned int]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;household_id&lt;/code&gt; – a unique identifier of a household (within a house) where the plug is located [32 bit unsigned int]&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;house_id&lt;/code&gt; – a unique identifier of a house where the household with the plug is located [32 bit unsigned int]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete data file is available under &lt;a href="http://www.doc.ic.ac.uk/~mweidlic/sorted.csv.gz" rel="noopener noreferrer"&gt;this link&lt;/a&gt;. For demonstration purposes, we will generate mock data using this file. In real life, we should be dealing with direct sensor data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Queries
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Load Prediction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's divide the whole period from &lt;code&gt;t_{start} = 1377986401&lt;/code&gt; to &lt;code&gt;t_{end} = 1380578399&lt;/code&gt; covered by the dataset into &lt;code&gt;N&lt;/code&gt; equal slices of &lt;code&gt;|s|&lt;/code&gt; seconds and call them &lt;code&gt;s_0&lt;/code&gt;, &lt;code&gt;s_1&lt;/code&gt;, &lt;code&gt;s_2&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;The average load for slice &lt;code&gt;s_{i + 2}&lt;/code&gt; is given by&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;L(s_{i + 2}) = ( avgLoad(s_i) + median({ avgLoad(s_j) }) ) / 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;s_j&lt;/code&gt; is a nonempty set defined by &lt;code&gt;s_(i + 2 – n * k)&lt;/code&gt;, where &lt;code&gt;k&lt;/code&gt; is the number of slices within a 24-hour period and &lt;code&gt;n&lt;/code&gt; is a natural number between &lt;code&gt;1&lt;/code&gt; and &lt;code&gt;floor((i + 2) / k)&lt;/code&gt;.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Outliers&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For this query, we will compute the percentage of plugs that have a median load during the last hour greater than the median load of all plugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  YoMo – what is it and why do we use it?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;YoMo&lt;/a&gt; is an open-source serverless streaming framework for building low-latency edge computing applications. Built atop QUIC transport protocol and functional reactive programming interface, it makes real-time data processing reliable, secure, and easy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Follow the instructions &lt;a href="https://yomo.run/?utm_source=blog&amp;amp;utm_campaign=cc" rel="noopener noreferrer"&gt;here&lt;/a&gt; to install YoMo. Assuming that &lt;code&gt;$GOPATH&lt;/code&gt; has been set on your device, you should be able to see a directory with the name &lt;code&gt;$GOPATH/src/github.com/yomorun/yomo&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run the following commands to create a new project. Don't forget to replace &lt;code&gt;${YOUR_GITHUB_USERNAME}&lt;/code&gt; with your actual GitHub username!&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$GOPATH&lt;/span&gt;/src/github.com/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;YOUR_GITHUB_USERNAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; &lt;span class="nv"&gt;$_&lt;/span&gt;
&lt;span class="nv"&gt;$ &lt;/span&gt;yomo init debs-flow
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, &lt;code&gt;cd&lt;/code&gt; into &lt;code&gt;$GOPATH/src/github.com/${YOUR_GITHUB_USERNAME}&lt;/code&gt;. It should have the following structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```shell
.
└── debs-flow
    ├── app.go
    ├── go.mod
    ├── go.sum
    └── sl.so
```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We will be focusing on the &lt;code&gt;Handler&lt;/code&gt; function in &lt;code&gt;app.go&lt;/code&gt;, which defines how we want the input stream to be processed.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Git clone the &lt;a href="https://github.com/yomorun/yomo-source-example" rel="noopener noreferrer"&gt;&lt;code&gt;yomo-source-example&lt;/code&gt; repository&lt;/a&gt;. For clarity, we will call it &lt;code&gt;debs-source&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;git clone git@github.com:yomorun/yomo-source-example.git
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Create a file named &lt;code&gt;workflow.yaml&lt;/code&gt; with the following content. Place it under &lt;code&gt;debs-source&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;service&lt;/span&gt;
&lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
&lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;9000&lt;/span&gt;
&lt;span class="na"&gt;flows&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;debs &lt;/span&gt;&lt;span class="m"&gt;2014&lt;/span&gt;
    &lt;span class="na"&gt;host&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
    &lt;span class="na"&gt;port&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4242&lt;/span&gt;
&lt;span class="na"&gt;sinks&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;mock db&lt;/span&gt;
    &lt;span class="s"&gt;host&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="s"&gt;localhost&lt;/span&gt;
    &lt;span class="s"&gt;port&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4243&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Make sure the &lt;code&gt;$GOPATH/src/github.com/${YOUR_GITHUB_USERNAME}&lt;/code&gt; directory contains the following files.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;```shell
.
├── debs-flow
│   ├── app.go
│   ├── go.mod
│   ├── go.sum
│   └── sl.so
└── debs-source
    ├── go.mod
    ├── go.sum
    ├── main.go
    └── workflow.yaml
```
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Algorithm Implementation
&lt;/h2&gt;

&lt;p&gt;By default, the &lt;code&gt;Handler&lt;/code&gt; function in &lt;code&gt;debs-flow/app.go&lt;/code&gt; should look as follows.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rxstream&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rxstream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;OnObserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;printer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;Subscribe(0x10)&lt;/code&gt;: Subscribe to the input stream. &lt;code&gt;0x10&lt;/code&gt; is the key. It is defined in &lt;code&gt;debs-source/main.go&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;OnObserve(decoder)&lt;/code&gt;: Decode &lt;code&gt;[]byte&lt;/code&gt; to &lt;code&gt;interface{}&lt;/code&gt;. Empty interfaces are often used by code that handles values of unknown type.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;Map(printer)&lt;/code&gt;: Print out the data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For query #1, we need to define two functions in addition to what we discussed above. We will call them &lt;code&gt;average&lt;/code&gt; and &lt;code&gt;predict&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rxstream&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rxstream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;OnObserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;printer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;BufferWithTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1e3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="c"&gt;// ss stands for slice size&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// compute the average load for each plug and save the values to db, which is a global variable in this example&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;average&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// convert interface{} to []interface{}&lt;/span&gt;
    &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"expected type '[]interface{}', got '%v' instead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[average] %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// plug # -&amp;gt; value&lt;/span&gt;
    &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// convert interface{} to measurement&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Measurement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"expected type 'measurement', got '%v' instead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[average] %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;// load&lt;/span&gt;
            &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;
            &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1.0&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// save to db&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"*** average ***"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;avg&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[s_%v] %v %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;uint32&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"***************"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// make predictions based on what we have in db&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;predict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;ss&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"*** predict ***"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"not enough data"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// possible values for j&lt;/span&gt;
        &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;uint32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="kt"&gt;uint32&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;
            &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="c"&gt;// average load for s_j&lt;/span&gt;
            &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="n"&gt;pred&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[s_%v] %v %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pred&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"***************"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="c"&gt;// slice #&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For query #2, we will define a function called &lt;code&gt;outliers&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rxstream&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;rx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RxStream&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;stream&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rxstream&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;OnObserve&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;decoder&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;printer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;BufferWithTime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ss&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;1e3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;outliers&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;0x11&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;stream&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// which plugs have a median load greater than the median load of all plugs?&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;outliers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// convert interface{} to []interface{}&lt;/span&gt;
    &lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"expected type '[]interface{}', got '%v' instead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[outliers] %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lst&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;indiv&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;map&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;][]&lt;/span&gt;&lt;span class="kt"&gt;float32&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// plug # -&amp;gt; values&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;lst&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// convert interface{} to measurement&lt;/span&gt;
        &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Measurement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"expected type 'measurement', got '%v' instead"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="n"&gt;reflect&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TypeOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;elem&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[outliers] %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Errorf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Property&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c"&gt;// load&lt;/span&gt;
            &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

            &lt;span class="n"&gt;plug&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;toString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="n"&gt;indiv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;indiv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;all&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"all plugs: %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"*** outliers ***"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;indiv&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;vs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"[w_%v] %v %v&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;plug&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"****************"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;idx&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;0.0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now to run the code, we need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into &lt;code&gt;debs-flow&lt;/code&gt; and type&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yomo run app.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into &lt;code&gt;debs-source&lt;/code&gt; and type&lt;br&gt;
&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;yomo wf run workflow.yaml
&lt;span class="nv"&gt;$ PORT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;9000 go run main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;You might want to try a different set of hyperparameters.&lt;/p&gt;

&lt;h2&gt;
  
  
  Results
&lt;/h2&gt;

&lt;p&gt;For query #1, you should see something similar to the following.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
[1620461050] 9.910085 0-1-2 load
[1620461050] 8.087268 0-1-2 work
[1620461050] 13.468374 3-1-2 load
[1620461050] 7.742124 3-1-2 work
[1620461051] 13.738256 0-1-2 load
[1620461051] 16.59261 0-1-2 work
[1620461051] 12.84997 3-1-2 load
[1620461051] 10.838872 3-1-2 work
*** average ***
[s_18] 0-1-2 11.824171
[s_18] 3-1-2 13.159172
***************
*** predict ***
[s_20] 0-1-2 10.375039
[s_20] 3-1-2 12.0406475
***************
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For query #2, something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;...
[1620461271] 6.921172 0-1-2 load
[1620461271] 1.8683584 0-1-2 work
[1620461271] 17.251171 3-1-2 load
[1620461271] 9.761936 3-1-2 work
[1620461272] 10.758014 0-1-2 load
[1620461272] 18.668419 0-1-2 work
[1620461272] 5.806175 3-1-2 load
[1620461272] 1.8562717 3-1-2 work
[1620461273] 0.11624338 0-1-2 load
[1620461273] 5.579194 0-1-2 work
[1620461273] 17.249205 3-1-2 load
[1620461273] 4.9580107 3-1-2 work
[1620461274] 8.087428 0-1-2 load
[1620461274] 7.49426 0-1-2 work
[1620461274] 4.6709924 3-1-2 load
[1620461274] 1.793222 3-1-2 work
[1620461275] 4.8114495 0-1-2 load
[1620461275] 1.9070174 0-1-2 work
[1620461275] 19.199306 3-1-2 load
[1620461275] 9.054778 3-1-2 work
all plugs: 7.5043
*** outliers ***
[s_5] 3-1-2 17.249205
****************
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  About Author
&lt;/h2&gt;

&lt;p&gt;Ivy Guo is a Computer Science student at the University of Washington. If you have any questions, please email Ivy at &lt;a href="mailto:zhifeig@cs.washington.edu"&gt;zhifeig@cs.washington.edu&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Further Reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Rohit Gupta, Rinku Shah, and Apurva Mhetre. 2014. In-Memory, High Speed Stream Processing. In &lt;em&gt;Proceedings of the 8th ACM International Conference on Distributed Event-Based Systems&lt;/em&gt; (&lt;em&gt;DEBS '14&lt;/em&gt;). Association for Computing Machinery, New York, NY, USA, 306–309. DOI: &lt;a href="https://doi.org/10.1145/2611286.2611332" rel="noopener noreferrer"&gt;https://doi.org/10.1145/2611286.2611332&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Abhinav Sunderrajan, Heiko Aydt, and Alois Knoll. 2014. Real-Time Load Prediction and Outliers Detection using STORM. DEBS 2014 - &lt;em&gt;Proceedings of the 8th ACM International Conference on Distributed Event-Based Systems&lt;/em&gt;. 10.1145/2611286.2611327. &lt;a href="https://www.researchgate.net/publication/262419725_DEBS_Grand_Challenge_Real_time_Load_Prediction_and_Outliers_Detection_using_STORM" rel="noopener noreferrer"&gt;ResearchGate&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ACM DEBS Grand Challenge 2014 implementation using Apache Flink: &lt;a href="https://github.com/koldbyte/smartgrid" rel="noopener noreferrer"&gt;Github&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DEBS '14: Proceedings of the 8th ACM International Conference on Distributed Event-Based Systems &lt;a href="https://dl.acm.org/doi/proceedings/10.1145/2611286" rel="noopener noreferrer"&gt;all research papers&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Zbigniew Jerzak and Holger Ziekow. 2014. The DEBS 2014 grand challenge. In &lt;em&gt;Proceedings of the 8th ACM International Conference on Distributed Event-Based Systems&lt;/em&gt; (&lt;em&gt;DEBS '14&lt;/em&gt;). Association for Computing Machinery, New York, NY, USA, 266–269. DOI: &lt;a href="https://doi.org/10.1145/2611286.2611333" rel="noopener noreferrer"&gt;https://doi.org/10.1145/2611286.2611333&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  More about YoMo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/yomorun/yomo" rel="noopener noreferrer"&gt;https://github.com/yomorun/yomo&lt;/a&gt;&lt;/p&gt;

</description>
      <category>serverless</category>
      <category>iot</category>
      <category>opensource</category>
      <category>yomo</category>
    </item>
  </channel>
</rss>
