<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>English on Nicole van der Hoeven</title><link>https://nicolevanderhoeven.com/tags/english/</link><description>Recent content in English on Nicole van der Hoeven</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>Nicole van der Hoeven</copyright><lastBuildDate>Thu, 08 Oct 2026 14:00:00 +0200</lastBuildDate><atom:link href="https://nicolevanderhoeven.com/tags/english/index.xml" rel="self" type="application/rss+xml"/><item><title>Roundtable: How We Really Use AI in Testing (HUSTEF 2026)</title><link>https://nicolevanderhoeven.com/blog/20261008-ai-testing-roundtable-hustef/</link><pubDate>Thu, 08 Oct 2026 14:00:00 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20261008-ai-testing-roundtable-hustef/</guid><description>&lt;p&gt;On the final day of &lt;a href="https://hustef.com/"&gt;HUSTEF 2026&lt;/a&gt; in Budapest, I joined the conference&amp;rsquo;s roundtable on AI in testing — &lt;em&gt;&amp;ldquo;AI Open Space Experiences: a roundtable with speakers on their experiences with AI testing.&amp;rdquo;&lt;/em&gt; It was five of us on stage: me plus &lt;strong&gt;Marta Firlej&lt;/strong&gt;, &lt;strong&gt;Kristoffer Nordström&lt;/strong&gt;, &lt;strong&gt;Callum Akehurst-Ryan&lt;/strong&gt;, and &lt;strong&gt;Maryia Tuleika&lt;/strong&gt;, with Marta moderating.&lt;/p&gt;
&lt;p&gt;The format was refreshingly honest — &amp;ldquo;how we &lt;em&gt;really&lt;/em&gt; use AI, with no bullshit.&amp;rdquo; Marta had run the same &amp;ldquo;AI open space&amp;rdquo; exercise with the Polish testing community, crowdsourcing the actual, un-hyped ways people use AI (information gathering, functionality discovery, generating tests and code, TDD, recruitment, presentation prep, even designing furniture and planning holidays), and then opened it up to the panel and the room. Here&amp;rsquo;s roughly how I answered her questions:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;What do you use AI for?&lt;/strong&gt; Mostly two things at work: analysing codebases and test code to understand what something actually does, and filling gaps on teams without a dedicated quality engineer — baking my testing knowledge into an AI the team can ask questions of. On the personal side, I&amp;rsquo;ve run some weird experiments: I&amp;rsquo;m a lifelong note-taker with decades of context (journals, therapy notes, eight years of WhatsApp history with my partner), so I&amp;rsquo;ve fed it all into a &lt;em&gt;local, open-weight&lt;/em&gt; model and asked things like &lt;em&gt;&amp;ldquo;what do I claim to believe, and where have I acted contrary to that — cite your evidence?&amp;rdquo;&lt;/em&gt; It&amp;rsquo;s a surprisingly honest mirror. I&amp;rsquo;m in a privileged spot with effectively unlimited AI access right now, and I know it won&amp;rsquo;t last, so I want to find out what&amp;rsquo;s safe and what isn&amp;rsquo;t while I can.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;How do you stay up to date?&lt;/strong&gt; Honestly, I don&amp;rsquo;t — not by chasing model releases or news. I keep up with how &lt;em&gt;other people&lt;/em&gt;, especially in testing, are using AI, and I lean on my coworkers (we&amp;rsquo;re at the forefront of this at work, so stepping outside that bubble is a useful reality check). I do have a scheduled Claude Code task that scrapes my ~34 AI-related Slack channels into a daily digest of just the things I care about.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;One piece of advice?&lt;/strong&gt; Don&amp;rsquo;t trust AI too much, and don&amp;rsquo;t believe you&amp;rsquo;re as far behind as you think. Almost no one has really tried this stuff; it&amp;rsquo;s genuinely early, everyone&amp;rsquo;s learning, and your foundational testing skills transfer. Just pick it up, play, and if it&amp;rsquo;s not for you, move on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Anything you&amp;rsquo;d never use AI for?&lt;/strong&gt; Communicating with people as a &lt;em&gt;proxy&lt;/em&gt;. I&amp;rsquo;ll use it to translate or to help me sound more fluent (I live across multiple languages — Portugal, Dutch, English), but I never want it to craft a whole message I didn&amp;rsquo;t think of. I don&amp;rsquo;t want to lose the discipline of actually talking to a human.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ethical dilemmas?&lt;/strong&gt; Yes — which is exactly why I keep my use mostly in the context of work, and try not to generate imagery or anything that&amp;rsquo;s obviously lifting from artists who deserve to be paid for it. There&amp;rsquo;s no hard line; it&amp;rsquo;s a sliding scale, and I have to keep questioning myself. (A Mastodon line stuck with me: &lt;em&gt;the strange future where the humans do the menial tasks and the robots write poetry and paint.&lt;/em&gt; I try not to let AI stop me from making art.)&lt;/p&gt;
&lt;p&gt;The best part of these panels is always the disagreement and the texture — five people who use AI daily and still land in very different places on trust, ethics, and what it&amp;rsquo;s actually &lt;em&gt;for&lt;/em&gt;. Thanks to Marta for moderating and to Kristoffer, Callum, and Maryia for a genuinely good conversation.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://hustef.com/"&gt;HUSTEF 2026&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My HUSTEF keynote: &lt;a href="https://nicolevanderhoeven.com/blog/20261007-asimovs-zeroth-law-testing-for-ai-hustef/"&gt;&lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics: Testing for AI&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Asimov's Zeroth Law of Robotics: Testing for AI (HUSTEF 2026)</title><link>https://nicolevanderhoeven.com/blog/20261007-asimovs-zeroth-law-testing-for-ai-hustef/</link><pubDate>Wed, 07 Oct 2026 10:00:00 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20261007-asimovs-zeroth-law-testing-for-ai-hustef/</guid><description>&lt;p&gt;This week I gave a keynote at &lt;a href="https://hustef.com/nicole_van_der_hoeven_2026/"&gt;HUSTEF 2026&lt;/a&gt; in Budapest, Hungary. The talk is called &lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics: Testing for AI&lt;/em&gt; — a testing-focused evolution of a talk I&amp;rsquo;ve been giving (and rewriting) for a while, previously as &lt;em&gt;Observability for AI&lt;/em&gt; at &lt;a href="https://nicolevanderhoeven.com/blog/20250402-asimovs-zeroth-law-of-robotics/"&gt;KubeCon EU 2025&lt;/a&gt; in London, &lt;a href="https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/"&gt;Dutch Cloud Native Day 2025&lt;/a&gt; in Utrecht, &lt;a href="https://nicolevanderhoeven.com/blog/20251106-asimovs-zeroth-law-newcrafts/"&gt;NewCrafts&lt;/a&gt; in Paris, and &lt;a href="https://nicolevanderhoeven.com/blog/20260526-asimovs-zeroth-law-expoqa-madrid/"&gt;ExpoQA Madrid 2026&lt;/a&gt;. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A robot may not harm humans. A robot must obey humans. A robot must protect its own existence. These are Isaac Asimov&amp;rsquo;s three Laws of Robotics, created to govern the ethical programming of artificial intelligences. From the Butlerian Jihad to Skynet to cylons, we&amp;rsquo;ve been immortalizing our collective nightmares about artificial intelligence for years. But there&amp;rsquo;s an unmentioned law that comes as a prerequisite to all of that: &lt;strong&gt;a robot must be testable.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;AI systems fail differently than traditional software. There&amp;rsquo;s no single correct output to assert against. A response can be fluent and completely wrong. Models drift silently over time. And yet we&amp;rsquo;re shipping AI into production — often without knowing what &amp;ldquo;passing&amp;rdquo; even looks like.&lt;/p&gt;
&lt;p&gt;Observability is what makes testing possible. When we can see inside our AI systems — trace the chain of reasoning, measure what changed, surface what failed — we can start to write evaluations, define what &amp;ldquo;good&amp;rdquo; looks like, and catch regressions we didn&amp;rsquo;t know to look for.&lt;/p&gt;
&lt;p&gt;In this talk, I explore what it means to test AI in the real world, drawing on lessons from building and evaluating an AI assistant for a large-scale observability platform. I&amp;rsquo;ll cover how evaluations work as the AI equivalent of a test suite, what to measure, how to catch hallucinations, and how to know when your model has regressed.&lt;/p&gt;
&lt;p&gt;You cannot test what you cannot see — and you cannot trust what you cannot test.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20261007-hustef-01.jpg" alt="Wide shot of me presenting the keynote at HUSTEF 2026, with the title slide reading “The Zeroth Law of Robotics: A robot must be testable” on the big screen above a full audience." loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The big shift in this version is right there in the Zeroth Law itself. In earlier iterations I argued that &lt;em&gt;a robot must be observable&lt;/em&gt;. That&amp;rsquo;s still true — observability is the only way to see the reasoning behind a system and find out what actually happened. But I&amp;rsquo;ve come to think that pure knowledge isn&amp;rsquo;t the same as trust. You can know exactly what a system did and still not trust it. The only way to trust something is to put it through its paces: to know how it behaves in the situations you foresee, and even the ones you don&amp;rsquo;t. So the Zeroth Law has become &lt;strong&gt;a robot must be &lt;em&gt;testable&lt;/em&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I framed the whole thing around Asimov&amp;rsquo;s short story &lt;em&gt;Runaround&lt;/em&gt; (from &lt;em&gt;I, Robot&lt;/em&gt;) and its robot, Speedy. Speedy&amp;rsquo;s smuggler owners sent him to collect selenium on Mercury, and he got stuck in a loop — circling the selenium pool, unable to resolve the conflict between obedience (the second law) and self-preservation (the third). His owners couldn&amp;rsquo;t predict his behaviour and couldn&amp;rsquo;t reason about it, so they had to do the only thing left: go out into the danger zone and fix him in production. Speedy wasn&amp;rsquo;t untestable because his owners were incompetent or lacked the tools — he was untestable because he was never &lt;em&gt;built&lt;/em&gt; to be tested. That&amp;rsquo;s the trap I think a lot of AI systems are walking into right now.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20261007-hustef-02.jpg" alt="Me looking up at a slide of an armoured robot running across the surface of Mars while I present." loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The through-line for a testing audience: AI is rewriting &lt;em&gt;how&lt;/em&gt; software gets built, but it doesn&amp;rsquo;t rewrite the discipline of trust. Trust that a system does what we say it does, and that when it breaks we know why and can fix it — that&amp;rsquo;s always been the job, and it isn&amp;rsquo;t going anywhere. There&amp;rsquo;s a whole generation of AI engineers shipping software they haven&amp;rsquo;t tested and can&amp;rsquo;t explain, and when someone says &amp;ldquo;the agent does this,&amp;rdquo; our job is still to ask &lt;em&gt;how do you know?&lt;/em&gt; Testing isn&amp;rsquo;t just going to survive the age of AI — testing is the reason AI gets to survive, if we make it testable.&lt;/p&gt;
&lt;p&gt;I demoed this with my TTRPG side project: an AI Dungeon Master, instrumented and put under test. It turns out that writing evals for something non-deterministic forces you to confront your real requirements. I thought I knew exactly when a dungeon master should call for a dice roll — I GM myself! — but trying to put it into words (&amp;ldquo;in &lt;em&gt;this&lt;/em&gt; situation I&amp;rsquo;d roll, but in &lt;em&gt;that&lt;/em&gt; one I wouldn&amp;rsquo;t, because I want to keep the story moving&amp;rdquo;) surfaced decisions I&amp;rsquo;d never had to make explicit. Those are things we&amp;rsquo;d normally discover much later, in production. Having to figure them out up front is a win.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20261007-hustef-03.jpg" alt="Me grinning during the talk, holding a microphone and presenter clicker." loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The Q&amp;amp;A was genuinely great and ranged well beyond the slides:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;When has an AI been tested &lt;em&gt;enough&lt;/em&gt;?&amp;rdquo;&lt;/strong&gt; Same answer as for anything else — it&amp;rsquo;s a mix of risk and budget. If it were a life-critical robot like Speedy, you test every scenario the people relying on it need. For my little demo app, less so.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testers vs. developers in the age of AI.&lt;/strong&gt; I said I&amp;rsquo;d fire developers before testers — provocatively, but the point stands: anyone can write code now. What made a good developer good was never the coding; it was communicating with business &lt;em&gt;and&lt;/em&gt; engineers, translating requirements, finding creative-but-safe solutions. Testers already think at that level and translate across teams, which makes them &lt;em&gt;more&lt;/em&gt; important in the age of AI, not less.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Defining expected results for non-deterministic systems&lt;/strong&gt;, multi-turn evals (I give the simulated user a &lt;em&gt;personality&lt;/em&gt; — adversarial, cooperative, beginner — rather than a script), and the broader shift from imperative to declarative: we no longer instruct step by step, we declare the end state we want, the way we do with Kubernetes.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Convincing colleagues not to fear AI.&lt;/strong&gt; I don&amp;rsquo;t, really. AI is here to stay; the question isn&amp;rsquo;t whether you approve of it, it&amp;rsquo;s whether you want to stay in this industry and help make it safe and trustworthy — or sit on the sidelines.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also recommended the book &lt;a href="https://link.amazon/B0e4SIur8"&gt;&lt;em&gt;Slow AI&lt;/em&gt;&lt;/a&gt;, which lands where I do: not an AI apologist, not a boycott, but a clear-eyed list of what AI is and isn&amp;rsquo;t good for — and the reminder to keep checking whether a given use of AI is making you &lt;em&gt;more&lt;/em&gt; capable or less.&lt;/p&gt;
&lt;p&gt;The demo app (the instrumented AI DM) lives on &lt;a href="https://nicole.to/asimov"&gt;GitHub&lt;/a&gt;, and I keep refining it with each iteration of this talk.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll update this post with the recording once HUSTEF publishes it.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicole.to/hustef"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicole.to/asimov"&gt;Demo app on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://link.amazon/B0e4SIur8"&gt;&lt;em&gt;Slow AI&lt;/em&gt; (book)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Previous versions of this talk: &lt;a href="https://nicolevanderhoeven.com/blog/20250402-asimovs-zeroth-law-of-robotics/"&gt;KubeCon EU 2025&lt;/a&gt; · &lt;a href="https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/"&gt;Dutch Cloud Native Day 2025&lt;/a&gt; · &lt;a href="https://nicolevanderhoeven.com/blog/20251106-asimovs-zeroth-law-newcrafts/"&gt;NewCrafts 2025&lt;/a&gt; · &lt;a href="https://nicolevanderhoeven.com/blog/20260526-asimovs-zeroth-law-expoqa-madrid/"&gt;ExpoQA Madrid 2026&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When to use Grafana Assistant vs MCP vs GCX: Grafana MCP</title><link>https://nicolevanderhoeven.com/blog/20260819-when-to-use-grafana-mcp/</link><pubDate>Wed, 19 Aug 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260819-when-to-use-grafana-mcp/</guid><description>&lt;p&gt;Three AI tools people confuse: Assistant, MCP, and GCX. &lt;a href="https://nicolevanderhoeven.com/blog/20260817-when-to-use-grafana-assistant/"&gt;Last time&lt;/a&gt; I talked about the brain — Assistant. Now hand number one: &lt;strong&gt;the MCP server&lt;/strong&gt;, the &lt;em&gt;easy&lt;/em&gt; hand.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HDmJyo9cyf8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Grafana MCP — Model Context Protocol — lets &lt;em&gt;any&lt;/em&gt; AI client reach into Grafana. The magic part: &lt;strong&gt;you bring your own brain.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using MCP requires &lt;strong&gt;two pieces&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;client&lt;/strong&gt; is your AI app — the brain you bring: claude.ai, ChatGPT, Cursor.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;server&lt;/strong&gt; is the door into Grafana that exposes the tools.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There are two ways to get that server. The easiest is the &lt;strong&gt;Grafana Cloud hosted&lt;/strong&gt; one — already running, auth built in, just connect and go. But you can also &lt;strong&gt;self-host&lt;/strong&gt; the open-source one on your own infra.&lt;/p&gt;
&lt;p&gt;So when do you reach for Grafana MCP?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When you&amp;rsquo;re using hosted chat tools with no terminal&lt;/strong&gt; — claude.ai, ChatGPT, your phone. No shell means no CLI, so MCP is the only way in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When you want to bolt Grafana onto a tool you already use&lt;/strong&gt; — already in Cursor or Claude? Just add the server. No new workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When you want the best discovery out of the box&lt;/strong&gt; — the tools describe themselves up front, so even smaller or cheaper models just &lt;em&gt;know&lt;/em&gt; what&amp;rsquo;s available. No trial-and-error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One honest catch: those tool definitions &lt;em&gt;can&lt;/em&gt; eat some context if you load everything — but modern hosts fix that with lazy tool search.&lt;/p&gt;
&lt;p&gt;MCP is deliberately curated — it doesn&amp;rsquo;t expose &lt;em&gt;every&lt;/em&gt; corner of Grafana. So what do you do when you need the esoteric stuff? That&amp;rsquo;s exactly what the power hand, &lt;strong&gt;GCX&lt;/strong&gt;, is for — next up.&lt;/p&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Three AI tools people confuse: Assistant, MCP, GCX. Last time, I talked about the brain — Assistant. Now hand number one: &lt;strong&gt;the MCP server,&lt;/strong&gt; the &lt;em&gt;easy&lt;/em&gt; hand.&lt;/p&gt;
&lt;p&gt;Grafana MCP — Model Context Protocol — lets &lt;em&gt;any&lt;/em&gt; AI client reach into Grafana. The magic part: &lt;strong&gt;you bring that AI client - you bring your own brain.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Using MCP requires &lt;strong&gt;two pieces.&lt;/strong&gt; The &lt;strong&gt;client&lt;/strong&gt; is your AI app — the brain you bring: claude.ai, ChatGPT, Cursor. The &lt;strong&gt;server&lt;/strong&gt; is the door into Grafana that exposes the tools.&lt;/p&gt;
&lt;p&gt;Two ways to get that server: the easiest way is to use the &lt;strong&gt;Grafana Cloud hosted&lt;/strong&gt; one — already running, auth built in, just connect and go. But you can also &lt;strong&gt;self-host&lt;/strong&gt; the open-source one on your own infra.&lt;/p&gt;
&lt;p&gt;So when do you reach for Grafana MCP?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;When you&amp;rsquo;re using hosted chat tools with no terminal&lt;/strong&gt; — claude.ai, ChatGPT, your phone. No shell means no CLI, so MCP is the only way in.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When you want to bolt Grafana onto a tool you already use&lt;/strong&gt; — already in Cursor or Claude? Just add the server. No new workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;When you want the best discovery out of the box&lt;/strong&gt; — the tools describe themselves up front, so even smaller or cheaper models just &lt;em&gt;know&lt;/em&gt; what&amp;rsquo;s available. No trial-and-error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;One honest catch: those tool definitions &lt;em&gt;can&lt;/em&gt; eat some context if you load everything — but modern hosts fix that with lazy tool search.&lt;/p&gt;
&lt;p&gt;But MCP is deliberately curated — it doesn&amp;rsquo;t expose &lt;em&gt;every&lt;/em&gt; corner of Grafana. So what do you do when you need the esoteric stuff? That&amp;rsquo;s exactly what the power hand is for. Next up is &lt;strong&gt;GCX.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/mcp-grafana"&gt;Grafana MCP server&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io/"&gt;Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/GCX"&gt;My notes on GCX&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>When to use Grafana Assistant vs MCP vs GCX: Grafana Assistant</title><link>https://nicolevanderhoeven.com/blog/20260817-when-to-use-grafana-assistant/</link><pubDate>Mon, 17 Aug 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260817-when-to-use-grafana-assistant/</guid><description>&lt;p&gt;Grafana has three AI things people keep confusing — Assistant, MCP, and GCX. They&amp;rsquo;re not competitors. Think of it as &lt;strong&gt;a brain and two hands.&lt;/strong&gt; In this short, I start with the brain: &lt;strong&gt;Grafana Assistant&lt;/strong&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xo7meD4Yn0k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Assistant isn&amp;rsquo;t just a chatbot — it&amp;rsquo;s the &lt;em&gt;reasoning layer&lt;/em&gt;. It manages context and knows your Grafana: your dashboards, your data sources, a knowledge graph of your infrastructure. Instead of clicking around, you tell Assistant &lt;em&gt;what&lt;/em&gt; you want to do and it figures out the &lt;em&gt;how&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Reach for the Assistant when the work is &lt;strong&gt;visual or exploratory&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Building a dashboard?&lt;/strong&gt; Assistant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&amp;ldquo;Teach me how to do this&amp;rdquo; or &amp;ldquo;where is this in the UI&amp;rdquo;?&lt;/strong&gt; Assistant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A real incident that needs root-cause analysis across multiple data sources?&lt;/strong&gt; Assistant. That&amp;rsquo;s its sweet spot — it forms a hypothesis, correlates your signals, and can even open a pull request with the fix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the key thing though: Assistant is Grafana&amp;rsquo;s &lt;em&gt;own&lt;/em&gt; brain — but it&amp;rsquo;s &lt;strong&gt;not the only brain that can drive Grafana.&lt;/strong&gt; That&amp;rsquo;s where the two hands come in, and I&amp;rsquo;ll cover the first of those (the MCP server) next.&lt;/p&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Grafana has three AI things people keep confusing — Assistant, MCP, and GCX. I&amp;rsquo;m going to talk a bit about each one so you know which one is best for your use case.&lt;/p&gt;
&lt;p&gt;Spoiler: They&amp;rsquo;re not competitors. Think of it as &lt;strong&gt;a brain and two hands.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with &lt;strong&gt;Grafana Assistant&lt;/strong&gt;, which is the brain.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s not just a chatbot — it&amp;rsquo;s the &lt;em&gt;reasoning layer&lt;/em&gt;. It manages context, it knows your Grafana: your dashboards, your data sources, a knowledge graph of your infrastructure. So instead of you clicking around to do something, you can say what you want to do to Assistant and it figures out the &lt;em&gt;how.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Reach for the Assistant when the work is &lt;strong&gt;visual or exploratory.&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you&amp;rsquo;re building a dashboard? Assistant.&lt;/li&gt;
&lt;li&gt;&amp;ldquo;Teach me how to do this&amp;rdquo; or &amp;ldquo;where is this in the UI&amp;rdquo;? Assistant.&lt;/li&gt;
&lt;li&gt;You have a real incident where you need root-cause analysis across multiple data sources? Assistant.
&lt;ul&gt;
&lt;li&gt;That&amp;rsquo;s its sweet spot — it forms a hypothesis, correlates your signals, and can even open a pull request with the fix.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the key thing though: Assistant is Grafana&amp;rsquo;s &lt;em&gt;own&lt;/em&gt; brain — but it&amp;rsquo;s &lt;strong&gt;not the only brain that can drive Grafana.&lt;/strong&gt; That&amp;rsquo;s where the two hands come in… and I&amp;rsquo;ll show you those next.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/products/cloud/ai-tools/"&gt;Grafana Assistant&lt;/a&gt; (product page)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;My notes on Grafana Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/GCX"&gt;My notes on GCX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;Unlearnings from building Grafana Assistant&lt;/a&gt; — my Context Horizon piece&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AI Week Day 5: Collaborating (Grafana AI Week — Friday)</title><link>https://nicolevanderhoeven.com/blog/20260731-ai-week-friday-collaborating/</link><pubDate>Fri, 31 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260731-ai-week-friday-collaborating/</guid><description>&lt;p&gt;The final day of AI Week is about &lt;strong&gt;collaborating&lt;/strong&gt; — using AI right where your team already works, no context switching required. &lt;strong&gt;Grafana Assistant in Slack is now generally available&lt;/strong&gt;: investigate issues, ask follow-up questions, and query your metrics and logs from the channel where the incident conversation is already happening. And that&amp;rsquo;s just one place Assistant now meets you — also announced: the &lt;strong&gt;Grafana mobile app is GA&lt;/strong&gt; (with Assistant on mobile in public preview), &lt;strong&gt;Assistant Desktop&lt;/strong&gt; in public preview, &lt;strong&gt;Microsoft Teams&lt;/strong&gt; support in private preview, and context-aware &lt;strong&gt;Assistant Search&lt;/strong&gt; in public preview. Add it all up and Assistant is now wherever you are: the Grafana UI, the API, your terminal, your coding agent, Slack, Teams, mobile, desktop, and search. That&amp;rsquo;s a wrap on five days of announcements.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/obBh4pMrHCM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s the final day of Grafana Labs&amp;rsquo; AI Week, and Friday is all about &lt;strong&gt;collaborating&lt;/strong&gt; — using AI right where your team already works, no context switching required.&lt;/p&gt;
&lt;p&gt;Today, &lt;strong&gt;Grafana Assistant in Slack is generally available.&lt;/strong&gt; Investigate issues, ask follow-up questions, query your metrics and logs — all from the channel where your incident conversation is already happening.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s just one place Assistant now meets you. Today we also announced: the &lt;strong&gt;Grafana mobile app is GA&lt;/strong&gt;, with Assistant on mobile in public preview. &lt;strong&gt;Assistant Desktop&lt;/strong&gt; is in public preview. &lt;strong&gt;Microsoft Teams&lt;/strong&gt; support is in private preview. And &lt;strong&gt;Assistant Search&lt;/strong&gt; — deeper, context-aware search — is in public preview too.&lt;/p&gt;
&lt;p&gt;Add it all up, and Assistant is now wherever you are: the Grafana UI, the API, your terminal, your coding agent, Slack, Teams, mobile, desktop, and search.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a wrap on five days of announcements — and I know it was a &lt;em&gt;lot&lt;/em&gt;. So if you missed a day, or you just want the full picture of where AI at Grafana stands today, I made a video for exactly that: everything you can do with AI in Grafana Cloud, including everything we shipped this week. It&amp;rsquo;s linked below and pinned in the comments.&lt;/p&gt;
&lt;p&gt;One last time: &lt;strong&gt;grafana.ai&lt;/strong&gt; for all of it. Thanks for spending AI Week with me.&lt;/p&gt;</description></item><item><title>Observability and AI explained</title><link>https://nicolevanderhoeven.com/blog/20260731-observability-and-ai-explained/</link><pubDate>Fri, 31 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260731-observability-and-ai-explained/</guid><description>&lt;p&gt;&amp;ldquo;AI observability&amp;rdquo; gets thrown around a lot, and it can mean one of two very different things. So in this video I map out the whole landscape of AI-related work at Grafana across the entire software development lifecycle — and show how AI and observability come together in two directions: &lt;strong&gt;AI for observability&lt;/strong&gt; (AI that helps you observe your systems) and &lt;strong&gt;observability for AI&lt;/strong&gt; (observing the AI itself).&lt;/p&gt;
&lt;p&gt;The framing is deliberate: AI in observability isn&amp;rsquo;t about replacing engineers. It&amp;rsquo;s about handing back the exhausting parts of the job — the 3am triage, the repetitive queries, the report nobody wanted to write — so you can spend your energy on the work only humans can do.&lt;/p&gt;
&lt;p&gt;I walk through each phase of the lifecycle and where the tools fit:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Planning&lt;/strong&gt; — clarity about what&amp;rsquo;s really going on, with &lt;a href="https://notes.nicolevanderhoeven.com/Grafana%20Assistant"&gt;Grafana Assistant&lt;/a&gt;: not just a chatbot, but an agent that knows your telemetry, writes your queries, and builds your dashboards.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Building&lt;/strong&gt; — momentum without losing control: Assistant, the open-source &lt;a href="https://notes.nicolevanderhoeven.com/GCX"&gt;GCX&lt;/a&gt; CLI, the Grafana MCP server, the specialized Loki/Tempo/k6 MCP servers, and the AI SDK for building your own agents in Go.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Operating&lt;/strong&gt; — staying calm under load: Investigations for agentic incident triage, Assistant Automations and the Watcher Agent for staying proactive, plus &lt;a href="https://notes.nicolevanderhoeven.com/Grafana%20Machine%20Learning"&gt;Grafana Machine Learning&lt;/a&gt; (Metrics Forecasting, Outlier Detection) and Adaptive Telemetry.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Testing &amp;amp; evaluating&lt;/strong&gt; — &lt;a href="https://notes.nicolevanderhoeven.com/Doubt%20is%20a%20form%20of%20care"&gt;doubt is a form of care&lt;/a&gt;: &lt;a href="https://notes.nicolevanderhoeven.com/k6%20%28tool%29"&gt;k6&lt;/a&gt; and agentic testing on the systems side, and Agent Observability plus the open-source o11y-bench benchmark on the &amp;ldquo;observing your AI&amp;rdquo; side.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Collaborating&lt;/strong&gt; — bringing it all to where your team already works: Assistant in Slack (and coming to Teams), on mobile, on the desktop, and via API/MCP, plus Assistant Search across your Grafana artifacts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you&amp;rsquo;re new to the Grafana stack itself, start with my open source observability video for the non-AI foundations that all of this builds on.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OTmgMF6gD1k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/Grafana%20Assistant"&gt;Grafana Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/GCX"&gt;GCX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/k6%20%28tool%29"&gt;k6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://o11ybench.ai"&gt;o11ybench.ai&lt;/a&gt; — the open leaderboard for AI agents doing observability work&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AI Week Day 4: Evaluating (Grafana AI Week — Thursday)</title><link>https://nicolevanderhoeven.com/blog/20260730-ai-week-thursday-evaluating/</link><pubDate>Thu, 30 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260730-ai-week-thursday-evaluating/</guid><description>&lt;p&gt;Day four of AI Week is all about &lt;strong&gt;evaluating&lt;/strong&gt; — because building an agent is the easy part; &lt;em&gt;trusting&lt;/em&gt; it is where things get hard. The headline: &lt;strong&gt;Grafana Agent Observability is now generally available&lt;/strong&gt; — the tool Grafana built for itself while scaling Assistant, once it grew too complex to evaluate with unit tests. Instrument your agent with the SDK and your conversations, tool calls, traces, latency, token use, and cost all become observable in one place; add evaluators (LLM judges plus deterministic checks) to score quality on live traffic, feed low-scoring conversations into your test suite, and gate CI on experiments comparing a candidate against a baseline. And because evaluator metrics land in Prometheus, you can get paged when a bad prompt change tanks quality. The fun bonus: &lt;strong&gt;k6 agentic testing&lt;/strong&gt; — describe a browser test in plain language and an agent embedded in k6 drives the browser, no script required (they proved it by getting it to beat Wordle).&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FOHdEm-_DEQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s day four of Grafana Labs&amp;rsquo; AI Week, and Thursday is all about &lt;strong&gt;evaluating&lt;/strong&gt; — because building an agent is the easy part. &lt;em&gt;Trusting&lt;/em&gt; it is where things get hard.&lt;/p&gt;
&lt;p&gt;The big news: &lt;strong&gt;Grafana Agent Observability is now generally available.&lt;/strong&gt; This is the tool we built for ourselves while scaling Grafana Assistant, when it grew too complex to evaluate with unit tests. Now it&amp;rsquo;s available to everyone on Grafana Cloud.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how it works: instrument your agent with the SDK, and your conversations, tool calls, traces, latency, token use, and cost all become observable in one place. Then add evaluators — LLM judges plus deterministic checks — to score quality on live traffic. Low-scoring conversations feed your test suite, and experiments let you compare a candidate against a baseline before you ship — you can even make it a CI gate. And because evaluator metrics land in Prometheus, you can get paged if a bad prompt change tanks quality in production.&lt;/p&gt;
&lt;p&gt;But my favorite part of today? &lt;strong&gt;k6 agentic testing.&lt;/strong&gt; Describe a browser test in plain natural language, and an agent embedded in k6 drives the browser for you — no script at all. And to prove it, we gave it one job: beat Wordle. Go watch that video. I&amp;rsquo;ll wait.&lt;/p&gt;
&lt;p&gt;Everything&amp;rsquo;s at &lt;strong&gt;grafana.ai&lt;/strong&gt; — see you tomorrow for the finale: using AI where your team already works.&lt;/p&gt;</description></item><item><title>Investigations Arena: how we test Assistant investigations</title><link>https://nicolevanderhoeven.com/blog/20260730-investigations-arena/</link><pubDate>Thu, 30 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260730-investigations-arena/</guid><description>&lt;p&gt;How do you test an AI agent whose whole job is to investigate incidents — when every investigation is different and &amp;ldquo;correct&amp;rdquo; isn&amp;rsquo;t a single deterministic answer? In this interview I sit down with &lt;strong&gt;Will&lt;/strong&gt;, a software engineer at Grafana who&amp;rsquo;s spent the last year focused on AI: the Grafana Assistant, investigations, and memory features.&lt;/p&gt;
&lt;p&gt;The story here is how the team got from Investigations V1 to a much better V2. V1 hit a ceiling, and the demo environment they&amp;rsquo;d been testing against turned out to be the problem — the cases were too easy and too far from the messy reality of a production cluster. So they built an &lt;strong&gt;arena&lt;/strong&gt;: think competitive bot programming, but the &amp;ldquo;game&amp;rdquo; is investigating real incidents in Grafana&amp;rsquo;s own production environment. Different AI agents, each with its own strategy and tools, all take a swing at the same incident, and an LLM-as-judge scores their answers against a human-verified root cause.&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s interesting is that the &lt;em&gt;score&lt;/em&gt; wasn&amp;rsquo;t even the most valuable output at first — the &lt;strong&gt;insights&lt;/strong&gt; were. Watching which strategies worked, which tools returned so much noise that they poisoned the context, and which agents wandered off is what let the team optimize bit by bit into the V2 release. The arena also compares more than models: different harnesses running Sonnet vs. Opus, Claude Code with the Grafana MCP, even just hitting the public API directly with &lt;code&gt;curl&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A couple of my favorite moments: Will explains the &lt;strong&gt;guardrails&lt;/strong&gt; that stop agents from &amp;ldquo;cheating&amp;rdquo; (they can only look at data from within the incident&amp;rsquo;s time window, so they can&amp;rsquo;t peek at the fix commit that resolved it) — and how the models mostly play fair because they treat it like a game. And there&amp;rsquo;s a lovely example of emergent creativity: an agent reached for tools the team hadn&amp;rsquo;t even considered, they turned out to be genuinely useful for investigation, and those tools got promoted into the real harness. Will&amp;rsquo;s hope for the future is to open this up — an OliBench-style shared benchmark where the community can throw their own investigation agents into the arena and raise quality across the board.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/YPfqchw8LCo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Will:&lt;/strong&gt;
Hey, my name is Will. I&amp;rsquo;m a software engineer at Grafana. I&amp;rsquo;ve been there for three years, and for the last year I&amp;rsquo;ve been focusing on AI — the Grafana Assistant, investigations, and memory features.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
And what&amp;rsquo;s the latest thing you&amp;rsquo;ve been working on?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will:&lt;/strong&gt;
So we developed Investigations V1, and we saw that we hit a ceiling at some point. We came up with a different approach, but this time we needed a good evaluation environment — the demo environment wasn&amp;rsquo;t enough, because those cases were too easy and too far from the reality of a production environment. So we decided to build an arena.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s a little bit like the idea of competitive bot programming, where bots fight against each other on specific tasks or games. In this case, the topic was investigations in our production cluster — real incidents. We started building bots that had different strategies and different tools; these were AI agents. Comparing a diversity of strategies let us surface the best approaches, and from there we could iterate, bring in more test cases from more incidents, and reach higher and higher quality.&lt;/p&gt;
&lt;p&gt;The idea is that the bots try to solve the same case, and we use an LLM as a judge to compare the different approaches. We have different criteria, because for each incident we have a root cause that&amp;rsquo;s been verified by a human. That gives us our ground truth, and the LLM-as-judge compares that ground truth against the answers the agents came up with.&lt;/p&gt;
&lt;p&gt;The important part at first wasn&amp;rsquo;t even the score — it was the insights. This tool was better with this strategy; this one had noise in the results that poisoned the context; the results returned from this specific tool were just too much. So we managed to really optimize bit by bit and come up with Investigations V2, which we just released. It&amp;rsquo;s a massive improvement compared to our V1 approach.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
So is it comparing just different models for investigations, or is it also comparing things like Claude Code and the Grafana MCP versus Assistant?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will:&lt;/strong&gt;
Both, actually. We have different versions of our harness for investigations that we run with Sonnet and with Opus, but we also use the Claude Code harness with the Grafana MCP — and even just using &lt;code&gt;curl&lt;/code&gt; to directly hit our public API.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Do the models ever cheat?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will:&lt;/strong&gt;
So far it&amp;rsquo;s been quite good. We have guardrails. Because we investigate past incidents, we need to make sure the LLM only looks at a specific time window — only from when the incident started — otherwise it would be able to find the pull request that was used to solve the incident. But they&amp;rsquo;re pretty good at following the rules; they take it as a game a little bit. We even have an agent that checks afterward, with the judge, to make sure they followed every rule.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s funny, actually — we had a case using Claude Code where it started to use some tools we hadn&amp;rsquo;t thought about in the first place, and they turned out to be very useful for investigation. We&amp;rsquo;d never considered them, so we brought them into our investigation harness and it helped a lot. Giving the agents freedom and creativity in this kind of environment is really useful. That diversity sponsors new ideas that we can put into our own work.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Cool. Do you have any plans to publish this and share it so that other people can do it too — kind of like OliBench?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Will:&lt;/strong&gt;
Yeah, I think, why not? I think we can go this way too. I&amp;rsquo;m sure it would be useful for other agents. And it would be very nice if we could compare agents from other people and other companies — maybe with different harnesses, maybe even different tools — because right now it&amp;rsquo;s mostly about our MCP, our CLI, and our investigation harness. But if the community comes up with their own investigation agents — and I think I&amp;rsquo;ve seen a few — it would be fun to put them in the arena and help not just our product, but any product improve in quality.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;Grafana Assistant&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>The Great Doubt: What Building an AI Agent Taught Us About Trust (KubeCon Japan 2026)</title><link>https://nicolevanderhoeven.com/blog/20260730-the-great-doubt-kubecon-japan/</link><pubDate>Thu, 30 Jul 2026 09:00:00 +0900</pubDate><guid>https://nicolevanderhoeven.com/blog/20260730-the-great-doubt-kubecon-japan/</guid><description>&lt;p&gt;This week I spoke at &lt;a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-japan/"&gt;KubeCon + CloudNativeCon Japan 2026&lt;/a&gt; in Yokohama, Japan. I gave a talk called &lt;em&gt;The Great Doubt: What Building an AI Agent Taught Us About Trust&lt;/em&gt;. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When we started building an AI assistant for observability, we thought the hard part would be making it smart. We were wrong. The hard part was knowing when to trust it.&lt;/p&gt;
&lt;p&gt;AI agents hallucinate, forget context, and confidently give wrong answers. Traditional testing doesn&amp;rsquo;t catch these failures. What&amp;rsquo;s needed is evaluation grounded in systematic doubt.&lt;/p&gt;
&lt;p&gt;This talk shares lessons from shipping an AI agent to production: how to build a golden dataset of use cases you must get right, how to use LLM-as-judge when there&amp;rsquo;s no ground truth, and how to use OpenTelemetry traces to debug eval failures. You&amp;rsquo;ll also hear what&amp;rsquo;s still unsolved: evaluating multi-agent handoffs and closing the feedback loop between what users ask and what your evals cover.&lt;/p&gt;
&lt;p&gt;Kyoto School philosopher Nishitani Keiji called this &amp;ldquo;The Great Doubt&amp;rdquo; (大疑): questioning every assumption until only what survives is real. For AI agents, that&amp;rsquo;s not philosophy. It&amp;rsquo;s the job.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The talk walks through the layers of doubt we worked through while building &lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;Grafana Assistant&lt;/a&gt;: doubting the agent itself, then doubting our tests, then the LLM-as-judge, then our own scores — and finally doubting whether the doubt was even justified. Each layer needed a different tool, from a golden dataset run in a fully synthetic observability environment, through online evals on live traffic, to per-conversation OpenTelemetry traces that link every eval score back to the exact LLM and tool calls that produced it.&lt;/p&gt;
&lt;p&gt;You can find the slides at &lt;a href="https://nicole.to/doubtslides"&gt;nicole.to/doubtslides&lt;/a&gt;, and you can watch the full talk below:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uW9Hlp3fT14?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;Grafana Assistant (generally available for Grafana OSS, Grafana Cloud, and Grafana Play):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/assistant/"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://play.grafana.org"&gt;Try it out on Grafana Play&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Assistant Investigations (Grafana Cloud):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gra.fan/investigations"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Agent Observability (Grafana Cloud):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gra.fan/agento11y"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;o11y-bench (OSS):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://gra.fan/o11ybench"&gt;Site&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Investigations Arena:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/YPfqchw8LCo"&gt;Video&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="related-reading"&gt;Related reading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;Grafana Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My Context Horizon piece &lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;&lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/4vZNlPD"&gt;&lt;em&gt;The Way of Zen&lt;/em&gt;&lt;/a&gt; by Alan W. Watts&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3RgXGIP"&gt;&lt;em&gt;Zen Mind, Beginner&amp;rsquo;s Mind&lt;/em&gt;&lt;/a&gt; by Shunryu Suzuki&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/4vQW2eQ"&gt;&lt;em&gt;Religion and Nothingness, Volume 1&lt;/em&gt;&lt;/a&gt; by Nishitani Keiji&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/4yFff6d"&gt;&lt;em&gt;Philosophers of Nothingness: An Essay on the Kyoto School&lt;/em&gt;&lt;/a&gt; by James W. Heisig&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>AI Week Day 3: Operations &amp; Maintenance (Grafana AI Week — Wednesday)</title><link>https://nicolevanderhoeven.com/blog/20260729-ai-week-wednesday-operations/</link><pubDate>Wed, 29 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260729-ai-week-wednesday-operations/</guid><description>&lt;p&gt;Day three of AI Week is about &lt;strong&gt;operations and maintenance&lt;/strong&gt; — because once code reaches production, the operational work is still surprisingly manual: someone&amp;rsquo;s watching dashboards, deciding whether an error spike is real, and writing up what happened, every single day. Two Grafana Assistant features went GA to take that off your plate. &lt;strong&gt;Assistant Automations&lt;/strong&gt; handle recurring work — save a prompt and run it on a schedule (like a morning brief on your service&amp;rsquo;s health), each run keeping its own history and able to notify you in Slack. &lt;strong&gt;Assistant Investigations&lt;/strong&gt; is for when something actually breaks: it digs across metrics, logs, traces, and profiles, develops and tests hypotheses, and hands you a structured report you can follow along with in a Workspace. You&amp;rsquo;re offloading vigilance, not accountability — the evidence is always there to review, and you still make the call.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5P7qSKIRSek?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s day three of AI Week, and Wednesday is all about &lt;strong&gt;operations and maintenance&lt;/strong&gt;. Because here&amp;rsquo;s the thing: once your code reaches production, the operational work is still surprisingly manual. Someone&amp;rsquo;s watching dashboards, someone&amp;rsquo;s deciding whether that error spike is real, and someone&amp;rsquo;s writing up what happened — every single day.&lt;/p&gt;
&lt;p&gt;Today, two features of Grafana Assistant are now generally available to take that burden off your plate: &lt;strong&gt;Investigations&lt;/strong&gt; and &lt;strong&gt;Automations&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant Automations&lt;/strong&gt; handle the recurring work of operating a system. Save an Assistant prompt and run it on a schedule — like a morning brief that summarizes the operational health of your service over the last 24 hours. Every run keeps its own conversation and history, and it can notify you in Slack when it&amp;rsquo;s done or needs approval.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Assistant Investigations&lt;/strong&gt; is for when something actually breaks. Investigations digs into issues across your metrics, logs, traces, and profiles, develops and tests hypotheses, and hands you a structured report. You can follow along in a Workspace, see what&amp;rsquo;s been ruled out, and add guidance while it works.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re offloading vigilance, not accountability — the evidence and reasoning are always there to review, and you still make the call.&lt;/p&gt;
&lt;p&gt;Everything&amp;rsquo;s at &lt;strong&gt;grafana.ai&lt;/strong&gt; — see you tomorrow for day four: evaluating your agents.&lt;/p&gt;</description></item><item><title>AI Week Day 2: Building (Grafana AI Week — Tuesday)</title><link>https://nicolevanderhoeven.com/blog/20260728-ai-week-tuesday-building/</link><pubDate>Tue, 28 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260728-ai-week-tuesday-building/</guid><description>&lt;p&gt;Day two of AI Week is all about &lt;strong&gt;building&lt;/strong&gt; — the AI tools that help you write software with confidence. Two big announcements went generally available: &lt;strong&gt;gcx&lt;/strong&gt; (the Grafana CLI) and the &lt;strong&gt;Grafana MCP server&lt;/strong&gt;. Both connect your coding agents — Claude Code, Cursor, and friends — to your Grafana telemetry. The MCP server gives agents opinionated, ready-made tools for the common cases (querying metrics and logs, reading and updating dashboards); gcx is the more flexible, less opinionated option, built for agents from the ground up with read-only guardrails and its own bundle of agent skills. Both work for OSS and Grafana Cloud. The point: when an agent writes your code, it shouldn&amp;rsquo;t be guessing — it should be looking at how your system &lt;em&gt;actually&lt;/em&gt; behaves in production. That&amp;rsquo;s telemetry-driven development.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Y3QtH94f77U?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s day two of Grafana Labs&amp;rsquo; AI Week, and Tuesday is all about &lt;strong&gt;building&lt;/strong&gt; — the AI tools that help you build software with confidence.&lt;/p&gt;
&lt;p&gt;Today we have two big announcements: &lt;strong&gt;gcx&lt;/strong&gt; and the &lt;strong&gt;Grafana MCP server&lt;/strong&gt; are both now generally available.&lt;/p&gt;
&lt;p&gt;Both of them connect your coding agents — think Claude Code or Cursor — to your Grafana telemetry. So what&amp;rsquo;s the difference?&lt;/p&gt;
&lt;p&gt;The &lt;strong&gt;Grafana MCP server&lt;/strong&gt; gives your agent opinionated, ready-made tools for the most common use cases: querying your metrics and logs, reading and updating dashboards, that kind of thing. You can run it yourself, or use the hosted MCP server with your Grafana Cloud stack — so yes, it works for both &lt;strong&gt;OSS and Grafana Cloud&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;gcx&lt;/strong&gt; is the Grafana CLI, and it&amp;rsquo;s the more flexible, less opinionated option. Agents can explore it and build their own workflows, and it was designed for agents from the ground up, with read-only guardrails so your agent can&amp;rsquo;t touch anything you didn&amp;rsquo;t approve. It works with Cloud stacks and self-managed instances, and it even ships with its own bundle of agent skills.&lt;/p&gt;
&lt;p&gt;Why does this matter? Because when an agent writes your code, it shouldn&amp;rsquo;t be guessing — it should be looking at how your system &lt;em&gt;actually&lt;/em&gt; behaves in production. That&amp;rsquo;s telemetry-driven development.&lt;/p&gt;
&lt;p&gt;Head to &lt;strong&gt;grafana.ai&lt;/strong&gt; for everything we&amp;rsquo;re shipping this week, and I&amp;rsquo;ll see you tomorrow for day three.&lt;/p&gt;</description></item><item><title>AI Week Day 1: Planning (Grafana AI Week — Monday)</title><link>https://nicolevanderhoeven.com/blog/20260727-ai-week-monday-planning/</link><pubDate>Mon, 27 Jul 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260727-ai-week-monday-planning/</guid><description>&lt;p&gt;It&amp;rsquo;s day one of Grafana Labs&amp;rsquo; AI Week, and Monday is all about &lt;strong&gt;planning&lt;/strong&gt; — getting the clarity you need on what&amp;rsquo;s going on in your system so you can figure out what to build. Kicking things off is &lt;strong&gt;Workspace for Grafana Assistant&lt;/strong&gt;: a full-page view of Assistant so your conversations and generated graphs aren&amp;rsquo;t crammed into the little right-hand sidebar. It&amp;rsquo;s a much less cluttered place to run investigations and to be agent-first. On top of that, Assistant is now easier to try — enable it in Grafana 13 for OSS without linking a Grafana Cloud account, or try it with no signup or download at all on &lt;a href="https://play.grafana.org"&gt;Grafana Play&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/AEU73mjeh0c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi everyone! I&amp;rsquo;m Nicole van der Hoeven and I&amp;rsquo;m really excited to welcome you to AI Week. Today is Monday, which is planning day, where we give you the tools you need to get clarity on what even is going on in your system so that you can figure out what to build.&lt;/p&gt;
&lt;p&gt;Now we&amp;rsquo;re kicking things off with a feature called Workspace for Grafana Assistant. Now if you&amp;rsquo;ve used Assistant before, you&amp;rsquo;ll know that it comes up on the little sidebar on the right side of Grafana. Well, that can start to get cramped if you have multiple conversations or if you&amp;rsquo;ve asked Assistant to generate multiple graphs for you. Well, we&amp;rsquo;ve heard you, and now we&amp;rsquo;re giving you a full page view of Assistant. So you&amp;rsquo;ll have all of your conversations on the left, and this is also an excellent place to run investigations from. You can also zoom in on any of those graphs, and it&amp;rsquo;s just a much less cluttered view if you want to be agent-first.&lt;/p&gt;
&lt;p&gt;Speaking of Assistant, the second thing I want to tell you is that you know, Assistant was already available everywhere. But now, Assistant is available&amp;hellip; in more places than everywhere? And also more easily. So Assistant was already available for OSS, but you had to link your Grafana Cloud account, which was not so handy if you wanted to try it out. But not anymore. Now if you download Grafana 13 and enable Assistant, then you&amp;rsquo;ll just be able to go and try it out and chat with Assistant without doing anything else. It&amp;rsquo;s still not free or open source, but it IS a lot easier to try it out.&lt;/p&gt;
&lt;p&gt;And if you don&amp;rsquo;t want to download anything, that&amp;rsquo;s what Grafana Play is for. Grafana Assistant is now available to try out on Grafana Play without any signup or any download required. Try it out at play.grafana.org. I really love seeing it there. Tune in tomorrow where we&amp;rsquo;re going to talk about everything we&amp;rsquo;re announcing to help you start to build.&lt;/p&gt;</description></item><item><title>My reMarkable Obsidian workflow</title><link>https://nicolevanderhoeven.com/blog/20260703-my-remarkable-obsidian-workflow/</link><pubDate>Fri, 03 Jul 2026 17:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260703-my-remarkable-obsidian-workflow/</guid><description>&lt;p&gt;I&amp;rsquo;m a big note-taker — but what most people don&amp;rsquo;t realise is that digital notes have only ever been a small part of that. I love analog notes, and lately I&amp;rsquo;ve loved &lt;em&gt;meshing&lt;/em&gt; the analog with the digital using E Ink tablets. The problem with the reMarkable has always been the workflow: there hasn&amp;rsquo;t been an easy way to get everything back into &lt;a href="https://nicolevanderhoeven.com/blog/"&gt;Obsidian&lt;/a&gt;, which — as you know — is kind of important for me.&lt;/p&gt;
&lt;p&gt;In this video I show how there&amp;rsquo;s &lt;em&gt;finally&lt;/em&gt; a clean way to tie it all together: reMarkable → Obsidian as a PDF → searchable, OCR&amp;rsquo;d text.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/h1Sv7sXMEj0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="the-setup-a-lot-of-e-ink"&gt;The setup: a lot of E Ink&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve tried a lot of E Ink tablets and readers. My everyday carry is the &lt;strong&gt;reMarkable Paper Pro Move&lt;/strong&gt;, and I keep a full-size &lt;strong&gt;reMarkable Paper Pro&lt;/strong&gt; at my desk. I love them more than the Kobo or Kindle Scribe lines — but the deciding factor was always going to be whether I could get my handwriting into Obsidian without friction.&lt;/p&gt;
&lt;h2 id="step-1--sync-the-pdf-into-obsidian"&gt;Step 1 — Sync the PDF into Obsidian&lt;/h2&gt;
&lt;p&gt;The piece that makes this work is a community plugin: &lt;strong&gt;&lt;a href="https://github.com/TimDommett/Remarkable-Sync---Obsidian-Plugin"&gt;reMarkable Sync&lt;/a&gt; by Tim Dommett&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In Obsidian, go to &lt;strong&gt;Community plugins → Browse&lt;/strong&gt;, search for &lt;em&gt;reMarkable&lt;/em&gt;, install and enable it.&lt;/li&gt;
&lt;li&gt;The first time, you&amp;rsquo;ll &lt;strong&gt;register&lt;/strong&gt; the plugin — it sends you to your reMarkable page, gives you a one-time code, and you paste that in and hit register.&lt;/li&gt;
&lt;li&gt;In settings, choose a &lt;strong&gt;sync sub-folder&lt;/strong&gt;. I put mine under &lt;code&gt;plugins/reMarkable&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Set the &lt;strong&gt;sync interval&lt;/strong&gt; — I have mine sync every 30 minutes, but you can go more frequently, manually, or trigger it on demand from the command palette (&lt;code&gt;reMarkable Sync: Sync documents&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Once that&amp;rsquo;s done, anything I write on the reMarkable lands in my vault as a &lt;strong&gt;PDF&lt;/strong&gt; — diagrams, cursive, print, colours and all. In the video I write out a page (neural nets, as explained by my partner Noel), trigger a manual sync, and watch it appear in Obsidian.&lt;/p&gt;
&lt;h2 id="step-2--ocr-the-handwriting-into-real-text"&gt;Step 2 — OCR the handwriting into real text&lt;/h2&gt;
&lt;p&gt;A PDF in Obsidian is a start, but it isn&amp;rsquo;t &lt;em&gt;searchable&lt;/em&gt; or editable. That&amp;rsquo;s where &lt;strong&gt;OCR&lt;/strong&gt; (optical character recognition) comes in — turning the handwritten image into text that behaves like any other note: searchable, linkable, modifiable. I keep the PDF too (I like preserving the colours and the handwriting, especially when someone else wrote on my tablet), but I want the durable text version as well.&lt;/p&gt;
&lt;p&gt;I automate this with &lt;strong&gt;&lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt;&lt;/strong&gt; — my AI agent, &lt;a href="https://openclaw.ai"&gt;Iris&lt;/a&gt;, runs a skill on a heartbeat that watches my reMarkable folder, notices new files as they drop in, and OCRs them automatically. It even fills in properties I like and, because it knows my context (and sometimes has the transcript too), it can describe diagrams more completely than I&amp;rsquo;d expect. It correctly read &lt;em&gt;&amp;ldquo;Neural nets as explained by Noel&amp;rdquo;&lt;/em&gt; and &lt;em&gt;&amp;ldquo;get diagrams from WhatsApp&amp;rdquo;&lt;/em&gt; — whether I wrote in print or cursive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;That setup is admittedly overkill&lt;/strong&gt;, and not something I&amp;rsquo;d recommend to everyone. So in the video I also show the more accessible version:&lt;/p&gt;
&lt;h3 id="the-accessible-alternative-claude-cowork--claude-desktop"&gt;The accessible alternative: Claude Cowork / Claude Desktop&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;d like to automate OCR without a full agent setup, the &lt;strong&gt;Claude Desktop app&lt;/strong&gt; (with Cowork) is a great option — especially if you already keep notes, since your vault is exactly the kind of context that makes AI immediately useful.&lt;/p&gt;
&lt;p&gt;The prompt I use, roughly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;You are in my Obsidian vault, in the folder &lt;code&gt;plugins/reMarkable&lt;/code&gt;. Look for the very latest PDF I&amp;rsquo;ve put in there and OCR it. If there&amp;rsquo;s a diagram, describe the diagram. If there&amp;rsquo;s text — handwritten cursive or print — transcribe it. Print all of your findings into a note in the &lt;code&gt;plugins/Claude output&lt;/code&gt; folder, using the same file name as the original PDF.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It reads the latest PDF, describes the diagram (it got &amp;ldquo;neuron&amp;rdquo; and &amp;ldquo;perceptron&amp;rdquo; — words that were never actually written), and writes the note. Interestingly it did as well as my own setup, because under the hood we were both using the same model (4.8).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Then turn it into a skill.&lt;/strong&gt; I tell Claude: &lt;em&gt;&amp;ldquo;Please turn all of these instructions into a skill and call it OCR.&amp;rdquo;&lt;/em&gt; It writes the skill, preserving the paths, and I hit save. Now next time I have a reMarkable PDF to transcribe, I just run &lt;code&gt;/OCR&lt;/code&gt; and name the file. If you want to go further, you can even ask it to make this a scheduled task.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(Tip: I use &lt;a href="https://spokenly.app/"&gt;Spokenly&lt;/a&gt; to dictate these instructions to Claude rather than type them.)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="why-this-matters"&gt;Why this matters&lt;/h2&gt;
&lt;p&gt;This simple workflow has made it so I can &lt;em&gt;actually use&lt;/em&gt; my reMarkables. I love typing notes on my laptop, but when I&amp;rsquo;m face-to-face with someone — in a talk, at a conference — a screen between me and the speaker feels distancing, and a little rude. I feel more present without it. And the little Paper Pro Move is far easier to carry than a laptop or iPad.&lt;/p&gt;
&lt;p&gt;Now that I know everything ends up in Obsidian anyway, I get to pick whatever note-taking method I feel like in the moment — typing, reMarkable, or fully analog. That same OCR process (minus the reMarkable Sync plugin) also works for OCRing photos of pages from my paper traveller&amp;rsquo;s journal.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to go deeper on how I use AI in my note-taking, check out my &lt;a href="https://nicolevanderhoeven.com/blog/20260529-my-ai-notetaking-workflows/"&gt;AI note-taking workflows video&lt;/a&gt; — I cover the different audio transcription tools I use there too.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Arigatō gozaimashita! Mata kondo ne~&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🖊️ &lt;a href="https://github.com/TimDommett/Remarkable-Sync---Obsidian-Plugin"&gt;reMarkable Sync by Tim Dommett&lt;/a&gt; — the Obsidian community plugin that syncs reMarkable documents into your vault as PDFs&lt;/li&gt;
&lt;li&gt;🧠 &lt;a href="https://notes.nicolevanderhoeven.com/OpenClaw"&gt;My notes on OpenClaw&lt;/a&gt; — the agent runtime Iris runs on&lt;/li&gt;
&lt;li&gt;🎥 &lt;a href="https://nicolevanderhoeven.com/blog/20260529-my-ai-notetaking-workflows/"&gt;My AI note-taking workflows&lt;/a&gt; — the companion video on transcription and AI capture&lt;/li&gt;
&lt;li&gt;🗣️ &lt;a href="https://spokenly.app/"&gt;Spokenly&lt;/a&gt; — the dictation app I use to talk to Claude&lt;/li&gt;
&lt;li&gt;💛 &lt;a href="https://patreon.com/nicolevdh"&gt;My Patreon&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>An Overview of AI Evaluation (The Context Window #05)</title><link>https://nicolevanderhoeven.com/blog/20260626-context-window-05-ai-evaluation/</link><pubDate>Fri, 26 Jun 2026 18:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260626-context-window-05-ai-evaluation/</guid><description>&lt;p&gt;How do you know if an AI agent is actually any good — and whether the change you just made to it made it &lt;em&gt;better&lt;/em&gt; or &lt;em&gt;worse&lt;/em&gt;? In this episode of &lt;em&gt;The Context Window&lt;/em&gt; — Grafana&amp;rsquo;s livestream series on AI in observability — I&amp;rsquo;m joined by &lt;a href="https://www.linkedin.com/in/yasirekinci/"&gt;Yas Ekinci&lt;/a&gt;, an engineer on Grafana&amp;rsquo;s AI team who has spent the last several months focused almost entirely on evaluation. We talk about why trusting AI is so hard (non-deterministic models, oversized PRs, and the shift from &lt;em&gt;writing&lt;/em&gt; code to &lt;em&gt;reviewing&lt;/em&gt; it), the difference between online and offline evals, how we actually test &lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;Grafana Assistant&lt;/a&gt;, and &lt;code&gt;o11y-bench&lt;/code&gt;, the open observability benchmark we announced at GrafanaCON. We recorded this one ahead of Yas&amp;rsquo;s two-month leave — so consider it a deep dive banked for the road.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_XGLBqVpL-Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="the-final-answer-problem"&gt;The &amp;ldquo;final answer problem&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;A recurring theme — and one close to my testing heart — is what I call the final answer problem. As a tester I&amp;rsquo;m used to looking at an outcome and asking &amp;ldquo;did this pass or fail?&amp;rdquo; But with AI, a plausible-looking answer isn&amp;rsquo;t enough. If the &lt;em&gt;process&lt;/em&gt; was wrong, you can&amp;rsquo;t trust the outcome even when it looks right — and a plausible-but-wrong answer is the dangerous case, because nothing on the surface tells you it&amp;rsquo;s wrong. Yas&amp;rsquo;s example: a broken Tempo tool that returned no spans, while the agent still answered convincingly by guessing from metadata. Plausible ≠ correct.&lt;/p&gt;
&lt;p&gt;This is also why the bottleneck has moved. The cost of &lt;em&gt;writing&lt;/em&gt; code has collapsed, so the burden now sits on review. Developers, as I like to put it, are becoming &lt;strong&gt;shepherds of intent&lt;/strong&gt; — less about typing the code, more about making sure the intent is clear and faithfully implemented.&lt;/p&gt;
&lt;h2 id="what-evals-are-and-online-vs-offline"&gt;What evals are, and online vs offline&lt;/h2&gt;
&lt;p&gt;An eval is simply a test of whether an AI agent behaves the way you want — from &amp;ldquo;who are you?&amp;rdquo; → &amp;ldquo;I&amp;rsquo;m Grafana Assistant&amp;rdquo; all the way up to multi-step querying and dashboarding. The point is to know &lt;em&gt;with confidence&lt;/em&gt; whether a change made the agent better, which is what lets you improve it consistently over time.&lt;/p&gt;
&lt;p&gt;There are two complementary flavours, and they map neatly onto testing concepts we already have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Online evals&lt;/strong&gt; — scoring a sample of real production conversations, usually with an LLM-as-a-judge. Great as a pulse check (it&amp;rsquo;ll catch a quality drop when a model provider silently swaps models), but it only tests the deployed variant and is hard to verify. Closest analogy: traditional observability / RUM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Offline evals&lt;/strong&gt; — a &amp;ldquo;golden set&amp;rdquo; of tasks run during development and CI against a controlled, reproducible environment. You can test every change, prompt, and implementation, and drill into specific skills (PromQL vs LogQL, dashboarding). Closest analogy: integration testing.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-we-test-grafana-assistant"&gt;How we test Grafana Assistant&lt;/h2&gt;
&lt;p&gt;Assistant evals run a real agent-plus-tools &lt;em&gt;harness&lt;/em&gt; against a real-ish environment (a Grafana with data sources, alerts, and dashboards), then grade the full transcript with &amp;ldquo;graders&amp;rdquo; or &amp;ldquo;verifiers.&amp;rdquo; The hard tension is that the environment has to be &lt;strong&gt;real and reproducible&lt;/strong&gt; at the same time. Because Assistant is a front-end plugin that runs some tools in the browser, the team uses Playwright to replicate real browser behaviour — which is where I made my pitch for k6&amp;rsquo;s browser module (now approaching Playwright parity) as a dogfooding option. The internal eval tool is a CLI called &lt;strong&gt;LLM Spec&lt;/strong&gt;, now on its third major iteration after the lessons from o11y-bench.&lt;/p&gt;
&lt;h2 id="o11y-bench"&gt;o11y-bench&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://grafana.com/blog/o11y-bench-open-benchmark-for-observability-agents/"&gt;&lt;code&gt;o11y-bench&lt;/code&gt;&lt;/a&gt; is our public benchmark, announced at GrafanaCON, with six task categories: dashboarding, investigation, logs, metrics, and traces. A few things I think make it genuinely interesting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s built on the &lt;strong&gt;Harbor&lt;/strong&gt; framework (also used by terminal-bench), which separates harness from environment from tasks — so you can swap harnesses and compare, say, &lt;code&gt;gcx&lt;/code&gt; + Claude Code against the Grafana MCP.&lt;/li&gt;
&lt;li&gt;The leaderboard includes open models (Qwen 3.6, Kimi), not just the frontier labs.&lt;/li&gt;
&lt;li&gt;It distinguishes &lt;strong&gt;pass@3&lt;/strong&gt; (got it right at least once in three runs — rough capability) from &lt;strong&gt;pass^3&lt;/strong&gt; (got it right all three times — reliability). The 10–20% gaps between the two are the whole reliability story in a single number.&lt;/li&gt;
&lt;li&gt;It runs against a &lt;strong&gt;synthetic environment&lt;/strong&gt; (Prometheus, Loki, Tempo in Docker) with generated data, so the correct answer is known in advance — and it uses &lt;strong&gt;fact-based rubrics&lt;/strong&gt;, where the grader runs its own known-good queries against the environment and checks the agent&amp;rsquo;s answer against them. That&amp;rsquo;s how you catch the subtle, plausible-but-wrong failures.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The internal eval set is a superset that adds scenarios drawn from real (private) conversations and Assistant-specific behaviour — like Slack&amp;rsquo;s not-quite-markdown formatting — while o11y-bench stays generic and harness-independent, grading on outcome rather than method.&lt;/p&gt;
&lt;h2 id="the-evaluation-loop"&gt;The evaluation loop&lt;/h2&gt;
&lt;p&gt;Yas&amp;rsquo;s blog post (the first engineering post on Grafana&amp;rsquo;s new community &lt;em&gt;Unprompted&lt;/em&gt; blog) and our GrafanaCON talk both center on the &lt;strong&gt;evaluation loop&lt;/strong&gt;: measure → make changes (new tools, prompt tweaks, bug fixes) → measure again. The crucial bit is that the loop can be driven by a coding agent — via an &lt;code&gt;LLM Spec Improve&lt;/code&gt; skill — because you can&amp;rsquo;t unit-test natural-language &amp;ldquo;programming&amp;rdquo; the way you test code. There&amp;rsquo;s no clean relationship between the instructions you write and what the model does, so the only way to know the impact of a change is to run the loop.&lt;/p&gt;
&lt;h2 id="where-its-going"&gt;Where it&amp;rsquo;s going&lt;/h2&gt;
&lt;p&gt;We closed on open questions and wishes: higher environment fidelity, more and harder tasks (very likely an o11y-bench 2.0), and getting more contributors — including PMs writing evals to capture desired product behaviour. I floated a k6-extension-style community model for evaluators, and using o11y-bench to support &lt;strong&gt;bring-your-own-model&lt;/strong&gt;, so users can see exactly where a smaller or local model falls short instead of assuming Assistant is broken. Yas&amp;rsquo;s industry hope is the neat one: if labs tune their models against o11y-bench, observability and Grafana performance improve across the board — free fine-tuning out of the box.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/o11y-bench-open-benchmark-for-observability-agents/"&gt;Introducing o11y-bench: an open benchmark for observability agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/o11y-bench"&gt;o11y-bench on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/engineering/demystifying-evals"&gt;Anthropic: Demystifying evals&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.grafana.com"&gt;Grafana Community Slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-reading"&gt;Related reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;My notes on &lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;Grafana Assistant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;My Context Horizon piece: &lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="more-from-the-context-window"&gt;More from The Context Window&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20260603-context-window-04-cli-mcp/"&gt;#04: CLI and MCP Basics for AI Agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20260422-context-window-03-ai-observability/"&gt;#03: All About AI Observability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Hey everyone. Welcome to another episode of The Context Window. This is a semi-regular podcast — we try to make it every month — and it&amp;rsquo;s all about the things going on with AI at Grafana. Usually this is live, and you might think looking at this that it&amp;rsquo;s live, but it&amp;rsquo;s actually prerecorded, because Yas has a busy schedule ahead and I wanted to get him on here before he left. So hi, I&amp;rsquo;m Nicole van der Hoeven, a senior developer advocate at Grafana Labs, and I&amp;rsquo;m assigned to the AI team these days. And one of the people on the AI team is — this person over here. How do you say your last name, actually?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Oh, it&amp;rsquo;s Ekinci.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Ekinci. I was totally confused because I just found out you speak Dutch. Did not know that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I&amp;rsquo;m based in Belgium, and I was like, &amp;ldquo;Nicole van der Hoeven&amp;rdquo; — okay, that sounds familiar enough to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Yeah, it&amp;rsquo;s the name of my ex-husband, but it&amp;rsquo;s okay, we still like him. So tell us what you do on the AI team.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I&amp;rsquo;m an engineer on the AI team — I&amp;rsquo;m getting to five years at Grafana next week. When I joined, this was pre-AI; we had the machine learning team building predictive models, forecasting, that kind of stuff. As the AI wave came, we all got absorbed into this newer, larger AI department. It&amp;rsquo;s been quite varied — the assistant, the AI agent inside Grafana — but especially the latter half of this year I&amp;rsquo;ve been more and more focused specifically on evals: how do we figure out the quality and reliability of these things we&amp;rsquo;re deploying?&lt;/p&gt;
&lt;p&gt;AI is a very useful tool. It has utility — it&amp;rsquo;s not like NFTs. We use it day to day. My job has changed drastically over the last two years. But you still notice it needs guidance and sometimes has reliability issues. The trend is that the guidance has come down — a year or two ago I&amp;rsquo;d steer an agent 50, 60, 70 times in a session; now it&amp;rsquo;s more like five or ten. But you still need to do it. If you just blindly vibe-code your way out of this, you&amp;rsquo;re not going to end up in a good place.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
It moves so quickly. Whenever someone tells me they tried AI and it didn&amp;rsquo;t do what they wanted, I ask, &amp;ldquo;Well, when was that?&amp;rdquo; Because if it was six months ago — try it again. In this episode we&amp;rsquo;ll talk all about evals, but first, some announcements. Assistant is now available for OSS and self-hosted Grafana, and I made a video showing how to do that. There&amp;rsquo;s also a new Medium blog for Grafana Labs called &lt;em&gt;Unprompted&lt;/em&gt; — a community-focused blog — and Yas wrote the first engineering post, about building an evaluation loop. And we&amp;rsquo;ve started AI weekly videos: the AI team has a weekly meeting, Mat Ryer had the idea to publish excerpts, usually the demo part. Just be warned we demo things that may never make it to production — you&amp;rsquo;re getting it raw, warts and all.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I need to make sure I don&amp;rsquo;t wear my PJs anymore for the AI weekly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
A bit of quick AI news: Warp is now open source. There are new models — GPT-5.5, Gemini 3.1 Ultra with a two-million-token context window, Anthropic&amp;rsquo;s Claude Mythos security preview. And there&amp;rsquo;s a great article by Matt Shumer called &amp;ldquo;Something Big Is Happening,&amp;rdquo; where he says, &amp;ldquo;I am no longer needed for the actual technical work of my job&amp;rdquo; — which hits hard — and advises leaning into what&amp;rsquo;s hardest to replace.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
It&amp;rsquo;s still that guidance thing — you need a human in the loop to guide it. But if you ask me how much code I&amp;rsquo;ve manually written lately, the actual technical piece is very close to zero. We&amp;rsquo;ll talk about how that&amp;rsquo;s different for evals, because evals don&amp;rsquo;t work as well as coding does there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
So why is it so hard to trust AI? Why don&amp;rsquo;t we just YOLO it and accept everything?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
A mix of things. Everybody knows these models are non-deterministic and not perfect — these aren&amp;rsquo;t new problems; underneath it&amp;rsquo;s all machine learning, numbers and math and stats. Every time you talk to it you might get a slightly different response. The second part is it writes &lt;em&gt;a lot&lt;/em&gt; of code. You can 10x your output — send ten agents at ten different features and launch all those PRs — but then someone needs to review them, and the PRs are typically big and over-engineered. One thing I always do at the end of a piece of work is ask it to find a simpler way and simplify. Bigger PRs plus so many changes makes it hard to keep a mental model of the whole thing. And interestingly, I&amp;rsquo;ll use AI to help review a PR — which gets you back to the same problem: if you use AI to review the AI, how much can you trust that?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
I like the phrase that developers are becoming shepherds of intent — we&amp;rsquo;re not writing the code so much as making sure the intent is clear and implemented. And this is the difference between process and outcome — what I call the final answer problem. I come from performance testing; I&amp;rsquo;m used to looking at the outcome and asking did it pass or fail. But now, even if the outcome looks right, if the process was wrong I don&amp;rsquo;t trust it. And the reverse too: right process, wrong outcome, something else is broken.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Tests are interesting here, because most of those tests are also AI-generated — and the AI doesn&amp;rsquo;t shy away from just changing the test to make its branch pass. For any branch I review, I still look at all the changes; I won&amp;rsquo;t blindly rubber-stamp. That&amp;rsquo;s probably the biggest bottleneck right now.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
One approach to trusting AI is human evaluation — thumbs up/thumbs down, or something like LMArena where you compare two answers blind. Useful, but not scalable; you can&amp;rsquo;t run it in CI.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
On the eval side they&amp;rsquo;re all complementary. So, what &lt;em&gt;is&lt;/em&gt; an eval? It&amp;rsquo;s testing whether the AI agent behaves like you want. A simple one: ask &amp;ldquo;who are you?&amp;rdquo; and expect &amp;ldquo;I&amp;rsquo;m Grafana Assistant.&amp;rdquo; There are much more complicated ones around querying and dashboarding. At its core, an eval is how you figure out if the agent is any good — and the reason we do it is so that when we make changes, we know if it&amp;rsquo;s better. Answer that with confidence and you have a path to improve consistently over time.&lt;/p&gt;
&lt;p&gt;We split into online and offline. Online — we recently launched AI observability for agents — is about measuring how the deployed agent does against real production conversations from real users. Valuable, because you get a score based on real behaviour, but hard to verify; we typically use an LLM as a judge, so it&amp;rsquo;s not as robust. Offline is used more during development, in CI — much more controlled. You have a golden set of evals covering the behaviour you expect in production, and because you always test the same set, you can see whether changes make it better, and dig into PromQL vs LogQL, or dashboarding. Online is a great pulse check — it can catch quality dropping when Anthropic swaps a model — but it only tests the deployed variant. Offline can test all your changes, your implementation, and all your prompts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
It took me a while to translate these, because the testing industry already has this — we call it pre-prod and production testing. Pre-prod is everything from unit to system integration testing in dev and staging; you can really hammer the thing. Production you have to be more careful — synthetic monitoring, real user monitoring — same idea with an AI flavour.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Definitely. Online is much more like traditional observability — you&amp;rsquo;re observing a system that happens to be powered by AI, turning natural language into a number you track over time and alert on. Offline is closer to an integration test: you give it a task, it runs the whole agent against a real environment, you get something out, and then separately you grade that outcome.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
We did an AI observability episode without you — you were at GrafanaCON — so I&amp;rsquo;ll link that. Let&amp;rsquo;s talk more about offline evals, since we haven&amp;rsquo;t covered those.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Offline is a bit of a beast. There&amp;rsquo;s a good Anthropic post called &amp;ldquo;Demystifying evals.&amp;rdquo; Back when we had simple single-turn LLM calls — incident summary was one of the first — the prompt was &amp;ldquo;here&amp;rsquo;s the context of the incident, summarize this,&amp;rdquo; and grading checked readability, completeness, appropriate length. Easy enough to set up. Agents get more complicated, because every time you run a task the agent can take very different trajectories — five steps one time, seven the next. The agent plus its tools is roughly the harness; it runs against an environment — a real Grafana with data sources, a certain alert and dashboard state — and keeps interacting using the tools until it&amp;rsquo;s done. Then we take the whole transcript and grade it with graders, sometimes called verifiers, to verify it actually got the task right.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
So how do you do it for Assistant, given how broad that environment is?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
We have the public benchmark we released recently and our internal evals — same approach, different number of tasks and some different data sources. We want an environment as real as possible, but with the tension that we also need to control it so a benchmark is reproducible. If two people run it and get different scores, which one was right? We started, like everybody, with manual tests — listing data sources to confirm a tool is wired up, some CPU questions, showing logs — with a human as the judge. That&amp;rsquo;s fine at four or five scenarios; you can&amp;rsquo;t do it as a human at 500. Assistant is a front-end plugin — some tools run in your browser, which is good for auth and security but makes testing hard — so we use Playwright to replicate real behaviour and pull the telemetry out. The internal eval tool is a CLI we call LLM Spec, and it can run against cloud instances or a local controlled environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Before the environment — did you consider using k6 instead of Playwright?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Interesting — yes and no. k6 is also a tool the assistant needs to use, but our goal isn&amp;rsquo;t to load test; it&amp;rsquo;s to hook into the plugin and get the messages and telemetry out, so we have a Playwright harness.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
There&amp;rsquo;s actually a browser module for k6 going towards feature parity with Playwright.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I did not know that. Might be interesting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Just dogfood all the things. I&amp;rsquo;d love to work with you on that. Okay, the environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
We test against cloud instances — for incidents especially, it&amp;rsquo;s a lot of data. And we run LLM Spec against a local controlled environment, which is quite similar to the open benchmark we published.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
You&amp;rsquo;ve mentioned o11y-bench — the benchmark announced at the last GrafanaCON. That was fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
o11y-bench has tasks across six categories — dashboarding, investigation, logs, metrics, traces. We wanted to bring our internal approaches outward, and it was a learning opportunity: we used a framework called Harbor, also used by the makers of terminal-bench. The nice thing is it separates harness from environment from tasks — so the default harness is a simple system prompt plus the Grafana MCP, but the folks working on GCX run Claude Code plus GCX against o11y-bench and compare GCX with MCP. There&amp;rsquo;s a leaderboard with a bunch of models, including open ones like Qwen 3.6 and Kimi.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
They&amp;rsquo;re getting good. Qwen 3.6 is awesome — not top five, but for an open-weight model, impressive.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
And this is the interesting part: sort on pass@3 and it looks different from pass^3. pass@3 runs each task three times and passes if it gets it right one out of three — rough capability. pass^3 means you need three out of three on every task — reliably solving it, not just getting lucky once. You see 10–20% differences between the two scores.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
That&amp;rsquo;s awesome. And this is public, right?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Yep — the repo&amp;rsquo;s on GitHub with all the tasks. We run o11y-bench against a synthetic environment — a Prometheus, Loki, and Tempo in Docker — and we generate the data, so every run uses the same data and we know what the answer should be before we even run it. We also do fact-based rubrics: separately from what the agent does, the grading side runs its own known-good queries against the environment and checks whether the agent&amp;rsquo;s answer matches. That matters because these agents fail in subtle ways. We once made a change to the Tempo tool that broke the spans — the agent got no spans but still answered, fairly realistically, from metadata. Without testing for it you&amp;rsquo;d never catch it; the text looked plausible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
That&amp;rsquo;s exactly process versus outcome. If the answer were negative two seconds it&amp;rsquo;s obviously wrong, but a plausible answer is the dangerous one.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Exactly, and that happens a lot.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
An early Assistant once told me it created a dashboard, and it didn&amp;rsquo;t look right — turned out it couldn&amp;rsquo;t find the data source so it just used dummy data.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Same thing happened to me locally — I broke all the tools, and it still came up with tool calls it couldn&amp;rsquo;t execute because of rough instructions in the system prompt.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
So what&amp;rsquo;s missing in o11y-bench that means you still need an internal one?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Two levels. First, some scenarios are based on real conversations or our own internal environments — anything involving private data can&amp;rsquo;t go public. Second, there are very Assistant-specific things we want to test — Slack, for instance, has its own version of markdown that looks like markdown but isn&amp;rsquo;t, and early Slack Assistant struggled to write it consistently, so we wrote tests for that. The internal set is a superset; the public set is still part of it. The public set is generic observability tasks — asking questions about your data, dashboarding, basic Grafana API checks — and because the harness is independent, we can test GCX, MCP, our assistant, or any other agent against it, grading on the outcome rather than how it was solved.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
We talked about your blog post — let&amp;rsquo;s define the evaluation loop.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
At its core: measure the current state, see where it works and where it doesn&amp;rsquo;t, make changes — a new tool, tool instructions, the system prompt, bug fixes — then measure again, and again. The key is that loop can be driven by a coding agent, not us manually. If your evals are robust enough to pass a clean feedback signal back, the agent can keep improving until it hits 100%, and then you make harder tasks or increase coverage. At scale it&amp;rsquo;s nearly impossible for one human to understand the whole system and make targeted improvements, because an agent isn&amp;rsquo;t programmed as code — it&amp;rsquo;s programmed with natural language, and there&amp;rsquo;s no clear relationship between the instructions and what the model does. The only way to probe that is to run a bunch of these loops.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Is the loop equally implemented for o11y-bench and LLM Spec?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
It&amp;rsquo;s implemented internally. o11y-bench is really just the measurement part — we&amp;rsquo;ve used it for GCX and MCP, but more manually. In LLM Spec we have an &lt;code&gt;LLM Spec Improve&lt;/code&gt; skill — you pick the agent, and it runs measure-improve-measure-improve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Where are you going next — no promises?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I&amp;rsquo;ve done a lot on the harnesses — the Playwright stuff, and there was an LLM Spec 1.0, then a 2.0 revamp for speed and robustness, then o11y-bench, and the learnings from that went into what I&amp;rsquo;d call LLM Spec 3.0. The two big challenges now are environment fidelity — more an issue for internal evals — and the number and quality of tasks: how do we cover more of Grafana? We weren&amp;rsquo;t sure o11y-bench would be a recurring thing, but there&amp;rsquo;s a lot of interest, so we&amp;rsquo;ll probably do an o11y-bench 2.0. And I want more people contributing — I was talking at the PM all-hands about getting product managers to write evals, because the tasks capture desired behaviour: when someone asks about my product, how should the agent ideally respond?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
What I&amp;rsquo;d love is something like the k6 extension model applied to evaluators. When Grafana acquired k6 — I was on k6 — k6 had extensions and modules, and we got a lot of cool community extensions. I think evaluators would be the same. After my Madrid talk, all the questions about the evaluator section were &amp;ldquo;can we add this, can we add that, why isn&amp;rsquo;t this in the template?&amp;rdquo; — and it could be.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
It would be nice to do that across both o11y-bench and the internal ones — there are open questions on making them work together; internally we&amp;rsquo;re in Go, o11y-bench is on Harbor in Python, but the tasks and most verifiers are language-independent by design. A fourth thing is getting to a better golden set over time — we haven&amp;rsquo;t yet automated going from real AI-observability conversations to verifiable offline tasks. As the product changes, your tasks might not stay relevant — imagine k6 didn&amp;rsquo;t exist and now people ask Assistant about k6. Bridging online and offline in a more automated way would be the fourth big thing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
I also have a wish for o11y-bench beyond being a benchmark — with no internal knowledge and no promises: it could be a step toward making Assistant bring-your-own-model. One barrier is that people try Assistant with a tiny local model and conclude it doesn&amp;rsquo;t work, when really you need certain models. A standardized way to measure that and show users where their model falls short — versus where the latest Opus sits on the leaderboard — lets them make an informed decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
I&amp;rsquo;d go beyond Assistant — we&amp;rsquo;ve got GCX and MCP too. If you want to use your own models with them, the benchmark should reflect, for observability tasks, which are the best models and the best &lt;em&gt;open&lt;/em&gt; models. It gets to your point: people can make a more informed decision.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Where are we still missing things as an industry, not just as a company?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Just recently a new benchmark called DeepSWE was released, and it&amp;rsquo;s a bit controversial because it flips the ranking from the most popular software-engineering benchmark — where Opus was always leading, here GPT-5.5 leads by a margin. So there&amp;rsquo;s something to be said about the reliability of the benchmarks themselves, since labs test and sometimes tune their models against them. That might actually be good for o11y-bench — I&amp;rsquo;d &lt;em&gt;want&lt;/em&gt; a lab to tune against it, so we get free fine-tuning out of the box: as newer models use o11y-bench to tune on observability tasks, they get better at using Grafana and solving observability problems.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
Thank you — we just hit time. It was really informative, and I&amp;rsquo;m glad we both found time; this got rescheduled for various reasons. A great overview of all the evals we&amp;rsquo;re doing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Thanks — it&amp;rsquo;s nice to step out of the day-to-day and talk about this stuff.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;
And if you&amp;rsquo;re watching, leave any eval questions in the comments and I&amp;rsquo;ll bug Yas to answer them. Thanks everyone for watching.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Yas:&lt;/strong&gt;
Bye.&lt;/p&gt;</description></item><item><title>OpenTelemetry's Graduation: What It Took (Grafana ❤️🔥 OpenTelemetry Community Call #8)</title><link>https://nicolevanderhoeven.com/blog/20260622-gocc08-opentelemetry-graduation/</link><pubDate>Mon, 22 Jun 2026 16:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260622-gocc08-opentelemetry-graduation/</guid><description>&lt;p&gt;OpenTelemetry graduated from the CNCF — so for this community call I gathered a panel of people who were in the room for it to talk about what graduation actually &lt;em&gt;means&lt;/em&gt;, what it took to get there, and where the project goes next. We covered the roughly two-year road to graduation, why semantic conventions are so genuinely hard, the state of the signals (traces, metrics, logs — and the newer profiles), AI&amp;rsquo;s double-edged impact on the project, and the most practical ways for new contributors to get involved.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/P9CfVEGwcgo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="what-we-covered"&gt;What we covered&lt;/h2&gt;
&lt;h3 id="-what-graduation-actually-took"&gt;🎓 What graduation actually took&lt;/h3&gt;
&lt;p&gt;Graduation from the CNCF took about two years, with OTel evaluated on traces, metrics, and logs across the major server-side languages. Profiling, mobile, and other newer signals were explicitly out of scope for the graduation criteria. One of the most concrete pieces of CNCF feedback: stop camping on &lt;code&gt;0.x&lt;/code&gt; versions for components that are actually production-ready. The fix is to mark maintained, stable packages as &lt;code&gt;1.0&lt;/code&gt; (reserving &lt;code&gt;2.0&lt;/code&gt; for future breaking changes) — which unblocks the enterprises that simply aren&amp;rsquo;t allowed to ship anything still labeled &amp;ldquo;beta.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="-documentation-thats-actually-findable"&gt;📚 Documentation that&amp;rsquo;s actually findable&lt;/h3&gt;
&lt;p&gt;A recurring theme was that the documentation bar isn&amp;rsquo;t just &amp;ldquo;does it exist&amp;rdquo; — it&amp;rsquo;s &amp;ldquo;can someone find it.&amp;rdquo; Collector component docs are spread across 100+ GitHub repos, which makes discovery painful. The stopgap is an auto-updated component list with metadata on the OpenTelemetry website that links out to the relevant READMEs; the longer-term answer is the &lt;strong&gt;Ecosystem Explorer&lt;/strong&gt; project, which aims to unify instrumentation details, versioning, and component metadata in one place.&lt;/p&gt;
&lt;h3 id="-why-semantic-conventions-are-so-hard"&gt;🏷️ Why semantic conventions are so hard&lt;/h3&gt;
&lt;p&gt;Semantic conventions define normalized attribute names so that the same event — say, an HTTP request — looks identical no matter the language or library that produced it. The naming debates are slow for real reasons: the database SIG took over a year to stabilize a single set of attributes. The process is propose names → check them against all the major databases → build a proof-of-concept in three or more languages → iterate. A name that&amp;rsquo;s obvious for one database may not even exist as a concept in another. (OTel itself is the product of merging OpenTracing, OpenCensus, and Elastic Common Schema — and yes, the name was chosen specifically because it&amp;rsquo;s boring and self-describing. Everything is named what it does.)&lt;/p&gt;
&lt;h3 id="-signals-baggage-and-stability"&gt;🧳 Signals, baggage, and stability&lt;/h3&gt;
&lt;p&gt;All three original signals — traces, metrics, and logs — are now stable, and that includes &lt;strong&gt;baggage&lt;/strong&gt;: a context-propagation mechanism that carries a small &amp;ldquo;bag&amp;rdquo; of attributes (trace ID, span ID, and more) across network hops. It was originally built for tracing but designed to be reusable for other cross-cutting concerns like security and feature flags, and it sat largely unused while the rest of OTel was being finished. &lt;strong&gt;Profiles&lt;/strong&gt;, meanwhile, hit alpha at KubeCon in March and are treated as a bonus on top of the graduation baseline rather than part of it.&lt;/p&gt;
&lt;h3 id="-ais-impact-on-opentelemetry--the-good-and-the-painful"&gt;🤖 AI&amp;rsquo;s impact on OpenTelemetry — the good and the painful&lt;/h3&gt;
&lt;p&gt;The good: the explosion of GenAI and agentic systems is creating real demand for OTel-style observability. The Gen AI SIG is growing fast to standardize telemetry for AI systems, and there&amp;rsquo;s a whole crop of AI-observability startups building on OpenTelemetry. Maintainers are also using AI coding tools to move faster — the &lt;strong&gt;Weaver&lt;/strong&gt; tool is being developed to constrain the problem space so AI-generated instrumentation code is more accurate, with the goal of going from spec to implementation with coding tools.&lt;/p&gt;
&lt;p&gt;The painful: a massive influx of low-quality, AI-generated PRs across all of open source. Some are genuinely malicious (bot accounts farming credibility for supply-chain attacks); others are just thoughtless. One proposed mitigation is to cap the number of open PRs per contributor without merge rights to something like three to five.&lt;/p&gt;
&lt;h3 id="-post-graduation-priorities-and-how-to-get-involved"&gt;🚀 Post-graduation priorities and how to get involved&lt;/h3&gt;
&lt;p&gt;The post-graduation backlog (&amp;ldquo;postgrad app&amp;rdquo;) focuses on stability cleanup, easier deployment, and self-observability. The deployment north star is something close to &lt;code&gt;apt-get install opentelemetry&lt;/code&gt; that auto-instruments everything — including outside Kubernetes. New stable YAML-based collector config lets operators manage all languages from a single file, and the &lt;strong&gt;Blueprint&lt;/strong&gt; project pairs a specific challenge with OTel guidelines and concrete implementation steps.&lt;/p&gt;
&lt;p&gt;If you want in, the panel was refreshingly practical about the fastest path to approver/maintainer status:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Review other people&amp;rsquo;s PRs&lt;/strong&gt; in your subject area.&lt;/li&gt;
&lt;li&gt;Ask maintainers &lt;em&gt;&amp;ldquo;what can I take off your plate?&amp;rdquo;&lt;/em&gt; rather than only filing your own issues.&lt;/li&gt;
&lt;li&gt;Quality over quantity — AI-heavy contributions you can&amp;rsquo;t explain won&amp;rsquo;t earn status.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Localization&lt;/strong&gt; is one of the easiest entry points; around ten language teams are active and docs translation is always welcome.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We also went around the panel on how everyone &lt;em&gt;got&lt;/em&gt; started — from debugging giant distributed systems, to a beginner-questions live stream, to Elastic Common Schema work, to copy-editing PRs as a former librarian. The throughline: pick a small, real thing, do it well, and document your learning journey as you go.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/"&gt;OpenTelemetry documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/open-telemetry/community"&gt;OpenTelemetry community &amp;amp; SIGs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.cncf.io/"&gt;CNCF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/OpenTelemetry"&gt;My notes on OpenTelemetry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to the panel — &lt;strong&gt;Ted Young&lt;/strong&gt;, &lt;strong&gt;Marylia Gutierrez&lt;/strong&gt;, &lt;strong&gt;Imma Valls&lt;/strong&gt;, &lt;strong&gt;Tiffany Hrabusa&lt;/strong&gt;, and &lt;strong&gt;Tiffany Jernigan&lt;/strong&gt; — for joining, and to everyone who showed up live with questions.&lt;/p&gt;</description></item><item><title>CLI and MCP Basics for AI Agents (The Context Window #04)</title><link>https://nicolevanderhoeven.com/blog/20260603-context-window-04-cli-mcp/</link><pubDate>Wed, 03 Jun 2026 18:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260603-context-window-04-cli-mcp/</guid><description>&lt;p&gt;MCP vs CLI: which one should your AI agent actually use? In this episode of &lt;em&gt;The Context Window&lt;/em&gt; — Grafana&amp;rsquo;s livestream series on AI in observability — I&amp;rsquo;m joined by &lt;a href="https://www.linkedin.com/in/tiffanyjerniganm/"&gt;Tiffany Jernigan&lt;/a&gt; and three of the engineers and PMs behind Grafana&amp;rsquo;s agent tooling: Ben Sully (who wrote the Grafana MCP server), and Ward Bekker and Dafydd Thomas from the team building &lt;code&gt;gcx&lt;/code&gt;. We get into the two main ways an AI agent can reach the outside world — the Model Context Protocol (MCP) and good old command-line interfaces — and look at when each one makes sense, the tradeoffs around context windows, tool sprawl, token cost, and reliability. We walk through Grafana&amp;rsquo;s cloud and open-source MCP servers along with &lt;code&gt;gcx&lt;/code&gt;, the Grafana Cloud CLI built for agents, do a live side-by-side demo of both creating an SLO, and talk about how we benchmark them against each other with o11y-bench.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZR6U4TN8-Cw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="timestamps"&gt;Timestamps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;00:00:00 — Introductions&lt;/li&gt;
&lt;li&gt;00:02:49 — The last month in AI news&lt;/li&gt;
&lt;li&gt;00:10:19 — What is Grafana Assistant?&lt;/li&gt;
&lt;li&gt;00:12:30 — What does it mean for Assistant to use tools?&lt;/li&gt;
&lt;li&gt;00:13:30 — What is MCP?&lt;/li&gt;
&lt;li&gt;00:16:56 — What is a CLI in an AI context?&lt;/li&gt;
&lt;li&gt;00:19:17 — What are skills?&lt;/li&gt;
&lt;li&gt;00:24:37 — Can you use a custom MCP server with Grafana Assistant?&lt;/li&gt;
&lt;li&gt;00:25:55 — Why team MCP?&lt;/li&gt;
&lt;li&gt;00:28:22 — The context-window cost of MCP tool definitions&lt;/li&gt;
&lt;li&gt;00:31:50 — Tool discoverability&lt;/li&gt;
&lt;li&gt;00:39:25 — What is gcx, and why a CLI?&lt;/li&gt;
&lt;li&gt;00:46:13 — Demo: creating an SLO with MCP vs gcx&lt;/li&gt;
&lt;li&gt;00:52:58 — Benchmarking MCP vs gcx with o11y-bench&lt;/li&gt;
&lt;li&gt;00:58:10 — How MCP and gcx relate to Grafana Assistant&lt;/li&gt;
&lt;li&gt;01:02:35 — k6 MCP vs Grafana MCP&lt;/li&gt;
&lt;li&gt;01:03:00 — When to use which (decision guide)&lt;/li&gt;
&lt;li&gt;01:04:29 — Adding the OSS Grafana MCP to Assistant&lt;/li&gt;
&lt;li&gt;01:05:41 — Turtles all the way down&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;h3 id="mcp-and-cli-for-agents"&gt;MCP and CLI for agents&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io"&gt;Model Context Protocol&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/mcp-grafana"&gt;Grafana MCP server (OSS)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/gcx"&gt;gcx — the Grafana Cloud CLI&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/o11y-bench-open-benchmark-for-observability-agents/"&gt;Introducing o11y-bench: an open benchmark for observability agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.grafana.com"&gt;Grafana Community Slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-reading"&gt;Related reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;My Context Horizon piece: &lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="more-from-the-context-window"&gt;More from The Context Window&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20260422-context-window-03-ai-observability/"&gt;#03: All About AI Observability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>My AI note-taking workflows</title><link>https://nicolevanderhoeven.com/blog/20260529-my-ai-notetaking-workflows/</link><pubDate>Fri, 29 May 2026 17:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260529-my-ai-notetaking-workflows/</guid><description>&lt;p&gt;Just over a year ago, if you&amp;rsquo;d asked me how I felt about AI and note-taking, I would have told you I didn&amp;rsquo;t want AI anywhere near my notes. The world is different now, and so am I — I rely on AI in a lot of ways, and one of the easiest places to start is speech-to-text: using AI to convert my voice into something my &lt;a href="https://nicolevanderhoeven.com/blog/"&gt;PKM&lt;/a&gt; system can actually work with.&lt;/p&gt;
&lt;p&gt;In this video, I walk through &lt;strong&gt;three tiers of AI note-taking workflows&lt;/strong&gt; — free, paid, and (a little) overkill — and show what I&amp;rsquo;m using at each level.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2Jl6H9Ri8iI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="the-framing-note-taking-vs-note-making"&gt;The framing: note-taking vs. note-making&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/@LinkingYourThinking"&gt;Nick Milo&lt;/a&gt; draws a useful distinction between note-&lt;em&gt;taking&lt;/em&gt; and note-&lt;em&gt;making&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Note-taking&lt;/strong&gt; is collecting — recording information, paraphrasing what an author said, highlighting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Note-making&lt;/strong&gt; is connecting — active thinking, engaging with the information, linking it to other ideas, working out how it fits into your PKM system.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The best use of AI right now, for me, is to help with the note-taking part. I like to start with speech because speech used to be a form of input my PKM system couldn&amp;rsquo;t take very much of. Pre-AI, voice was lossy — you&amp;rsquo;d have to transcribe it yourself or lose the thought. Now: you speak, AI transcribes it, it lands in your notes, and the AI can keep working with it from there.&lt;/p&gt;
&lt;h2 id="tier-1--free"&gt;Tier 1 — Free&lt;/h2&gt;
&lt;p&gt;Use your phone&amp;rsquo;s recording app. iOS Voice Memos transcribes recordings, and the Notes app does too on newer Apple devices. Samsung&amp;rsquo;s Voice Recorder app does the same on Galaxy devices. For desktop, I demo &lt;a href="https://spokenly.app/"&gt;Spokenly&lt;/a&gt; (Mac, Windows, iOS) — drop audio in, get text out.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The friction is manual:&lt;/strong&gt; remember to record, remember to transcribe, remember to paste.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;What you get:&lt;/strong&gt; quick notes to yourself, captured instantly.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Best for:&lt;/strong&gt; people who want to get started as easily as possible without paying for anything.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to go local-first, I&amp;rsquo;d point you at &lt;a href="https://huggingface.co/nvidia/parakeet-tdt-0.6b-v2"&gt;NVIDIA Parakeet&lt;/a&gt; and the &lt;a href="https://huggingface.co/Qwen"&gt;Qwen&lt;/a&gt; models for offline transcription.&lt;/p&gt;
&lt;h2 id="tier-2--paid"&gt;Tier 2 — Paid&lt;/h2&gt;
&lt;p&gt;The second tier is paying for the convenience layer. These tools collapse the first two steps — you record, the transcript appears, and you usually get extras like AI summaries or the ability to ask questions of the transcript (sometimes live).&lt;/p&gt;
&lt;p&gt;Tools: &lt;a href="https://voicenotes.com"&gt;Voicenotes&lt;/a&gt;, &lt;a href="https://otter.ai"&gt;Otter.ai&lt;/a&gt;, &lt;a href="https://letterly.app"&gt;Letterly&lt;/a&gt;, &lt;a href="https://www.granola.ai"&gt;Granola&lt;/a&gt;, &lt;a href="https://gemini.google.com"&gt;Gemini&lt;/a&gt; on Google Meet, &lt;a href="https://www.zoom.com/en/ai-assistant/"&gt;Zoom AI Companion&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For Granola specifically, I use the &lt;a href="https://github.com/tomelliot/obsidian-granola-sync"&gt;Granola Sync Obsidian plugin&lt;/a&gt; plus a &lt;a href="https://github.com/chhoumann/quickadd"&gt;QuickAdd&lt;/a&gt; macro (&lt;code&gt;QuickAdd: Macro - Link Granola&lt;/code&gt;) to automatically link a transcript to the right note in my vault — in the video I link a &lt;a href="https://www.youtube.com/@Bookborn"&gt;Dungeon Crawler Carl&lt;/a&gt; recap to its Granola transcript. &lt;em&gt;(The linking script and macro are on my &lt;a href="https://patreon.com/nicolevdh"&gt;Patreon&lt;/a&gt;.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tradeoffs:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Your notes live in their system, not yours. Shutdowns, pricing changes, and acquisitions all take your archive with them.&lt;/li&gt;
&lt;li&gt;The friction reduction is real, though — if it means you actually capture instead of &lt;em&gt;intending&lt;/em&gt; to capture, that&amp;rsquo;s worth a lot.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Best for:&lt;/strong&gt; people who want to capture meetings, games, or lectures.&lt;/p&gt;
&lt;h2 id="tier-3--overkill"&gt;Tier 3 — Overkill&lt;/h2&gt;
&lt;p&gt;This is my setup. It&amp;rsquo;s a little ridiculous; I&amp;rsquo;m going to show it anyway.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Hardware:&lt;/strong&gt; a &lt;a href="https://plaudus.sjv.io/MA4GQN"&gt;Plaud&lt;/a&gt; AI recorder. Small, clips to my phone or sits in a pocket. Always running, or started deliberately for important conversations and walks. It can run entirely locally, or upload to Plaud&amp;rsquo;s servers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plugin:&lt;/strong&gt; &lt;a href="https://github.com/nicolevanderhoeven/plaud-sync-for-obsidian"&gt;my fork&lt;/a&gt; of &lt;a href="https://github.com/leonardsellem/plaud-sync-for-obsidian"&gt;Leonard Sellem&amp;rsquo;s Plaud Sync plugin for Obsidian&lt;/a&gt;, installed via &lt;a href="https://github.com/tfthacker/obsidian42-brat"&gt;BRAT&lt;/a&gt;. The fork adds a couple of things I needed for my own daily workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI layer:&lt;/strong&gt; &lt;a href="https://openclaw.ai"&gt;Iris&lt;/a&gt;, my &lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt;-powered AI agent, watches the synced files. Every morning she reads the previous day&amp;rsquo;s transcripts, plus my calendar and daily notes, and outputs a daily summary, extracted tasks, and flags anything I&amp;rsquo;ve said I wanted to remember.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also use &lt;strong&gt;&amp;ldquo;Hey Iris&amp;rdquo; memos&lt;/strong&gt; — voice notes I record into Plaud while I&amp;rsquo;m out, addressed to Iris, that she processes the next time she runs. &lt;em&gt;&amp;ldquo;Hey Iris, remind me to follow up with X.&amp;rdquo;&lt;/em&gt; &lt;em&gt;&amp;ldquo;Hey Iris, add this restaurant to my places-to-try list.&amp;rdquo;&lt;/em&gt; They land in my system without me opening anything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Benefits:&lt;/strong&gt; I don&amp;rsquo;t think about capture at all. I just live and talk, and the relevant pieces land in my notes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cons:&lt;/strong&gt; the privacy of people around me. I&amp;rsquo;m careful about when this is on, and especially careful about explicit consent.&lt;/p&gt;
&lt;h2 id="why-three-tiers-not-one"&gt;Why three tiers, not one&lt;/h2&gt;
&lt;p&gt;The slightly absurd thing is that I still use all three levels — in parallel, for different things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Spokenly&lt;/strong&gt; for dictating at my desk, sometimes straight into Obsidian, sometimes into a chat.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Granola&lt;/strong&gt; for meeting notes, and increasingly for transcribing videos I&amp;rsquo;m watching.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Voicenotes&lt;/strong&gt; for diary-style entries.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Plaud&lt;/strong&gt; when it&amp;rsquo;s ethical to (especially when I&amp;rsquo;m travelling with my partner and I want a clean record of conversations and ideas we had on the move).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For me, voice is the &lt;strong&gt;lowest-friction capture method that exists&lt;/strong&gt;. No stopping, no finding my phone, no opening an app, no typing. Just talk — and the system handles everything downstream.&lt;/p&gt;
&lt;p&gt;That means the gap between &lt;em&gt;thinking of something&lt;/em&gt; and &lt;em&gt;writing it down&lt;/em&gt; is basically gone for me. Note-&lt;em&gt;taking&lt;/em&gt; — the tedious part — gets offloaded. So when I&amp;rsquo;m in a meeting I can be present, knowing the tool is faithfully tracking what&amp;rsquo;s said. Whatever notes I &lt;em&gt;do&lt;/em&gt; take are then what &lt;em&gt;I&lt;/em&gt; think about what I&amp;rsquo;m hearing, which lets me start synthesising a lot faster.&lt;/p&gt;
&lt;p&gt;If you want more details about any of these workflows, let me know in the comments. &lt;em&gt;Arigatō gozaimashita! Mata kondo ne~&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🎙️ &lt;a href="https://nicolevanderhoeven.com/blog/20250427-mechanics-of-knowledge-management-podcast/"&gt;The Mechanics of Knowledge Management podcast episode&lt;/a&gt; where Malik interviewed me on this stuff&lt;/li&gt;
&lt;li&gt;🧠 &lt;a href="https://notes.nicolevanderhoeven.com/OpenClaw"&gt;My notes on OpenClaw&lt;/a&gt; — the agent runtime Iris runs on&lt;/li&gt;
&lt;li&gt;🎤 &lt;a href="https://notes.nicolevanderhoeven.com/Voicenotes"&gt;My notes on Voicenotes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;💛 &lt;a href="https://patreon.com/nicolevdh"&gt;My Patreon&lt;/a&gt;, where I share the QuickAdd linking scripts and macros&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Grafana Campfire 🔥 — GrafanaCON 2026 recap</title><link>https://nicolevanderhoeven.com/blog/20260528-grafana-campfire-grafanacon-2026-recap/</link><pubDate>Thu, 28 May 2026 17:45:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260528-grafana-campfire-grafanacon-2026-recap/</guid><description>&lt;p&gt;I co-hosted this month&amp;rsquo;s &lt;a href="https://www.youtube.com/watch?v=6qYCSBT3yU4"&gt;Grafana Campfire&lt;/a&gt; with &lt;a href="https://www.linkedin.com/in/stephaniehingtgen/"&gt;Stephanie Hingtgen&lt;/a&gt;, where we recapped everything that came out of GrafanaCON 2026. Stephanie owned the Grafana 13 walkthrough — Git Sync GA, Dynamic Dashboards GA, Dashboards API v2 GA, Grafana Advisor GA, SCIM GA — what she described as &lt;em&gt;the year Grafana stopped being beta in production&lt;/em&gt;. I covered the AI section (Grafana Assistant now in OSS and Enterprise, the three scaling challenges from &amp;ldquo;Scaling Grafana Assistant&amp;rdquo;, Investigations, Skills going GA), the three-teams-one-architecture push across Loki Thor, Mimir 3.0, and Pyroscope 2.0, the OTel + Alloy roadmap, alerting, k6 v2.0, and the Marketplace and Logline.&lt;/p&gt;
&lt;p&gt;We also took questions from the Champions community on the pace of UI change, Mimir Alertmanager, and the agent-scale question — &lt;em&gt;what happens when your AI agents are themselves the noisiest users of your observability stack?&lt;/em&gt; — and threw in a flavour break about the &lt;a href="https://github.com/grafana/tamagrotchi"&gt;TamaGROTchi&lt;/a&gt; and the ocean digital twin demo.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6qYCSBT3yU4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/grafanacon-2026-announcements/?pg=blog&amp;amp;plcmt=featured"&gt;GrafanaCON 2026 announcements blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.linkedin.com/in/stephaniehingtgen/"&gt;Stephanie Hingtgen on LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Asimov's Zeroth Law of Robotics: Observability for AI (ExpoQA Madrid 2026)</title><link>https://nicolevanderhoeven.com/blog/20260526-asimovs-zeroth-law-expoqa-madrid/</link><pubDate>Tue, 26 May 2026 10:00:00 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20260526-asimovs-zeroth-law-expoqa-madrid/</guid><description>&lt;p&gt;This week I gave the opening keynote at &lt;a href="https://expoqa.eu/events/cd1-t1-kn2/"&gt;ExpoQA Madrid 2026&lt;/a&gt; in Madrid, Spain. I presented a talk called &lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics: Observability for AI&lt;/em&gt;, which I had previously given at &lt;a href="https://nicolevanderhoeven.com/blog/20250402-asimovs-zeroth-law-of-robotics/"&gt;KubeCon EU 2025&lt;/a&gt; in London, at &lt;a href="https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/"&gt;Dutch Cloud Native Day 2025&lt;/a&gt; in Utrecht, and at &lt;a href="https://nicolevanderhoeven.com/blog/20251106-asimovs-zeroth-law-newcrafts/"&gt;Newcrafts&lt;/a&gt; in Paris. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A robot may not harm humans. A robot must obey humans. A robot must protect its own existence. These are Isaac Asimov&amp;rsquo;s three Laws of Robotics, created to govern the ethical programming of artificial intelligences. From the Butlerian Jihad to Skynet to cylons, we&amp;rsquo;ve been immortalizing our collective nightmares about artificial intelligence for years. But there&amp;rsquo;s an unmentioned law that comes as a prerequisite to all of that: a robot must be observable.&lt;/p&gt;
&lt;p&gt;In this talk, I discuss the different types of AI, the factors that make observing AI different from observing applications, and the telemetry signals specific to AI that we might want to listen to. How do we deal with large data sets? How do we observe for model drift? How do we take into account the costs of LLMs? How can we use distributed tracing to follow event sequences? Part cautionary tale and part technical demo, this talk shows how to instrument and monitor AI apps using OpenTelemetry, Prometheus, OpenLit, and more.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was a keynote slot at a testing-focused audience, which gave me the chance to lean more into the &lt;em&gt;evals vs. observability&lt;/em&gt; framing — what evals can and can&amp;rsquo;t tell you about an AI system in production, and how distributed tracing fills the gap that benchmarks leave behind. The demo app (a Flask-based &amp;ldquo;play.py&amp;rdquo; instrumented with OpenTelemetry, flowing into Tempo for traces, Prometheus for metrics, and Loki for logs) is still on &lt;a href="https://nicole.to/asimov"&gt;GitHub&lt;/a&gt;, and I&amp;rsquo;ve been refining it with each iteration.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the recording of the talk:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/06Uus-llIBg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicole.to/asimov"&gt;Demo app on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Zero to Dashboard with Grafana Assistant and the Infinity datasource plugin</title><link>https://nicolevanderhoeven.com/blog/20260522-zero-to-dashboard-infinity-assistant/</link><pubDate>Fri, 22 May 2026 17:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260522-zero-to-dashboard-infinity-assistant/</guid><description>&lt;p&gt;What if you didn&amp;rsquo;t have to write a single query to get a useful dashboard?&lt;/p&gt;
&lt;p&gt;In this short video, I go from nothing to a working dashboard in a few minutes — no queries — using &lt;a href="https://grafana.com/products/cloud/ai-tools/"&gt;Grafana Assistant&lt;/a&gt; and the &lt;a href="https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/"&gt;Infinity datasource plugin&lt;/a&gt;. The data I&amp;rsquo;m visualising is the &lt;a href="https://rawg.io/apidocs"&gt;RAWG video game database API&lt;/a&gt;, so I end up with a dashboard that helps me decide what to play next.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/X3TZk_qywlo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="why-infinity-is-fun-here"&gt;Why Infinity is fun here&lt;/h2&gt;
&lt;p&gt;Most Grafana data sources are scoped to a specific kind of backend — Prometheus, Loki, a SQL database. &lt;strong&gt;Infinity&lt;/strong&gt; is different: it lets you treat &lt;em&gt;any&lt;/em&gt; REST/JSON/CSV/HTML endpoint as a data source. That means anything with an API can become a dashboard, which is exactly the right shape for goofing around with a games API on a Friday afternoon.&lt;/p&gt;
&lt;p&gt;Pair Infinity with Assistant and you don&amp;rsquo;t even have to know what queries to write — Assistant configures the data source, asks the API the right questions, and builds the panels for you.&lt;/p&gt;
&lt;h2 id="timestamps"&gt;Timestamps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;00:00 — Intro&lt;/li&gt;
&lt;li&gt;00:35 — The RAWG video game database&lt;/li&gt;
&lt;li&gt;01:01 — Setting up the Infinity datasource&lt;/li&gt;
&lt;li&gt;05:10 — Customising the dashboard with Assistant&lt;/li&gt;
&lt;li&gt;09:31 — Closing thoughts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/use-ai-to-turn-any-api-into-a-grafana-dashboard/"&gt;Step-by-step blog post: using Assistant with the Infinity datasource&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/alerting-and-irm/machine-learning/assistant/"&gt;Grafana Assistant documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/plugins/yesoreyeram-infinity-datasource/"&gt;Infinity datasource plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rawg.io/apidocs"&gt;RAWG video game database API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/g/cloud"&gt;Get started with Grafana Cloud (free tier)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;My notes on Grafana Assistant&lt;/a&gt; — everything I&amp;rsquo;m learning as I work on it&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Do Androids Dream of Second Brains?</title><link>https://nicolevanderhoeven.com/blog/20260518-do-androids-dream-of-second-brains-video/</link><pubDate>Mon, 18 May 2026 07:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260518-do-androids-dream-of-second-brains-video/</guid><description>&lt;p&gt;We often describe our personal knowledge management systems as &amp;ldquo;second brains&amp;rdquo; — but can we really say they think for themselves? In this video, I make the case for instrumenting your vault with an observability stack and layering AI on top, not because it&amp;rsquo;ll turn your notes into a brain, but because it might get us closer than anything else has.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/BeuaPO0Ezuk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;This is the video version of the talk I gave at &lt;a href="https://nicolevanderhoeven.com/blog/20260321-do-androids-dream-of-second-brains/"&gt;PKM Summit 2026&lt;/a&gt; in Utrecht earlier this year, with the live demos cleaner and the dashboards working without the conference wifi gods getting in the way.&lt;/p&gt;
&lt;h2 id="what-i-cover"&gt;What I cover&lt;/h2&gt;
&lt;h3 id="-why-second-brain-is-the-wrong-framing"&gt;🐑 Why &amp;ldquo;second brain&amp;rdquo; is the wrong framing&lt;/h3&gt;
&lt;p&gt;I take a small detour through Philip K. Dick&amp;rsquo;s &lt;em&gt;Do Androids Dream of Electric Sheep?&lt;/em&gt; — the inspiration for &lt;em&gt;Blade Runner&lt;/em&gt; — and the Voigt-Kampff test, which measures empathy through observed responses to staged scenarios. It&amp;rsquo;s a useful lens for asking what we actually mean when we say a knowledge system &amp;ldquo;thinks&amp;rdquo;: we&amp;rsquo;re really asking whether it can respond to us in a way that surprises us. Most second-brain setups can&amp;rsquo;t, yet.&lt;/p&gt;
&lt;h3 id="-observability-for-pkm"&gt;📊 Observability for PKM&lt;/h3&gt;
&lt;p&gt;Observability is a concept I&amp;rsquo;ve borrowed wholesale from how we monitor software systems — the idea that you can understand a complex system by what it emits, not by reading its internals. Three steps: instrumentation, analysis, improvement. I walk through what each one looks like for a personal vault:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Instrumentation&lt;/strong&gt;: a small script that emits metrics about my Obsidian vault — note counts, link density, growth over time, what folders are loud and which are quiet&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Analysis&lt;/strong&gt;: a Grafana dashboard sitting on top of Loki + Prometheus, surfacing things I genuinely didn&amp;rsquo;t know about my own vault&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Improvement&lt;/strong&gt;: the part where seeing the data actually changes how you work&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s a live dashboard tour, and a section where I ask &lt;strong&gt;Grafana Assistant&lt;/strong&gt; to edit the dashboard for me in natural language — including writing the PromQL queries I never want to write by hand.&lt;/p&gt;
&lt;h3 id="-meet-iris"&gt;👁️ Meet Iris&lt;/h3&gt;
&lt;p&gt;About halfway through the video I introduce &lt;strong&gt;Iris&lt;/strong&gt; — the AI agent I built using &lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt; that lives in my vault, reads my notes, and works alongside me. I walk through:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What &amp;ldquo;agentic AI&amp;rdquo; actually means in practice (vs. just chatting with an LLM)&lt;/li&gt;
&lt;li&gt;The OpenClaw setup — Docker sandbox, Syncthing, the whole pipeline&lt;/li&gt;
&lt;li&gt;Iris rewriting my observability map of content&lt;/li&gt;
&lt;li&gt;Iris doing talk-topic analysis on my vault&lt;/li&gt;
&lt;li&gt;Iris running benchmark research for a blog post&lt;/li&gt;
&lt;li&gt;Iris OCRing my reMarkable handwriting&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="-dreaming"&gt;🌙 Dreaming&lt;/h3&gt;
&lt;p&gt;The last section is the one I had the most fun with. I argue that the thing most second-brain setups are missing isn&amp;rsquo;t &lt;em&gt;more notes&lt;/em&gt; or &lt;em&gt;better search&lt;/em&gt; — it&amp;rsquo;s &lt;strong&gt;synthesis&lt;/strong&gt;. The capacity to take everything you&amp;rsquo;ve captured and surface patterns, contradictions, and ideas you hadn&amp;rsquo;t formed yet.&lt;/p&gt;
&lt;p&gt;I introduce OpenClaw&amp;rsquo;s &lt;em&gt;dreaming&lt;/em&gt; feature: a memory consolidation process inspired by how sleep stages work in the brain. Light sleep, REM, and deep sleep each do different work — surfacing recent material, finding unexpected connections, and consolidating long-term memory. I show how each phase actually behaves in my own system.&lt;/p&gt;
&lt;p&gt;And there&amp;rsquo;s a Zhuangzi reference. (You&amp;rsquo;ll see.)&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🎤 &lt;a href="https://nicolevanderhoeven.com/blog/20260321-do-androids-dream-of-second-brains/"&gt;PKM Summit 2026 talk recap (with photos)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🎞 &lt;a href="https://nicole.to/androids"&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;👁️ &lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📓 &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🔄 &lt;a href="https://syncthing.net"&gt;Syncthing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;📊 &lt;a href="https://grafana.com"&gt;Grafana&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-reading"&gt;Related reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/the-architecture-of-forgetting"&gt;&lt;em&gt;The Architecture of Forgetting&lt;/em&gt;&lt;/a&gt; — the essay version of why memory consolidation matters&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;&lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to follow more of how Iris works and what I&amp;rsquo;m learning about AI + PKM, &lt;a href="https://contexthorizon.substack.com"&gt;Context Horizon&lt;/a&gt; is where I write about it.&lt;/p&gt;</description></item><item><title>Continuous Profiling, the OpenTelemetry Way (Grafana ❤️🔥 OpenTelemetry Community Call #7)</title><link>https://nicolevanderhoeven.com/blog/20260518-gocc07-continuous-profiling/</link><pubDate>Mon, 18 May 2026 05:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260518-gocc07-continuous-profiling/</guid><description>&lt;p&gt;In this community call, my coworker &lt;strong&gt;Tiffany Jernigan&lt;/strong&gt; and I sat down with &lt;strong&gt;Christian Simon&lt;/strong&gt;, who works on Grafana Pyroscope, to dig into profiling as the &lt;strong&gt;fourth signal&lt;/strong&gt; in OpenTelemetry. Metrics, logs, and traces are the classic three pillars — but a significant portion of latency lives &lt;em&gt;inside&lt;/em&gt; a span, in the actual code execution, where the other three can&amp;rsquo;t see. Profiling fills that gap by giving you continuous, code-level visibility into where time is being spent.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/N47wy9pp7Lo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="what-we-covered"&gt;What we covered&lt;/h2&gt;
&lt;h3 id="-profiling-as-the-fourth-signal"&gt;🔥 Profiling as the fourth signal&lt;/h3&gt;
&lt;p&gt;Most observability conversations stop at logs, metrics, and traces. But when you see a slow span and ask &lt;em&gt;&amp;ldquo;what was the code actually doing?&amp;rdquo;&lt;/em&gt; — none of the three pillars can answer. Christian made the case that profiling is the missing piece: continuous, low-overhead, code-level visibility, typically visualized as flame graphs that attribute latency to specific functions and execution paths.&lt;/p&gt;
&lt;h3 id="-what-flame-graphs-actually-tell-you"&gt;📊 What flame graphs actually tell you&lt;/h3&gt;
&lt;p&gt;If you haven&amp;rsquo;t worked with flame graphs before: wide bars = lots of time spent in that function, and the stack reads bottom-up. Once you understand how to read them, they become surprisingly fast to interpret. We walked through what to look for and how to spot the patterns that matter.&lt;/p&gt;
&lt;h3 id="-the-current-state-of-profiling-in-opentelemetry"&gt;🌐 The current state of profiling in OpenTelemetry&lt;/h3&gt;
&lt;p&gt;Profiling is the newest signal to enter the OpenTelemetry spec, and the conversation around it is still evolving. Christian gave a clear-eyed status update on where things are — what&amp;rsquo;s stable, what&amp;rsquo;s experimental, and what the path to GA looks like.&lt;/p&gt;
&lt;h3 id="-running-profiling-in-production"&gt;🚀 Running profiling in production&lt;/h3&gt;
&lt;p&gt;The most common pushback on continuous profiling is &lt;em&gt;&amp;ldquo;what&amp;rsquo;s the overhead?&amp;rdquo;&lt;/em&gt; — and the honest answer is that modern continuous profilers typically add 1–3% CPU overhead, which makes them safe to run in production all the time. We talked through deployment patterns, including Kubernetes / containerized environments, and how to think about cost and storage.&lt;/p&gt;
&lt;h3 id="-correlating-profiles-with-traces-and-metrics"&gt;🧵 Correlating profiles with traces and metrics&lt;/h3&gt;
&lt;p&gt;This is where profiling really earns its place. Trace ID → profile is the killer pattern: you see a slow span, you click through to the flame graph for that exact execution, and you immediately see which function ate the time. Christian showed how this correlation works in practice and how it changes incident response.&lt;/p&gt;
&lt;h3 id="-how-to-get-involved"&gt;🤝 How to get involved&lt;/h3&gt;
&lt;p&gt;OpenTelemetry profiling is genuinely an area where the community has room to shape the future. If the conversation sparked something, there&amp;rsquo;s a working group, open issues, and a friendly path in.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/oss/pyroscope/"&gt;Grafana Pyroscope&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/open-telemetry/community/blob/main/projects/profiling.md"&gt;OpenTelemetry Profiling SIG&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/pyroscope/latest/"&gt;Pyroscope docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/"&gt;OpenTelemetry documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to Christian for joining, to Tiffany for co-hosting, and to everyone who showed up live with questions.&lt;/p&gt;</description></item><item><title>The Architecture of Forgetting</title><link>https://nicolevanderhoeven.com/blog/20260507-architecture-of-forgetting/</link><pubDate>Thu, 07 May 2026 16:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260507-architecture-of-forgetting/</guid><description>&lt;p&gt;Originally posted &lt;a href="https://contexthorizon.substack.com/p/the-architecture-of-forgetting"&gt;here&lt;/a&gt; on Context Horizon.&lt;/p&gt;
&lt;p&gt;In early April, &lt;a href="https://github.com/openclaw/openclaw/releases/tag/v2026.4.5"&gt;a new version of everyone&amp;rsquo;s favourite lobster, OpenClaw, was shipped&lt;/a&gt; with an interesting new feature: &lt;a href="https://docs.openclaw.ai/concepts/dreaming"&gt;dreaming&lt;/a&gt;. It&amp;rsquo;s a memory consolidation feature. But to understand why it matters, we need to back up.&lt;/p&gt;
&lt;p&gt;Early AI chatbots, like the initial GPT wrappers, had zero memory. Every conversation started fresh. You asked a question, you got an answer, and you moved on: a glorified search engine.&lt;/p&gt;
&lt;p&gt;Somewhere along the way we began to expect more and more of our chatbots. Models acquired context windows that became their de facto short-term memory. As the context window filled up, they remembered what had been said earlier in the conversation, making them better conversational partners. Still, it was ephemeral: close the tab, start fresh. And it had a hard ceiling: hit the limit, and the oldest things fall off. This felt like forgetting because &lt;em&gt;it was&lt;/em&gt;. But it was also, accidentally, a form of curation. Finite space forced priority.&lt;/p&gt;
&lt;p&gt;Then came the push for real persistence. RAG pipelines, vector databases, memory files, agent frameworks that write notes to themselves. Now our agents can remember that we prefer the Oxford comma, that we just started a new project at work, that our D&amp;amp;D character is named Zuhri. This felt like the solution. More memory = better agent.&lt;/p&gt;
&lt;p&gt;That mostly works— until it doesn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;As it turns out, the problem with AI memory isn&amp;rsquo;t that agents forget too much. It&amp;rsquo;s that &lt;strong&gt;they forget too little&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="why-remembering-is-hard"&gt;Why remembering is hard&lt;/h2&gt;
&lt;p&gt;It turns out that having a persistent memory, even for an agent like OpenClaw that has that as one of its defining features, doesn&amp;rsquo;t solve all the memory problems.&lt;/p&gt;
&lt;p&gt;I happen to have an OpenClaw agent that named itself Iris.&lt;/p&gt;
&lt;p&gt;Iris does a lot of things for me, including parsing my meeting notes to identify next actions, curating my tasks and projects, and generating a daily briefing. She also creates a summary of the day&amp;rsquo;s work based on my meetings, conversations, and notes. One day she was giving me the daily summary, and here&amp;rsquo;s that conversation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Iris: &amp;hellip;Tonsil is finally healed after weeks of pain&amp;hellip;
Me: Wait what? Where did you get the tonsil stuff?
Iris: From your memory file — it&amp;rsquo;s in the Apr 10 daily note context: &amp;ldquo;Tonsil finally healed — Nicole no longer in pain 🎉&amp;rdquo;. I&amp;rsquo;ve had that sitting in memory since the Apr 10 summary. Is that wrong? Was it something else that healed, or is the tonsil detail off?
Me: I have no idea where you got that. I have never had issues with my tonsil.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Where did that come from? I&amp;rsquo;m still not sure, but I occasionally have meetings in cafés, and it&amp;rsquo;s possible that a meeting recording overheard the conversation of someone else in the café. That got faithfully transcribed, copied over into my notes, and written into Iris&amp;rsquo;s memory. Iris treated it as fact for days.&lt;/p&gt;
&lt;p&gt;The problem isn&amp;rsquo;t that Iris forgot. It&amp;rsquo;s that she remembered the wrong thing&amp;hellip; and didn&amp;rsquo;t know how to forget it.&lt;/p&gt;
&lt;p&gt;Imagine this at scale: not one wrong fact, but dozens, quietly shaping every summary, every recommendation, every task Iris surfaces for me. The signal-to-noise ratio degrades until it doesn&amp;rsquo;t matter if Iris remembers mostly accurate memories— I won&amp;rsquo;t trust it.&lt;/p&gt;
&lt;p&gt;So how do you build a memory system that knows what to keep? Researchers have been working on this longer than you might think.&lt;/p&gt;
&lt;h2 id="meet-the-residents-of-smallville"&gt;Meet the residents of Smallville&lt;/h2&gt;
&lt;p&gt;Stanford researchers Park et al. &lt;a href="https://arxiv.org/abs/2304.03442"&gt;released a charming study in 2023&lt;/a&gt; called &lt;em&gt;Generative Agents: Interactive Simulacra of Human Behavior&lt;/em&gt; in which they talk about how they created a simulated environment called Smallville, populated it with 25 generative agents, and then watched.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260507-smallville.png" alt="Smallville, a simulated environment populated with 25 generative agents" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: Park et al. (2023)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The study was an attempt to simulate emergent social behavior, but the key insight I took from it isn&amp;rsquo;t the sim itself— it&amp;rsquo;s what they had to do to the inhabitants of Smallville to enable the rich social interactions they wanted to observe.&lt;/p&gt;
&lt;p&gt;The researchers had to give the inhabitants a way to remember.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260507-smallville-memory-architecture.png" alt="The memory architecture of Smallville’s generative agents — observation, retrieval, action, and reflection" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Above is a diagram of the memory architecture of every generative agent.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Observation:&lt;/em&gt; The agent perceives new information. The new information is saved into the &lt;em&gt;memory stream&lt;/em&gt;, a database that serves as the record of everything an agent has experienced.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Retrieval:&lt;/em&gt; When the agent is looking for information, a retrieval function takes that information from the memory stream and passes it onto the agent.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Action:&lt;/em&gt; The agent, armed with retrieved information, can decide to act.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Reflection:&lt;/em&gt; Patterns are synthesized from the observations and written back to the memory stream.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To determine which memories to retrieve at any given point in time, the researchers scored memories according to three weighted factors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Recency:&lt;/em&gt; when a memory was observed&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Importance:&lt;/em&gt; how significant the memory was&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Relevance:&lt;/em&gt; how closely related a memory is to the input memory (the agent&amp;rsquo;s current context)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The top-ranking memories that fit within the agent&amp;rsquo;s context window were selected to be retrieved and used with the prompt.&lt;/p&gt;
&lt;p&gt;The researchers also introduced a second type of memory: reflection. Reflections were generated when a threshold of important scores was reached per day, which typically happened 2-3 times a day.&lt;/p&gt;
&lt;p&gt;Crucially, reflection is a &lt;em&gt;compression&lt;/em&gt; step — the agent doesn&amp;rsquo;t just accumulate observations, it periodically steps back and asks &amp;ldquo;what do these observations actually mean?&amp;rdquo; That reflection pass is where low-signal memories get subordinated to higher-order patterns. That&amp;rsquo;s the first instance of intelligent forgetting.&lt;/p&gt;
&lt;p&gt;The Smallville paper was published in 2023. Three years later, the same insight shipped in a lobster.&lt;/p&gt;
&lt;h2 id="dreaming-of-electric-lobsters"&gt;Dreaming of electric lobsters&lt;/h2&gt;
&lt;p&gt;Every system that has solved the memory problem has solved it the same way: not by storing more, but by knowing what to throw away.&lt;/p&gt;
&lt;p&gt;Your brain does it while you sleep by consolidating important experiences into long-term memory, letting the rest dissolve. Some programming languages do it with garbage collection, periodically scanning for unused objects and reclaiming that space. Databases do it with compaction: Loki, Cassandra, and other LSM-tree-inspired systems periodically merge and discard obsolete data so reads stay fast.&lt;/p&gt;
&lt;p&gt;In all cases, the architecture of good memory is really the architecture of intelligent forgetting. OpenClaw&amp;rsquo;s dreaming feature is the same insight applied to agents.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260507-architecture-of-forgetting-dreaming.svg" alt="Diagram of OpenClaw’s internal memory architecture. The default components (“Awake”) are in black, and the new components are in blue (“Dreaming”)." loading="lazy" decoding="async"&gt;
&lt;em&gt;Diagram of OpenClaw&amp;rsquo;s internal memory architecture. The default components (&amp;ldquo;Awake&amp;rdquo;) are in black, and the new components are in blue (&amp;ldquo;Dreaming&amp;rdquo;).&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Note that without dreaming, there is no automatic promotion from the active context window to daily notes and then to long-term memory. When a new bit of information is mentioned, the agent has to decide whether it should be added to the daily note and/or the long-term memory file manually. Dreaming, by contrast, is an automated process.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s called &amp;ldquo;Dreaming&amp;rdquo; because the feature works similarly to the biological process, as if in three sleep phases:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Light phase:&lt;/em&gt; Creates a session corpus from session files and then succeeding sweeps tally how many times a chunk has been recalled in a session (a counter called &lt;code&gt;lightHit&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;REM phase:&lt;/em&gt; Spots patterns and themes from chunks and adds a reinforcement signal (&lt;code&gt;remHits&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Deep phase:&lt;/em&gt; Ranks the candidates by several factors and promotes those that exceed a threshold score to long-term memory in &lt;code&gt;MEMORY.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just like in the Smallville simulation, OpenClaw ranks information by several categories. Here&amp;rsquo;s the table of signals and weights from the &lt;a href="https://docs.openclaw.ai/concepts/dreaming#deep-ranking-signals"&gt;OpenClaw docs&lt;/a&gt; at the time of writing:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Frequency&lt;/td&gt;
&lt;td&gt;0.24&lt;/td&gt;
&lt;td&gt;How many short-term signals the entry accumulated&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Relevance&lt;/td&gt;
&lt;td&gt;0.30&lt;/td&gt;
&lt;td&gt;Average retrieval quality for the entry&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Query diversity&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;Distinct query/day contexts that surfaced it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recency&lt;/td&gt;
&lt;td&gt;0.15&lt;/td&gt;
&lt;td&gt;Time-decayed freshness score&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consolidation&lt;/td&gt;
&lt;td&gt;0.10&lt;/td&gt;
&lt;td&gt;Multi-day recurrence strength&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conceptual richness&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;td&gt;Concept-tag density from snippet/path&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Only candidates that have high scores according to these signals graduate to be part of &lt;code&gt;MEMORY.md&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="how-dreaming-helps-with-forgetting"&gt;How dreaming helps with forgetting&lt;/h3&gt;
&lt;p&gt;The new dreaming architecture doesn&amp;rsquo;t ever &lt;em&gt;delete&lt;/em&gt; things, technically. The forgetting is more passive. However, it&amp;rsquo;s still an improvement in a few ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Low-signal chunks don&amp;rsquo;t get promoted:&lt;/em&gt; Anything that doesn&amp;rsquo;t cross the deep phase thresholds simply never reaches MEMORY.md. It exists, but it&amp;rsquo;s functionally invisible to future sessions.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Score competition:&lt;/em&gt; The staging index has finite attention, so chunks compete against each other for recall signal. A high-frequency chunk that keeps getting surfaced crowds out low-frequency ones. Relative obscurity is functional forgetting.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Recency decay on scoring:&lt;/em&gt; The deep phase ranking includes a recency signal. So something that was frequently recalled two weeks ago but hasn&amp;rsquo;t come up since will score lower than something with fewer total hits but recent activity. Time degrades relevance passively.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;What&amp;rsquo;s notable: all three are selection mechanisms, not deletion mechanisms. The corpus files still exist. The staging index entries still exist. Nothing is removed&amp;hellip; it&amp;rsquo;s just progressively less likely to be chosen. This is forgetting as diminishing probability of retrieval, not erasure.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s the garbage collection analogy again: the objects are still in memory, they&amp;rsquo;re just unreachable.&lt;/p&gt;
&lt;h3 id="transparency"&gt;Transparency&lt;/h3&gt;
&lt;p&gt;Dreaming also adds a layer of transparency. Aside from the session corpus and staging files, it also produces some output about its decisions. All three dreaming stages create files per day that live in &lt;code&gt;.openclaw/workspace/memory/dreaming/{phase}/YYYY-MM-DD.md&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of an entry in the &lt;code&gt;light&lt;/code&gt; directory:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Light Sleep
- Candidate: &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; blog post (Context Horizon): `Dont Call It Eval - Blog Post Outline.md` — full outline with 7 open questions; `Dont Call It Eval - Draft.md` — 2,550-word draft, 6 sections; `Dont Call It Eval - Opening Research.md` — Tier 1/2/3 shortlist of popular AI eval po
- confidence: 0.62
- evidence: memory/2026-04-19.md:13-15
- recalls: 0
- status: staged
- Candidate: &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; blog post (Context Horizon): **Thesis (locked):** &amp;#34;AI eval community has rediscovered software testing and given it a new name. The testing world has been busy since.&amp;#34;
- confidence: 0.62
- evidence: memory/2026-04-19.md:17-17
- recalls: 0
- status: staged
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This entry identified a blog draft I was working on.&lt;/p&gt;
&lt;p&gt;REM sleep goes through these candidates and highlights when it spots themes:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# REM Sleep
### Reflections
- Theme: `assistant` kept surfacing across 532 memories.
- confidence: 1.00
- evidence: memory/2026-04-12.md:27-29, memory/.dreams/session-corpus/2026-04-17.txt:26-26, memory/.dreams/session-corpus/2026-04-17.txt:28-28
- note: reflection
### Possible Lasting Truths
- &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; blog post (Context Horizon): **Datadog Bits AI eval platform** (Apr 7, 2026) — &amp;#34;Bring the noise&amp;#34; = noise injection = production-like envs from 90s QA. SECTION HEADERS are gold (&amp;#34;When one improvement caused subtle regressions&amp;#34;, &amp;#34;Why tool-level testing and live [confidence=0.58 evidence=memory/2026-04-19.md:30-33]
- &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; blog post (Context Horizon): **Thesis (locked):** &amp;#34;AI eval community has rediscovered software testing and given it a new name. The testing world has been busy since.&amp;#34; [confidence=0.58 evidence=memory/2026-04-19.md:17-17]
- &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; blog post (Context Horizon): **Title:** &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; (Nicole&amp;#39;s original; I picked it over &amp;#34;Congratulations, you&amp;#39;ve invented testing&amp;#34;) [confidence=0.58 evidence=memory/2026-04-19.md:27-27]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In this case, REM sleep correctly identified that I&amp;rsquo;m currently working on the &lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/assistant/"&gt;Assistant&lt;/a&gt; feature at work (which had already been promoted to long-term memory) and the blog post that the light sleep phase had identified.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the same day&amp;rsquo;s deep sleep file:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;# Deep Sleep
- Ranked 10 candidate(s) for durable promotion.
- Promoted 3 candidate(s) into MEMORY.md.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;And here&amp;rsquo;s the addition to &lt;code&gt;MEMORY.md&lt;/code&gt; for the same day:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;## Promoted From Short-Term Memory (2026-04-26)
&amp;lt;!-- openclaw-memory-promotion:memory:memory/2026-04-19.md:17:17 --&amp;gt;
- **Thesis (locked):** &amp;#34;AI eval community has rediscovered software testing and given it a new name. The testing world has been busy since.&amp;#34; [score=0.926 recalls=0 avg=0.620 source=memory/2026-04-19.md:17-17]
&amp;lt;!-- openclaw-memory-promotion:memory:memory/2026-04-19.md:27:27 --&amp;gt;
- **Title:** &amp;#34;Don&amp;#39;t Call It Eval&amp;#34; (Nicole&amp;#39;s original; I picked it over &amp;#34;Congratulations, you&amp;#39;ve invented testing&amp;#34;) [score=0.926 recalls=0 avg=0.620 source=memory/2026-04-19.md:27-27]
&amp;lt;!-- openclaw-memory-promotion:memory:memory/2026-04-19.md:12:12 --&amp;gt;
- Three files in openclaw-output: [score=0.894 recalls=0 avg=0.620 source=memory/2026-04-19.md:12-12]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;There&amp;rsquo;s also an entry in &lt;code&gt;DREAMS.md&lt;/code&gt; for the entire sequence, which is more dreamlike and human-readable. The per-day Deep Sleep file is the structured internal audit trail; &lt;code&gt;DREAMS.md&lt;/code&gt; is the rolling, more narrative log for humans.&lt;/p&gt;
&lt;p&gt;This level of transparency and reflection is a welcome change when you compare it to what I had before, which was nothing. Iris had to manually decide on the spot what had to be written where, and those decisions were not logged anywhere.&lt;/p&gt;
&lt;h2 id="the-tonsil-dilemma"&gt;The tonsil dilemma&lt;/h2&gt;
&lt;p&gt;So dreaming could have prevented the tonsil hallucination, right? Well&amp;hellip; no.&lt;/p&gt;
&lt;p&gt;In this case, the idea of my supposed tonsil pain had come from an external source: my meeting recordings. Iris had faithfully manually added that to the daily note for the day, then decided to call on it a few days later, unprompted, in conversation with me.&lt;/p&gt;
&lt;p&gt;With dreaming, Iris still could have made those decisions. But in fact, even if she hadn&amp;rsquo;t, dreaming could have made it &lt;em&gt;worse&lt;/em&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Light phase sweeps it and scores it well since it&amp;rsquo;s recent and distinctive.&lt;/li&gt;
&lt;li&gt;Tonsil pain could be included in queries about health, such as the daily health tracker that is part of Iris&amp;rsquo;s tasks. REM phase sees a pattern and increments &lt;code&gt;remHits&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Deep phase ranks it highly and it crosses the promotion threshold.&lt;/li&gt;
&lt;li&gt;It gets written to &lt;code&gt;MEMORY.md&lt;/code&gt; and gets loaded &lt;em&gt;every session&lt;/em&gt;. And long-term memory is sticky. Only manual intervention (by me or by Iris) removes things from that file.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Even dreaming doesn&amp;rsquo;t solve everything. Dreaming adds a mechanism for forgetting. It doesn&amp;rsquo;t prevent OpenClaw from remembering the wrong things in the first place.&lt;/p&gt;
&lt;h3 id="the-residual-layer"&gt;The residual layer&lt;/h3&gt;
&lt;p&gt;Every memory architecture we&amp;rsquo;ve looked at — biological sleep consolidation, garbage collection, LSM compaction, Smallville&amp;rsquo;s reflection pass, OpenClaw&amp;rsquo;s dreaming — has the same shape: automated compression plus a residual human layer. Your brain has you. GC has the programmer. Iris&amp;rsquo;s dreaming has me. The human in the loop isn&amp;rsquo;t a bug in the design; it&amp;rsquo;s load-bearing.&lt;/p&gt;
&lt;h2 id="whats-worth-keeping"&gt;What&amp;rsquo;s worth keeping&lt;/h2&gt;
&lt;p&gt;Dreaming is a genuine step forward for OpenClaw&amp;rsquo;s memory architecture. The mechanism of passive forgetting isn&amp;rsquo;t perfect, but the automated promotion systems do add a necessary layer of periodic reflection.&lt;/p&gt;
&lt;p&gt;But there are limitations. Dreaming can&amp;rsquo;t yet distinguish between a memory worth keeping and a hallucinated tonsil. It can only measure how often something gets recalled. The next frontier is &lt;em&gt;active forgetting&lt;/em&gt;: automated demotion from &lt;code&gt;MEMORY.md&lt;/code&gt;, weighted by signals like source provenance and trust. The provenance side of that work landed in &lt;a href="https://github.com/openclaw/openclaw/releases/tag/v2026.4.29-beta.2"&gt;v2026.4.29-beta.2&lt;/a&gt; — memory now exposes evidence-kind drilldown and privacy/provenance reports, so you can at least &lt;em&gt;see&lt;/em&gt; where a memory came from. But the demotion half — automatically down-ranking memories based on a low-trust source like an audio transcript — still hasn&amp;rsquo;t been built.&lt;/p&gt;
&lt;p&gt;What remains, for now, is the human layer. The transparency of the dreaming process becomes a checkpoint for the human in the loop by surfacing promotion decisions. I still read the summaries. I still catch the errors. I still decide what goes into long-term memory and what gets quietly corrected. That&amp;rsquo;s not a gap in the system — it&amp;rsquo;s probably the right design. The most important memories should require a human to notice them twice.&lt;/p&gt;
&lt;p&gt;Good memory systems are defined by what they &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; keep as much as by what they &lt;em&gt;do&lt;/em&gt; keep.&lt;/p&gt;</description></item><item><title>Grafana k6 Community Call — Secrets Management &amp; AI Script Authoring</title><link>https://nicolevanderhoeven.com/blog/20260430-k6-community-call-secrets-and-ai-script-authoring/</link><pubDate>Thu, 30 Apr 2026 16:30:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260430-k6-community-call-secrets-and-ai-script-authoring/</guid><description>&lt;p&gt;The first k6 Community Call in over a year, and we packed it. I sat down with four of the people building k6 — &lt;strong&gt;Bukola Ayodele&lt;/strong&gt;, &lt;strong&gt;Facundo Batista&lt;/strong&gt; (Software Engineer), &lt;strong&gt;Vicente Ortega&lt;/strong&gt; (Senior Backend Engineer), and &lt;strong&gt;Charlie Burnett&lt;/strong&gt; (Product Manager) — to walk through two new pieces of work that have shipped recently, plus a look at what&amp;rsquo;s coming in k6 v2.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mYpnaE_J2lM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="what-we-covered"&gt;What we covered&lt;/h2&gt;
&lt;h3 id="-secrets-management-in-k6-cloud-facundo"&gt;🔐 Secrets management in k6 Cloud (Facundo)&lt;/h3&gt;
&lt;p&gt;A new way to store API tokens, passwords, and other sensitive values for your tests — centralized in Grafana&amp;rsquo;s secrets manager, encrypted at rest, and never visible in the UI or API once written. Your scripts reference secrets by name, and at runtime the values are injected and &lt;strong&gt;automatically redacted from logs&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Why this matters for load testers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;No more hardcoded credentials sitting in scripts or in Git&lt;/li&gt;
&lt;li&gt;Easy rotation — change the secret value, every script that uses it picks up the new value, no script edits needed&lt;/li&gt;
&lt;li&gt;Same script works across dev/staging/prod by just swapping which secrets are scoped to which environment&lt;/li&gt;
&lt;li&gt;Works with k6 OSS locally too — your local runs can pull cloud-managed secrets when you want them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Facundo Batista demoed the full flow: creating a secret in the Grafana Cloud UI (name, description, labels — up to 10 per secret, all write-only), and using it in a script with one line. There&amp;rsquo;s also an API for programmatic management.&lt;/p&gt;
&lt;h3 id="-grafana-assistant-k6-script-authoring-mode-vicente"&gt;🤖 Grafana Assistant k6 script authoring mode (Vicente)&lt;/h3&gt;
&lt;p&gt;This is the AI-powered script generation that&amp;rsquo;s been in the works for a while — fine-tuned specifically for k6 best practices, not a generic &amp;ldquo;ask an LLM to write you a load test&amp;rdquo; workflow. The interesting bit is the &lt;strong&gt;context sources&lt;/strong&gt; Assistant can pull from when generating a script:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A service name&lt;/strong&gt; — Assistant analyzes the existing telemetry data to discover endpoints and shapes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A GitHub repository URL&lt;/strong&gt; — pulls the code to understand the API&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;An OpenAPI specification&lt;/strong&gt; — generates tests that exercise every endpoint with realistic request shapes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Existing observability data&lt;/strong&gt; — metrics, logs, traces from your actual production traffic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Generated scripts come with proper structure, error handling, checks, and &lt;code&gt;TODO&lt;/code&gt; comments where the model genuinely doesn&amp;rsquo;t know what to write (e.g. for auth tokens, request bodies, or anything that needs your secrets — by design, Assistant won&amp;rsquo;t fabricate those). You can also point it at an existing script and ask it to refactor or extend.&lt;/p&gt;
&lt;h3 id="-k6-v2-charlie"&gt;🚀 k6 v2 (Charlie)&lt;/h3&gt;
&lt;p&gt;Release candidate 1 is out, GA is &lt;em&gt;very&lt;/em&gt; soon. The headline changes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Extensions marketplace&lt;/strong&gt; — community protocols and integrations&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enhanced Playwright browser support&lt;/strong&gt; with compatible syntax&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;New assertions library&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP / agent connectivity&lt;/strong&gt; for AI-driven workflows&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DNS, MQTT, and other network protocols&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Migration advice from Charlie Burnett: pin your script versions, test your existing scripts against the RC before GA hits, and don&amp;rsquo;t rush.&lt;/p&gt;
&lt;h3 id="-whats-next-on-the-ai-roadmap-next-12-months"&gt;🔮 What&amp;rsquo;s next on the AI roadmap (next 1–2 months)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Visual browser-based testing experience&lt;/li&gt;
&lt;li&gt;Enhanced observability workflow automation&lt;/li&gt;
&lt;li&gt;Improved user-journey creation across both personal and enterprise apps&lt;/li&gt;
&lt;li&gt;Integration with autonomous monitoring systems&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/k6/"&gt;k6 documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/grafana-assistant/"&gt;Grafana Assistant docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6/releases"&gt;k6 v2 release candidate&lt;/a&gt; (GA very soon)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/k6/secrets/"&gt;Secrets management in k6 Cloud&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-context-horizon-pieces"&gt;Related Context Horizon pieces&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;&lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/high-int-low-wis-what-llm-benchmarks"&gt;&lt;em&gt;High INT, Low WIS — what LLM benchmarks miss&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Thanks to Bukola, Facundo, Vicente, and Charlie for joining, and to everyone who showed up live.&lt;/p&gt;</description></item><item><title>High INT, Low WIS: What LLM Benchmarks Miss</title><link>https://nicolevanderhoeven.com/blog/20260423-high-int-low-wis-llm-benchmarks/</link><pubDate>Thu, 23 Apr 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260423-high-int-low-wis-llm-benchmarks/</guid><description>&lt;p&gt;Originally posted &lt;a href="https://contexthorizon.substack.com/p/high-int-low-wis-what-llm-benchmarks"&gt;here&lt;/a&gt; on Context Horizon.&lt;/p&gt;
&lt;p&gt;In the tabletop roleplaying game Dungeons &amp;amp; Dragons (D&amp;amp;D), the very first thing you do when you create a character is to choose ability scores. Ability scores are numbers that determine how good you are at the game&amp;rsquo;s main characteristics: Strength (STR), Dexterity (DEX), Constitution (CON), Intelligence (INT), Wisdom (WIS), and Charisma (CHA). 20 is the default maximum that a character can have in any ability, though some in-game events/items can increase that.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the thing, though: every D&amp;amp;D player knows that a 20 Intelligence doesn&amp;rsquo;t mean your wizard aces every check. Whether you have proficiency in the specific skill still matters. That 20 INT wizard, for all their raw cognitive horsepower, can absolutely still fail to identify a magical rune. The ability score is a starting point, not a verdict.&lt;/p&gt;
&lt;p&gt;This is exactly what&amp;rsquo;s happening to LLM benchmarks. All the general LLM/AI model benchmarks are ability scores. They tell you something real about a model&amp;rsquo;s general capabilities, the same way a 20 INT tells you something real about a wizard. But as frontier models crowd toward the top of every leaderboard, we&amp;rsquo;re running into a problem D&amp;amp;D solved decades ago: the stat block isn&amp;rsquo;t the character. And it was never supposed to be.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260423-safira-l10-stats.png" alt="A screenshot of the stats of my Level 10 bard. Low INT, but look at that CHA!" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A screenshot of the stats of my Level 10 bard. Low INT, but look at that CHA!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-stat-block-a-tour-of-the-ability-scores-everyones-maxing-out"&gt;The stat block: A tour of the ability scores everyone&amp;rsquo;s maxing out&lt;/h2&gt;
&lt;p&gt;There are so many new models and model versions out there that it&amp;rsquo;s hard to keep up with what we&amp;rsquo;re supposed to be using for which tasks. LLM benchmarks have come to be relied on to give a somewhat objective assessment of each model&amp;rsquo;s capability. Here are a few big ones that exist.&lt;/p&gt;
&lt;h3 id="general-knowledgereasoning"&gt;General knowledge/reasoning&lt;/h3&gt;
&lt;h4 id="mmlu-measuring-massive-multitask-language-understanding-2020"&gt;MMLU (Measuring Massive Multitask Language Understanding, 2020)&lt;/h4&gt;
&lt;p&gt;MMLU is the classic &amp;ldquo;general knowledge&amp;rdquo; INT check. It was &lt;a href="https://arxiv.org/abs/2009.03300"&gt;released in September 2020 by Hendrycks et al.&lt;/a&gt; and contains 15,908 multiple-choice questions across 57 subjects (humanities, social science, STEM, other). However, there were a few issues with it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://arxiv.org/abs/2406.04127"&gt;a study in 2024&lt;/a&gt; showed that 6.49% of those questions contained errors&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nytimes.com/2024/04/15/technology/ai-models-measurement.html"&gt;The New York Times reported&lt;/a&gt; (2024) that data contamination was an issue — models could be trained on the MMLU questions (and answers) to inflate their MMLU scores&lt;/li&gt;
&lt;li&gt;many frontier LLMs soon consistently achieved high scores&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In response, a new benchmark called &lt;a href="https://github.com/TIGER-AI-Lab/MMLU-Pro"&gt;MMLU-Pro&lt;/a&gt; was created with 12,000 questions that each have 10 options. The increase in options theoretically required more reasoning capability than the original benchmark, but frontier models are already knocking at 90% on the MMLU-Pro.&lt;/p&gt;
&lt;h4 id="humanitys-last-exam-hle-2025"&gt;Humanity&amp;rsquo;s Last Exam (HLE, 2025)&lt;/h4&gt;
&lt;p&gt;HLE was developed specifically to address the fact that LLMs &amp;ldquo;now achieve over 90% accuracy on popular benchmarks like MMLU&amp;rdquo; (from &lt;a href="https://lastexam.ai"&gt;the HLE site&lt;/a&gt;). The &lt;a href="https://arxiv.org/abs/2501.14249"&gt;paper by Phan et al&lt;/a&gt; explains the lengths they took to make it hard enough to be meaningful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;they solicited high-quality questions from nearly 1000 subject matter experts, even going as far as paying them for successful submissions (with a total prize pool of US $500,000)&lt;/li&gt;
&lt;li&gt;they included graduate-level classics (one of the questions includes translating Palmyrene script)&lt;/li&gt;
&lt;li&gt;they reviewed potential submissions using current LLMs and only proceeded with submissions if the LLMs are unable to answer correctly&lt;/li&gt;
&lt;li&gt;experts then reviewed the submissions further&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As a result, HLE scores are low — intentionally so:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;While current LLMs achieve very low accuracy on HLE, recent history shows benchmarks are quickly saturated – with models dramatically progressing from near-zero to near-perfect performance in a short timeframe [13, 45]. Given the rapid pace of AI development, it is plausible that models could exceed 50% accuracy on HLE by the end of 2025. (&lt;a href="https://arxiv.org/abs/2501.14249"&gt;Phan et al., 2025&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="software-engineering"&gt;Software engineering&lt;/h3&gt;
&lt;h4 id="humaneval-openai-2021"&gt;HumanEval (OpenAI, 2021)&lt;/h4&gt;
&lt;p&gt;In 2021, OpenAI released &lt;a href="https://arxiv.org/abs/2107.03374"&gt;a paper&lt;/a&gt; and &lt;a href="https://github.com/openai/human-eval"&gt;an evaluation harness&lt;/a&gt; for a benchmark consisting of 164 Python programming problems based on publicly available code on GitHub. It was developed to test coding in particular.&lt;/p&gt;
&lt;p&gt;Eventually, though, experts found that the problem sets in HumanEval were insufficient and ambiguous (&lt;a href="https://arxiv.org/abs/2305.01210"&gt;Liu et al., 2023&lt;/a&gt;). HumanEval+ was released to include more tests, but the next benchmark&amp;rsquo;s authors &lt;a href="https://arxiv.org/abs/2403.07974"&gt;suggested that models might be overfitting&lt;/a&gt; to HumanEval+ as well, memorizing the dataset and answers rather than genuinely demonstrating reasoning ability.&lt;/p&gt;
&lt;h4 id="livecodebench-2024"&gt;LiveCodeBench (2024)&lt;/h4&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2403.07974"&gt;Jain et al.&lt;/a&gt; tried a different approach to HumanEval to avoid data contamination: it was released with a continuously-updated coding benchmark. Problems have release dates and models can only be evaluated using problems released &lt;em&gt;after&lt;/em&gt; their training data cutoff dates.&lt;/p&gt;
&lt;p&gt;LiveCodeBench represents a shift in benchmarks towards a more continuous, dynamic measure. However, the last submission to the benchmark was &lt;a href="https://github.com/LiveCodeBench/submissions"&gt;9 months ago&lt;/a&gt; at the time of this writing, and &lt;a href="https://livecodebench.github.io/"&gt;the leaderboard&lt;/a&gt; has not been updated since then either, suggesting the benchmark is no longer being actively maintained.&lt;/p&gt;
&lt;h4 id="swe-bench-2024"&gt;SWE-bench (2024)&lt;/h4&gt;
&lt;p&gt;This benchmark was created by &lt;a href="https://openreview.net/pdf?id=VTF8yNQM66"&gt;Jimenez et al.&lt;/a&gt; to include 2,294 actual GitHub issues from 12 Python projects. When it launched, it was a much harder benchmark than predecessors, with models scoring 2-4%. Today, models are scoring around 70-80% on the original benchmark. There were enough issues with the original&amp;rsquo;s dataset quality that variants were introduced, including &lt;a href="https://openai.com/index/introducing-swe-bench-verified/"&gt;OpenAI&amp;rsquo;s SWE-bench Verified&lt;/a&gt;. Today, &lt;a href="https://www.swebench.com/"&gt;the SWE-bench website&lt;/a&gt; shows these variants:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SWE-bench&lt;/li&gt;
&lt;li&gt;SWE-bench Verified&lt;/li&gt;
&lt;li&gt;SWE-bench Multilingual&lt;/li&gt;
&lt;li&gt;SWE-bench Multimodal&lt;/li&gt;
&lt;li&gt;SWE-bench Lite&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="agents-and-tool-use"&gt;Agents and tool use&lt;/h3&gt;
&lt;p&gt;This last category is a preview of where I think the field should go: benchmarks that measure &lt;em&gt;what a model does&lt;/em&gt; rather than just &lt;em&gt;what a model knows&lt;/em&gt;. Here are some of them:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GAIA (&lt;a href="https://arxiv.org/abs/2311.12983"&gt;Mialon et al., 2023&lt;/a&gt;) — 466 real-world assistant tasks that combine web browsing, file reading, and multi-step reasoning. Easy for humans (92% success), hard for models (15% success for GPT-4), at least at launch.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.tbench.ai/"&gt;Terminal-Bench&lt;/a&gt; — agents working in actual Linux terminals. Tasks include &amp;ldquo;build the Linux kernel from source&amp;rdquo; and &amp;ldquo;configure a git server plus a webserver on port 8080.&amp;rdquo; No mocks; if it doesn&amp;rsquo;t actually build, it fails.&lt;/li&gt;
&lt;li&gt;WebArena (&lt;a href="https://arxiv.org/abs/2307.13854"&gt;Zhou et al., 2023&lt;/a&gt;) — realistic simulated websites (Reddit, GitLab, e-commerce) where agents complete actual user goals like &amp;ldquo;filter the last six months of orders by refund status.&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These benchmarks are harder to saturate than general-knowledge ones, because passing means the thing actually has to work in the real world. A model can memorise a question; it can&amp;rsquo;t memorise a Linux kernel that isn&amp;rsquo;t there until it builds it.&lt;/p&gt;
&lt;h2 id="the-wrong-answer-build-a-harder-general-benchmark"&gt;The wrong answer: Build a harder general benchmark&lt;/h2&gt;
&lt;p&gt;By now, you probably see that benchmarks tend to go the same way: A benchmark is created, models get too good at it and perform too well to be useful, and then a variant benchmark is created to address the problem.&lt;/p&gt;
&lt;p&gt;This is the &lt;em&gt;saturation problem&lt;/em&gt; in a nutshell: a benchmark that once provided meaningful information to help distinguish models eventually fails to do so because all the models&amp;rsquo; scores cluster at the top.&lt;/p&gt;
&lt;p&gt;Saturation occurs for two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Contamination&lt;/em&gt;: Many benchmarks publish their problem sets online, and models train on data scraped from the web. The benchmark now measures memorization, not capability.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Overfitting&lt;/em&gt;: Model providers are incentivized to optimize specifically for gaming performance on benchmarks. Scores go up without corresponding capability improvements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When you have a party of wizards with 20 INT, &amp;ldquo;What&amp;rsquo;s your INT score?&amp;rdquo; stops being an interesting question because any wizard&amp;rsquo;s Fireball will hit the same. Building harder benchmarks is like an arms race for ability scores, when what you actually want to know is whether your wizard can kill a dragon.&lt;/p&gt;
&lt;p&gt;Harder benchmarks don&amp;rsquo;t tell us what we want to know: &lt;em&gt;can this model do my specific job?&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="the-right-answer-skill-checks-with-real-dcs"&gt;The right answer: skill checks with real DCs&lt;/h2&gt;
&lt;p&gt;The fix isn&amp;rsquo;t a harder ability check. It&amp;rsquo;s a different kind of check altogether. In D&amp;amp;D, straight ability checks are rare compared to skill checks. There are 18 official skills that break down the six ability scores into more granular activities. For example, your wizard is much more likely to roll one of these instead of a straight INT check:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Arcana&lt;/li&gt;
&lt;li&gt;History&lt;/li&gt;
&lt;li&gt;Investigation&lt;/li&gt;
&lt;li&gt;Nature&lt;/li&gt;
&lt;li&gt;Religion&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All of these are still based on INT, but test narrow &lt;em&gt;types of intelligence&lt;/em&gt; rather than general intelligence.&lt;/p&gt;
&lt;p&gt;Specific, domain-grounded benchmarks are what the field actually needs. The evaluations that actually help practitioners share a structure: they test a specific skill in a specific context, and they&amp;rsquo;re judged by the people who have to live with the results.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://arxiv.org/abs/2009.13081"&gt;MedQA&lt;/a&gt; tests whether a model can answer the kind of clinical question a physician might face. &lt;a href="https://arxiv.org/abs/2308.11462"&gt;LegalBench&lt;/a&gt; tests whether a model can correctly identify enforceability clauses, classify contract language, and apply legal reasoning. &lt;a href="https://arxiv.org/abs/2311.11944"&gt;FinanceBench&lt;/a&gt; tests whether a model can answer the kind of question a financial analyst would actually ask about a real 10-K filing. None of these are trying to rank models on general intelligence. They&amp;rsquo;re asking the only question that matters downstream: &lt;em&gt;can this model do this specific job well enough?&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This week, Grafana released &lt;a href="https://github.com/grafana/o11y-bench"&gt;o11y-bench&lt;/a&gt;, an open benchmark for observability-specific agent tasks. I&amp;rsquo;m biased — I work there — but it&amp;rsquo;s a useful illustration of the shape I&amp;rsquo;m describing. o11y-bench doesn&amp;rsquo;t ask whether a model is smart in general. It asks whether an agent can do the things observability engineers actually do: read production traces, correlate logs with metrics, figure out why the thing that&amp;rsquo;s supposed to be working isn&amp;rsquo;t. &lt;a href="https://o11ybench.ai/"&gt;Its leaderboard&lt;/a&gt; shows models&amp;rsquo; performance for each activity.&lt;/p&gt;
&lt;p&gt;Does that mean that more specific benchmarks won&amp;rsquo;t get saturated? No. We&amp;rsquo;ve already seen this play out with SWE-bench. But they&amp;rsquo;ll get saturated more slowly and remain more meaningful measures along the way.&lt;/p&gt;
&lt;p&gt;These are skill checks with DCs that matter to someone. They&amp;rsquo;re not trying to produce a single scalar ranking of &amp;ldquo;which model is smartest.&amp;rdquo; They&amp;rsquo;re asking whether the wizard recognizes the family crest belonging to a political faction or knows this specific cult&amp;rsquo;s practices, not whether the wizard is good at &amp;ldquo;wizarding&amp;rdquo; in the abstract.&lt;/p&gt;
&lt;h2 id="roll-for-initiative-what-this-means-in-practice"&gt;Roll for initiative: What this means in practice&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re an engineer picking a model for production: stop picking by leaderboard. Find or build an eval that reflects your actual use case. A handful of representative examples, graded the way you&amp;rsquo;d grade them if you were doing the work yourself, will tell you more than a dozen public benchmarks.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a researcher thinking about what to build next: the interesting work is at the specific-and-grounded end of the spectrum, not the general-and-bigger end. Another harder general-knowledge benchmark will saturate in eighteen months. A well-designed domain benchmark, co-built with the people who actually do the work, can stay useful for years.&lt;/p&gt;
&lt;p&gt;And if you&amp;rsquo;re anyone else watching this field from the outside: be skeptical of the headlines. When a new model scores 94% on a benchmark you&amp;rsquo;ve never heard of, ask what it measures and whether the thing it measures is the thing you actually care about. Usually the answer is &amp;ldquo;not really,&amp;rdquo; and that&amp;rsquo;s the most important thing a benchmark score won&amp;rsquo;t tell you.&lt;/p&gt;
&lt;p&gt;The goal of a character sheet was never to produce one number that ranks the character. It was to give a DM enough information to run a meaningful encounter — and to give the player enough to know when to try, when to pass, and when to roll with advantage. LLM evaluation should work the same way. Not a ranking; a readiness check. Can this specific model clear this specific challenge? Roll for initiative.&lt;/p&gt;</description></item><item><title>All About AI Observability (The Context Window #03)</title><link>https://nicolevanderhoeven.com/blog/20260422-context-window-03-ai-observability/</link><pubDate>Wed, 22 Apr 2026 18:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260422-context-window-03-ai-observability/</guid><description>&lt;p&gt;In this episode of &lt;em&gt;The Context Window&lt;/em&gt; — Grafana&amp;rsquo;s livestream series on AI in observability — I&amp;rsquo;m joined by &lt;a href="https://www.linkedin.com/in/tiffanyjerniganm/"&gt;Tiffany Jernigan&lt;/a&gt; and the engineers behind the product, &lt;a href="https://www.linkedin.com/in/alexandersniffin/"&gt;Alexander Sniffin&lt;/a&gt; and &lt;a href="https://www.linkedin.com/in/jack-gordley/"&gt;Jack Gordley&lt;/a&gt;, for a deep dive into AI Observability in Grafana Cloud. We unpack what it actually is (a new way to instrument your AI apps and see canonical data about them, sitting alongside your existing telemetry), what an evaluation is in this context (and the difference between online evals on live traffic and offline evals on dataset conversations), and we walk through real demos: setting up AI Observability and evaluators, the analytics view, instrumenting a local coding agent, and Jack&amp;rsquo;s system prompt analysis tool. We also talk about the things nobody else is talking about — like LLM-as-judge as a method, evaluators that catch the most bugs, and the cheating-LLM phenomenon.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vzygCuuf7JQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="timestamps"&gt;Timestamps&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;00:00:00 — Introductions&lt;/li&gt;
&lt;li&gt;00:02:00 — The last month in AI news&lt;/li&gt;
&lt;li&gt;00:11:09 — What is AI Observability in Grafana Cloud?&lt;/li&gt;
&lt;li&gt;00:19:20 — What is an evaluation?&lt;/li&gt;
&lt;li&gt;00:21:05 — The origin of AI Observability&lt;/li&gt;
&lt;li&gt;00:25:09 — Demo: Setting up AI Observability and evaluators&lt;/li&gt;
&lt;li&gt;00:32:04 — What is LLM as judge?&lt;/li&gt;
&lt;li&gt;00:38:43 — Demo: AI Observability Analytics&lt;/li&gt;
&lt;li&gt;00:40:52 — AI O11y is based on OpenTelemetry&lt;/li&gt;
&lt;li&gt;00:42:17 — Demo: Instrumenting a local coding agent&lt;/li&gt;
&lt;li&gt;00:47:18 — Potential future agentic use cases&lt;/li&gt;
&lt;li&gt;00:52:00 — Evaluators that catch the most bugs&lt;/li&gt;
&lt;li&gt;01:02:23 — Demo: System prompt analysis&lt;/li&gt;
&lt;li&gt;01:05:11 — Guess the prompt&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;h3 id="news-from-the-episode"&gt;News from the episode&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/news/claude-opus-4-7"&gt;Claude Opus 4.7 release&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deepmind.google/models/gemma/gemma-4/"&gt;Gemma 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qwen.ai/blog?id=qwen3.6"&gt;Qwen 3.6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/o11y-bench-open-benchmark-for-observability-agents/"&gt;Introducing o11y-bench: an open benchmark for observability agents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.blog/news-insights/company-news/updates-to-github-copilot-interaction-data-usage-policy/"&gt;Updates to GitHub Copilot interaction data usage policy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gra.fan/gcon26"&gt;GrafanaCON 2026 announcements&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ai-observability"&gt;AI Observability&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/ai-observability/"&gt;AI Observability docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/ai-observability/introduction/#online-evaluation"&gt;Online evaluations on Grafana Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/machine-learning/ai-observability/introduction/#opentelemetry-integration"&gt;OpenTelemetry integration with AI Observability&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/sigil-sdk"&gt;The Sigil SDK&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mentioned"&gt;Mentioned&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://opencode.ai"&gt;OpenCode&lt;/a&gt; — the open-source coding agent Jack instruments&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.anthropic.com/research/emotion-concepts-function"&gt;Anthropic: Emotion concepts and their function in a large language model&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://openclaw.ai"&gt;OpenClaw&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="related-reading"&gt;Related reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/high-int-low-wis-what-llm-benchmarks"&gt;My Context Horizon piece on benchmarks: &lt;em&gt;High INT, Low WIS — What LLM benchmarks miss&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;My Context Horizon piece on Grafana Assistant: &lt;em&gt;Unlearnings from building Grafana Assistant&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to use Grafana Assistant with self-hosted Grafana</title><link>https://nicolevanderhoeven.com/blog/20260420-grafana-assistant-self-hosted/</link><pubDate>Mon, 20 Apr 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260420-grafana-assistant-self-hosted/</guid><description>&lt;p&gt;In case you missed it, possibly the biggest news to come from GrafanaCON this year is that if you&amp;rsquo;re running self-hosted or open-source Grafana, you can now connect it through your Grafana Cloud account to &lt;a href="https://grafana.com/products/cloud/ai-tools/"&gt;Grafana Assistant&lt;/a&gt;, the purpose-built AI tool for all things Grafana.&lt;/p&gt;
&lt;p&gt;In this short tutorial, I show you how to enable Assistant on a self-hosted Grafana instance and go from &lt;em&gt;nothing&lt;/em&gt; to a working server-health dashboard with a single prompt.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0O0ZqrruGns?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="a-quick-note-on-what-for-open-source-actually-means"&gt;A quick note on what &amp;ldquo;for open source&amp;rdquo; actually means&lt;/h2&gt;
&lt;p&gt;Assistant itself isn&amp;rsquo;t open source. But you can now use it &lt;em&gt;with&lt;/em&gt; your self-hosted or open-source Grafana instance. The way it works is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You still need a Grafana Cloud account (the free tier has &lt;a href="https://grafana.com/pricing/"&gt;generous inclusions&lt;/a&gt; for Assistant).&lt;/li&gt;
&lt;li&gt;You link your self-hosted Grafana to that Cloud account.&lt;/li&gt;
&lt;li&gt;Assistant then lights up inside your OSS instance.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Think of the Grafana Cloud account as the key that unlocks Assistant wherever your Grafana lives.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Grafana OSS v13 or later&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A Grafana Cloud account&lt;/strong&gt; (&lt;a href="https://grafana.com/pricing/"&gt;pricing here&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="enabling-assistant"&gt;Enabling Assistant&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;Administration → Plugins&lt;/strong&gt;, search for &lt;strong&gt;Assistant&lt;/strong&gt;, and click &lt;strong&gt;Install&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Refresh the page, then open the &lt;strong&gt;Connection&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Start Connection&lt;/strong&gt;. You&amp;rsquo;ll be prompted to log into Grafana Cloud.&lt;/li&gt;
&lt;li&gt;Select the organization and stack you want, then click &lt;strong&gt;Authorize connection&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Close the tab. Your self-hosted Grafana is now linked to Assistant.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="a-first-dashboard-from-nothing"&gt;A first dashboard from nothing&lt;/h2&gt;
&lt;p&gt;Every Grafana instance ships with a &lt;strong&gt;TestData&lt;/strong&gt; data source — perfect for a first run when you don&amp;rsquo;t yet have real data wired up. Enable it from Data Sources, then open Assistant (the new icon on the top right).&lt;/p&gt;
&lt;p&gt;Switch Assistant&amp;rsquo;s mode from &lt;strong&gt;General&lt;/strong&gt; to &lt;strong&gt;Dashboarding&lt;/strong&gt; — this mode is tuned for creating and managing dashboards — and ask in plain English, for example:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Hi Assistant, could you create a server health dashboard for me using the TestData data source?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;What comes back is a starting dashboard with CPU, memory, disk, and network panels already wired up. From there you can tweak panels, edit queries, or ask Assistant to iterate. You&amp;rsquo;re not starting from scratch — you&amp;rsquo;re starting from 80%.&lt;/p&gt;
&lt;h2 id="what-else-assistant-can-do"&gt;What else Assistant can do&lt;/h2&gt;
&lt;p&gt;I only showed dashboarding in this video, but Assistant can also:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Answer questions about the data already in your Grafana&lt;/li&gt;
&lt;li&gt;Run investigations to troubleshoot production incidents&lt;/li&gt;
&lt;li&gt;Learn new skills&lt;/li&gt;
&lt;li&gt;Manage alerts&lt;/li&gt;
&lt;li&gt;Teach you Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That list keeps growing, so stay tuned.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/products/cloud/ai-tools/"&gt;Grafana Assistant&lt;/a&gt; (product page)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/pricing/"&gt;Grafana Cloud pricing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/legal/grafana-cloud-data-processing/"&gt;How Grafana Labs handles your data&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Assistant"&gt;My notes on Grafana Assistant&lt;/a&gt; — everything I&amp;rsquo;m learning as I work on it&lt;/li&gt;
&lt;li&gt;&lt;a href="https://contexthorizon.substack.com/p/unlearnings-from-building-grafana"&gt;Unlearnings from building Grafana Assistant&lt;/a&gt; — my Context Horizon piece on what the team had to unlearn&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Unlearnings from building Grafana Assistant</title><link>https://nicolevanderhoeven.com/blog/20260409-unlearnings-from-building-grafana-assistant/</link><pubDate>Thu, 09 Apr 2026 09:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260409-unlearnings-from-building-grafana-assistant/</guid><description>&lt;p&gt;Originally posted &lt;a href="https://open.substack.com/pub/contexthorizon/p/unlearnings-from-building-grafana?r=7xe6zg&amp;amp;utm_campaign=post&amp;amp;utm_medium=web&amp;amp;showWelcomeOnShare=true"&gt;here&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Everyone&amp;rsquo;s talking about what you need to &lt;em&gt;learn&lt;/em&gt; to build AI agents: Prompt engineering. Tool calling. Retrieval strategies. The content ecosystem is full of it. But while I was watching Context Window Episode 1, it struck me that Mat Ryer, Cyril Tovena, and Sven Großmann&amp;ndash; some of the team behind Grafana Assistant&amp;ndash; spent most of their time on something different: what they had to &lt;em&gt;unlearn&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Grafana Assistant started as a weekend hackathon project. By the time it shipped, the team had thrown out a popular framework, flipped their assumptions about tool design, and discovered that some of the instincts you bring from conventional software development actively work against you when you&amp;rsquo;re building agents.&lt;/p&gt;
&lt;p&gt;I pulled out the ten moments where received wisdom turned out to be wrong. If you&amp;rsquo;re building anything agentic right now, these are worth sitting with.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TGWVqBAeIzI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="-langchain-will-help-us-build-faster"&gt;❌ LangChain will help us build faster&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/langchain-ai/langchain"&gt;LangChain&lt;/a&gt; is an opensource framework for building applications that use LLMs. It provides structured components that can be used for rapid prototyping.&lt;/p&gt;
&lt;p&gt;In the video, Tovena talks about how they started with LangChain during the initial hackathon because they thought it would help them build more quickly, but instead it became obvious fairly early on that the opposite was true. They didn&amp;rsquo;t end up using a lot of the features that LangChain provided and felt they needed more flexibility and speed.&lt;/p&gt;
&lt;h3 id="abstraction-overhead"&gt;Abstraction overhead&lt;/h3&gt;
&lt;p&gt;One possible reason for their troubles with LangChain is that LangChain has standard abstractions for prompts, tool use, and orchestration&amp;ndash; things that sound good in theory. But sometimes abstractions lend themselves to creating a sort of black box in your stack, where you don&amp;rsquo;t know what&amp;rsquo;s happening inside it. It sounds like the Assistant team missed the oversight and control of what was happening.&lt;/p&gt;
&lt;h2 id="-use-the-same-prompt-for-every-model"&gt;❌ Use the same prompt for every model&lt;/h2&gt;
&lt;p&gt;They also talked about how for the sake of simplicity and consistency, they initially used the same prompt for every model. However, they found out that this actually led to worse results. They found more success in creating slightly different prompts for different models, playing to their strengths and weaknesses a bit more.&lt;/p&gt;
&lt;p&gt;There is even an argument (&lt;a href="https://arxiv.org/abs/2401.00595"&gt;Mizrahi et al.&amp;rsquo;s &amp;ldquo;State of What Art? A Call for Multi-Prompt LLM Evaluation&lt;/a&gt;) that AI benchmarks that involve sending multiple LLMs the same prompt is a brittle and unreliable way to assess LLM capabilities. Different models respond differently to prompt variations.&lt;/p&gt;
&lt;p&gt;In practice, what this means is that switching models isn&amp;rsquo;t a drop-in replacement. Even if a new model scores better on benchmarks, your prompts were written with a specific model&amp;rsquo;s tendencies in mind. The unlearning here is letting go of the idea that a prompt is model-agnostic — it&amp;rsquo;s more like a conversation style, and different models have different conversational defaults.&lt;/p&gt;
&lt;h2 id="-treat-errors-as-failures"&gt;❌ Treat errors as failures&lt;/h2&gt;
&lt;p&gt;Traditionally in software, you catch errors and hide them from the user: you log them, handle them, but treat that transaction as a failed one.&lt;/p&gt;
&lt;p&gt;The Assistant team had to unlearn this habit when dealing with an LLM, because with agents, error messages &lt;em&gt;are&lt;/em&gt; useful data. Feeding it back to the LLM often results in it learning from its own mistake and trying again. It&amp;rsquo;s basically letting the agent debug itself, in a manner that Ryer noted was remarkably similar to how we humans debug errors too.&lt;/p&gt;
&lt;h2 id="-return-errors-in-structured-json"&gt;❌ Return errors in structured JSON&lt;/h2&gt;
&lt;p&gt;On the subject of error messages, Großmann mentioned that at one point they were trying to format the errors in JSON or stringified JSON. This practice shows solid engineer intuition because usually, structuring information helps machines process it faster and more accurately. What they found here was the reverse: it was easier and yielded better results when the LLM was just passed the entire error in natural language.&lt;/p&gt;
&lt;h2 id="-build-as-many-tools-as-possible"&gt;❌ Build as many tools as possible&lt;/h2&gt;
&lt;p&gt;The team mentioned that at the start, they were inclined to create as many tools/skills for Assistant: one for everything that could be done in Grafana. This made sense until they saw LLMs struggle to determine which tool to use in which context.&lt;/p&gt;
&lt;p&gt;To help LLMs identify the correct tool, they added tool descriptions and also experimented with combining multiple tools into fewer, parameterized, tools. These helped, although the team still observed that allowing users to create their own tools (with potentially very general tool descriptions) could potentially confuse LLMs.&lt;/p&gt;
&lt;h2 id="-bigger-context-window--better"&gt;❌ Bigger context window = better&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://developers.googleblog.com/en/new-features-for-the-gemini-api-and-google-ai-studio/"&gt;Gemini 1.5 Pro announced&lt;/a&gt; it had a 2M context window back in 2024, and it might seem that other providers had lagged behind: &lt;a href="https://openai.com/index/gpt-4-1/"&gt;OpenAI&lt;/a&gt; only announced support for 1M tokens in 2025 and &lt;a href="https://www.anthropic.com/news/claude-opus-4-6"&gt;Anthropic&lt;/a&gt; followed in 2026. However, the Assistant team pointed out that context wasn&amp;rsquo;t everything. They said that they noticed that bigger wasn&amp;rsquo;t necessarily better, also pointing out that the chat summarization feature on IDEs like &lt;a href="https://cursor.com/"&gt;Cursor&lt;/a&gt; could still sometimes lose important details when summarizing.&lt;/p&gt;
&lt;p&gt;This finding seems to coincide with a 2023 Stanford study (&lt;a href="https://arxiv.org/abs/2307.03172"&gt;Lost in the Middle: How Language Models Use Long Contexts&lt;/a&gt;) that found there was a performance degradation when models access information within a very large context. In the video, they talked about how their system prompts were often 40k tokens long (half for the prompt itself and then the other half for tools).&lt;/p&gt;
&lt;h2 id="-start-with-a-multi-agent-architecture"&gt;❌ Start with a multi-agent architecture&lt;/h2&gt;
&lt;p&gt;Tovena mentioned that creating a multi-agent architecture for Assistant yielded more mixed results than he expected. He said that passing context between agents is difficult, outputs were inconsistent, and there was a bit of a &amp;ldquo;telephone game&amp;rdquo; problem where agents didn&amp;rsquo;t always perfectly understand the intent or output of other agents.&lt;/p&gt;
&lt;p&gt;In early 2026, &lt;a href="https://arxiv.org/abs/2601.13295"&gt;Khatua et al. released a study&lt;/a&gt; called &amp;ldquo;CooperBench: Why Coding Agents Cannot Be Your Teammates Yet&amp;rdquo; that showed that AI agents aren&amp;rsquo;t great at collaboration. The study suggests, surprisingly, that this might be because AI agents lack human social habits that help us collaborate better, such as feeling obliged to do what we say and having a good understanding of what others&amp;rsquo; plans are.&lt;/p&gt;
&lt;p&gt;The Assistant team&amp;rsquo;s experience is also a perfect example of &lt;a href="https://www.laws-of-software.com/laws/gall/"&gt;Gall&amp;rsquo;s Law&lt;/a&gt;, which states that it&amp;rsquo;s easier to start with simplicity and build complexity than the other way around.&lt;/p&gt;
&lt;h2 id="-plan-around-models-as-they-are-now"&gt;❌ Plan around models as they are now&lt;/h2&gt;
&lt;p&gt;Software has always moved quickly, but it feels like AI models are moving faster. &lt;a href="https://hai.stanford.edu/assets/files/hai_ai_index_report_2025.pdf"&gt;Stanford&amp;rsquo;s AI Index Report 2025&lt;/a&gt; reported that models went from having a 50% chance to near-human performance in roughly 2 years (2021-2023). In fact, benchmarks keep getting retired as AI saturates them&amp;ndash; meaning that benchmarks can&amp;rsquo;t reliably be used to distinguish between good and bad models because all the models are testing near the ceiling.&lt;/p&gt;
&lt;p&gt;The rapid pace of development around AI requires us to not be so attached to our work: Großmann recalled an incident where someone wrote a joke prompt that spoke like a dog that shockingly did better than their other system prompts. Ryer also mentioned that at one point someone deleted all the system prompts and Assistant weirdly became more accurate.&lt;/p&gt;
&lt;p&gt;The lesson is clear: plan for models to improve, and plan to redo a lot of your work when they do.&lt;/p&gt;
&lt;h2 id="-we-dont-need-evals"&gt;❌ We don&amp;rsquo;t need evals&lt;/h2&gt;
&lt;p&gt;The Assistant team said that they went from having no evals to employing several types of evals:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;integration-style evals that exercise whole workflows&lt;/li&gt;
&lt;li&gt;unit-style evals that feed inputs plus a system prompt and check the output&lt;/li&gt;
&lt;li&gt;LLM-as-judge, where they pass conversations to an LLM to ask it to judge whether it answered the user&amp;rsquo;s questions.&lt;/li&gt;
&lt;li&gt;user feedback in the form of thumbs during conversations with Assistant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Beyond evaluation, they talked about how important it was to be able to observe AI. At the very minimum, showing what Assistant is doing at all times (thinking out loud) is very important to them because it builds users&amp;rsquo; trust in the thinking process and, eventually, in the result.&lt;/p&gt;
&lt;p&gt;Evals aren&amp;rsquo;t a sign that you don&amp;rsquo;t trust your product. They&amp;rsquo;re how you build the confidence to keep shipping it.&lt;/p&gt;
&lt;h2 id="-assume-people-already-know-how-to-work-with-ai"&gt;❌ Assume people already know how to work with AI&lt;/h2&gt;
&lt;p&gt;When you ship an AI feature, it&amp;rsquo;s tempting to assume the hard work is done. You&amp;rsquo;ve built the thing. Users will figure it out.&lt;/p&gt;
&lt;p&gt;What the Grafana Assistant team found was that this assumption doesn&amp;rsquo;t hold. Users came in with wildly different mental models of what an AI assistant could or should do — some treating it like a search box, others expecting it to read their minds, most not yet sure how to prompt it effectively.&lt;/p&gt;
&lt;p&gt;Their insight was that this isn&amp;rsquo;t just a UX problem to solve on your end. It&amp;rsquo;s a shared responsibility: AI should try to help the user, but the user also needs to learn how to work with AI. And building an assistant that teaches people how to use it well (through good responses, gentle corrections, showing its work) is part of building the product.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also a deeper point here specific to observability. Grafana Assistant isn&amp;rsquo;t just an AI feature; it&amp;rsquo;s a way of interacting with your own infrastructure. Every good interaction teaches you something about what questions to ask, what signals to look for, what it means to understand a system. In other words: learning to use AI well makes you a better engineer. The tool and the skill co-evolve.&lt;/p&gt;
&lt;p&gt;This is the unlearning that sits furthest from the code. It&amp;rsquo;s not about prompts or architectures or frameworks. It&amp;rsquo;s about recognising that you&amp;rsquo;re not just shipping a feature&amp;ndash; you&amp;rsquo;re introducing a new way of working. That takes time. And it&amp;rsquo;s worth designing for explicitly.&lt;/p&gt;
&lt;h2 id="summary"&gt;Summary&lt;/h2&gt;
&lt;p&gt;What strikes me most about this list isn&amp;rsquo;t any single item — it&amp;rsquo;s the pattern. Most of these unlearnings point in the same direction: &lt;em&gt;less is more, and messiness is the point.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Less abstraction. Fewer tools. Smaller context. Simpler architecture. And rather than hiding the mess — the errors, the reasoning, the uncertainty — let it show. That&amp;rsquo;s where the trust gets built.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re all still early with this. The team that built one of the most thoughtful AI products I&amp;rsquo;ve seen up close still didn&amp;rsquo;t have evals when they launched. That&amp;rsquo;s not a criticism — it&amp;rsquo;s a reminder. You don&amp;rsquo;t need to have it all figured out before you ship. You just need to commit to keep unlearning.&lt;/p&gt;</description></item><item><title>Let There Be Dashboards: Introducing Grafana Assistant</title><link>https://nicolevanderhoeven.com/blog/20260326-let-there-be-dashboards/</link><pubDate>Thu, 26 Mar 2026 19:30:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260326-let-there-be-dashboards/</guid><description>&lt;p&gt;I gave this talk at the &lt;a href="https://www.meetup.com/grafana-friends-lisboa/events/313572885/"&gt;Grafana &amp;amp; Friends Lisbon Meetup&lt;/a&gt; in Lisbon, Portugal.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260326-lisbon-meetup-01-presenting.jpg" alt="Demoing Grafana Assistant to the Lisbon meetup" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;This is a live demo of how to go from zero to a working Grafana dashboard using Assistant. Starting with a blank slate, we&amp;rsquo;ll use natural language to explore data and generate meaningful visualizations in minutes. Along the way, you&amp;rsquo;ll see how AI can accelerate dashboard creation without sacrificing control or understanding.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260326-lisbon-meetup-dashboard.png" alt="Dashboard created during the demo using Grafana Assistant" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260326-lisbon-meetup-02-audience.jpg" alt="The Grafana &amp;amp; Friends Lisbon crowd" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Thanks to everyone who came out! It was great to connect with the Lisbon tech community.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260326-lisbon-meetup-03-group.jpg" alt="Group photo with the meetup attendees" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Do Androids Dream of Second Brains?</title><link>https://nicolevanderhoeven.com/blog/20260321-do-androids-dream-of-second-brains/</link><pubDate>Sat, 21 Mar 2026 11:15:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260321-do-androids-dream-of-second-brains/</guid><description>&lt;p&gt;I gave this talk at &lt;a href="https://pkmsummit.com/"&gt;PKM Summit 2026&lt;/a&gt; in Utrecht, the Netherlands.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20260320-pkm-summit-01-presenting.png" alt="Presenting “Do Androids Dream of Second Brains?” at PKM Summit 2026 in Utrecht" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;We often describe our PKM systems as &amp;ldquo;second brains&amp;rdquo;. But can we really say our systems think for themselves?&lt;/p&gt;
&lt;p&gt;In Philip K. Dick&amp;rsquo;s &amp;ldquo;Do Androids Dream of Electric Sheep?&amp;rdquo;, the inspiration for the movie Bladerunner, the boundary between humans and machines is tested through observation and subtle signals. In this talk, we&amp;rsquo;ll explore a similar question for our knowledge systems: what happens when we start observing them?&lt;/p&gt;
&lt;p&gt;By instrumenting an Obsidian vault with an observability stack and layering AI tools on top, we can begin to see patterns in how ideas form, connect, and evolve. The result isn&amp;rsquo;t quite a thinking system&amp;hellip; but it may be something closer than we&amp;rsquo;ve had before.&lt;/p&gt;
&lt;h2 id="slides"&gt;Slides&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nicole.to/androids"&gt;nicole.to/androids&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Behind the Magic of Auto-Instrumentation (Grafana ❤️🔥 OpenTelemetry Community Call #6)</title><link>https://nicolevanderhoeven.com/blog/20260227-gocc06-auto-instrumentation/</link><pubDate>Fri, 27 Feb 2026 16:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260227-gocc06-auto-instrumentation/</guid><description>&lt;p&gt;In this community call with my coworker Liudmila Molkova, we pulled back the curtain on OpenTelemetry&amp;rsquo;s auto-instrumentation capabilities. We explored how auto-instrumentation works under the hood, when to use it versus manual instrumentation, and the trade-offs involved. The discussion covered language-specific implementations, the Collector&amp;rsquo;s role in auto-instrumentation, and practical tips for getting started with zero-code observability.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HItumi3qt90?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Observability for GenAI Applications (Grafana ❤️🔥 OpenTelemetry Community Call #4)</title><link>https://nicolevanderhoeven.com/blog/20260121-gocc04-observability-for-genai-applications/</link><pubDate>Wed, 21 Jan 2026 16:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20260121-gocc04-observability-for-genai-applications/</guid><description>&lt;p&gt;In this community call with my coworker Liudmila Molkova, we dove into the emerging field of observability for Generative AI applications. We explored how to instrument LLM-powered applications using OpenTelemetry, what metrics and traces matter most when monitoring AI workloads, and how to debug issues in complex AI pipelines. The discussion covered prompt tracing, token usage monitoring, latency considerations, and the unique challenges of observing non-deterministic AI systems.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LfDVygRWQJU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Logging Best Practices (Grafana ❤️🔥 OpenTelemetry Community Call #3)</title><link>https://nicolevanderhoeven.com/blog/20251217-gocc03-logging-best-practices/</link><pubDate>Wed, 17 Dec 2025 16:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20251217-gocc03-logging-best-practices/</guid><description>&lt;p&gt;In this community call with my coworker Liudmila Molkova, we explored logging best practices in the context of OpenTelemetry. We discussed how to structure logs for observability, the relationship between logs and other telemetry signals (traces and metrics), and practical patterns for making logs more useful in distributed systems. The conversation covered log levels, contextual information, correlation with traces, and common pitfalls to avoid when instrumenting applications with OpenTelemetry logging.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D-bWeY-gBWU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Lightweight Opensource APM with OTel Demo (Grafana ❤️‍🔥 OpenTelemetry Community Call #2)</title><link>https://nicolevanderhoeven.com/blog/20251119-gocc02-lightweight-opensource-apm-with-otel-demo/</link><pubDate>Wed, 19 Nov 2025 14:48:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20251119-gocc02-lightweight-opensource-apm-with-otel-demo/</guid><description>&lt;p&gt;This community call with my coworker Liudmila Molkova featured an interview with Cyrille Le Clerc from Grafana Labs, focusing on the OpenTelemetry demo as a practical example of a lightweight, open-source Application Performance Monitoring (APM) solution. Cyril explained the purpose and architecture of the OTel demo, highlighting its role as a realistic, complex microservices application that has become a de facto standard for observability vendors. The discussion explored the modern definition of APM, followed by a detailed walkthrough of a Grafana dashboard built on OTel data, covering RED metrics, alerting, trace correlation, and infrastructure monitoring. A significant portion of the conversation was dedicated to the role and challenges of integrating logs within an OpenTelemetry framework. The interview concluded with a look at the future of the OTel demo, including plans for AI observability and eBPF instrumentation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cX74hkdI1zM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;h3 id="introduction"&gt;Introduction&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
Okay. Hi everyone. Welcome to the second Grafana and OpenTelemetry community call. This time we&amp;rsquo;re going to talk about the lightweight open-source APM and we will use the OpenTelemetry demo as our playground. We have an expert, Cyrille, who works at Grafana. Cyrille, do you want to introduce yourCyrillef?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Thank you very much, Liudmila. My name is Cyrille, and I am a product manager at Grafana Labs. I&amp;rsquo;ve been working on open-source products for 15 years, first on Jenkins for CI/CDs, then at Elastic on observability, and now at Grafana Labs, also on observability. In addition to my day job, I have been an open-source contributor for about 20 years, starting with Apache Java projects and then moving on to Jenkins integration with Maven and OpenTelemetry. Now, I focus more on the OpenTelemetry project, like the OpenTelemetry demo, and I contribute to OpenTelemetry Helm charts as well. At Grafana Labs, I am the product management lead in charge of OpenTelemetry and I cover other areas as well. [laughter]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
That&amp;rsquo;s great. It&amp;rsquo;s great to have you here with us. Also, great for my internet to act up just a few minutes before this. Anyway, hi! I’m Nicole van der Hoeven, a developer advocate at Grafana. I work with Cyrille over there, and I&amp;rsquo;m really excited to be talking about OpenTelemetry. I&amp;rsquo;m the newbie of all of us here. [laughter] I have used OpenTelemetry in some demo apps I&amp;rsquo;ve built. Most recently, I used it for instrumenting an AI app. I&amp;rsquo;m excited to ask Cyrille all my questions because when he says he likes OpenTelemetry, what he really means is he&amp;rsquo;s the guy at Grafana who&amp;rsquo;s always banging on that OpenTelemetry drum. He&amp;rsquo;s like, &amp;ldquo;Tell all the things!&amp;rdquo; [laughter]&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
It&amp;rsquo;s probably my turn. I&amp;rsquo;m Liudmila. I work on the OpenTelemetry project and I&amp;rsquo;m a technical committee member. To echo what Nicole said, nobody knows all of OpenTelemetry, and this call is where we will uncover areas that are new to each of us. Going forward, we&amp;rsquo;ll probably have more of these calls. So, with that, let’s talk about the OpenTelemetry demo. Cyrille, what is it? Why do we care?&lt;/p&gt;
&lt;h3 id="what-is-the-opentelemetry-demo"&gt;What is the OpenTelemetry Demo?&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
So, the OpenTelemetry demo was born to showcase OpenTelemetry. OpenTelemetry was created in the context of cloud-native architecture. This demo is a cloud-native application—a distributed microservices application that is instrumented with OpenTelemetry. It&amp;rsquo;s maintained by the OpenTelemetry community and showcases all dimensions of modern monitoring or observability, including all telemetry types: traces, metrics, logs, and more at every layer. We started with monitoring the application layer and are now extending to show the infrastructure layer.&lt;/p&gt;
&lt;p&gt;We demo various technologies: Java, .NET, Node.js, and nearly all programming languages, including Rust. We also show how to instrument middleware and databases, such as Kafka, PostgreSQL, and Redis, all deployed on Docker Compose to make it easy to play with on your local desktop or deployed on Kubernetes to be more production-like.&lt;/p&gt;
&lt;p&gt;This is a complex demo that shows everything, and what&amp;rsquo;s interesting is that it is realistic and currently used by 40 observability vendors to demonstrate their solutions with the OpenTelemetry demo. So, when you get familiar with the OpenTelemetry demo, it’s really easy to evaluate different vendors quickly. It comes &amp;ldquo;batteries included,&amp;rdquo; with open-source monitoring and observability technologies like Prometheus, Jaeger, OpenSearch, and Grafana to showcase how to implement an observability solution with OpenTelemetry.&lt;/p&gt;
&lt;h3 id="exploring-the-application"&gt;Exploring the Application&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
Thanks for the intro! So maybe we should take a quick look at what the application itCyrillef looks like to make it more concrete.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m connected to a Kubernetes cluster, and I&amp;rsquo;m just port forwarding. This is the telescope shop we have in the OpenTelemetry demo. We can go and buy things, and now we have something in the cart that we can place an order for. Oh, actually, this application might not work as expected. Well, that&amp;rsquo;s why we need observability, right? If things don&amp;rsquo;t work, we need to figure out what&amp;rsquo;s broken and how to fix it.&lt;/p&gt;
&lt;p&gt;Before we move on, I just want to show that even though you only see the front-end web shop, it&amp;rsquo;s a relatively large application. It has quite a few services, databases, caches, a front-end proxy, and a log generator that consistently sends requests.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re super lucky to have all the telemetry Cyrille talked about. We have metrics in Prometheus, traces in Jaeger, and logs in OpenSearch, all visible in Grafana as a single pane of glass that you can refer to. With this, we can start looking at the telemetry itCyrillef. But I wanted to check with Cyrille or Nicole if you have any additional thoughts or anything we should cover here.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
No, I think you presented it well. It&amp;rsquo;s a very complex topology because we want to demo everything.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yeah, it&amp;rsquo;s almost complex by design. You could probably have made this simpler, but it&amp;rsquo;s supposed to approximate real applications that aren&amp;rsquo;t simple. That&amp;rsquo;s the problem with some of these other demo apps; they are so simple to deploy that they work because they&amp;rsquo;re monolithic or something like that. This one is much more of a polyglot architecture, involving microservices that represent the real challenges that people face in the field.&lt;/p&gt;
&lt;h3 id="application-performance-monitoring-apm"&gt;Application Performance Monitoring (APM)&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
One great thing about this demo is that sometimes it&amp;rsquo;s hard to understand how someone onboarded an application to OpenTelemetry. The demo has a lot of information on what services are used, and it demonstrates what&amp;rsquo;s been done to instrument this application with OpenTelemetry, which can help anyone with their journey in the OpenTelemetry space. Okay, wonderful! Let’s change gears and start looking at the APM dashboard.&lt;/p&gt;
&lt;p&gt;Before we go there, let&amp;rsquo;s talk about what APM is for a second. Why do we care? What is it?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
APM is a very old concept—over 15 years old. We’ve had several generations of monitoring tools. APM stands for Application Performance Monitoring. I see APM as a monitoring and observability technology that helps you monitor your application and understand its health.&lt;/p&gt;
&lt;p&gt;When I think about it, the first thing that comes to mind is understanding if my service is healthy or unhealthy. In a distributed architecture, I need to see my service in the context of the connections between services, typically represented with a service map. If I find something unhealthy, I need to drill down to see the health of a service. This means switching back and forth between the service metrics, which are more aggregated, and the traces, which give indications of how business transactions are executed.&lt;/p&gt;
&lt;p&gt;I also need to access logs to verify how things really happen and if there are messages that help me understand the problem. This is how I understand my service. Additionally, my service is deployed on a runtime and middleware, so I need to be able to zoom lower to see how it&amp;rsquo;s behaving on the Kubernetes pod or Linux box.&lt;/p&gt;
&lt;p&gt;APM allows me to switch back and forth between all layers, zooming in and out all the time across all telemetry types. This is essential for understanding health and troubleshooting. Another dimension is detecting anomalies, so I can wake people up at night when something goes wrong. This is where I create alerts and notifications.&lt;/p&gt;
&lt;p&gt;In the past, with monoliths, we created many alerts, but now we adopt best practices with SLOs, observing workflows, and root cause analysis. This is my vision of APM and why I think it’s more important than ever.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
When you talk about application performance management or monitoring, do you differentiate that from the wider field of observability? Some people say APM sounds outdated because it focuses on the application or just on performance, which is ambiguous.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
The monitoring landscape has evolved a lot. With cloud-native architecture, many things have changed, and we had to change our best practices. The best practices from 20 years ago in monoliths are not the same as today’s best practices for distributed cloud-native architectures.&lt;/p&gt;
&lt;p&gt;There were disruptions in the past by innovators who focused primarily on traces, and we learned a lot from that. But now I think the landscape is getting more stable. We recognize the value in metrics, traces, and logs, and we’ve evolved our best practices to leverage the best of all three.&lt;/p&gt;
&lt;p&gt;Some people prefer to call it observability. I know there are nuances, but this is my current perspective.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
It&amp;rsquo;s good to synchronize on terms. It sounds like we are on the same page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Now, with microservices architecture, we focus more on alerting symptoms rather than causes, centering more on the health of the application and the service provided to users than on the infrastructure layer. So, application monitoring or observability is becoming the entry point for people in charge of keeping the systems running.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
Why don’t we take a look at the dashboard and go through it?&lt;/p&gt;
&lt;h3 id="apm-dashboard-exploration"&gt;APM Dashboard Exploration&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
We will cover different parts of the dashboard throughout the hour. Let’s start with the top row—the red metrics. You can call them duration, error, and request rate.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
I believe the red metrics were created by Tom Wilkerson, who still works at Grafana. I think it was looCyrilley based on the Google SRE book, even though they didn&amp;rsquo;t explicitly say “red” there.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
When you think about any particular service, you would think about some well-known terminology, which might be service level indicators, or just your application. Service level indicators talk more about what&amp;rsquo;s important for the application, while red metrics focus more on the telemetry itCyrillef, like the raw data behind your SLI.&lt;/p&gt;
&lt;p&gt;One thing that stands out is the alerts. It looks pretty awesome to see that something violates the threshold we&amp;rsquo;ve set—probably high latency. Let’s explore it. We see it&amp;rsquo;s been firing for 17 hours. That’s quite a duration.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
That’s not so good. Let’s see the alert on the latency. The P95 is firing for a specific operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
We can look at this chart, which shows the latency around P99, which is like 18 milliseconds. Is it really a problem?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
No, it was for the demo. It&amp;rsquo;s very situational; it depends on your services. The focus was to show practitioners best practices for creating alerts on HTTP endpoints. Typically, you have two families of alerts: latency alerts and error rate alerts.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
We decided to take P95 as a commonly adopted indicator. Some take P99, but P95 is often more relevant. Something that&amp;rsquo;s perhaps not noted here is that we take a time interval of 5 minutes. We wanted to provide this out of the box because it relates to the data collection interval, which is typically every minute for hotel setups and quite common in Prometheus.&lt;/p&gt;
&lt;p&gt;Having a 5-minute window is quite good. These are best practices we worked on, identifying good labels to help practitioners succeed by easily routing alerts to the right people and having the right notification schemes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
Imagine if there was actually high latency. Now we can enable this view and look at the examples of operations with the worst performance—like the outliers you would see here. We use Jaeger as a store for telemetry, and if it were any other store that supports tracing, you would see something similar.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
This brings us to the Jaeger UI. I don&amp;rsquo;t want to spend a lot of time here, but it’s just another confirmation that nothing is visibly wrong with this operation. Things are just going a bit slower in the cloud, as usual.&lt;/p&gt;
&lt;h4 id="alert-analysis"&gt;Alert Analysis&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
We talked about alerts. There are other interesting things in this picture. For example, the request rate is pretty normal. If there were a spike in usage, we would see it here. The error rate looks good—there are no errors. By looking at these three metrics, you can get a basic understanding of the health of your system and this specific service.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
This dashboard illustrates years of best practices that the industry has accumulated. We have layers of information. At the top, you have your service identifier, the last metrics received time, and the overview of the aggregated service red metrics.&lt;/p&gt;
&lt;p&gt;This aggregated view across all operations of my service will help you decide if this service is healthy or not. If you have doubts or think something is going wrong, P95 is good at surfacing outliers.&lt;/p&gt;
&lt;p&gt;Typically, you will scroll down to the HTTP or gRPC operations, where you have the details broken down by operation. It’s likely that not all business operations have problems; it could be just a subset of them.&lt;/p&gt;
&lt;p&gt;Here you can see the outbound services. If you have a problem, this data will help you understand if it’s happening within your service or is it a downstream service. In microservices architecture, that’s always a question.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
Are those dashboards powered exclusively by metrics?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Everything is powered by metrics, specifically the OpenTelemetry semantic conventions. Initially, the OpenTelemetry demo derived metrics from spans, which was a great idea four years ago, but it had some limits. Now, OpenTelemetry has standardized some semantic conventions for HTTP server calls, client calls, database client calls, RPC calls, and messaging.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
I noticed during my time with the demo that the coverage of metrics is uneven across programming languages. Java, for instance, has great instrumentation, while in other languages, it depends on the instrumentation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yes, that’s true. It’s uncommon for OpenTelemetry instrumentations to emit logs these days, but let’s move on to that.&lt;/p&gt;
&lt;h3 id="logs-and-observability"&gt;Logs and Observability&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
So, what’s the deal with logs? Why are they not as important?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Logs are traditionally outputted in stdout, and we’ve lost Nicole. [laughter] The challenge is that traces and metrics are captured by SDKs within your app, while logs come from external log collectors, making correlation tough. When we discuss with practitioners and tell them that the OpenTelemetry SDK can directly export logs, they often respond that their log processes are mature and they can’t disrupt them just to trust the new kid on the block.&lt;/p&gt;
&lt;p&gt;It takes time to change your log toolchain. And while OpenTelemetry SDKs have capabilities to directly export logs, it’s not easy to get people to change practices they’ve had for 30 years.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
To demonstrate Cyrille’s point about correlation, the most basic way to correlate is by trace ID and span ID. When we capture distributed traces, we can also attribute logs to the specific operation.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yes, and when we look at a trace inside Grafana, we can see logs associated with it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
If we open the trace view, we can see the details for this operation. There are a bunch of attributes you can correlate to understand what happened.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Logs provide the details. I think the negative sentiment around logs came from the idea that they don’t work as well in distributed applications as they did in monolithic applications. We had to evolve our practices to log the right way for distributed applications.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
It’s user error because logs are the signals you can abuse the most. You can put anything in a log line, which causes issues. With metrics, you don’t have as much leeway, which makes it simpler to deal with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yes, and we need to convince users that going into log analytics tools is much more efficient than tailing logs directly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
It is more complicated to analyze logs than traces because they aren’t always structured.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Exactly. We have to help organizations better structure their logs for better value.&lt;/p&gt;
&lt;h3 id="questions-and-community-engagement"&gt;Questions and Community Engagement&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
We have a question here. “We are planning to adopt the LGTM stack as an observability platform. Is there any blueprint documentation aligned with observability 2.0?”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
LGTM stands for Loki, Grafana, Tempo, and Mimir. It’s an integrated solution. Observability 2.0 is about unified telemetry—having everything correlated and not just reacting to errors. It’s about understanding business impacts when you decrease response times.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
So, it’s more about understanding the overall system rather than just monitoring.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yes, exactly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
How do I know which metrics and traces to prioritize first when instrumenting a distributed system with OpenTelemetry?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
We recommend starting with auto-instrumentation first. It provides metrics and traces at a technical level, and with HTTP, the endpoints are meaningful from a business standpoint. You start with auto-instrumentation and then add custom instrumentation on critical workflows.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
What’s the current state of the OpenTelemetry demo? Can it monitor infrastructure as well?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Yes, OpenTelemetry was born in the application layer, but infrastructure monitoring came a bit later. We’re working with the hotel demo folks to showcase better infrastructure monitoring done by OpenTelemetry.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
If people want to contribute or try out the hotel demo for themCyrilleves, where should they go?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
I posted the link in the chat to the OpenTelemetry site.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
If you want to participate in the demo, we have community meetings, and I can share another link in the channel for more information.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Liudmila:&lt;/strong&gt;&lt;br&gt;
Great! Thank you both for being here and for everyone watching. I think that&amp;rsquo;s a great way to end this call.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cyrille:&lt;/strong&gt;&lt;br&gt;
Thank you very much! It was a pleasure to be invited and an honor.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nicole:&lt;/strong&gt;&lt;br&gt;
Thank you!&lt;/p&gt;</description></item><item><title>Asimov's Zeroth Law of Robotics: Observability for AI (Newcrafts 2025)</title><link>https://nicolevanderhoeven.com/blog/20251106-asimovs-zeroth-law-newcrafts/</link><pubDate>Thu, 06 Nov 2025 12:23:19 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20251106-asimovs-zeroth-law-newcrafts/</guid><description>&lt;p&gt;Today I presented at &lt;a href="https://ncrafts.io/"&gt;Newcrafts&lt;/a&gt; in Paris, France. I gave a talk I&amp;rsquo;ve given before, called &lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics: Observability for AI&lt;/em&gt;, which I had previously presented at &lt;a href="https://nicolevanderhoeven.com/blog/20250402-asmiovs-zeroth-law-of-robotics/"&gt;KubeCon EU&lt;/a&gt; in London and at &lt;a href="https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/"&gt;Dutch Cloud Native Day 2025&lt;/a&gt; in Utrecht. I was happy to present it again, as it gave me the chance to further refine my demo application, which you can find on &lt;a href="https://nicole.to/asimov"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The main change I made was to use the &amp;ldquo;AI as judge&amp;rdquo; approach that I had previously only talked about in theory. In this version of the demo app, I use AI in both the game as well as in the testing of the game, showing how AI can be integrated into both the application and its observability/testing stack. It was really interesting to note that testing with AI ended up exposing more defects than my hardcoded test cases did, which goes to show the potential of AI-driven testing.&lt;/p&gt;</description></item><item><title>The Spice Must Flow: The Fremen Guide to Sustainable Observability (Øredev 2025)</title><link>https://nicolevanderhoeven.com/blog/20251105-the-spice-must-flow/</link><pubDate>Wed, 05 Nov 2025 03:07:38 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20251105-the-spice-must-flow/</guid><description>&lt;p&gt;Today I gave a talk at &lt;a href="https://oredev.org/"&gt;Øredev 2025&lt;/a&gt; in Malmö, Sweden, titled +The Spice Must Flow: The Fremen Guide to Sustainable Observability&amp;quot;_. The presentation focused on how to implement sustainable observability practices using open-source tools like Grafana, Prometheus, Loki, Tempo, KEDA, and Kepler. Here&amp;rsquo;s the abstract:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Nobody wants to be wasteful. But how do you balance that with the need for enough data to fix things when they go wrong? After all, no matter how much it costs, there are SLOs to keep. The spice&amp;ndash; the telemetry&amp;ndash; must flow.&lt;/p&gt;
&lt;p&gt;The Fremen are a people who live on the planet Arrakis, simultaneously rich in spice while poor in water. But the Fremen have managed to thrive, not just survive, on very little while continuing to produce spice. What would it take to apply this &amp;ldquo;desert planet thinking&amp;rdquo; to observability?&lt;/p&gt;
&lt;p&gt;In this talk, you&amp;rsquo;ll learn about the hidden environmental and financial costs of your observability stack and how to reduce them. You&amp;rsquo;ll learn about the complications of measuring cost for ephemeral resources on Kubernetes, how to use KEDA to &amp;ldquo;right-size&amp;rdquo; resources when you don&amp;rsquo;t know what the right size is, and how to convince your teams to drop all but the most meaningful telemetry data. In the end, the spice must flow, but there must still be enough water to sustain all.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here are some resources mentioned in the talk:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can play the game Spice Runner &lt;a href="https://nicole.to/spicegame"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicole.to/spicerepo"&gt;The spice-runner repo&lt;/a&gt; containing everything you need to know about how to deploy it yourself&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicole.to/spiceslides"&gt;The slides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicole.to/spicedashboard"&gt;The Spice Runner dashboard&lt;/a&gt; for observing the application&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/projects/spice-runner/"&gt;More about Spice Runner&lt;/a&gt;: architecture, tech stack, and what it demonstrates&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/2025-11-05-oredev.JPG" alt="Photo of me at Øredev 2025" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Deploying Loki on Kubernetes via Helm (Loki Community Call October 2025)</title><link>https://nicolevanderhoeven.com/blog/20251029-lcc-deploying-loki-on-kubernetes-via-helm/</link><pubDate>Wed, 29 Oct 2025 18:04:30 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20251029-lcc-deploying-loki-on-kubernetes-via-helm/</guid><description>&lt;p&gt;This Loki Community Call is about deploying Loki on Kubernetes via Helm charts. We talk about why you might want to use Helm to deploy on Kubernetes, best practices for deployment, and which Helm chart you should use! We are Jay Clifford and Nicole van der Hoeven, Developer Advocates at Grafana Labs, and we have invited Grafana Champion and Loki Helm Maintainer Jan-Otto Kröpke, Principal Cloud Architect at QualityOperations GmbH, to talk about the state of the Loki Helm Chart.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZqumpIXutXg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Declarative Configuration in OpenTelemetry SDKs (Grafana ❤️‍🔥 OpenTelemetry Community Call October 2025)</title><link>https://nicolevanderhoeven.com/blog/20251022-gocc01-declarative-config-in-otel/</link><pubDate>Wed, 22 Oct 2025 15:02:21 -0700</pubDate><guid>https://nicolevanderhoeven.com/blog/20251022-gocc01-declarative-config-in-otel/</guid><description>&lt;p&gt;I&amp;rsquo;m very lucky to have the opportunity to work with &lt;a href="https://www.linkedin.com/in/lmolkova/"&gt;Liudmila Molkova&lt;/a&gt;, who just joined as a Staff Developer Advocate at Grafana Labs. We decided we would start a new monthly livestream called the Grafana ❤️‍🔥 OpenTelemetry Community Call. In this inaugural episode, we interviewed &lt;a href="https://www.linkedin.com/in/maryliag/"&gt;Marylia Gutierrez&lt;/a&gt; about declarative configuration for OpenTelemetry SDKs. We talked about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pains in getting started with OpenTelemetry, particularly around instrumentation and configuration&lt;/li&gt;
&lt;li&gt;What declarative configuration is, and how it improves the experience&lt;/li&gt;
&lt;li&gt;Which languages declarative configuration is for&lt;/li&gt;
&lt;li&gt;The future of declarative configuration in OpenTelemetry&lt;/li&gt;
&lt;li&gt;Marylia&amp;rsquo;s candidacy for Governing Committee of OTel (&lt;a href="https://gra.fan/otelvote"&gt;vote for her here&lt;/a&gt; from October 27th-30th, 2025)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FwnyV5z_ij4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>One Year Later: How I Use Visuals in My PKM (Sketch Your Mind Conference)</title><link>https://nicolevanderhoeven.com/blog/20251013-how-i-use-visuals-in-my-pkm/</link><pubDate>Mon, 13 Oct 2025 13:33:18 -0700</pubDate><guid>https://nicolevanderhoeven.com/blog/20251013-how-i-use-visuals-in-my-pkm/</guid><description>&lt;p&gt;Today I gave &lt;a href="https://sketch-your-mind.com/2025/sessions/nicole/"&gt;a talk&lt;/a&gt; at my friend Zsolt Viczián&amp;rsquo;s &lt;a href="https://sketchyourmind.com/"&gt;Sketch Your Mind Conference&lt;/a&gt; about how I use visuals in my PKM, a follow-up to my video about Obsidian Excalidraw last year where I shared that I&amp;rsquo;d changed all my Obsidian templates to hybrid Obsidian Excalidraw notes:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zmgqMZi6QL8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In the talk, I shared how I&amp;rsquo;ve evolved my use of visuals in my PKM over the last year, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Referring to icon and logo libraries that dynamically compile all the atomic visuals I use in my notes&lt;/li&gt;
&lt;li&gt;Adopting a visual Zettelkasten-like approach&lt;/li&gt;
&lt;li&gt;Creating notes at conferences to track people I&amp;rsquo;ve met and talks I&amp;rsquo;ve attended&lt;/li&gt;
&lt;li&gt;Using Obsidian Excalidraw to create compelling presentations in lieu of slides&lt;/li&gt;
&lt;li&gt;Combining visuals with audio recordings to create literature notes of books I&amp;rsquo;m reading&lt;/li&gt;
&lt;li&gt;Using a full observability pipeline to monitor and analyze the notes in my Obsidian vault&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I was particularly excited about the last point. I work at Grafana Labs and help people monitor their computer systems using opensource software. I realized that I could use the same tools to monitor my PKM system, so I set up a pipeline where a Python script scrapes note metadata, and sends information to Loki and Prometheus via Alloy, and then I visualize it all in Grafana. It&amp;rsquo;s a pretty nerdy and totally unnecessary setup, but &lt;a href="https://github.com/nicolevanderhoeven/obsidian-grafana"&gt;here&amp;rsquo;s the repo&lt;/a&gt; for anyone interested in replicating it.&lt;/p&gt;</description></item><item><title>All About Structured Metadata in Loki (Loki Community Call August 2025)</title><link>https://nicolevanderhoeven.com/blog/20250812-lcc-all-about-structured-metadata-in-loki/</link><pubDate>Tue, 12 Aug 2025 19:56:32 -0700</pubDate><guid>https://nicolevanderhoeven.com/blog/20250812-lcc-all-about-structured-metadata-in-loki/</guid><description>&lt;p&gt;In this video, &lt;a href="https://www.linkedin.com/in/jaymand13/"&gt;Jay Clifford&lt;/a&gt; and I talk to Senior Software Engineer Salva Corts Sánchez from the Loki team about structured metadata in Loki. We discuss what it is, why you might want to use it, and also how to query it. Structured metadata is especially useful if you&amp;rsquo;re instrumenting your system with OpenTelemetry, so we also touch on that.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IKdRzjwFXYI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Turn Logs Into Metrics with Grafana Loki (Loki Community Call July 2025)</title><link>https://nicolevanderhoeven.com/blog/20250708-lcc-how-to-turn-logs-into-metrics-with-grafana-loki/</link><pubDate>Tue, 08 Jul 2025 17:23:23 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250708-lcc-how-to-turn-logs-into-metrics-with-grafana-loki/</guid><description>&lt;p&gt;In this Loki Community Call, we talk all about how to turn metrics into logs in Grafana Loki using metric queries. We cover the basics of metric queries, how to use them to create metrics from logs, and some advanced use cases like using metric queries to create alerts and dashboards.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/tKcnQ0Q2E-k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Asimov's Zeroth Law of Robotics (Dutch Cloud Native Day 2025)</title><link>https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/</link><pubDate>Thu, 03 Jul 2025 15:01:24 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250703-asimovs-zeroth-law-dutch-cloud-native-day/</guid><description>&lt;p&gt;Today I presented at the &lt;a href="https://www.dutchcloudnativeday.nl"&gt;Dutch Cloud Native Day 2025&lt;/a&gt; in Utrecht, the Netherlands. I gave a talk titled &lt;em&gt;Asimov&amp;rsquo;s Zeroth Law of Robotics: Observability for AI&lt;/em&gt;, which I had previously presented at &lt;a href="https://nicolevanderhoeven.com/blog/20250402-asmiovs-zeroth-law-of-robotics/"&gt;KubeCon EU&lt;/a&gt; earlier on in the year, in London. I was very happy to be able to present it again, because it gave me the opportunity to improve the demo app I used, which you can find on &lt;a href="https://nicole.to/asimov"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/2025-07-03-dcnd_01.jpg" alt="Me speaking at Dutch Cloud Native Day 2025" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/2025-07-03-dcnd_02.jpg" alt="Me speaking at Dutch Cloud Native Day 2025" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>A Real Zettelkasten Workflow in Obsidian, with Tris Oaten and Bob Doto</title><link>https://nicolevanderhoeven.com/blog/20250625-a-real-zettelkasten-workflow-in-obsidian/</link><pubDate>Wed, 25 Jun 2025 12:13:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250625-a-real-zettelkasten-workflow-in-obsidian/</guid><description>&lt;p&gt;I recently had the pleasure of joining my friends &lt;a href="https://www.youtube.com/@NoBoilerplate"&gt;Tris Oaten of No Boilerplate on YouTube&lt;/a&gt; and &lt;a href="https://writing.bobdoto.computer/zettelkasten/"&gt;Bob Doto&lt;/a&gt; on my YouTube channel for a discussion on Zettelkasten, including demos of all three of our real Zettelkasten workflows in Obsidian. We talked extensively about the differences in how we maintain our Zettelkästen and plugins that we use to do so. We particularly talked a lot about &lt;em&gt;folgezettel&lt;/em&gt;, and how the Obsidian Breadcrumbs plugin can be used to implement this concept in Obsidian.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HzmFooRRtAw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;rsquo;re interested in this topic, you might also like Bob&amp;rsquo;s book &lt;a href="https://amzn.to/469VQOF"&gt;A System for Writing&lt;/a&gt;: How an Unconventional Approach to Note-Making Can Help You Capture Ideas, Think Wildly, and Write Constantly. I reviewed it and found it extremely useful, and Tris and I both use it as a reference for our Zettelkasten workflows.&lt;/p&gt;</description></item><item><title>The Road to Loki 4.0 (Loki Community Call June 2025)</title><link>https://nicolevanderhoeven.com/blog/20250624-lcc-the-road-to-loki-4_0/</link><pubDate>Tue, 24 Jun 2025 13:56:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250624-lcc-the-road-to-loki-4_0/</guid><description>&lt;p&gt;In this video, my colleague &lt;a href="https://www.linkedin.com/in/jaymand13/"&gt;Jay Clifford&lt;/a&gt; and I interview Ed Welch, Principal Engineer on the Loki team at Grafana Labs, about the upcoming Loki 4.0 release. We talk about some pretty big features that make this next release almost an entire rewrite of Loki, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A shift towards columnar storage, using a new storage format called &amp;ldquo;DataObject&amp;rdquo;&lt;/li&gt;
&lt;li&gt;A new Kafka/WarpStream architecture that decouples the read and write paths&lt;/li&gt;
&lt;li&gt;A new Loki Query Engine that decouples the query language from the rest of the system, allowing for more options in, for example, allowing for SQL queries against Loki in the future&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LWDeIHfAC9A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Sketch Your Mind in Obsidian and more, with Zsolt Viczián</title><link>https://nicolevanderhoeven.com/blog/20250618-how-to-sketch-your-mind-in-obsidian/</link><pubDate>Wed, 18 Jun 2025 15:30:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250618-how-to-sketch-your-mind-in-obsidian/</guid><description>&lt;p&gt;My friend Zsolt Viczián, a visual thinker and developer behind the plugins Obsidian Excalidraw and Obsidian ExcaliBrain, has written a book called &amp;ldquo;Sketch Your Mind: Nurture a Playful and Creative Brain&amp;rdquo;. The book is about how to create a system for visual thinking that helps you to think better, make connections, and make things with your ideas.&lt;/p&gt;
&lt;p&gt;Get Zsolt&amp;rsquo;s book &lt;a href="https://amzn.to/3Tz58we"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3uIeSIFWx0w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Query Grafana Loki</title><link>https://nicolevanderhoeven.com/blog/20250612-how-to-query-grafana-loki/</link><pubDate>Fri, 13 Jun 2025 15:21:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250612-how-to-query-grafana-loki/</guid><description>&lt;p&gt;In this video, I show you how to query &lt;a href="https://gra.fan/lokirepo"&gt;Grafana Loki&lt;/a&gt;, the open source log aggregation system from Grafana Labs. I cover the basics of Loki&amp;rsquo;s query language, LogQL, and demonstrate how to use it to filter and search logs effectively.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/57dQwcmqkpQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>State of the Observability Databases (Grafana Office Hours #30)</title><link>https://nicolevanderhoeven.com/blog/20250515-goh30-state-of-the-observability-databases/</link><pubDate>Thu, 15 May 2025 18:22:26 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250515-goh30-state-of-the-observability-databases/</guid><description>&lt;p&gt;In this Grafana Office Hours, we talk about the state of observability databases (Grafana Loki, Mimir, Tempo, and Pyroscope) and where they&amp;rsquo;re going. We talk about current and upcoming architectural changes in all four, how we&amp;rsquo;re making them more performant, how compatible they are with OpenTelemetry, and what we&amp;rsquo;re working on next for each database. In this conversation are Dee Kitchen (VP of Engineering for Databases) and Senior Developer Advocates Jay Clifford and Nicole van der Hoeven.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6Ph5nvicm6M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Meta-monitoring Loki (Loki Community Call May 2025)</title><link>https://nicolevanderhoeven.com/blog/20250512-lcc-meta-monitoring-loki/</link><pubDate>Mon, 12 May 2025 17:59:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250512-lcc-meta-monitoring-loki/</guid><description>&lt;p&gt;In this Loki Community Call, we talk about the need for meta-monitoring Loki: why Loki needs to be monitored, what to watch out for, and how to do it. We talk about different ways to get information from Loki that allow you to make it reliable, consistent, and performant, including a Helm chart to deploy a meta-monitoring stack on Kubernetes. We discuss the Loki mixin for Grafana and how to use it to visualize data about Loki. On the call are Jay Clifford, Nicole van der Hoeven, and Dylan Guedes from Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OzYHV9xHIms?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Nicole van der Hoeven: A Polymath with Obsidian as a Modern Zibaldone</title><link>https://nicolevanderhoeven.com/blog/20250427-mechanics-of-knowledge-management-podcast/</link><pubDate>Sun, 27 Apr 2025 09:40:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250427-mechanics-of-knowledge-management-podcast/</guid><description>&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20250322-pkm-summit-malik-nicole.png" alt="With Malik Alimoekhamedov at PKM Summit" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I joined &lt;a href="https://malikalimoekhamedov.substack.com/"&gt;Malik Alimoekhamedov&lt;/a&gt; on his podcast &lt;a href="https://malikalimoekhamedov.substack.com/"&gt;&lt;em&gt;The Mechanics of Knowledge Management&lt;/em&gt;&lt;/a&gt; for a long conversation about Obsidian, PKM, and the Renaissance-era &lt;em&gt;zibaldone&lt;/em&gt; tradition — the personal commonplace books that thinkers like Leonardo da Vinci kept as a hybrid of journal, reference, and idea workshop. We talked about how a modern Obsidian vault can play the same role for someone trying to think across domains, and about what changes when you treat your notes as the &lt;em&gt;exhaust of learning&lt;/em&gt; rather than the destination.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://malikalimoekhamedov.substack.com/p/nicole-van-der-hoeven-a-polymath"&gt;🎙️ Listen on Substack&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://podcasts.apple.com/us/podcast/nicole-van-der-hoeven-a-polymath-with-obsidian-as/id1804998781?i=1000705106137"&gt;🎙️ Listen on Apple Podcasts&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Thanks to Malik for the wide-ranging conversation.&lt;/p&gt;</description></item><item><title>Getting Started with Logging and Grafana Loki (webinar)</title><link>https://nicolevanderhoeven.com/blog/20250416-getting-started-with-logging-and-grafana-loki/</link><pubDate>Wed, 16 Apr 2025 08:18:04 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20250416-getting-started-with-logging-and-grafana-loki/</guid><description>&lt;p&gt;In this webinar, I talk about the key benefits of &lt;a href="https://gra.fan/lokirepo"&gt;Grafana Loki&lt;/a&gt;, the open source log aggregation system from Grafana Labs. I cover the basics of logging, how Loki works, and how to get started with it. This was a live webinar, but I recorded the session here as well:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9XL4o5lLfVM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Do's and Don'ts of Scaling Loki Cache (Loki Community Call March 2025)</title><link>https://nicolevanderhoeven.com/blog/20250325-lcc-dos-and-donts-of-scaling-loki-cache/</link><pubDate>Tue, 25 Mar 2025 17:56:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250325-lcc-dos-and-donts-of-scaling-loki-cache/</guid><description>&lt;p&gt;In this Loki community call, Poyzan (Staff Engineer on the Loki team) returns this time with Paul Rogers (Staff Engineer on the Loki team) to talk all about Loki cache! This topic was heavily discussed in our &amp;ldquo;How to run Loki at scale on Kubernetes&amp;rdquo; call. Some of the topics we will cover:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Types of cache and cache tiering&lt;/li&gt;
&lt;li&gt;Best practices for scaling your cache&lt;/li&gt;
&lt;li&gt;Understanding failure scenarios with Loki cache and how to detect them&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3u8UxLfmq6I?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Best Practices for Recording and Alerting (Loki Community Call February 2025)</title><link>https://nicolevanderhoeven.com/blog/20250226-lcc-best-practices-for-recording-and-alerting/</link><pubDate>Wed, 26 Feb 2025 17:54:15 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250226-lcc-best-practices-for-recording-and-alerting/</guid><description>&lt;p&gt;In this Loki Community Call, we talk about the best practices for recording and alerting rules with Loki Staff Engineer George Robinson and Senior Developer Advocates Jay Clifford and Nicole van der Hoeven. Ever wondered what’s the difference between the Ruler and Alertmanager? 🤔 Curious about the different modes the Ruler can run in when querying Loki? Want to avoid the most common pitfalls when setting up alerting and recording rules? We cover all of these, including optimizing rule performance to structure alerts effectively.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3_DtwTOppiI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Run Loki at Scale on Kubernetes (Loki Community Call January 2025)</title><link>https://nicolevanderhoeven.com/blog/20250123-lcc-how-to-run-loki-at-scale-on-kubernetes/</link><pubDate>Thu, 23 Jan 2025 17:51:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250123-lcc-how-to-run-loki-at-scale-on-kubernetes/</guid><description>&lt;p&gt;Happy New Year from the Loki Engineering team. To kick off 2025, Nicole and Jay will be joined by Poyzan Taneli from the Loki Engineering team to discuss how to run Loki at scale on Kubernetes. If you are currently running Loki in microservices mode or preparing to do so, we will be discussing best practices for scaling its components to meet the demands of production use cases.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many Ingesters vs Queriers do I need?&lt;/li&gt;
&lt;li&gt;What is the minimum cost of running Loki as a production cluster?&lt;/li&gt;
&lt;li&gt;What is the average node size for running Loki?
How do I monitor my Loki deployment?&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/lAr0GwuZHiw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My Year in PKM: 2024 in Numbers</title><link>https://nicolevanderhoeven.com/blog/20250110-my-year-in-pkm-2024-in-numbers/</link><pubDate>Fri, 10 Jan 2025 17:36:38 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20250110-my-year-in-pkm-2024-in-numbers/</guid><description>&lt;p&gt;Rather than a full explanation of what in the world happened to me last year, here&amp;rsquo;s my year in PKM. I use my Personal Knowledge Management system for everything, so I thought I&amp;rsquo;d let it speak for me through some statistics I gathered from different tools I consider part of that system.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NxCZ8GaM-Vw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Grafana Loki Query Best Practices with LogQL (Loki Community Call December 2024)</title><link>https://nicolevanderhoeven.com/blog/20241205-lcc-grafana-loki-query-best-practices-with-logql/</link><pubDate>Thu, 05 Dec 2024 17:48:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20241205-lcc-grafana-loki-query-best-practices-with-logql/</guid><description>&lt;p&gt;In this December&amp;rsquo;s Loki Community Call, Cyril Tovena, Senior Principal Engineer and LogQL guru walks us through a Grafana Loki query tutorial with LogQL, the Log Query Language used for Loki. He talks about the key &amp;ldquo;Dos and Don&amp;rsquo;ts&amp;rdquo; of LogQL, offering practical tips to help you write better queries, boost performance, and sidestep common mistakes.&lt;/p&gt;
&lt;p&gt;Whether you’re tuning up your current setup or just diving into LogQL, Cyril’s got you covered. Bring your questions, connect with the Loki community, and pick up insights that’ll make your log-querying life easier. See you there!&lt;/p&gt;
&lt;p&gt;Make sure you leave your questions &lt;a href="https://forms.gle/nm7TGX2EeWnRLmbs6"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Cyril is joined by Senior Developer Advocates Jay Clifford and Nicole van der Hoeven.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d61nQX-n91c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>AI Observability with Ishan Jain (Grafana Office Hours #29)</title><link>https://nicolevanderhoeven.com/blog/20241108-goh29-ai-observability-with-ishan-jain/</link><pubDate>Fri, 08 Nov 2024 18:24:29 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20241108-goh29-ai-observability-with-ishan-jain/</guid><description>&lt;p&gt;In this Grafana Office Hours, Ishan Jain talks about AI Observability with Grafana: what it entails, factors to consider when monitoring and observing LLMs, and how to do it all with Grafana. He is joined by Senior Developer Advocate Nicole van der Hoeven.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9X7M-bvnZG0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>All About Logs Drilldown (Loki Community Call October 2024)</title><link>https://nicolevanderhoeven.com/blog/20241003-lcc-all-about-logs-drilldown/</link><pubDate>Thu, 03 Oct 2024 17:45:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20241003-lcc-all-about-logs-drilldown/</guid><description>&lt;p&gt;In this Community Call, Senior Software Engineer Trevor Whitney talks to us all about Drilldown Logs for Grafana Loki, an open-source app for visualizing logs from Loki in Grafana without needing to learn and write LogQL queries. He is joined by Senior Developer Advocates Nicole van der Hoeven and Jay Clifford.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/XJMQbEuBeMc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Bloom Filter Changes for Grafana Loki (Loki Community Call September 2024)</title><link>https://nicolevanderhoeven.com/blog/20240905-lcc-bloom-filter-changes-for-grafana-loki/</link><pubDate>Thu, 05 Sep 2024 17:41:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240905-lcc-bloom-filter-changes-for-grafana-loki/</guid><description>&lt;p&gt;In this Community Call, Senior Software Engineer Christian Haudum talks to us about bloom filter changes for Grafana Loki, including the deprecation of the bloom compactor and a pivot towards creating bloom filters for structured metadata. Bloom filters are a probabilistic data structure that we&amp;rsquo;re using to improve query performance in Loki.&lt;/p&gt;
&lt;p&gt;Community Calls are monthly meetings that are open to everyone interested in the development of Loki. They are an opportunity for software engineers working on Loki to discuss new features as well as for open-source users of Loki to ask questions. To participate in the next Community Call, &lt;a href="https://gra.fan/lokicccal"&gt;subscribe to the calendar here&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/keXrUf8jw1A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>API Monitoring with Traefik, Grafana, and OpenTelemetry (Grafana Office Hours #28)</title><link>https://nicolevanderhoeven.com/blog/20240712-goh28-api-monitoring-with-traefik-grafana-and-opentelemetry/</link><pubDate>Fri, 12 Jul 2024 18:27:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240712-goh28-api-monitoring-with-traefik-grafana-and-opentelemetry/</guid><description>&lt;p&gt;Maytham Alfouadi (Solutions Architect) and Immánuel Fodor (Product Manager) from Traefik Labs give us a demonstration of how to do API monitoring with Traefik, Grafana, and OpenTelemetry. They talk about Traefik, an open-source reverse proxy, among other things, that is now included by default in k3s and Rancher. They are joined by Usman Ahmad and Nicole van der Hoeven, both Senior Developer Advocates at Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/1Buk3wPpJdY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Cartography of the Deep: Distributed Tracing for Testing (Romanian Testing Conference)</title><link>https://nicolevanderhoeven.com/blog/20240613-cartography-of-the-deep/</link><pubDate>Thu, 13 Jun 2024 12:24:02 -0700</pubDate><guid>https://nicolevanderhoeven.com/blog/20240613-cartography-of-the-deep/</guid><description>&lt;p&gt;I presented a talk today at the Romanian Testing Conference 2024 in Cluj-Napoca, Romania! My talk was called &amp;ldquo;Cartography of the Deep: Distributed Tracing for Testing&amp;rdquo; and it covered how to tie in distributed tracing into tests to get a better understanding of your system under test.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nicole.to/rtc2024"&gt;Here are my slides&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/rtc2024-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/rtc2024-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;From the Scandinavian Kraken that drags entire ships to their early graves to the Philippine Bakunawa said to rise from the waters to swallow the moon, our existential fears about what lurks at the bottom of our own oceans has inspired us to create hundreds of folkloric monsters across cultures. We&amp;rsquo;ve charted the surface of our planet, but the vast majority of the ocean floor remains a mystery.&lt;/p&gt;
&lt;p&gt;The mysterious depths of modern software architectures makes it difficult for us to test a system for performance and reliability. The easy solution? Unmanned underwater probes: send inputs to the system, and judge its state based on the outputs that return. But this method is often too limited to tell us what&amp;rsquo;s really going on when something goes wrong. What if there were a way to make our tests themselves more observable?&lt;/p&gt;
&lt;p&gt;In this talk, you will learn how to use open-source tools to instrument performance tests, identify bottlenecks at the code level using distributed tracing, and map out a system using a type of software bathymetry. You&amp;rsquo;ll also learn about the Mariana Trench expeditions, the difficulties of operating in a high-pressure underwater environment, and how to come face to face with monsters of our mythologies.&lt;/p&gt;</description></item><item><title>Grafana Loki Design Basics with Ed Welch (Grafana Office Hours #27)</title><link>https://nicolevanderhoeven.com/blog/20240607-goh27-grafana-loki-design-basics-with-ed-welch/</link><pubDate>Fri, 07 Jun 2024 18:29:26 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240607-goh27-grafana-loki-design-basics-with-ed-welch/</guid><description>&lt;p&gt;Ed Welch, Principal Engineer on the Loki team, is talking to us about how to get started with Grafana Loki for beginners. He tells us the story of why Loki was created in the first place, talks about the terminology of Loki (what are indices, streams, labels, metadata, tags, and chunks?), and shares candidly about what Loki is good at and what it&amp;rsquo;s not good at.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3uFMJLufgSo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Connecting Visual Notes with Obsidian Excalidraw</title><link>https://nicolevanderhoeven.com/blog/20240426-connecting-visual-notes-with-obsidian-excalidraw/</link><pubDate>Fri, 26 Apr 2024 17:34:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240426-connecting-visual-notes-with-obsidian-excalidraw/</guid><description>&lt;p&gt;Connecting visual notes isn&amp;rsquo;t as easy as connecting textual notes. Yet those connections are an essential part of taking notes that actually help you learn or remember things. In this video, I talk about ways to connect Excalidraw drawings and hybrid notes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/lGh53N_Lj2Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Visual Note Templates With Obsidian Excalidraw</title><link>https://nicolevanderhoeven.com/blog/20240419-visual-note-templates-with-obsidian-excalidraw/</link><pubDate>Fri, 19 Apr 2024 17:31:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240419-visual-note-templates-with-obsidian-excalidraw/</guid><description>&lt;p&gt;How can you create visual note templates that encourage both visual and textual note-taking? The Obsidian Excalidraw community plugin bridges this gap in Obsidian by allowing the creation of hybrid notes: notes that are both textual and visual by default. Obsidian Excalidraw is created by Zsolt Viczián.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zmgqMZi6QL8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Doing It in Public: Observability for PKM</title><link>https://nicolevanderhoeven.com/blog/20240405-doing-it-in-public-observability-for-pkm/</link><pubDate>Fri, 05 Apr 2024 17:26:42 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240405-doing-it-in-public-observability-for-pkm/</guid><description>&lt;p&gt;The quest of learning in public with Personal Knowledge Management is really about making what you learn observable and exposing your process, rather than your result, early and often. This is a rendition of a talk I gave at the PKM Summit in Utrecht, the Netherlands, on March 23rd, 2024, and it relates concepts borrowed from performance engineering and software development to PKM systems.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/i-uNtkre1aE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Real-time Collaboration in Obsidian with Peerdraft</title><link>https://nicolevanderhoeven.com/blog/20240323-real-time-collaboration-in-obsidian-with-peerdraft/</link><pubDate>Sat, 23 Mar 2024 17:24:07 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240323-real-time-collaboration-in-obsidian-with-peerdraft/</guid><description>&lt;p&gt;Working with others in Obsidian hasn&amp;rsquo;t always been the easiest task. Obsidian Peerdraft is a new community plugin and accompanying web app that brings real-time collaboration to Obsidian. In this video, I tell you how to use Peerdraft, collaborate with a friend live while using it, and interview the developer of the app and plugin, Dominik Schlund.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5ZyMyrmL_xc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I'm Writing a Book in Public</title><link>https://nicolevanderhoeven.com/blog/20240216-how-im-writing-a-book-in-public/</link><pubDate>Fri, 16 Feb 2024 17:21:16 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240216-how-im-writing-a-book-in-public/</guid><description>&lt;p&gt;I previously announced I&amp;rsquo;d be writing a book in public, but that didn&amp;rsquo;t happen. I explain what happened and why I&amp;rsquo;m writing another book instead. The new book is called Doing It in Public, and it&amp;rsquo;s about learning in public, my way&amp;hellip; and, appropriately, I&amp;rsquo;m writing it in public!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MwNPY9DmQTY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to get started in DevRel with Gertrude Westrin (Adobo &amp; Avocados #29)</title><link>https://nicolevanderhoeven.com/blog/20240131-ana38-how-to-get-started-in-devrel/</link><pubDate>Wed, 31 Jan 2024 11:04:30 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20240131-ana38-how-to-get-started-in-devrel/</guid><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/gertrude-chilufya"&gt;Gertrude Chilufya Westrin&lt;/a&gt; joined my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me on Adobo &amp;amp; Avocados to talk about how she got started with a career in Developer Relations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how and why she moved from Zambia to Sweden&lt;/li&gt;
&lt;li&gt;how she got her first job in tech&lt;/li&gt;
&lt;li&gt;the difference between Developer Relations and Developer Advocacy&lt;/li&gt;
&lt;li&gt;how a developer advocate can help the community.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/o5HHPrfigo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to publish your notes for free with Quartz</title><link>https://nicolevanderhoeven.com/blog/20240126-how-to-publish-your-notes-for-free-with-quartz/</link><pubDate>Fri, 26 Jan 2024 14:00:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240126-how-to-publish-your-notes-for-free-with-quartz/</guid><description>&lt;p&gt;&lt;a href="https://quartz.jzhao.xyz/"&gt;Quartz&lt;/a&gt; just won Best Tool in the &lt;a href="https://obsidian.md/blog/2023-goty-winners/"&gt;Obsidian Gems of the Year 2023&lt;/a&gt; awards, and with good reason. It&amp;rsquo;s a free, open-source static site generator that works really well with Markdown-based note-taking apps&amp;ndash; including Obsidian, which it was originally designed for.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://doingitinpublic.com/"&gt;Here&amp;rsquo;s what Quartz looks like when published&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6s6DT1yN4dw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;🖊️ &lt;a href="https://notes.nicolevanderhoeven.com/How+to+publish+Obsidian+notes+with+Quartz+on+GitHub+Pages"&gt;How to publish Obsidian notes with Quartz on GitHub Pages&lt;/a&gt;: The video in text form so you can follow along&lt;/li&gt;
&lt;li&gt;🙏🏻 &lt;a href="https://links.gilbertsanchez.com/"&gt;Gilbert Sanchez&lt;/a&gt; shared his experiences in trying to find a static site generator replacement for Obsidian Publish on &lt;a href="https://nicole.to/discord"&gt;my Discord server&lt;/a&gt; and inspired me to try Quartz.&lt;/li&gt;
&lt;li&gt;🖊️ &lt;a href="https://quartz.jzhao.xyz/"&gt;Quartz documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🖊️ &lt;a href="https://docs.github.com/"&gt;GitHub documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🖊️ &lt;a href="https://docs.github.com/en/pages"&gt;GitHub Pages documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;🖊️ &lt;a href="https://help.obsidian.md/Home"&gt;Obsidian documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Mental Health as a Superpower with Karen Todd (Adobo &amp; Avocados #28)</title><link>https://nicolevanderhoeven.com/blog/20240125-ana28-mental-health-as-a-superpower-with-karen-todd/</link><pubDate>Thu, 25 Jan 2024 15:12:44 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240125-ana28-mental-health-as-a-superpower-with-karen-todd/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I interviewed &lt;a href="https://www.youtube.com/c/KarenTestsStuff"&gt;Karen Todd&lt;/a&gt; about neurodivergence and neurodiversity, and how her ADHD can be a positive thing in her career as a tester.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/X0dQY-gxPYg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to do continuous profiling right with Grafana Pyroscope and Ryan Perry, (Grafana Office Hours #26)</title><link>https://nicolevanderhoeven.com/blog/20240119-goh26-how-to-do-continuous-profiling-right-with-grafana-pyroscope/</link><pubDate>Fri, 19 Jan 2024 18:09:01 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240119-goh26-how-to-do-continuous-profiling-right-with-grafana-pyroscope/</guid><description>&lt;p&gt;My friend &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; and I interview &lt;a href="https://ryanperry.io"&gt;Ryan Perry&lt;/a&gt;, co-founder of Grafana Pyroscope, about how to do continuous profiling right. Ryan, and the rest of the Pyroscope team, joined Grafana Labs, where he is now a Director of Engineer. Ryan discusses the main concerns in continuous profiling and how to avoid those pitfalls. Pyroscope is an open-source project for aggregating continuous profiling data about your system&amp;rsquo;s resources.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pzNRvMQzrJ0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pyroscope &lt;a href="https://grafana.com/docs/pyroscope/"&gt;docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pyroscope &lt;a href="https://pyroscope.io/"&gt;site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Pyroscope &lt;a href="https://github.com/grafana/pyroscope"&gt;repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Weigh in on the &lt;a href="https://github.com/open-telemetry/oteps/pull/239"&gt;OpenTelemetry Profiling Data Model&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Learning new things in Obsidian: in defense of remembering</title><link>https://nicolevanderhoeven.com/blog/20240119-learning-new-things-in-obsidian-in-defense-of-remembering/</link><pubDate>Fri, 19 Jan 2024 12:01:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240119-learning-new-things-in-obsidian-in-defense-of-remembering/</guid><description>&lt;p&gt;Here&amp;rsquo;s how I&amp;rsquo;m learning things in Obsidian in 2024, and the tools I use in my information processing pipeline to read, listen, and watch content and turn that into ideas and output. I also talk about why it&amp;rsquo;s important to remember what you&amp;rsquo;ve consumed, and the value of writing stuff down to help you do so.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZJop14hgf40?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;The Imperfectionist - &lt;a href="https://ckarchive.com/b/68ueh8hk25687hkq88gqmtzope0kk"&gt;How to forget what you read&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Sign up for &lt;a href="https://www.oliverburkeman.com/the-imperfectionist"&gt;The Imperfectionist newsletter&lt;/a&gt; (recommended!)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://chromewebstore.google.com/detail/readwise-highlighter/jjhefcfhmnkfeepcpnilbbkaadhngkbi"&gt;Readwise Highlighter&lt;/a&gt; (browser extension)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://link.snipd.com/Cx7S/nicole"&gt;Snipd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://napkin.one/?via=nicole"&gt;Napkin.one&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Smvvpw"&gt;Deep Work&lt;/a&gt; (book)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why People Leave Software Testing, with Maria Kedemo (Adobo &amp; Avocados #27)</title><link>https://nicolevanderhoeven.com/blog/20240118-ana27-why-people-leave-software-testing/</link><pubDate>Thu, 18 Jan 2024 11:54:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240118-ana27-why-people-leave-software-testing/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, &lt;a href="https://mkedemo.wordpress.com/"&gt;Maria Kedemo&lt;/a&gt; talks to my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me about why she left software testing&amp;ndash; and why she came back.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/s-tv51fMRXo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My workflow for making videos with Obsidian</title><link>https://nicolevanderhoeven.com/blog/20240112-my-workflow-for-making-videos-with-obsidian/</link><pubDate>Fri, 12 Jan 2024 18:00:32 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240112-my-workflow-for-making-videos-with-obsidian/</guid><description>&lt;p&gt;I&amp;rsquo;ve been making videos with Obsidian for about three years now, and I thought I&amp;rsquo;d share what I&amp;rsquo;ve learned. Here&amp;rsquo;s how I plan, outline, and edit my videos, as well as how I process them back into my notes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/alF6MnA6NvA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;This video was sponsored by Skillshare. The first 500 people to &lt;a href="https://skl.sh/nicolevanderhoeven12231"&gt;use this link&lt;/a&gt; will get a 1 month free trial of Skillshare. Signing up, even for just the free month, supports me and my work. Thanks!&lt;/p&gt;</description></item><item><title>The Power of Community, with Tara Walton (Adobo &amp; Avocados #26)</title><link>https://nicolevanderhoeven.com/blog/20240110-ana26-the-power-of-community-with-tara-walton/</link><pubDate>Wed, 10 Jan 2024 13:48:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240110-ana26-the-power-of-community-with-tara-walton/</guid><description>&lt;p&gt;What does a community builder do? In this episode of Adobo and Avocados, Tara Walton talk to my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me about what community is, its benefits, and ways to misuse it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TciFUzx69xY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Deploy Grafana Beyla on Kubernetes as a Sidecar Container</title><link>https://nicolevanderhoeven.com/blog/20240109-how-to-deploy-grafana-beyla-on-kubernetes-as-a-sidecar-container/</link><pubDate>Tue, 09 Jan 2024 13:41:38 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240109-how-to-deploy-grafana-beyla-on-kubernetes-as-a-sidecar-container/</guid><description>&lt;p&gt;Principal Staff Engineer Nikola Grčevski demonstrates how to deploy Grafana Beyla on Kubernetes as a sidecar container. Grafana Beyla is an eBPF auto-instrumentation tool for application observability: you just have to tell it what to listen to, give it permissions, and deploy it&amp;ndash; and you can see metrics and logs from that component or service without having to do any manual instrumentation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d7clTdz0bA4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/beyla/latest/setup/kubernetes/"&gt;Instructions for deploying Grafana Beyla on Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/beyla"&gt;Grafana Beyla on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why Not to Make Resolutions in 2024</title><link>https://nicolevanderhoeven.com/blog/20240105-why-not-to-make-resolutions-in-2024/</link><pubDate>Fri, 05 Jan 2024 18:24:10 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240105-why-not-to-make-resolutions-in-2024/</guid><description>&lt;p&gt;I&amp;rsquo;ve done a lot of thinking about why not to make resolutions in 2024. In 2023, I went a little overboard with OKRs (Objectives and Key Results) and that just sent me spiralling into overwork and burnout. That&amp;rsquo;s not something I want to see happen again this year, so instead, I&amp;rsquo;m doing a yearly theme: a one-word direction for the rest of the year that will act as a North Star rather than a strict set of rules. I&amp;rsquo;m hoping this will allow me to be productive, but also keep me happy.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/p6KdfE97y4w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;(podcast episode) &lt;a href="https://www.youtube.com/watch?v=cXexYmOHkas"&gt;2024 Yearly Themes by @cortexFM&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(book) &lt;a href="https://amzn.to/3S40x5g"&gt;Burnout: The Secret to Unlocking the Stress Cycle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(book) &lt;a href="https://amzn.to/3TLLm1P"&gt;Can&amp;rsquo;t Even: How Millennials Became the Burnout Generation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(book) &lt;a href="https://amzn.to/3tv6ezT"&gt;Essentialism: The Disciplined Pursuit of Less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(book) &lt;a href="https://amzn.to/3vscaKi"&gt;Effortless: Make It Easier to Do What Matters Most&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(book) &lt;a href="https://amzn.to/47ft5Ny"&gt;Romancing the Shadow: A Guide to Soul Work for a Vital, Authentic Life&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(podcast) &lt;a href="https://www.thedeeplife.com/listen/"&gt;Deep Questions with Cal Newport&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Introduction to eBPF With Grafana Beyla (Grafana Office Hours #25)</title><link>https://nicolevanderhoeven.com/blog/20240105-goh25-introduction-to-ebpf-with-grafana-beyla/</link><pubDate>Fri, 05 Jan 2024 18:03:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20240105-goh25-introduction-to-ebpf-with-grafana-beyla/</guid><description>&lt;p&gt;Nikola Grčevski, Principal Software Engineer at Grafana Labs, gives us an introduction to eBPF with Grafana Beyla. We discuss what is eBPF, how you can use it to auto-instrument applications, and how to get started with Beyla. eBPF observability is all the rage because we all want automagical instrumentation&amp;ndash; but does it live up to that promise? Nikola&amp;rsquo;s here to tell us what eBPF can and can&amp;rsquo;t do, and where he&amp;rsquo;d like to take Beyla next.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZEUzucqXUnQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="links"&gt;Links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/beyla"&gt;Grafana Beyla repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-applications/beyla/"&gt;Grafana Beyla docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-applications/application-observability/"&gt;Application Observability docs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Links vs Tags vs Folders: knowledge gardening with Jorge Arango</title><link>https://nicolevanderhoeven.com/blog/20231227-links-vs-tags-vs-folders/</link><pubDate>Wed, 27 Dec 2023 19:38:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231227-links-vs-tags-vs-folders/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever questioned the benefits of links vs tags vs folders, my guest today, &lt;a href="https://jarango.com"&gt;Jorge Arango&lt;/a&gt;, has some opinions about which method is best for you when creating a knowledge garden in Obsidian. Information architecture is a field of design that makes it easier to find information, and I&amp;rsquo;m talking to Jorge today about how the same principles can be used to find things in your notes.&lt;/p&gt;
&lt;p&gt;Jorge is an information architect, author, and educator. For the past 25 years, he has used architectural thinking to bring clarity and alignment to digital products and services. He’s the author of Living in Information: Responsible Design for Digital Places, co-author of Information Architecture: for the Web and Beyond, and host of The Informed Life podcast. Besides consulting, writing, and podcasting, Jorge also teaches in the graduate interaction design program at the California College of the Arts.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/iipvNQI8AQg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Get a 15% discount on Jorge&amp;rsquo;s book by buying it &lt;a href="https://rosenfeldmedia.com/books/duly-noted-extend-your-mind-through-connected-notes/"&gt;here&lt;/a&gt; and using the code &lt;code&gt;NVDH&lt;/code&gt;, valid through January 26th, 2024.&lt;/p&gt;
&lt;p&gt;Or, buy it on Amazon using &lt;a href="https://amzn.to/3TBPEsu"&gt;this affiliate link&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Learning about Glue Work and Quiet Quitting (Adobo &amp; Avocados #25)</title><link>https://nicolevanderhoeven.com/blog/20231220-ana25-learning-about-glue-work-and-quiet-quitting/</link><pubDate>Wed, 20 Dec 2023 19:36:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231220-ana25-learning-about-glue-work-and-quiet-quitting/</guid><description>&lt;p&gt;What is glue work, and how is it linked to quiet quitting and quality engineering? In this episode of Adobo and Avocados, Vernon Richards talks to &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me about what glue work is, the dangers of quiet quitting, its implications with quality engineering, and what we can do about it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0Wqf-NZQNkY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>DevOps Culture from a Tester's Perspective (Adobo &amp; Avocados #24)</title><link>https://nicolevanderhoeven.com/blog/20231215-ana24-devops-culture-from-testers-perspective/</link><pubDate>Fri, 15 Dec 2023 17:50:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231215-ana24-devops-culture-from-testers-perspective/</guid><description>&lt;p&gt;We&amp;rsquo;ve all heard of DevOps, but what is DevOps from a tester&amp;rsquo;s perspective? How can we embrace this culture? In this episode of Adobo and Avocados, the one and only Lisa Crispin talks to my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me about DevOps culture from a testing mindset, what holistic testing is really about, and her journey to being one of the well-respected voices in the testing community.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vCjXPEV4ib4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Note-taking Templates I Use in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20231215-note-taking-templates-i-use-in-obsidian/</link><pubDate>Fri, 15 Dec 2023 17:41:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231215-note-taking-templates-i-use-in-obsidian/</guid><description>&lt;p&gt;Using note taking templates helps me reduce the unnecessary tedium of taking and making notes, and I use them liberally in Obsidian. Why should you use them? Well, in this video I&amp;rsquo;m sharing some of the actual templates that I use on a daily basis and some recommended practices for working with templates in general.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SUzRlhKFCYM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My Daily Tech for Productivity</title><link>https://nicolevanderhoeven.com/blog/20231208-my-daily-tech-for-productivity/</link><pubDate>Fri, 08 Dec 2023 17:05:50 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231208-my-daily-tech-for-productivity/</guid><description>&lt;p&gt;Here&amp;rsquo;s a list of my daily tech for work and play&amp;ndash; all the everyday tech gear I use in these categories: laptops, mobiles, tablets, ereaders, wearables, and audio. I like to get the best devices for my use cases, but I&amp;rsquo;m also willing to use multiple devices in each category if I have a need for it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dRhfq0RrSH8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You can find all the gear I talked about in this video, along with other things I use, &lt;a href="https://nicolevanderhoeven.com/gear/"&gt;on this page&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Getting Started with OpenTelemetry (Grafana Office Hours #23)</title><link>https://nicolevanderhoeven.com/blog/20231208-goh23-getting-started-with-opentelemetry/</link><pubDate>Fri, 08 Dec 2023 17:00:23 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231208-goh23-getting-started-with-opentelemetry/</guid><description>&lt;p&gt;Principal Engineer Juraci Paixão Kröhling talks to my colleague &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; and me about getting started with OpenTelemetry: what it is, why everyone&amp;rsquo;s talking about it, and how to instrument your systems and improve their reliability and observability. Juraci is a contributor to open source projects like Jaeger and OpenTelemetry.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Xhh9V7uRP88?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Refactor Notes in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20231201-how-i-refactor-notes-in-obsidian/</link><pubDate>Fri, 01 Dec 2023 12:03:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231201-how-i-refactor-notes-in-obsidian/</guid><description>&lt;p&gt;It&amp;rsquo;s not enough for me to just take notes - they have to be useful, too. Here&amp;rsquo;s how I refactor notes in Obsidian using community and core plugins to inventory, structure, categorise, explain, and modularise my notes. Refactoring isn&amp;rsquo;t just for code. It&amp;rsquo;s for notes too! It&amp;rsquo;s only through gradually updating my notes over time that I can begin to reap the benefits of continuous note-taking.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/J8-1eOzQ438?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Monitoring"&gt;Monitoring&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Coding+and+writing+are+converging"&gt;Coding and writing converging&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Core+Plugins/Quick+Switcher"&gt;Quick Switcher&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Core+Plugins/Outline"&gt;Outline&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Core+Plugins/Search"&gt;Search&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Community+Plugins/Strange+New+Worlds"&gt;Strange New Worlds&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Rw1L5sxlnuU"&gt;Readwise Official&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/gqEtn3gCZF0"&gt;ExcaliBrain&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=erKrXsIwbAg"&gt;Obsidian Excalidraw&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Community+Plugins/Note+Refactor"&gt;Note Refactor&lt;/a&gt; (notes)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to Get Started with Tempo (Grafana Office Hours #22)</title><link>https://nicolevanderhoeven.com/blog/20231201-goh22-how-to-get-started-with-tempo/</link><pubDate>Fri, 01 Dec 2023 11:55:55 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231201-goh22-how-to-get-started-with-tempo/</guid><description>&lt;p&gt;Grafana Labs Principal Engineer and Tempo maintainer Joe Elliot talks about how to get started with Tempo, what distributed tracing is, and why TraceQL is cool. He is joined by Developer Advocates Nicole van der Hoeven and Paul Balogh.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zDrA7Ly3ovU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=pUAmL28uzos"&gt;Getting started with Tempo&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/tempo"&gt;Grafana Tempo repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/tempo/latest/getting-started/"&gt;Grafana Tempo docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://community.grafana.com/c/grafana-tempo/40"&gt;The Tempo category on the Grafana community forum&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/playlist?list=PLDGkOdUX1UjrA4D1MRdAzUgEGp5UXvW3z"&gt;Video playlist for Grafana Tempo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=petbezEmIw4"&gt;Distributed tracing with Grafana Cloud k6&lt;/a&gt; (Grafana Office Hours video)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Performance Testing With Nicole van der Hoeven (Quality Bits Podcast)</title><link>https://nicolevanderhoeven.com/blog/20231128-quality-bits-performance-testing-with-nicole-van-der-hoeven/</link><pubDate>Tue, 28 Nov 2023 14:01:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231128-quality-bits-performance-testing-with-nicole-van-der-hoeven/</guid><description>&lt;p&gt;My friend Lina Zubyte invited me to her podcast Quality Bits to talk about performance testing. We talked about what performance testing is, why it is important, how to get started, and how to get better at it. We also talked about the foundation of any type of testing: empathy.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://qualitybits.buzzsprout.com/2037134/13909242-performance-testing-with-nicole-van-der-hoeven"&gt;Check out the episode here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Navigating through Unemployment with Renata Andrade (Adobo &amp; Avocados #22)</title><link>https://nicolevanderhoeven.com/blog/20231128-ana22-navigating-through-unemployment/</link><pubDate>Tue, 28 Nov 2023 13:16:15 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231128-ana22-navigating-through-unemployment/</guid><description>&lt;p&gt;With the rise of redundancies in the tech industry, how do you navigate through unemployment calmly? In this episode of Adobo and Avocados, Renata Andrade, a Quality Engineer Lead, talks to &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and me about her experience navigating unemployment and the steps she followed to bounce back.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0UlUBkAETCU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Use Flow Mode for Grafana Agent (Grafana Office Hours #21)</title><link>https://nicolevanderhoeven.com/blog/20231124-goh21-how-to-use-flow-mode-for-grafana-agent/</link><pubDate>Fri, 24 Nov 2023 11:47:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231124-goh21-how-to-use-flow-mode-for-grafana-agent/</guid><description>&lt;p&gt;Senior Software Engineer Matt Durham shows us how to use flow mode for Grafana Agent. Flow mode is a new and better way to install and configure Grafana Agent than the older &amp;ldquo;static mode&amp;rdquo;. Among other things, flow mode&amp;rsquo;s modularity makes it easier to build more complex workflows like traditional data pipelines and allows for more use cases than collecting and processing telemetry.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-_SsFLoJvoc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/agent"&gt;Grafana Agent repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/agent/latest/"&gt;Grafana Agent docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/agent/latest/flow/"&gt;Grafana Agent flow mode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtube.com/live/i0mA0w_MCPQ"&gt;What is Grafana Agent?&lt;/a&gt; (previous Grafana Office Hours video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slack.grafana.com/"&gt;Grafana Slack&lt;/a&gt; - there&amp;rsquo;s an &lt;code&gt;#agent&lt;/code&gt; channel&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/document/d/1TqaZD1JPfNadZ4V81OCBPCG_TksDYGlNlGdMnTWUSpo/edit#heading=h.jkpb8gk2r6u8"&gt;Grafana Agent Community Call agenda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/agent-modules"&gt;Modules for Grafana Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Realistic Tests with Testcontainers (Grafana Office Hours #20)</title><link>https://nicolevanderhoeven.com/blog/20231117-goh20-realistic-tests-with-testcontainers/</link><pubDate>Fri, 17 Nov 2023 11:40:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231117-goh20-realistic-tests-with-testcontainers/</guid><description>&lt;p&gt;In this episode of Grafana Office Hours, we talk about realistic unit tests utilizing actual instances of databases and other dependencies. We&amp;rsquo;ll be joined by Manuel de la Peña from AtomicJar, and Pablo Chacin from Grafana to learn how we can use the Testcontainers open-source framework to create lightweight, throwaway dependencies for our tests.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LtlRvmWzCRE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="related-links"&gt;Related links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/"&gt;Testcontainers&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/modules/k3s/"&gt;k3s Module&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://testcontainers.com/modules/k6/"&gt;k6 Module&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Minimalism in Software Testing with Lina Zubyte (Adobo &amp; Avocados #21)</title><link>https://nicolevanderhoeven.com/blog/20231115-ana21-minimalism-in-software-testing/</link><pubDate>Wed, 15 Nov 2023 13:13:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231115-ana21-minimalism-in-software-testing/</guid><description>&lt;p&gt;How can we apply minimalism in software testing? Lina Zubyte, an Independent Quality Consultant, talks to &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I about what really matters in testing, why empathy is at the root of the testing attitude, and how we can incorporate principles from minimalism to improve quality.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VQQFFVXg-Do?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Testing on Kubernetes with k6 Private Load Zones (Grafana Office Hours #19)</title><link>https://nicolevanderhoeven.com/blog/20231110-goh19-load-testing-on-kubernetes-with-k6-private-load-zones/</link><pubDate>Fri, 10 Nov 2023 10:46:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231110-goh19-load-testing-on-kubernetes-with-k6-private-load-zones/</guid><description>&lt;p&gt;This week, we&amp;rsquo;re talking about how you can do load testing on Kubernetes with k6 Private Load Zones, a new feature on Grafana Cloud k6 that leverages the k6 Kubernetes operator to allow you to run distributed load tests against applications behind a firewall. Here to discuss this new feature are Senior Software Engineer Olha Yevtushenko, Product Manager Daniel González Lopes, Developer Advocate Paul Balogh, and Senior Developer Advocate Nicole van der Hoeven.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/RXLavQT58YA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="related-links"&gt;Related links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6"&gt;The Grafana k6 repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6-operator"&gt;k6 operator repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/k6/author-run/private-load-zone-v2/"&gt;Docs on Private Load Zones in Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Learning about experience design with Jenna Charlton (Adobo &amp; Avocados #20)</title><link>https://nicolevanderhoeven.com/blog/20231108-ana20-learning-about-experience-design/</link><pubDate>Wed, 08 Nov 2023 13:01:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231108-ana20-learning-about-experience-design/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with fellow Developer Advocate Jenna Charlton, where they talk about their career journey, what can we learn from experience design, and the impact of different job titles to testers.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/aooYirC-meo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Creating Characters in TTRPGs (Beyond the Character Sheet #01)</title><link>https://nicolevanderhoeven.com/blog/20231105-bcs01-creating-characters-in-ttrpgs/</link><pubDate>Sun, 05 Nov 2023 13:33:17 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231105-bcs01-creating-characters-in-ttrpgs/</guid><description>&lt;p&gt;In this first episode of Beyond the Character Sheet, &lt;a href="https://leahferguson.com"&gt;Leah Ferguson&lt;/a&gt; and I talk about creating characters in TTRPGs: how to create a character you love, how it works in different systems, and the interplay between player personality and character personality.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZJZA01rgaxs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Combining Frontend and Backend Performance With John Hill (Grafana Office Hours #18)</title><link>https://nicolevanderhoeven.com/blog/20231103-goh18-combining-frontend-and-backend-performance-with-john-hill/</link><pubDate>Fri, 03 Nov 2023 12:30:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231103-goh18-combining-frontend-and-backend-performance-with-john-hill/</guid><description>&lt;p&gt;In this episode of Grafana Office Hours, my colleagues &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt;, &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt;, and I talk to John Hill, a Web UI Test Engineer and Grafana k6 champion, to talk about how the Grafana and k6 ecosystems can be used to ensure performance in mission-critical applications like NASA&amp;rsquo;s Open MCT.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8Z67vAkv3J0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Becoming an accessibility advocate with Erin Crise (Adobo &amp; Avocados #19)</title><link>https://nicolevanderhoeven.com/blog/20231101-ana19-becoming-an-accessibility-advocate-with-erin-crise/</link><pubDate>Wed, 01 Nov 2023 12:22:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231101-ana19-becoming-an-accessibility-advocate-with-erin-crise/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I speak with Erin Crise about her tech career journey, what led to her accessibility advocacy, and why empathy drives innovation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZCr_z9ii4Io?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>K-SIX News v0.47</title><link>https://nicolevanderhoeven.com/blog/20231030-ksix-news-0_47/</link><pubDate>Mon, 30 Oct 2023 11:57:21 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20231030-ksix-news-0_47/</guid><description>&lt;p&gt;In this video, my colleagues (&lt;a href="https://www.srperf.com/"&gt;Leandro Melendez&lt;/a&gt;, &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt;, and &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt;) and I discuss the latest updates in k6 v0.47.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/iUwSgJgJBAI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Here are some of the highlights:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;ve created an official &lt;a href="https://grafana.com/grafana/dashboards/19665-k6-prometheus/"&gt;k6 Prometheus Grafana dashboard&lt;/a&gt; and &lt;a href="https://grafana.com/grafana/dashboards/18030-k6-prometheus-native-histograms/"&gt;another dashboard for Prometheus with native histograms&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;New APIs have been added for Prometheus Remote Write output for k6 (authentication and HTTP headers).&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve increased the character limit for metric names from 63 to 128, aligned with the OpenTelemetry specification update.&lt;/li&gt;
&lt;li&gt;k6 browser tests can be executed in Grafana Cloud by everyone.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve improved the cookie API for k6 browser.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ve added support for &lt;code&gt;page.on('console')&lt;/code&gt; for k6 browser.&lt;/li&gt;
&lt;li&gt;There are now official Docker images that include a Chromium-based browser for running k6 browser tests within CI/CD pipelines.&lt;/li&gt;
&lt;li&gt;Distributed tracing is in public preview for Grafana Cloud.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/avitalique/xk6-file"&gt;xk6-file&lt;/a&gt; is a new extension that lets you rename files within your k6 script.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/deejiw/xk6-gcp"&gt;xk6-gcp&lt;/a&gt; is a new extension that adds k6 support for messaging using Google PubSub.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-dashboard"&gt;xk6-dashboard&lt;/a&gt; is now an official Grafana extension that lets you generate HTML dashboards from k6 test results.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/szkiba/k6x"&gt;k6x&lt;/a&gt; is a new utility that automatically detects when you import k6 extensions and builds the custom k6 binary for you so that you don&amp;rsquo;t have to.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6-operator"&gt;k6-operator&lt;/a&gt; now has a Helmchart deployment option.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Real User Monitoring With Grafana Faro (Grafana Office Hours #17)</title><link>https://nicolevanderhoeven.com/blog/20231027-goh17-real-user-monitoring-with-grafana-faro/</link><pubDate>Fri, 27 Oct 2023 07:00:19 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231027-goh17-real-user-monitoring-with-grafana-faro/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with Software Engineers Kostas Pelelis and Marco Schaefer to discuss what Grafana Faro is, why it&amp;rsquo;s important to have a real user monitoring solution, and how to get started with it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/lUYj28znIu8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-applications/frontend-observability/"&gt;Frontend observability docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/faro-web-sdk"&gt;Grafana Faro repo&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Emergent Load Testing - TestCon Europe 2023</title><link>https://nicolevanderhoeven.com/blog/20231025-emergent-load-testing-testconeu/</link><pubDate>Wed, 25 Oct 2023 20:05:36 +0300</pubDate><guid>https://nicolevanderhoeven.com/blog/20231025-emergent-load-testing-testconeu/</guid><description>&lt;p&gt;I presented at &lt;a href="https://testcon.lt/"&gt;TestCon Europe 2023&lt;/a&gt; in Vilnius, Lithuania about emergent load testing, and how to use it to find the limits of your system. My talk was called &lt;a href="https://events.pinetool.ai/3078/#sessions/100686?referrer%5Bpathname%5D=%2Fsessions&amp;amp;referrer%5Bsearch%5D=&amp;amp;referrer%5Btitle%5D=Sessions"&gt;Emergent load testing: Rules for Organized Chaos&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can find the slides &lt;a href="https://slides.nicolevanderhoeven.com/2023-emergent-load-testing-testconeu/"&gt;here&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/JUJ_0079.jpg" alt="Me speaking at TestCon Europe 2023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/JUJ_0102.jpg" alt="Portrait snapshot of me presenting at TestCon Europe 2023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/JUJ_0193.jpg" alt="Wide shot of me talking about agency, feedback, and affordances" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/JUJ_0208.jpg" alt="Me at the podium at TestCon Europe 2023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Inspiring others and fuelling your passion with Jonah Andersson (Adobo &amp; Avocados #18)</title><link>https://nicolevanderhoeven.com/blog/20231023-ana18-inspiring-others-and-fuelling-your-passion/</link><pubDate>Tue, 24 Oct 2023 20:00:53 +0300</pubDate><guid>https://nicolevanderhoeven.com/blog/20231023-ana18-inspiring-others-and-fuelling-your-passion/</guid><description>&lt;p&gt;In this episode of Adobo &amp;amp; Avocados, my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with Jonah Andersson, a Software Developer, Cloud &amp;amp; DevOps Engineer, and the founder of Azure User Group Sweden. We spoke about her career journey and how she is fuelling her passion and inspiring others.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bO67fbpFRJM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What is Grafana Agent? (Grafana Office Hours #16)</title><link>https://nicolevanderhoeven.com/blog/20231020-goh16-what-is-grafana-agent/</link><pubDate>Fri, 20 Oct 2023 12:55:11 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231020-goh16-what-is-grafana-agent/</guid><description>&lt;p&gt;What is Grafana Agent? Senior Software Engineer Paschalis Tsilias tells us about what telemetry collectors do, why they&amp;rsquo;re useful, what you&amp;rsquo;d have to do without them, and how to get started with Grafana Agent. He is joined by Developer Advocates Nicole van der Hoeven and Paul Balogh.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/i0mA0w_MCPQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="useful-links"&gt;Useful links&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/agent"&gt;Grafana Agent repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/agent/"&gt;Documentation on Grafana Agent&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Having a coaching mindset with Kulas Angeles (Adobo &amp; Avocados #17)</title><link>https://nicolevanderhoeven.com/blog/20231018-ana17-having-a-coaching-mindset/</link><pubDate>Wed, 18 Oct 2023 12:27:16 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231018-ana17-having-a-coaching-mindset/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with &lt;a href="https://kulasangeles.com/"&gt;Kulas Angeles&lt;/a&gt;, a DevOps coach and Quality Engineering leader, about his career journey and how he transitioned from engineering to coaching mindset.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/K9jQ7HEo5bw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Agentless Monitoring for Prometheus in Grafana Cloud (Grafana Office Hours #15)</title><link>https://nicolevanderhoeven.com/blog/20231013-goh15-agentless-monitoring-for-prometheus-in-grafana-cloud/</link><pubDate>Fri, 13 Oct 2023 10:56:15 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231013-goh15-agentless-monitoring-for-prometheus-in-grafana-cloud/</guid><description>&lt;p&gt;Did you know you could do agentless monitoring for Prometheus in Grafana Cloud? Senior Software Engineer Matt Nolf talks to me and my coworker &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; about the new Metrics Endpoint integration and how you can use it to collect Prometheus metrics from publicly addressable hosts&amp;ndash; WITHOUT using Grafana Agent.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EYR5lQJ_kG8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/monitor-infrastructure/integrations/integration-reference/integration-metrics-endpoint/"&gt;Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/2023/09/21/introducing-agentless-monitoring-for-prometheus-in-grafana-cloud/"&gt;Blog post&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Investing in yourself with Nicola Lindgren (Adobo &amp; Avocados #16)</title><link>https://nicolevanderhoeven.com/blog/20231011-ana16-investing-in-yourself/</link><pubDate>Wed, 11 Oct 2023 11:52:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231011-ana16-investing-in-yourself/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I talked with &lt;a href="https://nicolalindgren.com/"&gt;Nicola Lindgren&lt;/a&gt; about different ways we&amp;rsquo;ve all invested in ourselves and our career&amp;ndash; and how you can do the same.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/x9g1k7SvFjg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Distributed tracing with Grafana Cloud k6 (Grafana Office Hours #14)</title><link>https://nicolevanderhoeven.com/blog/20231007-goh14-distributed-tracing-with-grafana-cloud-k6/</link><pubDate>Sat, 07 Oct 2023 08:31:03 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231007-goh14-distributed-tracing-with-grafana-cloud-k6/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I interview Senior Software Engineer Łukasz Gut about a new feature: Distributed Tracing with Grafana Cloud k6. He discusses what distributed tracing is, why it matters, and how it can help teams find reliability issues faster.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/petbezEmIw4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The Role of AI in Gender Equality with Nicola Martin (Adobo &amp; Avocados #15)</title><link>https://nicolevanderhoeven.com/blog/20231004-ana15-the-role-of-ai-in-gender-equality/</link><pubDate>Wed, 04 Oct 2023 17:26:14 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20231004-ana15-the-role-of-ai-in-gender-equality/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with &lt;a href="https://linktr.ee/nlmit"&gt;Nicola Martin&lt;/a&gt;, Head of Quality Engineering at Adarga, to talk about the role of AI, technology, and education in gender equality.&lt;/p&gt;
&lt;p&gt;Nicola is a Council and Committee Member for the British Computer Society and WomenTech Global Network. She is also a mentor, speaker, and panelist speaking on subjects such as AI and quality, software testing, and diversity in tech.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yoErbu09AGw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Deploy Grafana on Kubernetes (Grafana Office Hours #13)</title><link>https://nicolevanderhoeven.com/blog/20230929-goh13-how-to-deploy-grafana-on-kubernetes/</link><pubDate>Fri, 29 Sep 2023 17:30:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230929-goh13-how-to-deploy-grafana-on-kubernetes/</guid><description>&lt;p&gt;My coworker Usman Ahmad and I talk about how to deploy Grafana on Kubernetes for beginners: what Kubernetes is, how it&amp;rsquo;s an evolution of distributed computing, what its relationship to Docker is, other things you might need to know to work with Kubernetes, and how you can deploy Grafana on your own Kubernetes clusters.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DEv5wtZxNCk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Documentation on how to deploy Grafana on Kubernetes &lt;a href="https://grafana.com/docs/grafana/latest/setup-grafana/installation/kubernetes/"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Easiest way to share a note on Obsidian - Obsius Publish plugin</title><link>https://nicolevanderhoeven.com/blog/20230929-easiest-way-to-share-a-note-on-obsidian/</link><pubDate>Fri, 29 Sep 2023 17:11:21 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230929-easiest-way-to-share-a-note-on-obsidian/</guid><description>&lt;p&gt;Obsius Publish is a new Obsidian plugin that lets you share a note on Obsidian for free. It&amp;rsquo;s best used as a complement to Obsidian Publish in that it particularly shines when wanting to share notes temporarily. Obsius Publish is a third-party community plugin that adds commands to Obsidian to let you push the contents of a note to Obsius and gives you a shareable link to make the note accessible over the internet.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-5RO4Xsw9Ec?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ko-fi.com/jonstodle"&gt;Support the developer&lt;/a&gt; of Obsius Publish, Jon G Stødle&lt;/li&gt;
&lt;li&gt;Thanks to my friend &lt;a href="https://polaine.com"&gt;Andy Polaine&lt;/a&gt; for telling me about Obsius Publish&lt;/li&gt;
&lt;li&gt;&lt;a href="https://courses.nicolevanderhoeven.com/o4e"&gt;Obsidian for Everyone&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Modernizing government documents with Govable and Grafana (Grafana Office Hours #12)</title><link>https://nicolevanderhoeven.com/blog/20230922-goh12-modernizing-government-documents-with-govable-and-grafana/</link><pubDate>Fri, 22 Sep 2023 21:01:39 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230922-goh12-modernizing-government-documents-with-govable-and-grafana/</guid><description>&lt;p&gt;Ari Hershowitz and Andrii Kovalov from Govable.ai talk about modernizing government documents with Govable and Grafana, and how they saved weeks of effort by using Grafana as a ready-made frontend for their clients. They are joined by Developer Advocates Nicole van der Hoeven and Paul Balogh from Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fodMyzisa6s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The benefits and dangers of public speaking (Adobo &amp; Avocados #14)</title><link>https://nicolevanderhoeven.com/blog/20230919-ana14-benefits-and-dangers-of-public-speaking/</link><pubDate>Tue, 19 Sep 2023 21:40:43 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230919-ana14-benefits-and-dangers-of-public-speaking/</guid><description>&lt;p&gt;In this episode of Adobo and Avocados, my friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with &lt;a href="https://maaretp.com/"&gt;Maaret Pyhäjärvi&lt;/a&gt;, a Development Manager and Testing Specialist who has shared countless resources about exploratory testing. We talk about her journey to tech, the benefits and dangers of public speaking, and her approach to testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/P4LKvoFxfm0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Winning over imposter syndrome with Sophie Küster (Adobo &amp; Avocados #13)</title><link>https://nicolevanderhoeven.com/blog/20230912-ana13-winning-over-imposter-syndrome/</link><pubDate>Tue, 12 Sep 2023 21:38:15 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230912-ana13-winning-over-imposter-syndrome/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I chat with &lt;a href="https://www.linkedin.com/in/sophie-k%C3%BCster-1901b4149/"&gt;Sophie Küster&lt;/a&gt;, who currently works as a Test Automation Engineer, all about imposter syndrome.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZOHjfiTkgD0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Celebrating 100 episodes of k6 Office Hours (k6 Office Hours #100)</title><link>https://nicolevanderhoeven.com/blog/20230908-koh100-celebrating-100-episodes-of-koh/</link><pubDate>Fri, 08 Sep 2023 20:56:43 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230908-koh100-celebrating-100-episodes-of-koh/</guid><description>&lt;p&gt;In this 100th episode of k6 Office Hours, the Grafana Developer Advocates celebrate how it all started! Join us at this live fika with our favorite drinks and discuss our favorite moments and episodes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OVanapEZYFM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Grafana k6 for WebSockets and infrastructure testing (Grafana Office Hours #11)</title><link>https://nicolevanderhoeven.com/blog/20230908-goh11-grafana-k6-for-websockets-and-infrastructure-testing/</link><pubDate>Fri, 08 Sep 2023 20:54:28 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230908-goh11-grafana-k6-for-websockets-and-infrastructure-testing/</guid><description>&lt;p&gt;In this episode of Grafana Office Hours, Solution Architect &lt;a href="https://www.youtube.com/@huzaifaasif8580"&gt;Huzaifa Asif&lt;/a&gt; talks about how he has used Grafana k6 for WebSockets and infrastructure testing, and how k6 can be used for general reliability testing in addition to load testing. He is joined by Grafana Labs Developer Advocates Nicole van der Hoeven and Paul Balogh.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_V81Xm22l_c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Setting boundaries, time management, and essentialism (Adobo &amp; Avocados #12)</title><link>https://nicolevanderhoeven.com/blog/20230906-ana12-setting-boundaries-time-management-essentialism/</link><pubDate>Wed, 06 Sep 2023 21:34:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230906-ana12-setting-boundaries-time-management-essentialism/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I discuss setting boundaries and managing time. We also discuss what essentialism is and why less is better.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/R8-33cFfPeY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Get the Essentialism book &lt;a href="https://amzn.to/48nDdpb"&gt;here&lt;/a&gt; (affiliate link).&lt;/p&gt;</description></item><item><title>How to learn Grafana with Grafana Play (Grafana Office Hours #10)</title><link>https://nicolevanderhoeven.com/blog/20230901-goh10-how-to-learn-grafana-with-grafana-play/</link><pubDate>Fri, 01 Sep 2023 20:50:02 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230901-goh10-how-to-learn-grafana-with-grafana-play/</guid><description>&lt;p&gt;If you were wondering how to learn Grafana, &lt;a href="https://play.grafana.com"&gt;Grafana Play&lt;/a&gt; is probably the easiest way. Grafana Play is a collection of ready-made dashboards and apps that you can use without creating an account. Developer Advocates Matt Abrams, Paul Balogh, and Nicole van der Hoeven discuss how to take advantage of this awesome tool and what you can do with it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fqs8Y1IDzYY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Getting started with Grafana Loki (Grafana Office Hours #09)</title><link>https://nicolevanderhoeven.com/blog/20230825-goh09-getting-started-with-grafana-loki/</link><pubDate>Fri, 25 Aug 2023 20:41:32 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230825-goh09-getting-started-with-grafana-loki/</guid><description>&lt;p&gt;Senior Principal Solutions Engineer &lt;a href="https://www.linkedin.com/in/wardbekker/"&gt;Ward Bekker&lt;/a&gt; talks about getting started with Grafana Loki: what Loki is, why you need log aggregation, and how it fits into the rest of the Grafana stack. He is joined by Developer Advocates Paul Balogh and Nicole van der Hoeven to tell you everything you need to know about Loki.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OLebNPLIJMI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What's new in k6 browser? (k6 Office Hours #98)</title><link>https://nicolevanderhoeven.com/blog/20230811-koh98-whats-new-in-k6-browser/</link><pubDate>Fri, 11 Aug 2023 20:37:25 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230811-koh98-whats-new-in-k6-browser/</guid><description>&lt;p&gt;k6 browser adds browser-level APIs to automate browser actions and collect web performance metrics as part of your k6 test. It&amp;rsquo;s an experimental module, and there is a good reason why!&lt;/p&gt;
&lt;p&gt;In this k6 Office Hours, Developer Advocates Marie Cruz and Nicole van der Hoeven are joined by Software Engineers Ankur Agarwal and Daniel Jimenez to discuss the breaking changes that are about to come to k6 browser! You wouldn&amp;rsquo;t want to miss this.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d614EQjPzew?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Observing the Internet of Things (Grafana Office Hours #08)</title><link>https://nicolevanderhoeven.com/blog/20230811-goh08-observing-an-internet-of-things/</link><pubDate>Fri, 11 Aug 2023 20:31:53 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230811-goh08-observing-an-internet-of-things/</guid><description>&lt;p&gt;My colleague &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; and I welcomed &lt;a href="https://danielmangum.com/"&gt;Daniel Mangum&lt;/a&gt;, Lead Cloud Engineer from &lt;a href="https://golioth.io"&gt;Golioth&lt;/a&gt;. We learned how Golioth uses Grafana to report data from varied sensors and monitors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xMd0pT0ZjUY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Navigating parenthood with Laveena Ramchandani (A&amp;A #11)</title><link>https://nicolevanderhoeven.com/blog/20230807-ana11-navigating-parenthood-with-laveena-ramchandani/</link><pubDate>Mon, 07 Aug 2023 21:30:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230807-ana11-navigating-parenthood-with-laveena-ramchandani/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I speak to &lt;a href="https://laveenaramchandani01.medium.com/"&gt;Laveena Ramchandani&lt;/a&gt;, a Digital and Data Science Test Manager at easyJet and also a Digital Star finalist, speaker, blogger, and coach. Laveena talks about her career journey and her journey to parenthood.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/YiGfyQU6IZo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to get started with Grafana and Docker (Grafana Office Hours #07)</title><link>https://nicolevanderhoeven.com/blog/20230803-goh07-how-to-get-started-with-grafana-and-docker/</link><pubDate>Thu, 03 Aug 2023 20:28:40 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230803-goh07-how-to-get-started-with-grafana-and-docker/</guid><description>&lt;p&gt;My colleague Usman Ahmad and I talk about how to use Docker to quickly get up and running with Grafana, how to add Grafana plugins, and how to troubleshoot common issues.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FlDfcMbSLXs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Grafana documentation on &lt;a href="https://grafana.com/docs/grafana/latest/setup-grafana/installation/docker/"&gt;how to install Grafana on Docker here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Making a career and being true to yourself with Lena Pejgan Nyström (Adobo &amp; Avocados #10)</title><link>https://nicolevanderhoeven.com/blog/20230728-ana10-making-a-career-and-being-true-to-yourself/</link><pubDate>Fri, 28 Jul 2023 21:25:02 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230728-ana10-making-a-career-and-being-true-to-yourself/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I speak to Lena Pejgan Nyström, the author and creator of &lt;a href="https://pejgan.se/WHRI.htm"&gt;Would Heu-risk it?&lt;/a&gt; cards and book about various topics!&lt;/p&gt;
&lt;p&gt;Lena opens up about how she got started in tech and her career journey from being a developer turned tester and now an Engineering Manager as well as an international keynote speaker! We also discuss topics such as diversity in tech, dealing with burnout, and any struggles Lena experienced between making a career and being true to her personal beliefs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sD6XOpuV0ow?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>OpenTelemetry demo app with Grafana, Tempo, Loki, and Prometheus (Grafana Office Hours #06)</title><link>https://nicolevanderhoeven.com/blog/20230728-goh06-open-telemetry-demo-app-with-grafana-tempo-loki-prometheus/</link><pubDate>Fri, 28 Jul 2023 20:25:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230728-goh06-open-telemetry-demo-app-with-grafana-tempo-loki-prometheus/</guid><description>&lt;p&gt;DevOps &lt;a href="https://www.linkedin.com/in/blueswen/"&gt;Engineer Blueswen Liu&lt;/a&gt; 劉義瑋 joins us to walk us through some OpenTelemetry demo apps he created, instrumented with Grafana, Loki, Prometheus, and Tempo.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dXR8WNm5uos?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Obsidian properties in YAML frontmatter (v1.4)</title><link>https://nicolevanderhoeven.com/blog/20230726-obsidian-properties-in-yaml/</link><pubDate>Wed, 26 Jul 2023 20:05:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230726-obsidian-properties-in-yaml/</guid><description>&lt;p&gt;If you&amp;rsquo;ve ever tried to use Obsidian properties in YAML frontmatter, you may have noticed some issues. Obsidian v1.4 brings a new UI for properties that may just solve some of those, including the difficulty in keeping frontmatter properties and keys consistent.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/RrxqkIhh9L8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://obsidian.md/pricing"&gt;Sign up&lt;/a&gt; for early access to all Obsidian releases&lt;/li&gt;
&lt;li&gt;&lt;a href="https://obsidian.md/changelog/2023-07-26-desktop-v1.4.0/"&gt;Full changelog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/JTObSymEvWA"&gt;How to use the Dataview plugin&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/5j9fAvJCaig"&gt;How to use the Templater plugin&lt;/a&gt; (video)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>All the Obsidian Core Plugins (Obsidian Tour 2023)</title><link>https://nicolevanderhoeven.com/blog/20230721-all-the-obsidian-core-plugins-2023/</link><pubDate>Fri, 21 Jul 2023 20:02:59 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230721-all-the-obsidian-core-plugins-2023/</guid><description>&lt;p&gt;Lost in all the Obsidian core plugins? Here&amp;rsquo;s a video that goes through every single one of them: which ones I&amp;rsquo;ve left enabled, which ones I&amp;rsquo;ve disabled, and which community plugins I use instead. This &amp;ldquo;Obsidian Tour&amp;rdquo; series is about showing MY personal setup of Obsidian, not the &amp;ldquo;best&amp;rdquo; one. I&amp;rsquo;m hoping that sharing how I use these plugins will help you decide whether or not they could fit in your workflows, too.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/RJW3kXErkJk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/obsidian-playbook/Obsidian+Plugins/Core+Plugins/Core+plugins"&gt;All the core Obsidian plugins, in text&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/SVlMpzaAAT0"&gt;Bookmarks plugin&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/rPescoJzcFA"&gt;Canvas plugin&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/5Uxj0XgMp0k"&gt;Periodic Notes community plugin&lt;/a&gt; (video)&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Why monoculture is problematic for quality with Callum Akehurst-Ryan (Adobo &amp; Avocados #9)</title><link>https://nicolevanderhoeven.com/blog/20230719-ana09-why-a-monoculture-in-tech-is-a-bad-thing/</link><pubDate>Wed, 19 Jul 2023 21:16:32 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230719-ana09-why-a-monoculture-in-tech-is-a-bad-thing/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I speak to Callum-Akehurst Ryan about his experience as an LGBTQIA+ software tester, the importance of diversity and inclusion, and how it can improve testing and quality.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Xdpyf4XNdTs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Marie Cruz and Callum Akehurst-Ryan&amp;rsquo;s joint presentation on &lt;a href="https://www.youtube.com/watch?v=XQn0WdHbVtg"&gt;Testing in Story Shaping&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Distributed tracing for testing with Grafana Tempo and Tracetest (Grafana Office Hours #05)</title><link>https://nicolevanderhoeven.com/blog/20230714-goh05-distributed-tracing-for-testing-with-grafana-tempo-and-tracetest/</link><pubDate>Fri, 14 Jul 2023 20:21:30 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230714-goh05-distributed-tracing-for-testing-with-grafana-tempo-and-tracetest/</guid><description>&lt;p&gt;In this video, my colleague &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; and I welcomed &lt;a href="https://danielmangum.com/"&gt;Daniel Mangum&lt;/a&gt;, Lead Cloud Engineer from &lt;a href="https://golioth.io"&gt;Golioth&lt;/a&gt;. We learn how Golioth uses Grafana to report data from varied sensors and monitors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oJ0wdneD8Po?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Taking notes on podcasts with Snipd, Readwise, and Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230714-taking-notes-on-podcasts-with-snipd/</link><pubDate>Fri, 14 Jul 2023 15:55:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230714-taking-notes-on-podcasts-with-snipd/</guid><description>&lt;p&gt;In this video, I show you my favorite method for taking notes on podcasts with Snipd, Readwise, and Obsidian: three tools that work very well together. Snipd is a mobile podcast player app for iOS and Android that integrates with Readwise. With the Readwise Official plugin for Obsidian, that means my highlights and notes from podcasts end up automatically in my Obsidian vault, tagged appropriately.&lt;/p&gt;
&lt;h2 id="resources"&gt;RESOURCES&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.snipd.com/ai-podcast-notes?invitationCode=NICOLE"&gt;Snipd AI Podcast Notes wishlist&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.snipd.com"&gt;Snipd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://share.snipd.com/episode-takeaways/6eb18522-d1f3-4a09-aa81-d6a07bd9f770"&gt;Sample AI podcast notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@CalNewportMedia - Deep Questions - &lt;a href="https://www.youtube.com/watch?v=Udzf5F1GPME"&gt;The Failure of Cybernetic Productivity&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@CalNewportMedia - Deep Questions - &lt;a href="https://www.youtube.com/watch?v=EoWlWIUJyPQ"&gt;Decoding Overhead&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@masteringdungeons - &lt;a href="https://www.youtube.com/watch?v=hFsCanZZ-gU"&gt;Mike Shea on Organized Play vs Home Games&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The Informed Life - &lt;a href="https://theinformed.life/2020/06/21/episode-38-andy-polaine/"&gt;Andy Polaine on Service Design&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ierImyE5pgU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What does an overloaded system look like for humans? (Adobo &amp; Avocados #08)</title><link>https://nicolevanderhoeven.com/blog/20230712-ana08-what-does-an-overloaded-system-look-like-for-humans/</link><pubDate>Wed, 12 Jul 2023 21:13:41 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230712-ana08-what-does-an-overloaded-system-look-like-for-humans/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I talk about burnout from a more technical point of view. We discuss how burnout is similar to an overloaded system (and how it isn&amp;rsquo;t), and we draw comparisons on how to make an overloaded system more resilient and recover from burnout.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OEKFl_tYeIE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>When Productivity Gets Toxic, with Andy Polaine</title><link>https://nicolevanderhoeven.com/blog/20230707-when-productivity-gets-toxic/</link><pubDate>Fri, 07 Jul 2023 22:03:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230707-when-productivity-gets-toxic/</guid><description>&lt;p&gt;We usually see productivity as a positive thing, but what happens when productivity gets toxic? According to my friend &lt;a href="https://polaine.com"&gt;Andy Polaine&lt;/a&gt;, design leadership coach, burnout can occur when you&amp;rsquo;ve been doing more than you used to, struggling with the work, and feeling like you can&amp;rsquo;t say anything to anyone. In this video, Andy shares some tips for setting up boundaries to create mental space and defending your calendar against external pressures.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/suNrD8PVDXU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Check out Andy&amp;rsquo;s work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://polaine.com"&gt;Andy&amp;rsquo;s website&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Reach out about getting coaching from Andy &lt;a href="https://www.polaine.com/coaching/"&gt;here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Andy&amp;rsquo;s podcast, &lt;a href="https://www.polaine.com/tags/power-of-ten/"&gt;Power of Ten&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Andy&amp;rsquo;s newsletter, &lt;a href="https://newsletter.polaine.com/"&gt;Doctor&amp;rsquo;s Note&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Andy&amp;rsquo;s upcoming book, &lt;a href="http://pln.me/dip-book"&gt;The Design Leadership Dip&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Monitor behind a Firewall With Private Data Source Connect (Grafana Office Hours #04)</title><link>https://nicolevanderhoeven.com/blog/20230707-goh04-monitor-behind-a-firewall-with-private-data-source-connect/</link><pubDate>Fri, 07 Jul 2023 21:59:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230707-goh04-monitor-behind-a-firewall-with-private-data-source-connect/</guid><description>&lt;p&gt;How do you monitor behind a firewall? With Grafana Cloud Private Data Connect, you can create a secure tunnel to query data sources, even including those in VPCs on public cloud vendors. Senior Software Engineers Stephanie Hingtgen and Georges Chaudy talk to me about how it works.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9oPe1IICE80?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Quality Engineering, DevOps, and work-life balance (Adobo &amp; Avocados #07)</title><link>https://nicolevanderhoeven.com/blog/20230706-ana07-quality-engineering-with-katja-obring/</link><pubDate>Thu, 06 Jul 2023 21:55:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230706-ana07-quality-engineering-with-katja-obring/</guid><description>&lt;p&gt;Developer Advocates Marie Cruz and I talk to Katja Obring, an experienced Quality Engineering Coach, about her experience in tech and moving to freelance for better work-life balance. We also talk about her book, &amp;ldquo;Testing in DevOps: A Guide to Optimised Testing for Speedy and High Quality Delivery,&amp;rdquo; and how Testing fits in the overall DevOps landscape, the importance of automated testing, and the cultural changes crucial to DevOps.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bjrZst8Flm0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Why Representation Matters (Adobo &amp; Avocados #06)</title><link>https://nicolevanderhoeven.com/blog/20230701-ana06-why-representation-matters/</link><pubDate>Sat, 01 Jul 2023 15:08:51 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230701-ana06-why-representation-matters/</guid><description>&lt;p&gt;My friend Marie Cruz and I talk to Parveen Khan about her experience in tech and the importance of diversity and inclusion. Parveen is a Senior QA Consultant at Thoughtworks, a quality advocate, and an international speaker.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sdaK-iv_bHE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Every Single Plugin I Use (Obsidian Tour 2023)</title><link>https://nicolevanderhoeven.com/blog/20230630-every-single-plugin-i-use-obsidian-tour-2023/</link><pubDate>Fri, 30 Jun 2023 23:39:17 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230630-every-single-plugin-i-use-obsidian-tour-2023/</guid><description>&lt;p&gt;In this video, I talk about all the Obsidian plugins I currently use&amp;hellip; all 46 of them. I demonstrate some of them, talk about why I didn&amp;rsquo;t keep others, and talk through my use cases for each one. These plugins aren&amp;rsquo;t necessarily the best ones out there for Obsidian - they&amp;rsquo;re just the ones that are useful enough for my use cases to have them installed on a daily basis.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3UMncGbocAU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Recording a Performance Test With Grafana Cloud k6 (k6 Office Hours #93)</title><link>https://nicolevanderhoeven.com/blog/20230630-koh93-recording-a-performance-test-with-grafana-cloud-k6/</link><pubDate>Fri, 30 Jun 2023 23:33:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230630-koh93-recording-a-performance-test-with-grafana-cloud-k6/</guid><description>&lt;p&gt;Senior Frontend Engineer Edvinas Daugirdas demonstrates recording a performance test with Grafana Cloud k6 and some other new features that have recently come to Grafana Cloud. He is joined by Developer Advocates Marie Drake and Nicole van der Hoeven to talk about getting started with k6 for free.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CZRyiQN7ht4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Changes to Grafana Plugins in Grafana 10 (Grafana Office Hours #03)</title><link>https://nicolevanderhoeven.com/blog/20230629-goh03-changes-to-grafana-plugins-in-grafana-10/</link><pubDate>Thu, 29 Jun 2023 23:29:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230629-goh03-changes-to-grafana-plugins-in-grafana-10/</guid><description>&lt;p&gt;Grafana 10 is fresh off the presses, and it includes some important changes to Grafana plugins that any plugin developer or user will want to know. Senior Product Manager David Harris chats to me about all the new features available to plugins (including the new Scenes framework) and some breaking changes to legacy plugins.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MliUlT3UNdM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>From Load Testing to Reliability Testing Tool (k6 Office Hours #92)</title><link>https://nicolevanderhoeven.com/blog/20230623-koh92-from-load-testing-to-reliability-testing-tool/</link><pubDate>Fri, 23 Jun 2023 23:43:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230623-koh92-from-load-testing-to-reliability-testing-tool/</guid><description>&lt;p&gt;In this k6 Office Hours, Developer Advocates Nicole van der Hoeven and Marie Cruz talk about the evolution of k6 from a load testing tool to a reliability testing tool. They also demonstrate how to combine various modules and extensions with k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/N2x94S_3mNE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Structure My Obsidian Vault (Obsidian Tour 2023)</title><link>https://nicolevanderhoeven.com/blog/20230623-how-i-structure-my-obsidian-vault-obsidian-tour-2023/</link><pubDate>Fri, 23 Jun 2023 18:00:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230623-how-i-structure-my-obsidian-vault-obsidian-tour-2023/</guid><description>&lt;p&gt;Here&amp;rsquo;s how I structure my Obsidian vault using tags, folders, links, metadata (used in conjunction with Dataview queries), and bookmarks. This is an Obsidian tour of my main vault, and we&amp;rsquo;re starting with organization. As with anything on this channel, don&amp;rsquo;t take what you see here as gospel. I&amp;rsquo;m just sharing my approach in case it sparks ideas for some of you.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vAwS-js2iB0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Do Appearances Matter in Tech (Adobo &amp; Avocados #05)</title><link>https://nicolevanderhoeven.com/blog/20230623-ana05-do-appearances-matter-in-tech/</link><pubDate>Fri, 23 Jun 2023 15:03:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230623-ana05-do-appearances-matter-in-tech/</guid><description>&lt;p&gt;My fellow Developer Advocate Marie Cruz and I talk to Imma Valls, a community support engineer who works with us at Grafana Labs, about image biases that people might have, whether that’s piercings, tattoos, or hair dye!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/B4jg_UiO7_g?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What Is Grafana Scenes? with Torkel Ödegaard (Grafana Office Hours #02)</title><link>https://nicolevanderhoeven.com/blog/20230619-goh02-what-is-grafana-scenes/</link><pubDate>Mon, 19 Jun 2023 23:03:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230619-goh02-what-is-grafana-scenes/</guid><description>&lt;p&gt;In GrafanaCON 2023, the latest version of Grafana 10 was announced, and with it, Scenes. But what is Grafana Scenes? Torkel Ödegaard, creator of Grafana and co-founder of Grafana Labs, joined me to discuss what Scenes is and how you can use it to create dynamic dashboards like never before.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pJlWAD5SUYA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Taking Notes for Work With Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230616-taking-notes-for-work-with-obsidian/</link><pubDate>Fri, 16 Jun 2023 19:00:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230616-taking-notes-for-work-with-obsidian/</guid><description>&lt;p&gt;In this talk, I show why I think taking notes for work with Obsidian has not just helped me learn faster but improved my career working in tech as a Developer Advocate and performance engineer. I take notes continuously as a way to keep my skills relevant. This is a rehearsal of a presentation I gave &lt;a href="https://nicolevanderhoeven.com/blog/20230614-lost-art-of-taking-good-notes"&gt;at EuroSTAR 2023&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0g38K_DtxFI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing Kubernetes Networking With k6 (k6 Office Hours #91)</title><link>https://nicolevanderhoeven.com/blog/20230616-koh91-testing-kubernetes-networking-with-k6/</link><pubDate>Fri, 16 Jun 2023 13:00:50 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230616-koh91-testing-kubernetes-networking-with-k6/</guid><description>&lt;p&gt;How would you go about testing Kubernetes networking? For his initial project with k6, our new Senior Software Engineer, Roberto Santalla, talks to us about how he used k6 to improve end-to-end network throughput and some insights he learned about Kubernetes networking along the way. I also invited my colleague, Leandro Melendez, to help me interview Roberto.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DryiirlkKIo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What's New in Grafana 10? (Grafana Office Hours #01)</title><link>https://nicolevanderhoeven.com/blog/20230616-goh01-whats-new-in-grafana-10/</link><pubDate>Fri, 16 Jun 2023 12:00:25 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230616-goh01-whats-new-in-grafana-10/</guid><description>&lt;p&gt;What&amp;rsquo;s new in Grafana 10? I interview Grafana Labs Product Director Mitch Seaman about all the new features in Grafana 10, including Scenes, correlations, some important plugin development changes, and improved security.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uk7NoagbJ28?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The Lost Art of Taking Good Notes (EuroSTAR 2023)</title><link>https://nicolevanderhoeven.com/blog/20230614-lost-art-of-taking-good-notes/</link><pubDate>Wed, 14 Jun 2023 08:00:21 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230614-lost-art-of-taking-good-notes/</guid><description>&lt;p&gt;Today I gave the talk &amp;ldquo;&lt;a href="https://conference.eurostarsoftwaretesting.com/event/2023/the-lost-art-of-taking-good-notes"&gt;The Lost Art of Taking Good Notes&lt;/a&gt;&amp;rdquo; at &lt;a href="https://conference.eurostarsoftwaretesting.com"&gt;EuroSTAR 2023&lt;/a&gt;, about how I use Obsidian for work and why creating a personal knowledge management system is so valuable in the career of a tester.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0g38K_DtxFI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://slides.nicolevanderhoeven.com/2023-lost-art-of-taking-good-notes"&gt;Here are the slides&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to use k6 for site reliability engineering (k6 Office Hours #90)</title><link>https://nicolevanderhoeven.com/blog/20230609-koh90-how-to-use-k6-for-sre/</link><pubDate>Fri, 09 Jun 2023 18:32:32 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230609-koh90-how-to-use-k6-for-sre/</guid><description>&lt;p&gt;In this k6 Office Hours, our k6 Champion, Sarah Zipkin, chats to the Grafana Labs Developer Advocates on how a Site Reliability Engineer uses k6 to test for reliability.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yBXzUUGRCMQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Text Expansion in Obsidian With Espanso</title><link>https://nicolevanderhoeven.com/blog/20230609-text-expansion-in-obsidian-with-espanso/</link><pubDate>Fri, 09 Jun 2023 18:12:41 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230609-text-expansion-in-obsidian-with-espanso/</guid><description>&lt;p&gt;I&amp;rsquo;ve gotten a few questions asking me how I do text expansion in Obsidian, because there are a lot of text expander plugins out there. The truth, though, is that I don&amp;rsquo;t use any of them. Instead, I use a separate, free, open-source app called Espanso to define text triggers and replace them with certain phrases. One of the best things about Espanso is that it stores all configuration in plain text files.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zoeQ5yNoXsY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>10 tips for starting (or progressing) a career in tech (Adobo &amp; Avocados #04)</title><link>https://nicolevanderhoeven.com/blog/20230607-ana04-10-tips-for-starting-a-career-in-tech/</link><pubDate>Wed, 07 Jun 2023 08:00:25 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230607-ana04-10-tips-for-starting-a-career-in-tech/</guid><description>&lt;p&gt;&lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I did another Adobo &amp;amp; Avocados livestream, this time about 10 tips (five from each of us) about starting a career in tech.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LVVR_56jdU0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How Supabase does performance benchmarking using k6 (k6 Office Hours #89)</title><link>https://nicolevanderhoeven.com/blog/20230526-koh89-how-supabase-does-performance-benchmarking-using-k6/</link><pubDate>Fri, 26 May 2023 16:19:51 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230526-koh89-how-supabase-does-performance-benchmarking-using-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, we talk about how Supabase does performance benchmarking using k6 with Egor Romanov, SDET at Supabase; Théo Crevon, Senior Software Engineer at Grafana Labs; and Nicole van der Hoeven, Senior Developer Advocate at Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VcrQidYBjEg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Supabase is an open-source alternative to Firebase. Learn more about Supabase &lt;a href="https://supabase.io"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>My Remote Work Setup While Traveling for a Month</title><link>https://nicolevanderhoeven.com/blog/20230519-my-remote-work-setup-while-traveling-for-a-month/</link><pubDate>Fri, 19 May 2023 18:00:14 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230519-my-remote-work-setup-while-traveling-for-a-month/</guid><description>&lt;p&gt;In this video, I go through everything that&amp;rsquo;s in my remote work setup while traveling for a month in 5 different countries&amp;ndash; all in one backpack and one sling. I work remotely full-time, and in this trip I have three talks in one month, several meetups with friends and family, and livestreams to do. Here&amp;rsquo;s what I chose to bring with me to remain fully operational while also travelling.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bV6mR6UwE90?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;For a list of everything I mentioned in this video, check out my &lt;a href="https://nicolevanderhoeven.com/gear/"&gt;Gear list&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Load testing and tracing with k6 and Tempo</title><link>https://nicolevanderhoeven.com/blog/20230518-load-testing-and-tracing-with-k6-and-tempo/</link><pubDate>Thu, 18 May 2023 22:41:42 +1000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230518-load-testing-and-tracing-with-k6-and-tempo/</guid><description>&lt;p&gt;At &lt;a href="https://grafana.com/about/events/observabilitycon/2023/sydney/"&gt;ObservabilityCON on the Road 2023 in Sydney, Australia&lt;/a&gt;, I talked about why you should use load testing and distributed tracing, how to do it with k6 and Tempo, and the benefits of being able to see beyond traditional black-box testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZP2aa5qjNOg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/presentation/d/1rC8kifF6X1ZSH8jgh-yUp6NfgK_UaLiOG8TWLa5dQBQ/edit?usp=sharing"&gt;Check out the slides here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Distributed+tracing"&gt;Distributed tracing&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/xk6-distributed-tracing"&gt;xk6-distributed-tracing&lt;/a&gt; (notes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/ocr-2023-syd-01.jpeg" alt="Photo of the crowd at OCR Sydney" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>How to Avoid the Most Common Kubernetes Monitoring Mistakes</title><link>https://nicolevanderhoeven.com/blog/20230516-how-to-avoid-the-most-common-kubernetes-monitoring-mistakes/</link><pubDate>Tue, 16 May 2023 22:41:16 +1000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230516-how-to-avoid-the-most-common-kubernetes-monitoring-mistakes/</guid><description>&lt;p&gt;For &lt;a href="https://grafana.com/about/events/observabilitycon/2023/singapore/"&gt;ObservabilityCON on the Road Singapore 2023&lt;/a&gt;, I talked about some mistakes people make when monitoring applications within Kubernetes clusters. I also demonstrated Grafana&amp;rsquo;s Kubernetes Monitoring solution and how it can be a shortcut for engineers looking to get started quickly.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/ocr-2023-sin-01.jpg" alt="Photo of me speaking at OCR Singapore 2023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.google.com/presentation/d/1rC8kifF6X1ZSH8jgh-yUp6NfgK_UaLiOG8TWLa5dQBQ/edit?usp=sharing"&gt;Slides here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Monitoring+Kubernetes"&gt;Monitoring Kubernetes in general&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Grafana+Kubernetes+Monitoring"&gt;The Grafana Kubernetes Monitoring feature&lt;/a&gt; (notes)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/ocr-2023-sin-02.jpg" alt="Photo of the crowd at OCR Singapore 2023" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>More Than Just Taking Notes: Learning Exhaust</title><link>https://nicolevanderhoeven.com/blog/20230512-more-than-just-taking-notes-learning-exhaust/</link><pubDate>Fri, 12 May 2023 21:18:45 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230512-more-than-just-taking-notes-learning-exhaust/</guid><description>&lt;p&gt;For me, using Obsidian is about more than just taking notes&amp;ndash; it&amp;rsquo;s about creating learning exhaust. Learning exhaust is the byproduct of real learning, and thinking of my notes as learning exhaust has helped me shift my focus from taking good notes to learning new things well.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3L24rKggMX8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Intersectionality in Tech (Adobo &amp; Avocados #03)</title><link>https://nicolevanderhoeven.com/blog/20230510-ana03-intersectionality-in-tech/</link><pubDate>Wed, 10 May 2023 21:35:00 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230510-ana03-intersectionality-in-tech/</guid><description>&lt;p&gt;&lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I talk about what intersectionality is and how intersecting identities can affect how we relate to the world and our experiences.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IxHvtWBFCoY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Tagging and Linking With AI: Napkin</title><link>https://nicolevanderhoeven.com/blog/20230505-tagging-and-linking-with-ai-napkin/</link><pubDate>Fri, 05 May 2023 00:58:39 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230505-tagging-and-linking-with-ai-napkin/</guid><description>&lt;p&gt;In this video, I demonstrate my workflow for tagging and linking with AI using the Napkin.one app. Napkin is an app that uses a fork of GPT-3 to intelligently tag thoughts with keywords that improve over time. I like to use Napkin to tag mostly my highlights from Readwise.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/p2E3gRXiLYY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://napkin.one/?via=nicole"&gt;Napkin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;The Lost Art of Taking Good Notes&lt;/em&gt;, &lt;a href="https://conference.eurostarsoftwaretesting.com/event/2023/the-lost-art-of-taking-good-notes/"&gt;my talk at EuroSTAR 2023&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Getting started in testing (Adobo &amp; Avocados #02)</title><link>https://nicolevanderhoeven.com/blog/20230503-ana02-getting-started-in-testing/</link><pubDate>Wed, 03 May 2023 21:22:18 +0800</pubDate><guid>https://nicolevanderhoeven.com/blog/20230503-ana02-getting-started-in-testing/</guid><description>&lt;p&gt;&lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I interviewed &lt;a href="https://azevedorafaela.com/"&gt;Rafaela Azevedo&lt;/a&gt; about her experiences in getting started in testing, what it&amp;rsquo;s like to be a woman in tech, cultural differences between Brazil and the UK, and how she became a founder of a new Blockchain startup.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MwBKEGkMbP0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Emergent Note Taking</title><link>https://nicolevanderhoeven.com/blog/20230428-emergent-note-taking/</link><pubDate>Fri, 28 Apr 2023 18:21:15 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230428-emergent-note-taking/</guid><description>&lt;p&gt;Emergent note taking is the process of turning individual notes into something more than the sum of their parts and combining them in different ways. In this video, I talk about how to take notes to be found and how to explore your vault in ways to help ideas emerge in &lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="resources-mentioned"&gt;Resources Mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LlgLn7"&gt;Emergence, by Steven Johnson&lt;/a&gt;: book that prompted this idea (book)&lt;/li&gt;
&lt;li&gt;Zsolt Viczián - &lt;a href="https://www.youtube.com/watch?v=4GTh0A6fp7U"&gt;Book on a Page about Emergence&lt;/a&gt; (video)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=GqrczIftYyA"&gt;Visual atomic note taking with ExcaliBrain&lt;/a&gt; (video)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-XZwcZHKnMg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Get Core Web Vitals in k6 (k6 Office Hours #86)</title><link>https://nicolevanderhoeven.com/blog/20230428-koh86-how-to-get-core-web-vitals-in-k6/</link><pubDate>Fri, 28 Apr 2023 16:11:52 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230428-koh86-how-to-get-core-web-vitals-in-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, we discuss how to get Core Web Vitals for your web app using k6, and how it can help you test for user experience. We are Nicole van der Hoeven and &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt;, and in this livestream, we&amp;rsquo;re talking about frontend performance testing with Grafana k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uERQXeWVV_E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Obsidian Bookmarks (new in Obsidian v1.2)</title><link>https://nicolevanderhoeven.com/blog/20230420-obsidian-bookmarks/</link><pubDate>Thu, 20 Apr 2023 10:37:51 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230420-obsidian-bookmarks/</guid><description>&lt;p&gt;Obsidian bookmarks have arrived in the latest Obsidian version, v1.2. Here&amp;rsquo;s what they are, what you can bookmark, and how to use them within your workflows. I also go over other, smaller Quality of Life improvements in this release.&lt;/p&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tfthacker.medium.com/zen-like-focus-with-obsidian-bookmarks-a60d24382eb"&gt;TfT Hacker&amp;rsquo;s blog post on this&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=b0W6QGoaCSg"&gt;@Boostezvotreproductivite&amp;rsquo;s video&lt;/a&gt; (French)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SVlMpzaAAT0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Emergent Load Testing - rules for organized chaos</title><link>https://nicolevanderhoeven.com/blog/20230419-emergent-load-testing/</link><pubDate>Wed, 19 Apr 2023 00:21:06 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230419-emergent-load-testing/</guid><description>&lt;p&gt;Today I spoke at &lt;a href="https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/program/schedule/"&gt;KubeCon EU 2023&lt;/a&gt; about &lt;a href="https://sched.co/1HyYH"&gt;emergent load testing&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Og4-Z6j_0M0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3556.jpg" alt="Me just before the presentation, with the opening slide on the screen behind me." loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://slides.nicolevanderhoeven.com/2023-emergent-load-testing/#"&gt;Here are the slides&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Below are some links to extensions and experimental modules that I mentioned:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/"&gt;Grafana&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/"&gt;k6 site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6"&gt;k6 repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/"&gt;k6 docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/using-k6-browser/overview/"&gt;k6 browser&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/results-output/real-time/prometheus-remote-write/"&gt;Prometheus Remote Write&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/javascript-api/k6-experimental/tracing/"&gt;k6 tracing&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-kubernetes"&gt;xk6-kubernetes&lt;/a&gt; (extension)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/javascript-api/k6-experimental/redis/"&gt;k6 redis&lt;/a&gt; (experimental module)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-disruptor"&gt;xk6 disruptor&lt;/a&gt; (extension)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3560-1.jpg" alt="Me presenting, with a slide containing my definition of emergence on the screen" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="abstract"&gt;Abstract&lt;/h2&gt;
&lt;p&gt;When we write load testing scripts against our applications, we write them sequentially: A, then B, then C. But this doesn&amp;rsquo;t accurately reflect the organized chaos of a system in production, nor does it prepare the system for the unexpected.&lt;/p&gt;
&lt;p&gt;Emergence is a phenomenon where parts of a whole independently develop properties not originally present in the whole. Emergence is what helps ant workers develop roles without leadership, prompts animals to evolve adaptive traits without forethought, and facilitates non-toxic communities without moderators.&lt;/p&gt;
&lt;p&gt;The growing field of emergent software applies this swarm logic to the programs that we write. What would it take to write emergent load testing scripts? It turns out that there are a few ingredients for emergence: a large population size, opportunities to interact, feedback, and an element of control.&lt;/p&gt;
&lt;p&gt;In this talk, Nicole van der Hoeven discusses how to bring these elements to load testing by writing a script in Grafana k6 that can independently decide what requests to make next, modify Kubernetes app pods, and disrupt services based on a continual feed of results during runtime&amp;ndash; all without manual intervention. She shows how to wield this new breed of load testing to improve confidence in the complex systems we build.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/img_3558.jpg" alt="Photo of the room while I was presenting" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Organizing PDFs in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230414-organizing-pdfs-in-obsidian/</link><pubDate>Fri, 14 Apr 2023 08:01:11 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230414-organizing-pdfs-in-obsidian/</guid><description>&lt;p&gt;There are many tools for organizing PDFs in Obsidian, but which one is the best? In this video, I go through several options, including DevonThink, Readwise, Skim, and Zotero. For my (non-academic) use case of organizing my TTRPG-related PDFs, I decided on Zotero&amp;ndash; but maybe something else will be better for you!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VqOc9OsMX_s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;h3 id="tools"&gt;Tools&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.devontechnologies.com/apps/devonthink"&gt;DevonThink&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://skim-app.sourceforge.io/"&gt;Skim&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="zotero-plugins-mentioned"&gt;Zotero plugins mentioned&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/retorquere/zotero-folder-import"&gt;Zotero folder import&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/wshanks/Zutilo"&gt;Zutilo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/argenos/zotero-mdnotes"&gt;MD Notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://patreon.com/mcdm"&gt;Support MCDM on Patreon&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="thanks"&gt;Thanks&lt;/h3&gt;
&lt;p&gt;Thanks to the following people for their input and help in experimenting:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://polaine.com"&gt;Andy Polaine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://leahferguson.com/"&gt;Leah Fergusson&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;@argentum#3920 on Discord&lt;/li&gt;
&lt;li&gt;The lovely folks on &lt;a href="https://patreon.com/nicolevdh"&gt;my Patreon Discord server&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Lazy GM Note Taking With Notion and Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230412-lazy-gm-note-taking-with-notion-and-obsidian/</link><pubDate>Wed, 12 Apr 2023 12:36:50 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20230412-lazy-gm-note-taking-with-notion-and-obsidian/</guid><description>&lt;p&gt;How does Mike Shea (Sly Flourish) do lazy GM note taking with Notion? Mike shows me how he uses Notion to prep and run games, and I&amp;rsquo;m taking the opportunity to show him some of how I do the same in Obsidian. Mike is the author of several RPG-related books, including the Return of the Lazy Dungeon Master and his latest, The Lazy DM&amp;rsquo;s Companion. Mike has been playing RPGs for almost 40 years and is a forever DM. He also has a YouTube channel where he releases two videos weekly: one about news in the RPG community and one where he preps live for one of his games.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/k1YgPpvQYnw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="about-sly-flourish"&gt;About Sly Flourish&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://slyflourish.com/subscribe/"&gt;Sly Flourish newsletter&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.patreon.com/slyflourish"&gt;Sly Flourish Patreon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shop.slyflourish.com/"&gt;Sly Flourish bookstore&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Taking Notes on People in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230407-taking-notes-on-people-in-obsidian/</link><pubDate>Fri, 07 Apr 2023 13:16:27 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230407-taking-notes-on-people-in-obsidian/</guid><description>&lt;p&gt;Taking notes on people in Obsidian sounds weird, but I think it just shows how much I care. If I take notes on things that matter, why shouldn&amp;rsquo;t I take notes on people that matter? Here are the templates I use to remember important things about significant people in my life.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4jYUQXy0nsg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Javascript Ecosystem (k6 Office Hours #85)</title><link>https://nicolevanderhoeven.com/blog/20230407-koh85-k6-javascript-ecosystem/</link><pubDate>Fri, 07 Apr 2023 13:00:42 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230407-koh85-k6-javascript-ecosystem/</guid><description>&lt;p&gt;Did you know that there is a k6 JavaScript ecosystem on top of the Go extension ecosystem? What&amp;rsquo;s the difference between the two? What does k6 actually support? What types of things can you do with JavaScript? In this k6 Office Hours, Software Engineer and k6 maintainer Mihail Stoykov joins me to talk all about the different options for k6 available through JavaScript libraries.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UZ-1yXd4xkk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Frontend vs. backend: How to plan your performance testing strategy</title><link>https://nicolevanderhoeven.com/blog/20230403-frontend-vs-backend-testing/</link><pubDate>Mon, 03 Apr 2023 13:20:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230403-frontend-vs-backend-testing/</guid><description>&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://grafana.com/blog/2023/04/03/frontend-vs.-backend-how-to-plan-your-performance-testing-strategy/"&gt;here&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;There are many aspects of application performance, but they broadly fall into two categories: frontend performance and backend performance. As a tester, it’s important to know the differences between the two and how that impacts the way you approach your tests.&lt;/p&gt;
&lt;p&gt;In this blog, I’ll provide a high-level overview of frontend performance testing and backend performance testing, including pros and cons of each one. I’ll also explain why you need both if you really want a holistic view of how your application is performing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xVACRP5qIJI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="why-and-where-to-use-frontend-performance-testing"&gt;Why (and where) to use frontend performance testing&lt;/h2&gt;
&lt;p&gt;Frontend performance testing verifies user experience &lt;a href="https://grafana.com/blog/2023/02/10/watch-how-to-pair-grafana-faro-and-grafana-k6-for-frontend-observability/"&gt;at the interface level&lt;/a&gt;. Basically, this entails everything a user sees when they access your web app, whether it’s on a laptop or other devices. This might involve automating user interactions with the site through the browser — for example, clicking on a button, filling out a form, or having scripts that load on the browser and run.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/crocs-r-cool.png" alt="mockup of a site called “Crocs R Cool”" loading="lazy" decoding="async"&gt;
&lt;em&gt;In frontend testing, you&amp;rsquo;re looking at how components of the UI respond.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The metrics we analyze for frontend performance tests are typically quite different from what we use for backend testing. Let’s say we want to know the time it takes for a page to render after a user clicks on a button that directs them there. This isn’t the same thing as measuring server response time; that total round trip takes a lot more into account — things like latency or the time it takes for a client-side script to run and display the requested information.&lt;/p&gt;
&lt;h3 id="advantages-of-frontend-performance-testing"&gt;Advantages of frontend performance testing&lt;/h3&gt;
&lt;p&gt;The great thing about frontend performance testing is that it provides a more realistic measurement of your end users’ experiences. They don’t care what’s going on under the hood; they care about the overall experience — and that’s exactly what frontend performance testing measures. Unlike backend performance testing, frontend performance testing looks at everything from a user’s point of view: from the time they visit a webpage to the time they can interact with something on that page.&lt;/p&gt;
&lt;p&gt;On top of that, most (about 80%) of the performance issues end users report are frontend issues. It doesn’t make much sense to skip this type of testing; it can be a critical step in finding ways to improve the overall user experience.&lt;/p&gt;
&lt;h3 id="disadvantages-of-frontend-performance-testing"&gt;Disadvantages of frontend performance testing&lt;/h3&gt;
&lt;p&gt;The most obvious disadvantage of frontend testing is that it doesn’t look under the hood. If you only do frontend testing, you’re almost certain to miss something. Maybe a component isn’t working, which is creating issues for your users. But you wouldn’t know that because you’re only testing what’s visible from the browser. In other words, you might be in the situation where you know something in the application is wrong and responding too slowly, but you don’t know what.&lt;/p&gt;
&lt;p&gt;Frontend performance testing can also be quite expensive compared to, say, protocol-based testing. That’s because you need enough resources (memory and CPU) to actually spin up a browser instance and interact with your application the way that a real user would. The same load generator that could run tens of thousands of backend virtual users may only be able to run 50 frontend virtual users before running out of resources.&lt;/p&gt;
&lt;p&gt;Finally, only testing frontend performance can sometimes lead to pretty misleading results, especially as you scale. As load increases, the response time for the frontend remains fairly constant, but that’s not the case with the backend.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Frontend-Backend-LoadTesting.png" alt="graph plotting response time over the number of concurrent users for front-end and back-end" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;While the frontend component of response time remains more or less constant, the backend component of response time increases exponentially with the number of concurrent users.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This phenomenon occurs because most of the issues that frontend performance tests might identify, such as a slow-running client-side script, don’t tend to compound. It’ll be just as slow on each user’s computer regardless of how many users are running it. However, problems uncovered by backend performance testing are on the side of the application, not the users. If a database can’t keep up with 100 users sending queries to it, then 1,000 users sending it queries is likely to yield an even worse response time.&lt;/p&gt;
&lt;h2 id="why-and-where-to-use-backend-performance-testing"&gt;Why (and where) to use backend performance testing&lt;/h2&gt;
&lt;p&gt;As you might have guessed at this point, backend performance testing targets the infrastructure under the hood. This could be a database that contains customer information, a payment gateway, or an authentication service for customers that have already signed up. These are things that an end user doesn’t see and maybe isn’t ever even aware of, but they still have an effect on response times.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/backend.png" alt="graphic of application components" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Backend testing addresses infrastructure users might not even be aware of, like different databases, gateways, and services that underpin an application.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Scripting against the backend is quite different from scripting against the frontend. Instead of scripting user interactions like clicking, you’re scripting certain requests that are being sent on the protocol level. So, for example, you could have an HTTP GET request for the page and also for its embedded resources.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test.k6.io&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The sample Grafana k6 script above is an example of a simplified backend performance test. It makes a single HTTP request to retrieve the contents of &lt;a href="https://test.k6.io"&gt;https://test.k6.io&lt;/a&gt;, and then waits one second.&lt;/p&gt;
&lt;p&gt;Backend performance includes things beyond just load times and latency. It includes scalability, availability, reliability, and similar attributes, so the metrics that we measure are different as well. We might look at server uptime or response times per component. We could also trace the path of a particular request through the application stack.&lt;/p&gt;
&lt;p&gt;An illustration shows that performance testing can address scalability, elasticity, availability, latency, resiliency, and reliability.
Application performance is more than just speed. Backend testing helps us verify many different aspects of performance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/performance-ilities.png" alt="diagram of different types of performance" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Application performance is more than just speed. Backend testing helps us verify many different aspects of performance.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="advantages-of-backend-performance-testing"&gt;Advantages of backend performance testing&lt;/h3&gt;
&lt;p&gt;As we already discussed, frontend testing doesn’t cover everything, but it’s also more complicated than that. The 20% or so of performance bottlenecks that are backend-related can be the hardest to troubleshoot, identify, and fix. Even worse, a lot of backend performance issues can spiral out of control at higher levels of load and can be quite expensive to fix later on in a development cycle. The worst time to realize that you need to rethink your entire infrastructure is after it’s already failed in production. If you take care of backend performance testing earlier (commonly known as shifting left), it makes such pivots less costly.&lt;/p&gt;
&lt;p&gt;Another advantage of backend testing is the ability to target different components of an application. You can choose which API endpoint to hit and how hard, and you can target specific user flows, so it doesn’t always have to be end-to-end testing.&lt;/p&gt;
&lt;p&gt;And finally, backend performance tests tend to be less resource-intensive; they’re just protocol-level requests that can be easily ramped up.You don’t need to spin up a browser instance, or even parse through the Document Object Module (DOM) of a webpage or look for specific elements. It’s just a matter of sending these requests, and that’s something that you can increase the scale of pretty cheaply.&lt;/p&gt;
&lt;h3 id="disadvantages-of-backend-performance-testing"&gt;Disadvantages of backend performance testing&lt;/h3&gt;
&lt;p&gt;Backend performance testing won’t tell you anything about what’s happening on the frontend, and a lot of sites these days actually use scripts that have to run on the frontend. So with backend performance testing tools, you just download those scripts. But the response time they measure is the download time, which is not really realistic because those scripts are executed. A backend performance test would fetch the text of the script. A frontend performance test would run it — and that script might do something like perform a calculation. You need frontend performance testing to measure that properly.&lt;/p&gt;
&lt;p&gt;Backend performance testing is also much more expansive than front end performance testing, especially with microservices-based applications. There are so many components to track that it can be difficult to determine where to look. You can quickly find yourself going down a rabbit hole of constant, never-ending performance tuning.&lt;/p&gt;
&lt;h2 id="frontend--backend-testing-for-the-win"&gt;Frontend + backend testing for the win&lt;/h2&gt;
&lt;p&gt;So, as we’ve seen, frontend testing and backend testing both seem to have advantages and disadvantages. So which one should you use? Both, if at all possible! They look at different parts of application performance, so doing both is essential if you want a holistic view of user experience.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/frontend-vs-backend-meta.png" alt="diagram of k6 being used for both frontend and backend testing" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Software teams can use Grafana k6 to address frontend and backend performance testing.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;If you’re operating at a smaller scale, use your own discretion about how to find the right mix for needs. But if you’re testing at a larger scale with thousands of users and you want to test both the frontend and backend aspects of application performance, I suggest you change your test strategy so the majority of the load is generated with backend performance testing scripts. That’s because of the resource intensiveness of frontend performance testing scripts, which we discussed earlier.&lt;/p&gt;
&lt;p&gt;So, if you generate most of the load with the backend and then you have a handful of frontend performance testing scripts running in the background, you should still get a good idea of how both are performing. Remember, frontend application performance remains fairly constant throughout different levels of load, so you’ll still get a lot of useful insights on both types of performance without worrying too much about the scaling costs.&lt;/p&gt;
&lt;p&gt;Frontend and backend performance both affect what your end users think of your application. If the underlying application servers respond immediately to all requests, but then a huge picture of a crocodile makes your homepage excruciatingly slow to load, then users aren’t going to like that.&lt;/p&gt;
&lt;p&gt;On the other hand, if your homepage is really sleek and quick to load, but the application server hasn’t responded with the data that the browser needs to render, then users aren’t going to like that either.&lt;/p&gt;
&lt;p&gt;A common problem when testing both frontend and backend performance is script duplication: because of the differences in the two approaches, you often have to use two separate tools — which means two test suites and potentially two scripting languages. While this is a valid approach, it’s more sustainable to look for a tool that can target both types of performance, such as k6.&lt;/p&gt;
&lt;p&gt;Whichever tool(s) you end up using, testing both frontend and backend performance is going to give you the clearest view of how your application really performs.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The easiest way to get started with k6 is through Grafana Cloud k6. The free tier includes 500 virtual user hours/month for k6 testing and more. &lt;a href="https://grafana.com/auth/sign-up/create-user?pg=blog&amp;amp;plcmt=body-txt"&gt;Sign up for free now!&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Taking Notes for RPGs in Obsidian with Andy Polaine</title><link>https://nicolevanderhoeven.com/blog/20230331-taking-notes-for-rpgs-in-obsidian-with-andy-polaine/</link><pubDate>Fri, 31 Mar 2023 14:30:21 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230331-taking-notes-for-rpgs-in-obsidian-with-andy-polaine/</guid><description>&lt;p&gt;My friend, &lt;a href="https://polaine.com"&gt;Andy Polaine&lt;/a&gt;, joins me to discuss taking notes for RPGs in Obsidian. Andy is the Dungeon Master for one of my weekly games of D&amp;amp;D, and in this livestream, we&amp;rsquo;re comparing our notes (his as a DM, mine as a player) for the same campaign, a homebrew one in the world of Exandria (from Critical Role). We&amp;rsquo;re showing the differences between our styles of note-taking and playing games.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8IyaSGI8X8Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="key-takeaways"&gt;Key takeaways&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Andy&amp;rsquo;s DM style is improv-heavy and inspired by the Lazy GM, &lt;a href="https://slyflourish.com"&gt;Sly Flourish&lt;/a&gt;. His notes reflect that philosophy.&lt;/li&gt;
&lt;li&gt;Andy primarily uses folders for organization due to concerns regarding futureproofness, whereas I use links and Dataview and have no sub-folders.&lt;/li&gt;
&lt;li&gt;Andy has Dice Roller tables for random generation, but he also embeds existing websites as iframes within Obsidian.&lt;/li&gt;
&lt;li&gt;When a situation calls for many moving parts, monsters, or factions that the party might encounter, Andy uses an Adversary Roster to keep track of where everyone is.&lt;/li&gt;
&lt;li&gt;Andy uses Canvas to display multiple statblocks at a time and be able to zoom in individually when necessary. He said he initially had performance issues with this approach, but those seem to be resolved now.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="resources-mentioned"&gt;Resources mentioned&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://dmheroes.com/"&gt;DM Heroes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rpgtinker.com/"&gt;RPG Tinker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tetra-cube.com/dnd/dnd-statblock.html"&gt;TetraCube Statblock generator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://slyflourish.com"&gt;Sly Flourish&lt;/a&gt; Lazy GM method for session prep&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/DnD/comments/775caq/my_friends_and_i_have_something_called_knife/"&gt;Knife Theory&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is a transcript of the video.&lt;/p&gt;
&lt;h2 id="how-we-met"&gt;How we met&lt;/h2&gt;
&lt;p&gt;NICOLE: Hello, everyone. Welcome to the channel. I&amp;rsquo;m Nicole van der Hoeven. You probably already know me, but today, I&amp;rsquo;m also Scura, the level eight Pallid Elf Twilight Cleric/Stars Druid. And with me today is a someone who should be a familiar face now. I think this is your third time back. Andy Polaine.&lt;/p&gt;
&lt;p&gt;ANDY: Not sure. Second time on the stream, I think maybe, I&amp;rsquo;m not sure.&lt;/p&gt;
&lt;p&gt;NICOLE: Okay, okay. But we already did a TTRPG thing together.&lt;/p&gt;
&lt;p&gt;ANDY: That&amp;rsquo;s right. So it is the third time in the Obsidian DM world.&lt;/p&gt;
&lt;p&gt;NICOLE: So Andy happens to be my DM, my Dungeon Master for my D&amp;amp;D 5e game. And that actually happened because of that presentation we did on Obsidian, right?&lt;/p&gt;
&lt;p&gt;ANDY: It is, yes. We&amp;rsquo;re chatting on the Obsidian channel, the TTRPG channel. And at some point, I kinda said, oh yeah, well actually I need another person. But you probably, &amp;lsquo;cause you had said something like, I play 50 games a week or whatever. And I said, &amp;ldquo;You probably don&amp;rsquo;t need another game.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;NICOLE: It was like four.&lt;/p&gt;
&lt;p&gt;ANDY: And you went, &amp;ldquo;Well actually.&amp;rdquo; So yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah. So you slid into my DMs and you&amp;rsquo;re like, &amp;ldquo;Well, just in case you need a fifth.&amp;rdquo; And I&amp;rsquo;m like, &amp;ldquo;Actually, I don&amp;rsquo;t have a weekday one yet. So maybe, yeah.&amp;rdquo; So let&amp;rsquo;s talk about that, because you definitely knew when you asked me to join your game that I took notes. What was going on inside your head? Were you like, &amp;ldquo;Yeah, I want someone to take notes.&amp;rdquo; Or did you not really know how much I would take notice of everything that happens?&lt;/p&gt;
&lt;p&gt;ANDY: No, I mean, I wanted another player and I wanted someone who was into the same stuff and I thought you would be interested and a great player and you have been. It&amp;rsquo;s great to have you in the game. I mean, leading up to that, actually, I guess, I had played D&amp;amp;D when I was a kid, teenager, and then I stopped and then COVID happened and like a lot of people, I sort of thought, &amp;ldquo;Oh yeah, D&amp;amp;D that&amp;rsquo;s a thing.&amp;rdquo; And it was actually to talk to my daughter about it and try and persuade her to play. And then the internet happened between when I stopped playing D&amp;amp;D and when I wanted to start again. And so I was looking for ways to note take and have everything. And I&amp;rsquo;ve tried a few different things, including Notion and I didn&amp;rsquo;t really like Notion&amp;rsquo;s&amp;hellip; The main thing was no offline mode, which was a real big thing for me. But I&amp;rsquo;m also like many people who use Obsidian, I&amp;rsquo;ve been keeping my notes for my work stuff in as plain text markdown for years. And so I thought, &amp;ldquo;Ah, I&amp;rsquo;m gonna, I&amp;rsquo;m gonna switch to that.&amp;rdquo; So very quickly, I did one game in Notion and I started actually the campaign that you&amp;rsquo;re currently play in Notion. I think the first few, maybe five or six sessions, and then I switched to Obsidian.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, I didn&amp;rsquo;t know that.&lt;/p&gt;
&lt;p&gt;ANDY: With all the pain that exporting out of Notion with like these horrid, long hex or these database codes attached to all the files. I&amp;rsquo;ve still got some of that junk occasionally appears in my auto completes.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I can imagine. I think by that point, I&amp;rsquo;d been using Obsidian for a while, but I had just started to use it a lot for TTRPGs &amp;lsquo;cause you know, I was gonna use it for like serious stuff like work. and that changed very quickly. I know. Hey, do you have dice with you?&lt;/p&gt;
&lt;p&gt;ANDY: I do have dice I do have dice.&lt;/p&gt;
&lt;p&gt;NICOLE: Let&amp;rsquo;s do rollies again.&lt;/p&gt;
&lt;p&gt;ANDY: Okay, alright.&lt;/p&gt;
&lt;p&gt;NICOLE: I got my-&lt;/p&gt;
&lt;p&gt;ANDY: You better explain what rollies is for people who may not-&lt;/p&gt;
&lt;p&gt;NICOLE: It&amp;rsquo;s just rolling a d20, seeing which one&amp;rsquo;s higher &amp;lsquo;cause I have a question from Patreon. And the person who gets higher is going to decide whether they answer first or the other person answers first.&lt;/p&gt;
&lt;p&gt;ANDY: All right, okay. All right, you ready?&lt;/p&gt;
&lt;p&gt;NICOLE: Okay, yeah.&lt;/p&gt;
&lt;p&gt;ANDY: 16.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh no. Natural one. Okay, you decide.&lt;/p&gt;
&lt;p&gt;ANDY: Okay, okay. I decide whether, well, I don&amp;rsquo;t know what the question is. So that would-&lt;/p&gt;
&lt;p&gt;NICOLE: No, you gotta decide if you wanna go first or me.&lt;/p&gt;
&lt;p&gt;ANDY: Well ladies first.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, great. Okay, so the question is for me, what GM are you? And for you, what player am I? Andy is a very empathetic GM. He listens and he listens to not just the stuff from the character but also your stuff. And maybe this is something where we should talk about knife theory &amp;lsquo;cause Andy&amp;rsquo;s particularly good at remembering things that draw you into the story, your character and you. And I think he&amp;rsquo;s mentioned quite a few times that he likes slightly messing with us all, so.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah. So, okay, so what player are you? Well, you&amp;rsquo;re great. You are actually very empathetic player and you play a cleric, right?&lt;/p&gt;
&lt;p&gt;NICOLE: That was my thing.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah. And so, no, what I used to say is that basically, Scura runs around healing everyone way too much from my liking as the DM. But Scura does a lot of, if you like a hit point machine, just of vending machine, like here you go, you have hit points and you have some hit points. And so you&amp;rsquo;re very engaged on that front. You&amp;rsquo;re very engaged in the role play. And thanks to Obsidian, Scura has got like a sort of photographic memory. So you have&amp;hellip; And you, Nicole, use it I think to kind of mess with me as well sometimes too, which is, usually through sending-&lt;/p&gt;
&lt;p&gt;NICOLE: No, I would never.&lt;/p&gt;
&lt;h2 id="how-i-use-sending-to-mess-with-andy"&gt;How I use Sending to mess with Andy&lt;/h2&gt;
&lt;p&gt;ANDY: Should we talk about sendings here?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I could.&lt;/p&gt;
&lt;p&gt;ANDY: I&amp;rsquo;m assuming here that everyone knows about how D&amp;amp;D works and stuff. So I don&amp;rsquo;t know if this is true, but you might all be Obsidian people just interested in this. For those of you don&amp;rsquo;t know, there&amp;rsquo;s a spell in D&amp;amp;D. It&amp;rsquo;s called sending where you can send 25 words to someone sort of telepathically over distances. So tell me what you do with that.&lt;/p&gt;
&lt;p&gt;NICOLE: Well, I actually have something to show on that front.&lt;/p&gt;
&lt;p&gt;ANDY: Okay. All right.&lt;/p&gt;
&lt;p&gt;(recorded video plays)&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m gonna play a little clip that I got permission to show. I&amp;rsquo;m going to send to, I&amp;rsquo;m not sure what her name is. Sabilis, Sybilis.&lt;/p&gt;
&lt;p&gt;ANDY: I don&amp;rsquo;t who.&lt;/p&gt;
&lt;p&gt;NICOLE: The drow priestess that wanted Wally to come with her to Xhorhas.&lt;/p&gt;
&lt;p&gt;ANDY: Oh my God. Let me just check who that might be.&lt;/p&gt;
&lt;p&gt;TYLER: Great pull. Great pull.&lt;/p&gt;
&lt;p&gt;ANDY: That is like, I gotta choose this, this really random that you haven&amp;rsquo;t thought about for ages.&lt;/p&gt;
&lt;p&gt;(back to livestream)&lt;/p&gt;
&lt;p&gt;NICOLE: So that was a clip from our actual game where I pulled out a particularly unexpected sending. I don&amp;rsquo;t know why it was unexpected really, because my character had been try trying to chase down this thread for the other character. So I don&amp;rsquo;t know why I was unexpected, Andy.&lt;/p&gt;
&lt;p&gt;ANDY: Well&amp;hellip;. There&amp;rsquo;s so much that&amp;rsquo;s unexpected. So I would say there was a couple things actually about that group. So I mean, it may be interesting on the note front for people. So if there&amp;rsquo;s an important NPC, and I&amp;rsquo;ll show some stuff in a second, if there&amp;rsquo;s an important NPC, I will usually make a note for them. But sometimes as in this case, there&amp;rsquo;s like a group of NPCs. In this case there was a group of drow, they&amp;rsquo;re called the Kryn in Exandria. We play in the critical role Exandria Wildemount world. There was one of those times where I didn&amp;rsquo;t have much prep time and I thought, &amp;ldquo;Oh, I just need to come up with some names and stuff. And so I think I probably just pulled some stat blocks form somewhere just in case you had a fight with them. But actually, the names, I just had them in a little list and there&amp;rsquo;s a block and like a one line description. I think you might see some in a minute too. And so they didn&amp;rsquo;t have any notes made for them. And so when you said that, and I&amp;rsquo;m looking through my dashboard and stuff and I think I can&amp;rsquo;t think who that is at all. And the name didn&amp;rsquo;t stick with me at all, so yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, you know what&amp;rsquo;s weird is I actually wasn&amp;rsquo;t there. I wasn&amp;rsquo;t there when they met her. I was going off of the recording, this is when I think I briefly came in, I dialed in from the airport. So I had very limited video to go on because not everything was recorded. And so I wasn&amp;rsquo;t actually sure, that&amp;rsquo;s why I didn&amp;rsquo;t know the name. But I can show you how I look at how I decide who to send to. So I&amp;rsquo;m using the new bookmarks feature. I actually have one for sending, in particular. These are all the sendings. There&amp;rsquo;s a tag now that I do. So like for example, I didn&amp;rsquo;t change any of my notes so I hope nothing comes up. But this is how I do it. So I have the sending tag, I have the name of the person and then what I actually sent. And that&amp;rsquo;s easy because then I can highlight it and I can see, &amp;ldquo;Hey look, it&amp;rsquo;s 25 words, which is the limit of the spell.&amp;rdquo; And then when I go into a particular NPC, I also later put down all of the sendings I&amp;rsquo;ve ever sent to them and their response back. So this particular NPC, I have apparently reluctantly sent him messages a few times. But I also have an agenda page. So I have some sendings planned already and I go down the list. And I also have, this is a Dataview query that it&amp;rsquo;s a Dataview JS query. And it&amp;rsquo;s all like random NPC. So there is an element of randomness &amp;lsquo;cause sometimes, these are the ones that I know I want to send to, but these are the ones that I&amp;rsquo;m like, &amp;ldquo;Huh, I wonder who Rolf is and what they&amp;rsquo;re doing today.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ANDY: It&amp;rsquo;s annoying.&lt;/p&gt;
&lt;p&gt;NICOLE: I have-&lt;/p&gt;
&lt;p&gt;ANDY: It&amp;rsquo;s in a good way, it&amp;rsquo;s very funny.&lt;/p&gt;
&lt;p&gt;NICOLE: Annoying in a good way. That&amp;rsquo;s me. I have a follow up list. These are the people that I like to talk to often that I&amp;rsquo;ve sent more than one sending to. They&amp;rsquo;re like important to my character or to the group or to the story. And I&amp;rsquo;m also using Supercharged Links by the way. That&amp;rsquo;s why all of these icons are there. So the rainbow is like a PC and the other one, which is like a vampire actually. It&amp;rsquo;s like an NPC. So that&amp;rsquo;s basically it. I have ideas of whom to send to. And they&amp;rsquo;re also based on the quests and questions that we&amp;rsquo;ve got. &amp;lsquo;Cause these are like, some of them are just for me, for my character and some of them are for the group. I don&amp;rsquo;t know. I find sometimes that I&amp;rsquo;m the one that&amp;rsquo;s like, other people in the group are like, &amp;ldquo;Hey, what are we doing here again?&amp;rdquo; I&amp;rsquo;m like, &amp;ldquo;Okay, this is what we&amp;rsquo;re doing.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ANDY: Scura would definitely have glasses or something and be the one that goes, the one who&amp;rsquo;s the character who is most likely the brainy, one of the group who actually knows everything&amp;rsquo;s going on and pulls everyone else into line on that front.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I actually rolled a journal for her in her starting items.&lt;/p&gt;
&lt;p&gt;ANDY: That&amp;rsquo;s perfect. So that&amp;rsquo;s handy, A magical journal where you can interlink different pages.&lt;/p&gt;
&lt;p&gt;NICOLE: I know. I actually purposely never play a character with low intelligence because of it. Because I don&amp;rsquo;t think it&amp;rsquo;s realistic. We have a question. Oh, by the way, there&amp;rsquo;s someone, Mariana Bergo, who said:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What a lovely collision of worlds. I follow Andy&amp;rsquo;s work on service design but had no idea he&amp;rsquo;s a D&amp;amp;D guy as well. That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;ANDY: I have in mind to do some crossover stuff actually about this, about some of stuff I&amp;rsquo;ve learned from RPGs too and managing teams and design leadership and stuff and vice versa. So we&amp;rsquo;ll see if that emerges. So what&amp;rsquo;s the question?&lt;/p&gt;
&lt;p&gt;NICOLE: Courtney Robertson says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Does your group share notes? Curious if the group might use GitHub or some other means to sync?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Okay, so no. Well, I publish my notes and sometimes, I&amp;rsquo;ll post my notes especially if somebody was away that week or something. I&amp;rsquo;ll publish my notes. There&amp;rsquo;s another person who we got into Obsidian and he doesn&amp;rsquo;t publish it though. He will just often like export to PDF from Obsidian. And Andy of course, can&amp;rsquo;t share his notes with us.&lt;/p&gt;
&lt;h2 id="andys-dm-style"&gt;Andy&amp;rsquo;s DM style&lt;/h2&gt;
&lt;p&gt;ANDY: Yeah, I think a couple of them actually, a couple of others too. So I think three out of the other four use Obsidian and what state their notes are in. So I have to say it&amp;rsquo;s incredibly handy for me. So as the DM, I really do make up quite a lot. I mean, I think people forget&amp;hellip; It maybe just my style. So one of the things you would ask me, what am I like as a DM? I follow the Sly Flourish&amp;rsquo;s Lazy GM format. So I prep kind of&amp;hellip; I think about it a lot. I caught myself this week actually thinking about some stuff like all week. And in fact, the session that we just had on Tuesday, there was a little bit of trolling I did to Nicole&amp;rsquo;s character that I-&lt;/p&gt;
&lt;p&gt;NICOLE: A little.&lt;/p&gt;
&lt;p&gt;ANDY: Had been thinking about the joke basically, and the setup of it and just crafting it all week. But then generally, I spend maybe an hour, two hours maybe. And in fact the one we&amp;rsquo;re about to have a look at, the session we&amp;rsquo;ll look at in a second, I spent probably a lot of time. Over a couple of weeks, I probably spent about four hours maybe prepping this, plus the map. But usually, I spend less than that. But then, I did that classic thing where I sometimes I prep very little and I&amp;rsquo;m terribly worried. And literally, so this group is an interesting group in that they&amp;rsquo;re violent pacifists. They&amp;rsquo;ll sort of avoid combat and then chop people in half. Once they get triggered, it goes violent. And they&amp;rsquo;re quite a suspicious group, so quite a suspicious party. So we&amp;rsquo;ve had sessions where it&amp;rsquo;s literally taken like half an hour in real time to decide to go through a doorway or something. And I think this isn&amp;rsquo;t unusual actually in other parties. So sometimes that happens and I think I prep all of this stuff and I think, &amp;ldquo;Oh God, I&amp;rsquo;m not prepped at all.&amp;rdquo; And literally we get through about 20% of it. And sometimes, we blast through it or they desire to do something else. And there of course, I have to improvise an awful lot. Should we have a look at some notes?&lt;/p&gt;
&lt;p&gt;NICOLE: I take pleasure at that happening. I wanna ask you first, how many notes, yeah, how many notes do you think I have for this campaign?&lt;/p&gt;
&lt;p&gt;ANDY: Oh, I don&amp;rsquo;t know. It&amp;rsquo;s gonna be 1,000. No, I don&amp;rsquo;t know, 800. I don&amp;rsquo;t know how many, like including other stuff or just the campaign itself?&lt;/p&gt;
&lt;p&gt;NICOLE: Just the campaign. Not including pictures.&lt;/p&gt;
&lt;p&gt;ANDY: 700.&lt;/p&gt;
&lt;p&gt;NICOLE: Less actually.&lt;/p&gt;
&lt;p&gt;ANDY: Oh, okay.&lt;/p&gt;
&lt;p&gt;NICOLE: It is 486 notes.&lt;/p&gt;
&lt;p&gt;ANDY: It&amp;rsquo;s still quite a lot.&lt;/p&gt;
&lt;p&gt;NICOLE: It is but it&amp;rsquo;s 133,784 words.&lt;/p&gt;
&lt;p&gt;ANDY: Wow. It&amp;rsquo;s telling me I&amp;rsquo;ve got, well, 1,915 files. But actually, the DM notes come up to 321. And here&amp;rsquo;s where all the Obsidian people fall off the 102 folders. So I might want to explain-&lt;/p&gt;
&lt;p&gt;NICOLE: Oh God.&lt;/p&gt;
&lt;p&gt;ANDY: -why that is. Oh God, you use folders? You heathen.&lt;/p&gt;
&lt;p&gt;NICOLE: Heathen!&lt;/p&gt;
&lt;p&gt;ANDY: So do you wanna have a look?&lt;/p&gt;
&lt;p&gt;NICOLE: Do you know bookmarks can- Yeah, yeah. Do you wanna add it or do you want me to do that?&lt;/p&gt;
&lt;p&gt;ANDY: No, I&amp;rsquo;ll do it. I&amp;rsquo;ll do the same. Bookmarks can what?&lt;/p&gt;
&lt;p&gt;NICOLE: Bookmarks can actually on my version, bookmarks can bookmark a folder.&lt;/p&gt;
&lt;h2 id="a-tour-of-andys-dm-vault"&gt;A tour of Andy&amp;rsquo;s DM vault&lt;/h2&gt;
&lt;p&gt;ANDY: I can do that too. I can do that too. Yeah, it does work.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m gonna show people around my vault a little bit. Not too much. And you&amp;rsquo;ll see I&amp;rsquo;ve got the episode title here and it says sanitized &amp;lsquo;cause there there was like two secrets that you&amp;rsquo;re not allowed to see.&lt;/p&gt;
&lt;h3 id="dm-reference-resources"&gt;DM reference resources&lt;/h3&gt;
&lt;p&gt;So I have a bunch of DM resources here. I have the raw reference here, the SRD plus other stuff I&amp;rsquo;ve added. I have this thing which I don&amp;rsquo;t really use anymore, which is called default tabs. So I used to use it quite a lot where I&amp;rsquo;d pull up some generators and cheat sheet and stuff. I don&amp;rsquo;t really use it anymore. And in fact, I think I&amp;rsquo;ve lost my DM screen, but I&amp;rsquo;ll put it back up there. I have a DM screen, which is set up as a list. I used to have it as a Kanban, but I prefer it in a list &amp;lsquo;cause I can just sneak it in in that left-hand column. So I have two keyboard hotkeys set up, which is to hide the two sides and I use them all the time both in work and also DMing. So this is quite handy.&lt;/p&gt;
&lt;p&gt;And the other thing plugin I use a lot is the hover one. So I&amp;rsquo;m really quite often doing this thing where I&amp;rsquo;m just checking something here. And so, that&amp;rsquo;s how I&amp;rsquo;m doing that. So back to this.&lt;/p&gt;
&lt;h3 id="random-tables"&gt;Random tables&lt;/h3&gt;
&lt;p&gt;So I have a bunch of random raw tables. I don&amp;rsquo;t use these so much. The one I use a lot is the NPC. So I have a big random roller, which is like, pulls from a lot of stuff. It&amp;rsquo;s got a button at the top and it&amp;rsquo;s pulling from a bunch of lists. I think some of these will break, but it&amp;rsquo;s also got things like sort of encounter some of these encounter roll tables and stuff that I&amp;rsquo;ve got around in my vault. So if I just go, I&amp;rsquo;m going to&amp;hellip; So I re-roll that. And I can quickly find an NPC and a name. Something&amp;rsquo;s a bit weird I think with the name there actually now it&amp;rsquo;s pulling, it should be first name, second name. And they&amp;rsquo;ve got some stuff here and I sometimes re-roll that bit. Always drinking over by under. Sometimes, that&amp;rsquo;s handy. And occasionally, if you&amp;rsquo;re wandering around, you will meet some of this stuff. Probably less so. I sometimes might use it when I&amp;rsquo;m writing bits of an encounter or I might trust, okay, travelers on the road do they meet someone or a roadside encounter. But I actually don&amp;rsquo;t use this as much as I thought I would.&lt;/p&gt;
&lt;p&gt;What I probably use most are things like these things which are iframes. So there&amp;rsquo;s a website called RPG Heroes. I use this all the time. So when you go, &amp;ldquo;So do I see anyone to ask directions?&amp;rdquo; And I&amp;rsquo;m like, &amp;ldquo;Oh yeah.&amp;rdquo; And then I go, &amp;ldquo;Yes, there&amp;rsquo;s a guy with a long beard and a cloak and stuff.&amp;rdquo; &amp;lsquo;Cause I like the visual. And I quite often ignore the rest of it, but sometimes, it&amp;rsquo;s quite useful. This one is useful for stat blocks. It generates stat blocks as well. So RPG Tinker is good and there&amp;rsquo;s a bestiary version of it too. And sometimes, use Tetra Cube one, but I mostly use those or I have quick name lists as well.&lt;/p&gt;
&lt;p&gt;So in game, that&amp;rsquo;s what I&amp;rsquo;m doing. All the other stuff is mostly for adventure writing if I&amp;rsquo;m doing stuff. And there&amp;rsquo;s more of that in there. Now I&amp;rsquo;m seeing amount of PDFs and stuff in here.&lt;/p&gt;
&lt;p&gt;I have some charts and tables like price list I use quite often. We&amp;rsquo;ve just had a couple of shopping episodes. I have a price list encyclopedia here and when someone goes, &amp;ldquo;Oh, I wanna go and buy a crossbow.&amp;rdquo; And I&amp;rsquo;m like, &amp;ldquo;Crossbow. Oh yeah, yeah, well that&amp;rsquo;s gonna cost you.&amp;rdquo; Let&amp;rsquo;s just go through hand crossbow, that&amp;rsquo;s 75 gold. So I&amp;rsquo;m not spending ages searching around in stuff for this.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s most of the stuff I&amp;rsquo;m using in game. And there&amp;rsquo;s obviously sort of monsters and stuff like that. I have them in folders partly because this existed before Obsidian and I like to have my stuff in folders on the desktop. So when I don&amp;rsquo;t have Obsidian handy or maybe one day might use something else whatever, the stuff is organized. I don&amp;rsquo;t want to become so dependent on say on Dataview that I can&amp;rsquo;t use all the stuff in my folders or tags for that matter. I do actually just started tagging stuff on macOS in Finder.&lt;/p&gt;
&lt;h3 id="dm-notes"&gt;DM notes&lt;/h3&gt;
&lt;p&gt;My actual DM notes are in Wildemounts - Tuesday Wildemount DM notes. I didn&amp;rsquo;t change that &amp;lsquo;cause this is like ripple across so many links. So I&amp;rsquo;ve got a previous sessions note and I have a current one, and I make a folder. And the reason why I have it in folder instead of just a note is &amp;lsquo;cause sometimes, I have sub bits of a plot arc. And particularly, if I&amp;rsquo;m borrowing bits from an existing adventure like a published adventure, I&amp;rsquo;ll have them in here and the bits of that are actually in that session&amp;rsquo;s folder.&lt;/p&gt;
&lt;p&gt;And I do it as separate notes because then, what I can do is if we don&amp;rsquo;t get through it all, I can just move the bits that we haven&amp;rsquo;t got through into the next problem. So that&amp;rsquo;s why I do that. So that&amp;rsquo;s my current session always.&lt;/p&gt;
&lt;p&gt;I do have a previous session lister. So this is a Dataview query that is doing that. And I can go through an hour, in fact hour, and sometimes I have a few other bits and pieces. I have some scratch stuff so you&amp;rsquo;re not seeing this but these are sort of things I&amp;rsquo;m thinking of that might come up. They end up sort of in there. So I have adventures, I&amp;rsquo;ve got some different quests. I&amp;rsquo;ve got some extra lore stuff in here. I&amp;rsquo;ve got some specific images to this world and items and stuff. And then I have locations.&lt;/p&gt;
&lt;h3 id="location-dashboard"&gt;Location dashboard&lt;/h3&gt;
&lt;p&gt;In every location, so we are gonna have a look at a place named Shadycreek Run. Every location has its folder, there&amp;rsquo;s some hooks, plot hooks in there, there are locations in there, there are maps and there are NPCs. And that&amp;rsquo;s how I structure it. And then I usually have a dashboard. So this one here is the Shadycreek dashboard I&amp;rsquo;ve actually gotta open up here.&lt;/p&gt;
&lt;p&gt;And that is a bunch of&amp;hellip; That&amp;rsquo;s a map using the leaflet plugin. I have a bunch of Dataview things that are pulling stuff out that&amp;rsquo;s tagged as locations, NPCs and so forth. And back to my point that I don&amp;rsquo;t wanna become so dependent on Dataview that I can&amp;rsquo;t live without it, that&amp;rsquo;s what the folders are for, right?&lt;/p&gt;
&lt;p&gt;Stuff in here is tagged. And so if I didn&amp;rsquo;t have Obsidian, if I didn&amp;rsquo;t have Dataview, I can still go and find all those NPCs and stuff &amp;lsquo;cause they&amp;rsquo;re in that folder and I&amp;rsquo;m not having to hunt around amongst locations and other stuff as well. So that&amp;rsquo;s why I do it. But the dashboard is super handy. It&amp;rsquo;s particularly handy for when they go, &amp;ldquo;I wanna go and go to the blacksmith.&amp;rdquo; And I&amp;rsquo;m like, &amp;ldquo;Hang on a second, I have that table.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;NICOLE: We haven&amp;rsquo;t gone to most of these!&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah, we have. So then I&amp;rsquo;m like, &amp;ldquo;Oh yeah, blacksmith. Oh I want to go to a shop.&amp;rdquo; And I think with this one here, so I&amp;rsquo;ll often just gonna pull up there. I don&amp;rsquo;t know why that&amp;rsquo;s looping. It&amp;rsquo;s into like some ridiculous nested thing there.&lt;/p&gt;
&lt;p&gt;So the Jezean Emporium for example, they went there. I pretty much, that&amp;rsquo;s very weird. That&amp;rsquo;s doing that. What have I got down going on there that is making that nest? I think that&amp;rsquo;s a weird artifact. I don&amp;rsquo;t know why, maybe it&amp;rsquo;s this. What this is here, this blank thing, I still haven&amp;rsquo;t come up with an image for the NPC who&amp;rsquo;s here. I&amp;rsquo;m pretty sure I decided that he was a taxidermist like, on the spot. So you went-&lt;/p&gt;
&lt;p&gt;NICOLE: Really?&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah. And then I decided he was this known taxidermist and I thought it was funny to have this taxidermist that was this little gnome. And he was in the middle of pretty disgustingly actually stuffing a worg and preserving a worg, which was this big creature. So I had this idea, it was like sort of getting inside. And he was-&lt;/p&gt;
&lt;p&gt;NICOLE: I thought that was intentional.&lt;/p&gt;
&lt;p&gt;ANDY: No, no. And then as I was doing it I was thinking, &amp;ldquo;Oh, this is quite good because one of the characters, this guy, Ionos Jagentoth, I had him collecting these sort of exotic monsters and stuff and keeping them in a dungeon menagerie. So he&amp;rsquo;s got this dungeon or he had this dungeon, we&amp;rsquo;ll come to that in a minute. That was full of these different creatures.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;Cause I was looking through Kobold Press&amp;rsquo;s Tome of Beasts and I thought, &amp;ldquo;Wouldn&amp;rsquo;t it be really great to have just a whole load of monsters of different kinds in one place in a dungeon or in an area, they&amp;rsquo;re in cages and there&amp;rsquo;s a bunch of switches on the walls and the players don&amp;rsquo;t really know what the switches do.&amp;rdquo; And so I had a random roll table for the switches and I was rolling to see what they did. I can&amp;rsquo;t remember if I got you to roll. I think I&amp;rsquo;ve got you to roll. Which what the switch did. So sometimes, it like it opened one cage but there was a couple of switches that opened everything and it would&amp;rsquo;ve probably been-&lt;/p&gt;
&lt;p&gt;NICOLE: Oh God we would&amp;rsquo;ve died.&lt;/p&gt;
&lt;p&gt;ANDY: All the creatures come out. And I thought it was really nice and funny. I thought it was funny most of the time, I&amp;rsquo;m trying to think of stuff that was funny idea to have all these different creatures.&lt;/p&gt;
&lt;p&gt;And they might start fighting each other and stuff as well &amp;lsquo;cause they were creatures that definitely probably would just like feed off of each other and things in the midst of this sort of chaos. Plus you had a fairly major boss character turn up at the same time. So that was the idea behind this. And anyway, so Kimbal Jezean who was the&amp;hellip; And I am pretty sure the source for this by the way, was the very good Exandria Discord. It&amp;rsquo;s a very good community online.&lt;/p&gt;
&lt;p&gt;NICOLE: Wait a minute, his potion prices are plus 10%, what?!&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, his prices, well because you are in&amp;ndash; so Shadycreek Run, for those of you who don&amp;rsquo;t know, is like the Mos Eisley of Wildemount. It is a dodgy sort of outpost outside of the main empire. And so yeah, so there is a premium on the prices. right?&lt;/p&gt;
&lt;p&gt;So I had some potions for sale here, which you may or may not have got. Burned down, thanks to Halkin. So one of our players, his character got petrified, he&amp;rsquo;s a wizard and so he rolled another character, which is a barbarian dragonborn. And who followed these sort earth goddess called Melora. Anyway, seeing these stuffed animals, he was incensed and basically paid someone to burn it down. There was a lot of that going on in this particular thing.&lt;/p&gt;
&lt;p&gt;So anyway, the main thing that I wanna say about him is that a lot of the stuff about him being a taxidermist and well I just sort of thought, &amp;ldquo;Oh, that&amp;rsquo;d be funny.&amp;rdquo; And then I thought, &amp;ldquo;Oh maybe he&amp;rsquo;s delivering creatures, either live creatures or stuffed versions of it as trophies to the Jagentoths.&amp;rdquo; And I thought that might be a good connection.&lt;/p&gt;
&lt;p&gt;And then I just came up with his character and his voice, which I&amp;rsquo;m not gonna do right now immediately.&lt;/p&gt;
&lt;p&gt;NICOLE: But that was the best part about him.&lt;/p&gt;
&lt;p&gt;ANDY: Let&amp;rsquo;s go like this. Oh hang, on a minute. I&amp;rsquo;ve just gotta go and get this slime off of my hands.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh it was perfect. Did you do that just on the spot?&lt;/p&gt;
&lt;p&gt;ANDY: I did do that on the spot, yeah. And I regretted it &amp;lsquo;cause I-&lt;/p&gt;
&lt;p&gt;NICOLE: Oh wow.&lt;/p&gt;
&lt;p&gt;ANDY: After about five minutes of talking I was like. So that was it. So that&amp;rsquo;s how I then reuse something like that dashboard and the NPCs that are in it &amp;lsquo;cause when Nicole as Scura goes, &amp;ldquo;Oh I&amp;rsquo;m just gonna send sending to this person.&amp;rdquo; I&amp;rsquo;m like, &amp;ldquo;Yeah, who&amp;rsquo;s that again?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="nicoles-note-on-shadycreek-run"&gt;Nicole&amp;rsquo;s note on Shadycreek Run&lt;/h2&gt;
&lt;p&gt;NICOLE: I wonder if I should show my Shadycreek dashboard.&lt;/p&gt;
&lt;p&gt;ANDY: Well do you wanna show, yeah, maybe let&amp;rsquo;s switch &amp;lsquo;cause there&amp;rsquo;s more I can show you. &amp;lsquo;Cause I&amp;rsquo;d like to show you the Jagentoth compound.&lt;/p&gt;
&lt;p&gt;NICOLE: Ooh, we&amp;rsquo;re switching.&lt;/p&gt;
&lt;p&gt;ANDY: But you go to yours first and see where you got to.&lt;/p&gt;
&lt;p&gt;NICOLE: Okay, so this is my note on Shadycreek Run. I also have the Leaflet thing. I think you gave us this. And then the places that we have been to are already marked on there. So when I click on them, it goes to the note. I do also have Dataview queries. These are the locations that aren&amp;rsquo;t shops. I have factions because a big part of Shadycreek Run is that it&amp;rsquo;s ruled by these families. And so I have notes on each of them like, here&amp;rsquo;s the Jagentoth family. People that they&amp;rsquo;ve killed, businesses. I even have like a little diagram of their family tree.&lt;/p&gt;
&lt;p&gt;ANDY: It&amp;rsquo;s more than I have, I can tell you.&lt;/p&gt;
&lt;p&gt;NICOLE: I think I asked you and you&amp;rsquo;re like, &amp;ldquo;Uh, yeah, Reese. Reese is his name.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, I don&amp;rsquo;t know what I thought. No, I think some of them are in the book.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, okay. And then also I have Dataview query that lists everybody that&amp;rsquo;s on there. So every NPC I put their family if it&amp;rsquo;s relevant as a faction as well. And then some of these have skulls, that&amp;rsquo;s &amp;lsquo;cause we killed them.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, quite a lot of them.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, so here are all my NPCs from Shadycreek Run. Some of them are dead. And I have a little description of them. I mean, sometimes it&amp;rsquo;s really like, Sybastien: doesn&amp;rsquo;t like Wally. Sometimes, it&amp;rsquo;s very vague. And then here are the shops in Shadycreek, &amp;lsquo;cause that&amp;rsquo;s like a separate thing. Kimbal said I might get calming tea here which I did actually. And then I have sessions. So I think there was one point when we were like, &amp;ldquo;Oh, when was that? What session was it that we were last here?&amp;rdquo; I&amp;rsquo;m like, &amp;ldquo;Oh it was on 37 or whatever.&amp;rdquo; But my numbering is different from Andy&amp;rsquo;s by the way, just because I came in like after 17 sessions. So I&amp;rsquo;m 17 sessions behind. So that&amp;rsquo;s my Shadycreek Run one.&lt;/p&gt;
&lt;p&gt;ANDY: Next week with session 83. So it&amp;rsquo;s been going for two years. Actually just around this time, I think April, it was the session zero.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah. So should we go into a particular session that you-&lt;/p&gt;
&lt;p&gt;ANDY: Let&amp;rsquo;s do that. Yeah, let&amp;rsquo;s do that.&lt;/p&gt;
&lt;p&gt;NICOLE: Okay, well&amp;hellip; Let me ask first though.&lt;/p&gt;
&lt;h2 id="background-for-the-session-andy-chose-to-show"&gt;Background for the session Andy chose to show&lt;/h2&gt;
&lt;p&gt;NICOLE: Why did you really choose this session and why was it to troll me?&lt;/p&gt;
&lt;p&gt;ANDY: Okay. So I did not deliberately troll you. So there was a significant event with an NPC from Scura&amp;rsquo;s backstory in this episode. And I actually thought it had happened in the previous episode, session.&lt;/p&gt;
&lt;p&gt;NICOLE: Still not convinced.&lt;/p&gt;
&lt;p&gt;ANDY: And I chose this one because it was one that I had prepped sort of quite a lot for it. It&amp;rsquo;s got some, I think some maybe some interesting prep stuff in it in terms of the way I went about structuring it. And it was interesting on because there was some extra bits that I did, which I then have probably then carried on and we&amp;rsquo;ll probably continue in the future because it was quite complex. There were a lot of NPCs. So the session is, they go to this place they&amp;rsquo;re called Jagentoths, they go to their compound, it&amp;rsquo;s this house set in the forest surrounded by the perimeter fence. And there&amp;rsquo;s an NPC called, sorry, there&amp;rsquo;s an NPC called Floyd. And I&amp;rsquo;ll explain why I&amp;rsquo;m laughing in a second. His name&amp;rsquo;s Floyd Hemsworth.&lt;/p&gt;
&lt;p&gt;And one of the other characters-&lt;/p&gt;
&lt;p&gt;NICOLE: Crownsguard Douche.&lt;/p&gt;
&lt;p&gt;ANDY: -Milla, had a dalliance with him. Crownsguard Douche, as you&amp;rsquo;ve christened him.&lt;/p&gt;
&lt;p&gt;And there was reverse damseling. So basically they had to go and rescue him. He had been captured by this boss guy.&lt;/p&gt;
&lt;p&gt;And so you&amp;rsquo;ve got the NPCs, a lot of NPCs cause there&amp;rsquo;s guards and there&amp;rsquo;s all the other characters that have been, they&amp;rsquo;re also in it. And this is a thing we talked about in session zero. There are some slaves in this that these are nasty people. So I really wanted to go, this is one of those things where I&amp;rsquo;m not going to have slavery, like the characters have the main party, have slaves, for fun and stuff. But these are bad people.&lt;/p&gt;
&lt;p&gt;So bad that in fact the party decided to burn their whole place down and kill them all and rescue the slaves. So you&amp;rsquo;ve got the slaves, you&amp;rsquo;ve got the family, you&amp;rsquo;ve got all the guards, plus you&amp;rsquo;ve got this basement, this dungeon menagerie in the basement with all these different creatures.&lt;/p&gt;
&lt;p&gt;So there&amp;rsquo;s quite a lot going on and it could have gone in a lot of different directions for me as a DM. So that&amp;rsquo;s one of the reasons why I prepped it. Fairly often, I don&amp;rsquo;t do that much prep.&lt;/p&gt;
&lt;p&gt;Fairly often, I&amp;rsquo;ve got maybe three or four scenes, very bare bones sketched out what&amp;rsquo;s gonna happen. If there&amp;rsquo;s any encounter stuff, I&amp;rsquo;ll have a sort of encounter set up and that&amp;rsquo;s about it. And then kind of, I don&amp;rsquo;t know, I think I&amp;rsquo;m fairly good at winging it. I think quite often, I said I feel so unprepared and you guys don&amp;rsquo;t think so.&lt;/p&gt;
&lt;p&gt;What was entertaining about this one is I was really prepared and I expected you to do a sort of heist thing and sneak in to the house, rescue, explore the house. I had all these kind of, I&amp;rsquo;m gonna show you. Let me put up my thing and I&amp;rsquo;ll show you.&lt;/p&gt;
&lt;h3 id="andys-session-prep"&gt;Andy&amp;rsquo;s session prep&lt;/h3&gt;
&lt;p&gt;ANDY: So in the house. Here&amp;rsquo;s the session, So the session starts with, I have just have a reminder calendar links back to the Wildemount, I can never remember the names of the week and stuff. So we do a little bit of a thing. There&amp;rsquo;s an eclipse coming up. I don&amp;rsquo;t use this that much, but it just reminds me to, in fact, this is an old Owlbear link. I don&amp;rsquo;t even use that anymore. I use Owlbear-&lt;/p&gt;
&lt;p&gt;NICOLE: Actually Andy.&lt;/p&gt;
&lt;p&gt;ANDY: The new one.&lt;/p&gt;
&lt;p&gt;NICOLE: I remember in the first session &amp;lsquo;cause I went back to the first session we played, that played with you and you weren&amp;rsquo;t using calendars, no one had asked about the time.&lt;/p&gt;
&lt;p&gt;ANDY: No, that&amp;rsquo;s right. That&amp;rsquo;s one of the things that now, we do have a calendar actually. So now we have the Fantasy Calendar plugin. Thank you, Jeremy. And as you can see, our game moves pretty slowly. There&amp;rsquo;s like five sessions in the space that have happened in the game day.&lt;/p&gt;
&lt;p&gt;NICOLE: I think we started in Quen&amp;rsquo;pillar though, didn&amp;rsquo;t we?&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, I think you did. But I don&amp;rsquo;t remember. I don&amp;rsquo;t think I started adding to the calendar until more recently. So in this, I&amp;rsquo;ve made myself a little note to remind about the X or fast forward cards session zero thing. Because of the slavery thing and because one of the guys is the main guy, the main bad is a torturer. I wanted to just remind people if this is something they don&amp;rsquo;t want, they can skip. So then there&amp;rsquo;s a recap and then I have a few DM notes. So these are basically things I mustn&amp;rsquo;t forget to open or I know that I&amp;rsquo;m going to wanna go back and have a look at. I usually list all the NPCs out and this is all done manually.&lt;/p&gt;
&lt;p&gt;NICOLE: Who is Phespo?&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, who&amp;rsquo;s Phespo? That&amp;rsquo;s a very good point. Oh, that&amp;rsquo;s the Medusa. You didn&amp;rsquo;t know? Did you not know her name? Her name is Phespo.&lt;/p&gt;
&lt;p&gt;NICOLE: No.&lt;/p&gt;
&lt;p&gt;ANDY: So there was a character, there was a Medusa that they faced a couple of sessions before this. And so that&amp;rsquo;s why she&amp;rsquo;s there. Just in case I have to go back and remember some of that. And then the rescue&amp;rsquo;s on. So there&amp;rsquo;s the Jagentoth. I called them Jagentoth, it&amp;rsquo;s probably Jagentoth but I live in Germany and for me the Js&amp;ndash; Jagen is to hunt&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, it should be Jagentoth, yeah.&lt;/p&gt;
&lt;p&gt;ANDY: And so I&amp;rsquo;ve got these two people, I&amp;rsquo;ve got one note here. That&amp;rsquo;s the scene basically. They&amp;rsquo;re gonna dine around 8 PM. So that&amp;rsquo;s what I had in mind. They&amp;rsquo;re in the dining room at this point in time. You didn&amp;rsquo;t know this, did you?&lt;/p&gt;
&lt;p&gt;NICOLE: No, I very nearly poisoned them. I had the midnight tears, ugh.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, let me go to the compound because in the compound, I think I&amp;rsquo;ve got a map or have I? Haven&amp;rsquo;t got a map wherever I put it. I haven&amp;rsquo;t got a map. Somewhere, I&amp;rsquo;ve got a map. So what I&amp;rsquo;ve done here on the left-hand side, you can see I&amp;rsquo;ve broken out all of the rooms in the compound. So I&amp;rsquo;m sure I&amp;rsquo;d got&amp;hellip; I thought I&amp;rsquo;ve got.&lt;/p&gt;
&lt;p&gt;NICOLE: Wow, this is a lot.&lt;/p&gt;
&lt;p&gt;ANDY: This is a lot, yeah. And so I had built this room, I built this mansion in Dungeon Alchemist.&lt;/p&gt;
&lt;p&gt;NICOLE: Dungeon Alchemist.&lt;/p&gt;
&lt;p&gt;ANDY: And what&amp;rsquo;s it called? What&amp;rsquo;d you say? It&amp;rsquo;s called Dungeon Alchemist.&lt;/p&gt;
&lt;p&gt;NICOLE: Dungeon Alchemist.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah. And I&amp;rsquo;d furnished it all and all of these rooms have some thought behind it. There&amp;rsquo;s a little tree and there&amp;rsquo;s a kitchen here. And here is-&lt;/p&gt;
&lt;p&gt;NICOLE: We didn&amp;rsquo;t see it all.&lt;/p&gt;
&lt;p&gt;ANDY: No you didn&amp;rsquo;t. So here is the bedroom, the bedroom has a door to this study. The study has a secret passage, a secret bookshelf door into this secret study with a safe. And then here at the end of this corridor is a secret passageway down into the dungeon. And over here is the slave hut. This is a secret passageway down into the dungeon too. And this was the guardhouse, which you never got to see inside. Because&amp;hellip;&lt;/p&gt;
&lt;p&gt;NICOLE: &amp;lsquo;Cause we just burned it.&lt;/p&gt;
&lt;p&gt;ANDY: Because you decided to burn the place down. So they-&lt;/p&gt;
&lt;p&gt;NICOLE: We used an immovable rod.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah. So they used an invisible rod to block the guardhouse door. They put sort of casks of gunpowder, which they had got illegally elsewhere. You blew up the latrine was the first thing. And then you basically ended up setting fire to the house. So that was quite an interesting thing for me in the sense that, okay, so all that stuff I prepared, they&amp;rsquo;re not gonna see &amp;lsquo;cause they just burnt it down. And all those secrets and all that loot and things like that, that were quite important.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh no. There was loot??&lt;/p&gt;
&lt;p&gt;ANDY: They&amp;rsquo;re gonna see. There&amp;rsquo;s loads of secrets and stuff in there that I had to relocate.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh no.&lt;/p&gt;
&lt;p&gt;ANDY: So then what happened was quite an interesting mechanic for me though, &amp;lsquo;cause they had actually started that in the previous session. I then thought, &amp;ldquo;Okay, what would be going on?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So all the guards are obviously some people are trying to put out the fires. A lot of people are gonna trying to be rescuing stuff from the house. So what was happening is that all these people are kind of pulling stuff out of the house and they&amp;rsquo;re putting onto the lawn and things like that. It&amp;rsquo;s kind like people do when there&amp;rsquo;s a bushfire or something trying to rescue the stuff.&lt;/p&gt;
&lt;p&gt;But meanwhile down in the dungeon menagerie. Let me open that. What you guys ended up doing was I had, so there were these&amp;hellip; For reasons I won&amp;rsquo;t go into, all the slaves were tieflings. And there was one of them.&lt;/p&gt;
&lt;p&gt;So I had some stuff in here, which is my sort of read aloud thing. Oh, I think I&amp;rsquo;ve got a read aloud callout here and I use that so I can just flip that up. And then what I do is I use embed, so transcludes. So I have all the different bits here and then I can transclude them. That&amp;rsquo;s why I find this quite useful to split them into separate notes. Because then I can adjust the structure and things of what I&amp;rsquo;m gonna be doing in that session. &amp;lsquo;Cause you spent like two or three sessions around this compound. And so I can adjust it, I can embed a note in the scene like I did here and I go, &amp;ldquo;Okay, so the slave house so this is gonna be this thing.&amp;rdquo; And then the dungeon menagerie and then I&amp;rsquo;ve got some stuff around here.&lt;/p&gt;
&lt;p&gt;So I have the dungeon menagerie. I&amp;rsquo;ve got Ionos and Ilbane, who was the big bad in this. I pulled a stat block from LevelUp, actually, 5e. Because it was more interesting.&lt;/p&gt;
&lt;p&gt;NICOLE: Is this just an image?&lt;/p&gt;
&lt;p&gt;ANDY: This is just an image. Yeah, I think I&amp;rsquo;ve just clipped a stat block. Out of LevelUp. And sometimes, you use the statblocks plugin and sometimes, it&amp;rsquo;s just easier to grab an image.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I get that.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah. And in this one for the dungeon menagerie, I actually like an idiot.&lt;/p&gt;
&lt;p&gt;NICOLE: Ooh, ooh, looking at all the secrets.&lt;/p&gt;
&lt;p&gt;ANDY: It wasn&amp;rsquo;t like an- And there&amp;rsquo;s a secrets and clues things at the end. And I think you know all of these but you know all of these. So I have secrets and clues. So when they found this stuff I go, &amp;ldquo;Okay, right. They found that.&amp;rdquo; These will been reset I think because I can&amp;rsquo;t remember why. Probably made a new sanitized version of it.&lt;/p&gt;
&lt;p&gt;So then I have the encounter. So this is using the encounter plugin. So when this is going on, it fires up the encounter there and I work it that way. But the dungeon menagerie was a real issue &amp;lsquo;cause I thought, &amp;ldquo;Oh my god. And there&amp;rsquo;s so many people in this place, how am I gonna manage it?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So I had for the first time ever did an adversary roster. So if anyone knows the Alexandrian, Justin Alexander, he recommends this. It was quite an old school D&amp;amp;D thing to do. And the adversary roster looks like this. It&amp;rsquo;s just a little markdown table, it&amp;rsquo;s got links to some people. And it was just so I can remember, these are all the different people around in the house. And I have an idea of where they are, but they can move around.&lt;/p&gt;
&lt;p&gt;NICOLE: Did you plan that one of them had a birthday?&lt;/p&gt;
&lt;p&gt;ANDY: So I had this idea. I wanted the guards. I didn&amp;rsquo;t want the guards to dominate everything that you were gonna be fighting multiple guards for ages. And you&amp;rsquo;d gone there, you&amp;rsquo;d scoped it out during the day and then you&amp;rsquo;d gone there in the evening.&lt;/p&gt;
&lt;p&gt;So I thought would it be fun for the guards to be in the guard house getting drunk and being loud. And then, I think in the moment, I thought you hear that one of them&amp;rsquo;s singing &amp;ldquo;Happy Birthday.&amp;rdquo; And it was particularly poetic because that one then came out and got axed, I think by Halkin. It&amp;rsquo;s like, &amp;ldquo;You just killed the guy whose birthday it was.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;And I quite like messing with them that way. I remember there was one thug and you found a note. I think, I can&amp;rsquo;t remember if you were playing for this point.&lt;/p&gt;
&lt;p&gt;NICOLE: Many, many ways you like to mess with us.&lt;/p&gt;
&lt;p&gt;ANDY: So they killed two random thugs who were guarding a place. And then of course, when they searched the bodies, I had a thing where one of them had a note in their pocket from his estranged wife saying, &amp;ldquo;Please come home. Your daughter misses you. Please give up this way of life&amp;rdquo; and stuff. And they&amp;rsquo;re all like, &amp;ldquo;Oh no, we just killed this henchman, but they had a life and stuff.&amp;rdquo; So I apologize.&lt;/p&gt;
&lt;p&gt;NICOLE: How cruel is that? What a sadistic, okay, I change my answer. You&amp;rsquo;re a sadistic DM.&lt;/p&gt;
&lt;p&gt;ANDY: My job is to mess with you as well.&lt;/p&gt;
&lt;p&gt;So anyway, adversary roster and then I had an encounter table. So using the encounter plugin such as separate, it&amp;rsquo;s in a separate thing as well, a separate transclude, there&amp;rsquo;s an encounter table so that depending on where you went, I could fire up a, a different set of encounters. So if you were gonna fight the house guards and the captain, I can fire up that one and so on.&lt;/p&gt;
&lt;p&gt;And this was the dungeon menagerie. So I just had this set up like all the creatures are in here and then I would just skip them in the initiative if depending on who was there. You would&amp;rsquo;ve probably struggled if they&amp;rsquo;d all escaped in one go.&lt;/p&gt;
&lt;p&gt;But as it happened, you set fire to the house and missed out quite a lot of, all that prep, all these bedrooms and everything that I created, you guys just completely missed out &amp;lsquo;cause they turned to ash.&lt;/p&gt;
&lt;p&gt;NICOLE: There was an ettercap?&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, there was an ettercap in the dungeon menagerie. So we play, we use Owlbear Rodeo. So this was loaded into our Owlbear Rodeo and yeah, there was the one that was the ether cap was, there was one cage you might remember that was full of spiderwebs and cobwebs. That was the&amp;hellip;&lt;/p&gt;
&lt;p&gt;NICOLE: Cool.&lt;/p&gt;
&lt;p&gt;ANDY: And then I guess the last thing you were, Floyd&amp;hellip; So the joke was that this Domovoi was Floyd. Ah, so Floyd, he was just a Crownsguard. He was just a guard on a gate. And I thought it would be funny if there was like a really good looking guy and a young doofus who was as a comedic pair.&lt;/p&gt;
&lt;p&gt;And then I said, &amp;ldquo;Oh, this guy&amp;rsquo;s, his name&amp;rsquo;s&amp;hellip;&amp;rdquo; I thought of Pink Floyd or something, his name&amp;rsquo;s Floyd. And when you ask him directions and that&amp;rsquo;s how it started. And then I said, &amp;ldquo;He&amp;rsquo;s really good looking. He looks like Chris Hemsworth.&amp;rdquo; And so that&amp;rsquo;s how he became Floyd Hemsworth. And then-&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, I didn&amp;rsquo;t know that.&lt;/p&gt;
&lt;p&gt;ANDY: You asked him to come with you. Yeah, the party asked him to come with you. He started flirting with one of the characters who then was flirting, well, she was flirting with him. And then he had all sorts of thoughts about, he became, then I had to build a whole backstory and family and stuff and connections for him. But it was one of the examples of a randomly invented NPC became actually quite important.&lt;/p&gt;
&lt;p&gt;So anyway, the way the setup was he was in here and the Domovoi had made him invisible but had made himself look like Floyd and was in here. So the idea was that I was gonna lure a character into the cage, get the cage closed, there was gonna be a little cage fight inside here except what happened?&lt;/p&gt;
&lt;p&gt;What happened, Scura? Tell us.&lt;/p&gt;
&lt;p&gt;NICOLE: I foiled your plans.&lt;/p&gt;
&lt;p&gt;ANDY: Milla. It was Milla that foiled the plans actually. Two of you, both of you, between the two of you.&lt;/p&gt;
&lt;p&gt;NICOLE: I cast the see invisibility, yeah.&lt;/p&gt;
&lt;p&gt;ANDY: So you cast see invisibility and Milla cast Detect Thoughts. And so basically between the two of them, they could work out who was in which cage. So that didn&amp;rsquo;t work. Anyway. So that was my setup for all of that. That&amp;rsquo;s probably as much as I need to carry on going on about, it&amp;rsquo;s been quite a long time, but it was quite complex. And then got foiled by the players.&lt;/p&gt;
&lt;h3 id="nicoles-session-notes"&gt;Nicole&amp;rsquo;s session notes&lt;/h3&gt;
&lt;p&gt;NICOLE: Good. I can show you mine for the same one.&lt;/p&gt;
&lt;p&gt;ANDY: Okay. And if anyone has any questions, please fire away.&lt;/p&gt;
&lt;p&gt;NICOLE: Okay, so this is the same session. I always like to have like a Midjourney thing that I do just so that in the worldview, in the world note, it&amp;rsquo;s just nice to have cards and each session has like an image of what it looks like. Sometimes it&amp;rsquo;s not quite right, but it&amp;rsquo;s enough to remind me of the session.&lt;/p&gt;
&lt;p&gt;And oh, that&amp;rsquo;s our video of it actually happening. Oh, so we have a player-only chat where we scheme against Andy.&lt;/p&gt;
&lt;p&gt;ANDY: I didn&amp;rsquo;t know about this.&lt;/p&gt;
&lt;p&gt;NICOLE: And plan to mess with him almost as much as he plans to mess with us. So there were, at the time, Tyler, who plays Wally, he was away. So sometimes, I put things like instructions for Wally and he had this weapon. He told me when to use it and what the abilities were. And then I like to use these little call outs sometimes to mark what I know and what I don&amp;rsquo;t know or what other players don&amp;rsquo;t know.&lt;/p&gt;
&lt;p&gt;Sometimes, I put things in comments so that if somebody goes into my Obsidian published notes, one of the other players, they won&amp;rsquo;t immediately see some things there. So it&amp;rsquo;s the same thing, right?&lt;/p&gt;
&lt;p&gt;So here I cast &lt;em&gt;see invisibility&lt;/em&gt; as we were going down into the dungeon. And then I also use Initiative Tracker.&lt;/p&gt;
&lt;p&gt;I mean, I&amp;rsquo;m a healer. So part of the reason I love being a healer is that I always love keeping track of where everyone is. So this is what it looks like. I happen to have taken a screenshot of the end of this session. So this is what it looks like. I have everyone&amp;rsquo;s HP, I&amp;rsquo;m going through this using the initiative tracker and I have these custom statuses. So I track things like, if our barbarian has used reckless this round, then I know that he&amp;rsquo;s gonna need a little bit more help &amp;lsquo;cause he is probably gonna get hit.&lt;/p&gt;
&lt;p&gt;And if I have temporary hit points that I&amp;rsquo;m giving to people, I would track that here as well. Even things like if people have reacted or not, &amp;lsquo;cause that affects whether my party can leave the threat range. And what I noticed though, you use the initiative tracker, but you don&amp;rsquo;t use the log, do you?&lt;/p&gt;
&lt;p&gt;ANDY: Yes, sometimes. I do turn it on and off. I do use the log but once I, something crashed or something and I couldn&amp;rsquo;t remember everyone&amp;rsquo;s, the initiative order. What I don&amp;rsquo;t do is I don&amp;rsquo;t really log everyone&amp;rsquo;s hit points. I let you guys decide. I let you keep track of your character. Obviously, I&amp;rsquo;m keeping track of your opponents, but I&amp;rsquo;m not keeping track of your hit points. Obviously, I&amp;rsquo;m seeing it.&lt;/p&gt;
&lt;p&gt;NICOLE: That&amp;rsquo;s fair enough.&lt;/p&gt;
&lt;p&gt;ANDY: We still have our character sheets on D&amp;amp;D Beyond, so I&amp;rsquo;m usually checking where you&amp;rsquo;re at on D&amp;amp;D Beyond in the phone app.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, so I do that mainly in Obsidian because I need to know who needs healing and I always turn the log on, and this log is like an optional thing for Initiative Tracker, which is the same one that Andy uses. So I have a bunch of them here. There&amp;rsquo;s a separate Folder for log and those are the combats. And then I embed that combat into the session note so that way, it gets updated here. And then while I&amp;rsquo;m going through the rounds, I also just type in some explanation because otherwise, it&amp;rsquo;s just things like, &amp;ldquo;Grom took three damage.&amp;rdquo; And it doesn&amp;rsquo;t say, Oh that was because of Divine Smite. So I also track it along the way. And it&amp;rsquo;s just also handy I think if Andy, your initiative tracker stuffs up or something or you lose it, I can say like, &amp;ldquo;No, we&amp;rsquo;re in round three&amp;rdquo; or whatever.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, it is super handy. I think one of this is one of the differences between being the DM and being a player also is that as a DM, I&amp;rsquo;m just flat out like in a combat thing, but there&amp;rsquo;s like lots of creatures and people going on. I&amp;rsquo;m flat out concentrating on like everything. Whereas there&amp;rsquo;s a player, you&amp;rsquo;ve got the space between your turn and the next time it comes round to-&lt;/p&gt;
&lt;p&gt;NICOLE: We&amp;rsquo;re much more immersed.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, yeah. Well, you are much more immersed, but also you have time. You have time to write notes.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, true.&lt;/p&gt;
&lt;p&gt;ANDY: I barely write any notes when I&amp;rsquo;m DMing by the way. I probably should. I know loads of people who also don&amp;rsquo;t, I occasionally will write some at the end of the session if like, &amp;ldquo;Oh, I must remember that that&amp;rsquo;s happened.&amp;rdquo; I like Scura gave her two daggers to one of the NPCs, so I wrote that down.&lt;/p&gt;
&lt;p&gt;NICOLE: Everything. I gave everything.&lt;/p&gt;
&lt;p&gt;ANDY: I forget everything. I&amp;rsquo;m very reliant on note-taking players.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, so mine was basically the combat after that. And here, I&amp;rsquo;m tracking whether somebody has used my Guiding Bolt advantage on attacks and things like that.&lt;/p&gt;
&lt;p&gt;And at the time, I was also playing two players because one of the other, two characters, because one of the other players was gone. So this is like where I put the next moves for both of them. And then at the end, I had a little note to tell him because I don&amp;rsquo;t have access to his character sheet.&lt;/p&gt;
&lt;p&gt;But I was thinking that maybe I could also show how I create a new session because this is the world page and I have this nice little add new session button and when I click it, look, everything&amp;rsquo;s filled in for me.&lt;/p&gt;
&lt;p&gt;I guess I haven&amp;rsquo;t processed the last one yet, The Leaky Cucumber. But it creates- It creates the session already. So yeah, I use funny titles as well. So this is where it is at the end of the session, I would put like a summary here so that when I generate the next one that&amp;rsquo;s pulled in, so this is the recap.&lt;/p&gt;
&lt;p&gt;So often, I do the recap. Sometimes I try to get one of the other players to do it, to encourage them as well. But it&amp;rsquo;s just nice to have everything filled in. And this is also pulling in the date. I set today&amp;rsquo;s date on Fantasy Calendar so that it always chooses today&amp;rsquo;s date. My character is a Twilight Cleric and a Stars Druid, so moons matter. So I do have that as well. Let&amp;rsquo;s just show, oh, by the way, our party&amp;rsquo;s name is Temporary White Circle, and now you didn&amp;rsquo;t notice, Andy. Do you see there?&lt;/p&gt;
&lt;p&gt;ANDY: Oh yeah, I see the logo. Yeah, yeah, that&amp;rsquo;s what we&amp;rsquo;ve got on here, TWC.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah. So there, you can also see the moons, Catha and Ruidus. Isn&amp;rsquo;t that cool?&lt;/p&gt;
&lt;p&gt;ANDY: So you are way more organized in terms of the automation than I am. I generally start by duplicating the previous session&amp;rsquo;s note and because of the stuff in there, there&amp;rsquo;s some secrets and clues still that they haven&amp;rsquo;t discovered and I sort of delete stuff out and then go back in. So my metadata is all manually done. I should probably try and automate some of that.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I can just give it to you.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, but then all the rest of the stuff doesn&amp;rsquo;t work and I just don&amp;rsquo;t have the inclination to go back through every session note though and add it all back in, so.&lt;/p&gt;
&lt;p&gt;NICOLE: Octavian Datcu says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;Nicole, how do you color tags without any tags surrounding it?&amp;rdquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I&amp;rsquo;m not sure what you mean exactly. Let me share my screen.&lt;/p&gt;
&lt;p&gt;ANDY: It could be the theme. Is it the?&lt;/p&gt;
&lt;p&gt;NICOLE: You mean, does Octavian mean like the italics and stuff? Because yeah, this is the Anuppuccin theme where you can have the text decorations a different color. So that&amp;rsquo;s handy. For example, if I just put something here, it&amp;rsquo;s automatically green because it&amp;rsquo;s italic. And then this one would be automatically red &amp;lsquo;cause it&amp;rsquo;s bold. I love Anuppuccin.&lt;/p&gt;
&lt;h2 id="how-has-me-taking-notes-changed-the-way-andy-gms"&gt;How has me taking notes changed the way Andy GMs?&lt;/h2&gt;
&lt;p&gt;NICOLE: Andy. Do you think that it&amp;rsquo;s changed anything about the way that you GM that we take notes, and I take notes, so much?&lt;/p&gt;
&lt;p&gt;ANDY: I don&amp;rsquo;t know because this was the first big campaign. I&amp;rsquo;d played some small stuff with my family. But it&amp;rsquo;s the first big campaign that I&amp;rsquo;ve done since I was a kid. And so, I guess you came in, I mean, couple of the other players did take notes, but probably, you take obviously more extreme notes.&lt;/p&gt;
&lt;p&gt;What has it changed? I don&amp;rsquo;t think it changes much. I mean, it&amp;rsquo;s just really useful for me. &amp;lsquo;Cause I know that I&amp;rsquo;ve like, &amp;ldquo;Oh God, I didn&amp;rsquo;t make a note of what happened here or who&amp;rsquo;s got what,&amp;rdquo; and things like that especially when you&amp;rsquo;re dividing up loot and things like that. And I know that one of you has made a note, so I&amp;rsquo;ll often ask for your notes or go and have a look at them and that&amp;rsquo;s pretty useful.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s probably, I think, we&amp;rsquo;ve joking about the sending stuff before. I don&amp;rsquo;t know what it&amp;rsquo;s like for you as a player. I mean, I get the feeling that it sort of makes the world a bit more alive because NPCs, they&amp;rsquo;re not just like, &amp;ldquo;Oh yeah, we spoke to that person and we recorded that one and then we moved on and we&amp;rsquo;ve forgotten all about them.&amp;rdquo; It means that they sort of come back into the world a bit and I think that maybe makes the world feel more alive maybe to you as players.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I mean part of it is me just wanting to mess with you, but also some of these things are actually for a greater purpose. Most of them are not completely random. I am actually trying to do a background check or whatever.&lt;/p&gt;
&lt;p&gt;And yeah, I am very engaged in the world. And there have been a few times where I would&amp;rsquo;ve gone further if I didn&amp;rsquo;t think I was taking up too much time already. I would&amp;rsquo;ve, like, engaged with an NPC a bit more.&lt;/p&gt;
&lt;h2 id="taking-notes-on-other-pcs"&gt;Taking notes on other PCs&lt;/h2&gt;
&lt;p&gt;NICOLE: I don&amp;rsquo;t know, maybe I&amp;rsquo;ll also show my notes on the PCs. So this is one of them. Yeah, I&amp;rsquo;m hoping that they won&amp;rsquo;t watch till this part.&lt;/p&gt;
&lt;p&gt;So this is the one for Milla, there&amp;rsquo;s a picture of her, there&amp;rsquo;s a backstory that I&amp;rsquo;ve pieced together from things that she&amp;rsquo;s told me in the game. I do something called an OGAS framework. Occupation, goal, attitudes, stake. So I&amp;rsquo;m just&amp;hellip; I&amp;rsquo;m thinking of what her goals are because I think my character is very supportive and she wants her fellow party to achieve their goals. So I have to know them first. So I take notes on everybody. So I also have ideals, bonds, and flaws, not the actual ones that she has. So I don&amp;rsquo;t see that, but just, I&amp;rsquo;m guessing. I&amp;rsquo;m guessing based on what she said. And then I also have a section for knives.&lt;/p&gt;
&lt;p&gt;Andy, can you explain knife theory?&lt;/p&gt;
&lt;p&gt;ANDY: Oh, we didn&amp;rsquo;t talk about that, yeah.&lt;/p&gt;
&lt;p&gt;So knife theory is the thing, and there&amp;rsquo;s a Reddit post. So if you Google like Reddit knife theory D&amp;amp;D or something, you&amp;rsquo;ll find it.&lt;/p&gt;
&lt;p&gt;So knife theory is this idea that what you do when you create a player, when you create a character as a player, you give a bunch of knives in there that the DM can use basically to stab you with later.&lt;/p&gt;
&lt;p&gt;Which is, there are some things like, I did this thing and I&amp;rsquo;m trying to escape from it or so I have this adversary or I have this ally, or I have this particular weakness, or I have this thing in my past.&lt;/p&gt;
&lt;p&gt;And the more knives there are, the more useful it is for me. The more I can as a DM and the more I can integrate you into the world or integrate the story with their backstories.&lt;/p&gt;
&lt;p&gt;And a lot of stuff comes up fairly randomly as I talked about Floyd Hemsworth. And he is, like I said, he&amp;rsquo;s just a random NPC. And then it forced me, if I go here.&lt;/p&gt;
&lt;p&gt;ANDY: Actually, for this session, the dungeon menagerie one, I put all the stat blocks on a canvas. And it was really crawling on the day of the session, so I stopped using it, but it would now actually be quite useful. So I could just quickly grab the stat block.&lt;/p&gt;
&lt;p&gt;So here&amp;rsquo;s Floyd. I found a picture of Chris Hemsworth, I don&amp;rsquo;t know what you know, what this is from here. He is dressed up and he looked a bit like.&lt;/p&gt;
&lt;p&gt;NICOLE: Well, so he really is just a basic guard.&lt;/p&gt;
&lt;p&gt;ANDY: Yeah, well he&amp;rsquo;s a captain now. Well, he&amp;rsquo;s more than the captain now anyway. And super handsome Crownsguard.&lt;/p&gt;
&lt;p&gt;NICOLE: Super handsome!&lt;/p&gt;
&lt;p&gt;ANDY: And then there&amp;rsquo;s a backstory for him. I came up with a kind of, his father&amp;rsquo;s a general and all this stuff. And they ended up being quite a scene with me talking to myself, like him talking to his father, NPC to NPC about it. And so it was quite of, I was able to connect him to a couple of the other characters&amp;rsquo; backstories in interesting ways.&lt;/p&gt;
&lt;p&gt;So one of the characters, Wally, I thought, well, like I said, Wally&amp;rsquo;s character is actually, his father&amp;rsquo;s also in the military. So I thought, &amp;ldquo;Oh, this would be interesting that they know each other and stuff.&amp;rdquo; You have to be a little bit careful because you can also end up with a thing like of too many coincidences. But it helps and I&amp;rsquo;d really like the knife thing. And then, occasionally, there are actual player things that I know like things that I then just use to mess with them.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I like that stuff. But I also keep notes on knives for the other players and that&amp;rsquo;s what I like&amp;ndash; my character likes to do Zone of Truth, which is basically just us telling&amp;ndash; me, me asking questions to the group-&lt;/p&gt;
&lt;p&gt;ANDY: It&amp;rsquo;s spin the bottle.&lt;/p&gt;
&lt;p&gt;NICOLE: -to the characters. Pretty much, yeah. And those questions come from some knives that I&amp;rsquo;ve identified, like things that they react to in a positive or negative way.&lt;/p&gt;
&lt;p&gt;And I also actually have a section where. So here, the knives are things that the tiefling likes and doesn&amp;rsquo;t like. And then I always have a section of how I can help them for every PC. What are the things that my character, Scura, could do. And then I have this section, which is all of the questions that I ask in Zone of Truth. I also have stuff for playing the tiefling in case she&amp;rsquo;s away.&lt;/p&gt;
&lt;p&gt;ANDY: The tiefling.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I have them. Yeah, I guess she&amp;rsquo;s not THE tiefling anymore, but yeah. They&amp;rsquo;re my notes.&lt;/p&gt;
&lt;p&gt;ANDY: I sometimes&amp;ndash; I have a cheat sheet. I found a cheat sheet for Scura actually from a session &amp;lsquo;cause I think that was the one where you were away, you were like getting on a plane or something, so I had a little cheat sheet.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah. Well we should probably end this &amp;lsquo;cause we&amp;rsquo;re over time. There&amp;rsquo;s so much that I would&amp;rsquo;ve wanted to ask you, but probably for my own edification.&lt;/p&gt;
&lt;p&gt;ANDY: You can ask one more.&lt;/p&gt;
&lt;p&gt;NICOLE: Maybe I&amp;rsquo;ll ask you offline. Okay. What should I ask? Oh, no.&lt;/p&gt;
&lt;p&gt;ANDY: Roll dice.&lt;/p&gt;
&lt;h2 id="taking-notes-on-the-players"&gt;Taking notes on the players&lt;/h2&gt;
&lt;p&gt;NICOLE: Okay, okay, I know. Because the kind of GMing that you do, it is very specific to us as the players. I don&amp;rsquo;t know, at least that&amp;rsquo;s what I feel. It&amp;rsquo;s our characters and it&amp;rsquo;s what we&amp;rsquo;ve given you in our backstory as knives. But the more that you know us, the more that you also know our knives as players. So do you take notes on us as well as our characters? Do you just remember that?&lt;/p&gt;
&lt;p&gt;ANDY: Only up here. Yeah, I don&amp;rsquo;t write notes really about you as people. No, no, not as players. Some things come up during the week or something and I&amp;rsquo;ll think of something I thought that would be funny to mess with the player. I can do this to their character to mess with the player and I do that, but I don&amp;rsquo;t have notes. I mean, I do have notes from session zero about you and stuff like that. And that&amp;rsquo;s mostly around so I can remember what you said you did and didn&amp;rsquo;t want and things like that. But otherwise no. I don&amp;rsquo;t take notes. Not like you.&lt;/p&gt;
&lt;p&gt;NICOLE: Wow. You just have space in your mind for all sorts of devious things then.&lt;/p&gt;
&lt;p&gt;ANDY: Well, lots of improv.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, no, it&amp;rsquo;s really well done. It means a lot to me to have a safe space to play a game and to like truly try out things that I wouldn&amp;rsquo;t do in real life.&lt;/p&gt;
&lt;p&gt;ANDY: That&amp;rsquo;s good. I&amp;rsquo;m glad that it feels that way. That&amp;rsquo;s the aim.&lt;/p&gt;
&lt;p&gt;NICOLE: All right, let&amp;rsquo;s close this so that I can ask you the real questions afterwards. Thanks for coming on to the channel again for the second time.&lt;/p&gt;
&lt;p&gt;ANDY: Thanks for having me.&lt;/p&gt;
&lt;p&gt;NICOLE: Maybe we&amp;rsquo;ll have you on for a third. You&amp;rsquo;re always welcome.&lt;/p&gt;
&lt;p&gt;ANDY: Okay. Take care.&lt;/p&gt;
&lt;p&gt;NICOLE: Thank you, everyone for listening and I&amp;rsquo;ll see you next week. Bye.&lt;/p&gt;
&lt;p&gt;ANDY: Bye.&lt;/p&gt;</description></item><item><title>How we got into tech (Adobo &amp; Avocados #01)</title><link>https://nicolevanderhoeven.com/blog/20230329-ana01-how-we-got-into-tech/</link><pubDate>Wed, 29 Mar 2023 14:54:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230329-ana01-how-we-got-into-tech/</guid><description>&lt;p&gt;My friend &lt;a href="https://testingwithmarie.com"&gt;Marie Cruz&lt;/a&gt; and I have been wanting to talk about a few topics related to diversity in tech, and over the few years we&amp;rsquo;ve known each other, we&amp;rsquo;ve only added to that list. We finally decided to take a leap and start a new YouTube channel/video podcast just so we have a space to have those discussions. Here&amp;rsquo;s the first one, where we talk about how we got into tech.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/25Ba4Z694Gw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Below is a transcript of our conversation.&lt;/p&gt;
&lt;h2 id="why-adobo--avocados"&gt;Why &amp;ldquo;Adobo &amp;amp; Avocados&amp;rdquo;?&lt;/h2&gt;
&lt;p&gt;MARIE: All right, we&amp;rsquo;re live. So, hey everyone, my name is Marie Cruz and with me I have my colleague today.&lt;/p&gt;
&lt;p&gt;NICOLE: Hi, I&amp;rsquo;m Nicole van der Hoeven, I&amp;rsquo;m her colleague. And I&amp;rsquo;m a little sick, but I&amp;rsquo;m here.&lt;/p&gt;
&lt;p&gt;MARIE: So we, today we&amp;rsquo;re actually gonna be doing the first ever recording for the Adobo and Avocados podcast. So we thought about this name and initially like Nicole and I wanted to, you know, ever since before we wanted to launch a podcast where we can talk about, you know, our experiences working in tech and all other things. And then we thought about the name Adobo and Avocado. So you know, to anyone who doesn&amp;rsquo;t know, so we&amp;rsquo;re both from the Philippines, and Adobo is the national dish of the Philippines. So that&amp;rsquo;s why we thought we&amp;rsquo;ll add the name of Adobo in our podcast title. Avocados, &amp;lsquo;cause we&amp;rsquo;re both Developer Advocates. But yeah, I think, why don&amp;rsquo;t we discuss like, why was it called avocados in the first place? Do you have any idea?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, well, we don&amp;rsquo;t really know for sure. So I thought that it was something to do with the language of it. Like, you know, an advocate is usually like a, could be like a lawyer in common non-tech senses. And the translation for that is abogado in Spanish or Tagalog actually,&lt;/p&gt;
&lt;p&gt;MARIE: Even in Tagalog.&lt;/p&gt;
&lt;p&gt;NICOLE: our native language.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So it&amp;rsquo;s like kind of similar to avocado. I don&amp;rsquo;t know, that&amp;rsquo;s kind of what I thought.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, that&amp;rsquo;s actually an interesting thought. Like, &amp;lsquo;cause the abogado does sound very, you know, similar to avocado, but I actually read this one article where I think their project manager had a hard time saying Developer Advocate, they ended up saying developer avocado. So who knows what the origin is. But yeah, I think it&amp;rsquo;s a great, you know, you know, term in terms of like, you know, the whole play, like playful, you know, meaning behind the word Developer Advocate.&lt;/p&gt;
&lt;h2 id="how-we-got-into-tech"&gt;How we got into tech&lt;/h2&gt;
&lt;p&gt;MARIE: So yeah, I guess first things first, like you know, who we are? Like, why are we doing this podcast? How, you know, we got into tech? So we&amp;rsquo;ll talk first about, I guess a bit of some introductions about ourselves. So Nicole, why don&amp;rsquo;t you start, like how did you get started? You know, what&amp;rsquo;s been your, I guess, background so far? Did you have a traditional, you know, computer science background or did you do like a different, I guess course back when you were still studying?&lt;/p&gt;
&lt;h3 id="nicoles-background"&gt;Nicole&amp;rsquo;s background&lt;/h3&gt;
&lt;p&gt;NICOLE: I did not have a traditional background. I grew up in the Philippines. I moved away when I was 18. And I don&amp;rsquo;t know what your experience was, Marie, but mine was that in the Philippines there are still, I think we do a pretty good job at being equal between genders, but I think there&amp;rsquo;s still gender roles. And when I was growing up, I really loved both the maths and sciences and like literature and languages, but I was very heavily pushed towards the humanities, &amp;lsquo;cause that&amp;rsquo;s what girls do. Girls don&amp;rsquo;t go into tech.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And so I really struggled at uni and in college. I shifted majors six times. I had no idea what I wanted to do.&lt;/p&gt;
&lt;p&gt;MARIE: Wow.&lt;/p&gt;
&lt;p&gt;NICOLE: And I went through, and that was over two countries. I went to the US to study as well. None of them was computer science because my brother was a developer. And I don&amp;rsquo;t know, he&amp;rsquo;s a little too introverted for me. And I just had this idea that, if I go into computer science, I have to be a developer, and if I&amp;rsquo;m a developer, I won&amp;rsquo;t talk to anyone. I&amp;rsquo;m just going to be&lt;/p&gt;
&lt;p&gt;MARIE: Yes.&lt;/p&gt;
&lt;p&gt;NICOLE: with a machine. Like I had that in mind, which now I know is completely wrong,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but that&amp;rsquo;s why I never went into it. So finally my parents were just like, we don&amp;rsquo;t care what you finish,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: we don&amp;rsquo;t care if it&amp;rsquo;s basket weaving, just pick a major and finish it.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And that was economics,&lt;/p&gt;
&lt;p&gt;MARIE: Oh.&lt;/p&gt;
&lt;p&gt;NICOLE: which I have never used in a job.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then so-&lt;/p&gt;
&lt;p&gt;MARIE: That&amp;rsquo;s really interesting. Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then I, how did I get into IT? I was applying for different economics related ones, and then I met my now husband and he,&lt;/p&gt;
&lt;p&gt;MARIE: Hi Rob.&lt;/p&gt;
&lt;p&gt;NICOLE: he was a test manager. Yeah, hi Rob! He was a test manager and I said, well what&amp;rsquo;s a test manager? And then he told me about the world of testing.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I didn&amp;rsquo;t understand it at first, but I wanted to know more. And then I thought the way that he described it sounded so interesting, like the idea that,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: that there is a job, there is a person whose job it is to be the one using applications or products first. And then trying to see what&amp;rsquo;s wrong with it for the purposes of improving it. I just, I really loved that idea and it was another branch of tech that I didn&amp;rsquo;t know existed.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So I started to, I did an ISTQB certification just to like have something&lt;/p&gt;
&lt;p&gt;MARIE: No background.&lt;/p&gt;
&lt;p&gt;NICOLE: &amp;lsquo;cause I didn&amp;rsquo;t have any background. Yeah. And I started job hunting, and somehow managed to land a performance testing job under someone who became my mentor.&lt;/p&gt;
&lt;h3 id="maries-background"&gt;Marie&amp;rsquo;s background&lt;/h3&gt;
&lt;p&gt;MARIE: Hmm, nice. Yeah, it&amp;rsquo;s really relatable because like similar with myself, I fall into tech accidentally. Like it was never my intention, you know, okay, I&amp;rsquo;m gonna study computer science, although I did actually have a computer science degree.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, wow.&lt;/p&gt;
&lt;p&gt;MARIE: But the story, the story behind that, I don&amp;rsquo;t share it too much to other people &amp;lsquo;cause I think the story behind it is a bit funny. But my first experience with tech is actually updating my MySpace profile. Do you remember MySpace?&lt;/p&gt;
&lt;p&gt;NICOLE: Yes.&lt;/p&gt;
&lt;p&gt;MARIE: Yes so, before you can customize your profile with a bunch of HTML, CSS codes and like I think before I was just trying to, you know, create something even though it didn&amp;rsquo;t look very accessible. I remember I had lots of animations, just lots of like&lt;/p&gt;
&lt;p&gt;NICOLE: Oh.&lt;/p&gt;
&lt;p&gt;MARIE: striking fonts, background music, and it was just something that I was doing for fun. I did a mass communications course back home in the Philippines. So I was majoring in digital media. And then I had to go back here in the UK. So I was working first for about two years before I decided to go back to uni. And during that time when I was looking at, you know, courses catalog, &amp;lsquo;cause I wasn&amp;rsquo;t really sure what to pick. So I saw a course which basically has three different things. So it&amp;rsquo;s computer science with business management and financial accounting.&lt;/p&gt;
&lt;p&gt;So I thought,&lt;/p&gt;
&lt;p&gt;NICOLE: Oh wow, okay.&lt;/p&gt;
&lt;p&gt;MARIE: I was like thinking in my head I think that sounds like a really cool name for a course, so I&amp;rsquo;m gonna go for it. So to me I just found the name like very interesting. And it means that-&lt;/p&gt;
&lt;p&gt;NICOLE: So when did you&lt;/p&gt;
&lt;p&gt;MARIE: Yeah?&lt;/p&gt;
&lt;p&gt;NICOLE: move out of the Philippines?&lt;/p&gt;
&lt;p&gt;MARIE: So I, so we went back 2008. So I was in the UK since 2004. Actually no, we went back 2006, and then I went back in the UK 2008. So 2006 I enrolled, you know, to study mass communications. I didn&amp;rsquo;t finish the course &amp;lsquo;cause I had to go back in the UK after two years because of like visa, like status. And then when I got back, I just put that into a pause, you know, did some work experience. So I was working as an office assistant for about two years and then my friend and I just decided, okay, I think we should go back to uni. So I actually applied as a mature student &amp;lsquo;cause I didn&amp;rsquo;t, you know, had any like actual qualifications &amp;lsquo;cause I never graduated from my degree in the Philippines. I never finished high school as well, &amp;lsquo;cause I kept going back and forth between the UK and the Philippines. So the last time I actually graduated was during middle school.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, wow.&lt;/p&gt;
&lt;p&gt;MARIE: but applying as a mature student, they just looked at my, you know, work credentials, like my work attitude. And I submitted some of my grades like back, you know, when I was still in the Philippines &amp;lsquo;cause like my first two years I had some, you know, grades from like the different subjects that I was doing. But yeah, that&amp;rsquo;s how I got into tech. I just found the name like really interesting and I thought before I could mix and match it with business and accounting. So even if the computer science bit didn&amp;rsquo;t work out, like I can still maybe utilize some of the things that I&amp;rsquo;ve learned on the business side and on the accounting side. And then, when I was about to look for graduate jobs, I got approached by a testing consultancy company. I didn&amp;rsquo;t, I wasn&amp;rsquo;t aware that there&amp;rsquo;s a graduate job for, you know, just doing testing &amp;lsquo;cause most of the graduate jobs that, you know, we were being offered is, you know, how to, you know, do like development, or like database like management roles. So initially I wasn&amp;rsquo;t really sure if I wanted to do the developer route. Like I enjoyed the coding, I was doing the coding bit, but like back then I wasn&amp;rsquo;t like fully 100% sure that it was the right path for me. So I found out that, yeah you can have a career in testing. Again this is all accidental &amp;lsquo;cause if that testing company didn&amp;rsquo;t approach me, I would&amp;rsquo;ve probably looked at like other roles. So it was like really great to hear that, yeah, there&amp;rsquo;s like a graduate jobs for just doing testing. And yeah, we were doing the ISTQB as well. So we were doing some training. And yeah, the rest is history. It&amp;rsquo;s funny because I didn&amp;rsquo;t intend to continue on a developer route, but then now I work as a Developer Advocate.&lt;/p&gt;
&lt;h2 id="how-did-we-become-developer-advocates-without-being-developers"&gt;How did we become Developer Advocates without being developers?&lt;/h2&gt;
&lt;p&gt;NICOLE: Yeah, maybe we should talk about that a bit &amp;lsquo;cause I also don&amp;rsquo;t consider myself as a developer even though I can code.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm. Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And yet somehow we&amp;rsquo;re both Developer Advocates. How did that happen?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. It&amp;rsquo;s like there&amp;rsquo;s some sort of, I guess, interesting link between software testing and developer advocacy. I don&amp;rsquo;t know like if it&amp;rsquo;s the same for you, but like with me, I really enjoy the teaching part, the learning and public part as well. And when I was doing my role as a software tester, I felt that I was doing the advocacy, but maybe, you know, not really in a way that it&amp;rsquo;s very out there. So I was, you know, helping my colleagues, I was talking about tools that I&amp;rsquo;ve learned, you know, with them, I was showing them how to use it. And then while I was working as well, like I started doing the learning in public on the side. So I started with my personal blog and then getting involved, you know, with meetups to talk about, you know, the different tools that I&amp;rsquo;ve learned. So I guess for me, like being a software tester also, you know, encouraged me to, I guess be a Developer Advocate &amp;lsquo;cause I was just telling people what I&amp;rsquo;ve been doing as a software tester. I&amp;rsquo;ve been telling them what different tools I&amp;rsquo;ve been using, you know, different concepts that I&amp;rsquo;ve been learning as well on like a day-to-day. So is that the same for you?&lt;/p&gt;
&lt;p&gt;NICOLE: For me it was more because I was a consultant,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: which means I was going on different projects all the time. And when you&amp;rsquo;re really new in an industry, I think it&amp;rsquo;s really exciting and you&amp;rsquo;re learning a lot. And certainly every project has like its own framework and different languages and different people, which is interesting for a while.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: But I don&amp;rsquo;t know, after several years of it, I started to feel like, people are actually asking the same questions. You know, there&amp;rsquo;s always, there&amp;rsquo;s some things that I always had to explain. You know, I always had to, for example, fight against the fact that performance testing is often seen as just something where you run the test, okay, you check the box, you&amp;rsquo;ve done performance testing.&lt;/p&gt;
&lt;p&gt;MARIE: Uh-huh.&lt;/p&gt;
&lt;p&gt;NICOLE: There&amp;rsquo;s always a certain amount of education where I&amp;rsquo;m like, no, it&amp;rsquo;s not just about checking the box, it can actually provide real value, here&amp;rsquo;s how.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I just found myself repeating a lot of the same things. And so I actually started to create videos also because load testing results are kind of difficult to explain sometimes.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And I would create this like test summary report that lots of people don&amp;rsquo;t read.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And so, as kind of an alternative way to explain things, I started creating video summaries to go along with it. And then I just thought, well maybe I can, &amp;lsquo;cause I can&amp;rsquo;t publish those, because it&amp;rsquo;s very specific to that company.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: But then I, I thought maybe I can pull out, I can abstract away some things and then publish those videos where I&amp;rsquo;m not talking about a specific project. And I guess that&amp;rsquo;s kind of how it started. I started, I put it into text first, because that&amp;rsquo;s just easier than video.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And then eventually found myself into video anyway.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So I guess for me, I got into Developer Advocacy because I was tired of, I was trying to automate a part of my life, the explanation part where I kept having to say the same things and I just wanted to be like, hey, read this blog post where I explain why you need think time in a much more coherent and considerate way.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: So that&amp;rsquo;s, that&amp;rsquo;s how it naturally happened. I think you and I are the same in that regard that we were already doing it before we got the title.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. I totally relate to that. Like, especially when you said that like, we&amp;rsquo;re just trying to solve the same problems. I started, you know, my blogging journey just trying to communicate like, you know, questions that people have been asking me on a day-to-day basis. And rather than just, you know, speaking to individual people and repeating the same things like again and again, like just put everything into a post or like you said like a video, and then just share that, you know, like to the public, &amp;lsquo;cause you&amp;rsquo;re not only gonna be able to help like one person but you know, maybe if someone else stumbled upon your blog or your video, then like, you might help them as well. I think like one of the, like, one of the best reward that I experienced when doing this like learning in public and you know, sharing more content out there is if you just get a message from someone or like a comment and then they say that, oh, like, I&amp;rsquo;ve been stuck with the same issue, I found your blog post or your video and it really helped me. And just that feeling that you know, you&amp;rsquo;ve helped someone is like a really great feeling. &amp;lsquo;Cause at first I wanted the blog as well just so that I can have something that I can look back to in case I, you know, forget like what I&amp;rsquo;ve done on a previous project. Like I can document it on a blog post, but then like now it&amp;rsquo;s also helping like other people who are experiencing the same like issues at work.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I definitely see that. At first I was doing these things for myself because you know, you don&amp;rsquo;t really know that you know a subject until you can teach it to some degree. And I really believe that. And I, for me there were so many things &amp;lsquo;cause as a consultant, you have to switch tools very quickly, you have to switch languages, you have to be a polyglot on a lot of different levels and it&amp;rsquo;s impossible to keep all that in your mind. So after every project I tried to like, distill my learnings from it, so that I,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: future me would come back to that framework, or tool, or whatever, and not be starting from zero. But yeah,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: the kind of other people finding it was an unexpected boon.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. So let&amp;rsquo;s just move on a bit. So we&amp;rsquo;ve talked about, you know, how we transition from software testing to developer advocacy. But I guess in terms of like the process, like did you apply to a lot of, you know, companies? Was developer advocacy something that, you know, you were aware of already, or like you just found a job description and then you&amp;rsquo;re like, oh, this is what I do already. Okay, let me apply to that job. So what&amp;rsquo;s been like the process for you?&lt;/p&gt;
&lt;p&gt;NICOLE: So I was, this is only, this is my first job as an actual, like the first job where I have Developer Advocate in my title.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: My previous job was with a, well at the time it was a startup, it was Flood.io, which is now acquired by Tricentis.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And when I joined, I think I was like, I think the fifth person that they hired in the team.&lt;/p&gt;
&lt;p&gt;MARIE: Oh, wow.&lt;/p&gt;
&lt;p&gt;NICOLE: So it was very small. And it was, I really love that environment because you can do a lot of things, you can wear multiple hats. And that&amp;rsquo;s really where it started. On a typical day, I might be answering questions in support, or presenting at a conference or ducking into a sales call or like,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: there were so many things that I could do. I was like part of the rotation for things going down basically, for things exploding. And I had to learn a lot about infrastructure as well to be competent in that role. And I started doing a lot of advocacy type things, mainly from a support perspective&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: because I got the same questions there as well. And I wanted to be able to focus on the crunchier topics.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And you can&amp;rsquo;t do that unless you address some of the more basic or common questions. And then my manager at the time told me about Developer Advocacy&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: and my immediate response was, but I&amp;rsquo;m not a developer.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: He said that that&amp;rsquo;s just the name for the whole industry that I think you would be really good at and that you&amp;rsquo;re already doing. And with his encouragement, this is Tim Koopmans, the one of the co-founders of Flood, with his encouragement, strong encouragement by the way, things like, he said, oh, I&amp;rsquo;ve got this conference in Moscow that I&amp;rsquo;m speaking at. Do you wanna come watch me?&lt;/p&gt;
&lt;p&gt;MARIE: Right.&lt;/p&gt;
&lt;p&gt;NICOLE: And I said yes. And he backed out so I had to do it, things like that. Because of things like that that he did, I started to understand what developer advocacy is&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: and when it was, when I felt the time to change directions, I specifically looked at k6 actually. I didn&amp;rsquo;t apply to any other jobs because I was pretty happy where I was.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: But I really loved k6. I had already not used it in a project, but I&amp;rsquo;d already, I knew what the tool was and I used it, I tested it a bit. I love the site, I love the principles behind it. And I saw that they had a Developer Advocate role. So,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: It just kind of happened. How about you?&lt;/p&gt;
&lt;p&gt;MARIE: Well the first time I heard about the term was from you, when you said that, hey we&amp;rsquo;ve got this role for, you know like, you know like, we&amp;rsquo;ve got a Developer Advocate role for one of the tools that, you know, we&amp;rsquo;re gonna launch. Like, you&amp;rsquo;ll be like the great fit. So I didn&amp;rsquo;t really send any CV. I don&amp;rsquo;t think I sent any CV or like, yeah, I think, you just like, &amp;lsquo;cause we just connected already like via this Automation Guild conference. So like we were already connected via Twitter. And I think this is where like one of the benefits of like learning in public really came into play, &amp;lsquo;cause I was just, you know, publishing constantly. I was, you know, talking at various meetups and conferences already. But I was just doing all of this like as part of my, you know, side projects. Like it wasn&amp;rsquo;t part of my day-to-day role on my previous job. So when you explain to me what a Developer Advocate is, I&amp;rsquo;m like, oh yeah, I&amp;rsquo;ve been doing that on the side. So that was my first actual, you know, experience of like hearing what a Developer Advocate, you know, does on a day-to-day. &amp;lsquo;Cause I had the same perception that I&amp;rsquo;m not a developer, how can I be a Developer Advocate? But I think because as like as part of our day-to-day jobs, like even if we&amp;rsquo;re not writing application code, we&amp;rsquo;re still writing, you know, test scripts. we&amp;rsquo;re creating test automation frameworks. So I think that&amp;rsquo;s really helped as well transitioning into this role. But yeah, like I never sent any CV. I just remembered like we were talking a lot like back and forth and then I met up with, you know, a bunch of our colleagues now. And yeah, the rest is like history again.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I think that there are just some people that when you meet them, you click or you don&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: And when that click happens, I&amp;rsquo;m just like, okay, I&amp;rsquo;m gonna write her name down. I think I told you about it like for two years,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, I just joined-&lt;/p&gt;
&lt;p&gt;NICOLE: we were talking, and I was like, hey, this could happen&amp;hellip;&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I don&amp;rsquo;t know when. I think you&amp;rsquo;d be perfect for it. And you&amp;rsquo;re like, okay,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but it&amp;rsquo;s kind of early to be telling me, right?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: I was like, Yeah, yeah, but let&amp;rsquo;s just keep in touch. You know, and it worked out. I can&amp;rsquo;t believe it actually did.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. And now we&amp;rsquo;re, doing.&lt;/p&gt;
&lt;p&gt;NICOLE: We didn&amp;rsquo;t actually-&lt;/p&gt;
&lt;p&gt;MARIE: Yeah, go on Nicole.&lt;/p&gt;
&lt;p&gt;NICOLE: We haven&amp;rsquo;t actually defined what a Developer Advocate is.&lt;/p&gt;
&lt;h2 id="whats-a-developer-advocate"&gt;What&amp;rsquo;s a Developer Advocate?&lt;/h2&gt;
&lt;p&gt;MARIE: Yeah, I guess like we can both, you know, share what our, you know, view is of a Developer Advocate. So to me when it comes to developers, I guess trying out, you know, new tools or learning about new things, they feel most comfortable talking to someone who&amp;rsquo;s actually used, you know, the product, or you know, the tool that they want to use. So, we are, you know, that person. So we&amp;rsquo;re helping developers, we&amp;rsquo;re helping testers when it comes to, I guess learning about best recommended practices, learning about different tools. So we&amp;rsquo;re kind of like a bridge between the community and like the company that we work for. There&amp;rsquo;s a lot of misconception that people think that we&amp;rsquo;re salespeople but we&amp;rsquo;re actually not, like it&amp;rsquo;s a completely different, you know, role. We are focused more on the community side, helping them grow, helping them, you know, I guess in some ways, like be some sort of champions as well, so they can also promote like, you know, the different tools, the different practices that we have been communicating to them. But yeah, what about you? Is that like sort of the same concept?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I agree with everything you said, especially about being a bridge.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: Because as a Developer Advocate you&amp;rsquo;re not quite a developer, that&amp;rsquo;s not our primary responsibility,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: but we&amp;rsquo;re also not like marketers or sales people. Although there&amp;rsquo;s an overlap there in both. I kind of think of it as anti-marketing. So a marketer is going to be talking about something that they themselves have never used, are not the target user for.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And might not know much about in terms of the technical details.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: A Developer Advocate is someone who actually is the target user. So for those who don&amp;rsquo;t know, Marie and I work at Grafana Labs specifically on k6, which is a performance testing tool. But we have both used k6, we have both been testers and still are. And so there are things that we can suggest. Part of it is advocating internally.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: We advocate for testers everywhere to the product team so that we say, like these are the features that we would be looking for as testers. Like we would say it this way or we wouldn&amp;rsquo;t really use that feature, we want this other one. But another part of it is advocating externally. So this is the part that people think of as marketing, but I think of it as anti-marketing, because we&amp;rsquo;re not going out there and saying, hey, you should use this product that we&amp;rsquo;ve never used before.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Instead, we build cool things and demonstrate cool things that we have done, not some other developer.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Like we do our demos,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And then when people ask us, then we say, oh yeah, we use k6. So I don&amp;rsquo;t know, marketing definitely has its place, but for me I am so addicted to that authenticity and genuineness that comes from just talking about a tool that you actually love, which is,&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: what k6 is for me.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. I really like that because for me, an important part of, you know, this advocacy is, like communicating something that I truly believe in. Like I&amp;rsquo;m not going to advocate for, you know, a tool that I haven&amp;rsquo;t used. Like I would just feel like, you know, I&amp;rsquo;m a fraud if I do that. So if I know that, you know, there are situations where a certain tool or a certain practice, you know, would work better, then I would advocate for, you know, that as well. So it&amp;rsquo;s not just about, you know, for example, like at the moment we can&amp;rsquo;t do k6 for accessibility and I&amp;rsquo;m an accessibility advocate as well. So I would go and, you know, recommend like other tools and practices based on what like I&amp;rsquo;ve experienced, based on what I&amp;rsquo;ve done. And I think, like for me, that&amp;rsquo;s one of the biggest like advantage, &amp;lsquo;cause yeah, if I&amp;rsquo;ve been put on the spot and say, hey, you should talk about this to then promote it to other people, that would just totally go against my, like one of my beliefs.&lt;/p&gt;
&lt;p&gt;NICOLE: I think I also really appreciate that this position lets us shine a light on people like us who maybe,&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: who don&amp;rsquo;t look like the average person in tech. I know it&amp;rsquo;s still, I&amp;rsquo;ve been lucky to work with teams of mainly men that haven&amp;rsquo;t treated me any differently because I&amp;rsquo;m a woman, but there is still like a sense of being Other.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah And I guess that-&lt;/p&gt;
&lt;p&gt;NICOLE: And being in a position of advocacy means that we&amp;rsquo;re, we&amp;rsquo;re also able to appeal to other women who maybe didn&amp;rsquo;t, who didn&amp;rsquo;t have as good an experience as we did.&lt;/p&gt;
&lt;h2 id="what-can-you-expect-from-adobo--avocados"&gt;What can you expect from Adobo &amp;amp; Avocados?&lt;/h2&gt;
&lt;p&gt;MARIE: Yeah. And I guess that really leads to this next question. And you know, people who will watch this in the future might also ask like, what are the expectations like for this podcast? Like why are we doing this? So do you want to maybe start.&lt;/p&gt;
&lt;p&gt;NICOLE: Why ARE we doing this Marie?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. Oh, yeah. So do you wanna start like from your side, like what are the expectations that you know, that we can, yeah, share to people?&lt;/p&gt;
&lt;p&gt;NICOLE: Sure. I think that you and I both do a lot of technical advocacy. We, you know, do demos, we write scripts, and we tell people how to do things in tech, very technical things. But, I think that there&amp;rsquo;s a whole other side of tech that doesn&amp;rsquo;t get talked about and that&amp;rsquo;s like, things like interpersonal dynamics or cultural differences. You and I are both Europeans that have to work in, in our situation, predominantly American space, and we&amp;rsquo;re also Asian. So balancing the two, you know, we are on different sides of the spectrum on that. Just also the general stress that comes with tech. It is not easy, not just as a Developer Advocate, but just to be in tech to keep up with changing trends.&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: I feel like there are so many emotional aspects and psychological aspects that don&amp;rsquo;t get talked about that I would really like to cover.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: Then also, I kind of alluded to it. I would like to make it a little bit more open, an open discussion for particularly underrepresented people&lt;/p&gt;
&lt;p&gt;MARIE: Mm-hmm.&lt;/p&gt;
&lt;p&gt;NICOLE: like ourselves. We identify with several minority groups.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: And maybe help them along a bit by telling them things that we had to find out the hard way early on in our career. How about you?&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. Yeah, I agree with all of those. And I guess it&amp;rsquo;s also to just have a safe space, you know, for everyone just to share their experiences in tech. Like you said, there&amp;rsquo;s this whole other side of tech that we don&amp;rsquo;t talk about that maybe other women are also uncomfortable to talk about, you know, with like, I guess other colleagues, especially if it&amp;rsquo;s just predominantly male. So we want to, you know, have a safe space for them, share, you know, I guess from their side, like their unique experiences as well. And maybe like we can all have, I mean maybe we also have those shared experiences that we don&amp;rsquo;t talk about, but then when someone says, oh yeah, I&amp;rsquo;ve experienced that too. So it&amp;rsquo;s just really finding, you know, shared experiences that we can all relate to. And like you said, just helping them, you know, or empower them to, I guess move forward in terms of like the next stage in their career. Like, you know, share what&amp;rsquo;s worked for us, share what hasn&amp;rsquo;t worked for us. &amp;lsquo;cause I think it&amp;rsquo;s all about like being authentic as well and not just talking about the good things, but we could also talk about the bad and the negative things as well.&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m excited to see where we go from here.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah.&lt;/p&gt;
&lt;p&gt;NICOLE: I think we have a lot of ideas about where we&amp;rsquo;re going to take this and I hope people will come along for the ride.&lt;/p&gt;
&lt;p&gt;MARIE: Yeah. So, yep. I guess this is it for the first episode. We are just, you know, extremely excited to do this on a regular basis. So we&amp;rsquo;ll talk about different, you know, topics in every episode. And we might, you know, have like really awesome, like guests as well in future episodes. So yeah, I guess just stay tuned and yeah, look out for Adobo and Avocados.&lt;/p&gt;
&lt;p&gt;MARIE: Thanks everyone. See you next time.&lt;/p&gt;
&lt;p&gt;NICOLE: Bye-bye.&lt;/p&gt;</description></item><item><title>Taking Notes for Research with Bianca Pereira</title><link>https://nicolevanderhoeven.com/blog/20230327-taking-notes-for-research/</link><pubDate>Mon, 27 Mar 2023 08:56:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230327-taking-notes-for-research/</guid><description>&lt;p&gt;Bianca Pereira joins me to talk about taking notes for academic research as well as general knowledge creation. Bianca is a researcher, a software developer, a feminist by ideal, and an educator by passion, and she comes with a lot of experience in working with PKM (Personal Knowledge Management) and Tools for Thought.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vbl1nP4H9Yk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Below is the transcript of our conversation.&lt;/p&gt;
&lt;h2 id="introductions"&gt;Introductions&lt;/h2&gt;
&lt;p&gt;NICOLE: Hey, everyone, I&amp;rsquo;m Nicole van der Hoeven, and on this channel, I like to talk about tech, travel and taking notes. My guest today ticks off a few of these boxes. Please welcome Bianca Pereira. (Portuguese) Good afternoon, Bianca, how are you?&lt;/p&gt;
&lt;p&gt;BIANCA: (Portuguese) Good afternoon, Nicole, I&amp;rsquo;m doing well. (English) Thanks a lot for inviting. I&amp;rsquo;m really excited for our chat today. I really enjoyed chatting with you, and I want to see whoever is here with us today. So if I like to invite, if anyone wants to participate in our chat, maybe can just send us a message down there.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, leave a comment with questions that you want to ask Bianca or me, or both of us. But Bianca, (Portuguese) Could you introduce yourself, in English? (English) I practiced that so I needed to say it.&lt;/p&gt;
&lt;p&gt;BIANCA: Oh, okay. That&amp;rsquo;s really good. Yeah, well, my name is Bianca Pereira. I&amp;rsquo;m a researcher and a knowledge management coach as well. So my focus, when you think about taking notes, managing papers, managing the literature, the source is really like, how can we do personal knowledge management for the purpose of research? So how can we create notes so that we can write research-driven outputs later on? Research-driven outputs can be like papers or they can be an essay or a blog post can be anything that is based on research. So it&amp;rsquo;s really like how can we do the whole process of personal knowledge management for the specific purpose of research? So that&amp;rsquo;s what I work on now. And I keep doing my own research as well in computer science, as we talked before.&lt;/p&gt;
&lt;p&gt;NICOLE: Rodrigo said, &amp;ldquo;Good Portuguese.&amp;rdquo; (Portuguese) Thank you, Rodrigo. (English) I&amp;rsquo;m trying. I moved to Portugal. But maybe we should explain that connection, why I am randomly speaking to you in Portuguese. You&amp;rsquo;re from Brazil, right?&lt;/p&gt;
&lt;p&gt;BIANCA: Yes, I&amp;rsquo;m from Brazil, from Rio de Janeiro. And I learned that Nicole, you&amp;rsquo;re speaking Portuguese because you&amp;rsquo;re also living in Portugal, right?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, of course, I have to learn that.&lt;/p&gt;
&lt;h2 id="research-isnt-just-for-academics"&gt;Research isn&amp;rsquo;t just for academics&lt;/h2&gt;
&lt;p&gt;NICOLE: I thought it was interesting when we were talking about this stream and I said, &amp;ldquo;I wanted to call it taking notes for academic research.&amp;rdquo; And you said, &amp;ldquo;Oh, well, it&amp;rsquo;s not just academic research.&amp;rdquo; You said that you wanted it to be broader, just research in general and also knowledge creation. Can you talk a bit more about the distinction between the two? &amp;lsquo;Cause when I think research, I automatically jump to academic research.&lt;/p&gt;
&lt;p&gt;BIANCA: Yes. Yeah, many people, they&amp;rsquo;re like, &amp;ldquo;Oh, okay. Let&amp;rsquo;s write academic research.&amp;rdquo; I&amp;rsquo;m like, &amp;ldquo;No, please, no.&amp;rdquo; Because at least like from my perspective, I think research, it&amp;rsquo;s not just inside of academia. Everyone not only can do research, but many people do research in their jobs. Even like when you are going to create content, for example.&lt;/p&gt;
&lt;p&gt;So for me, researcher is more than someone who went through a PhD or went through like formal academic research, but they&amp;rsquo;re all people who are using critical thinking for the purpose of creating new knowledge. For example, someone is in a company, the company is facing a problem and they need to solve a problem, which may be very specific to their company. So they need to do some research. They need to use some tools that we use for doing research to solve the problem to come up with innovation to solve something inside of the company.&lt;/p&gt;
&lt;p&gt;So for me, from my perspective, that person is a researcher, even when it&amp;rsquo;s not an academic researcher, for example. So that&amp;rsquo;s why I like to think about research as the process of knowledge creation when you&amp;rsquo;re using critical thinking for that. So for me, I think like anyone and everyone could become a researcher or is already a researcher, even when they don&amp;rsquo;t call themselves researchers. So that&amp;rsquo;s why I was like, &amp;ldquo;Oh, let&amp;rsquo;s try to not&amp;hellip;&amp;rdquo; Don&amp;rsquo;t say, &amp;ldquo;Oh, only who is in academia is a researcher, only who went through a PhD is a researcher.&amp;rdquo; I don&amp;rsquo;t think that&amp;rsquo;s the case. I think everyone can use the research for their work, sorry, in their daily lives.&lt;/p&gt;
&lt;p&gt;NICOLE: That&amp;rsquo;s really cool. By that definition, I think I would classify as a researcher and I had never really thought of myself as one. It&amp;rsquo;s very meta, but I&amp;rsquo;m taking notes on this while we&amp;rsquo;re talking. And you said that one of the things that differentiates, I&amp;rsquo;m paraphrasing here. One of the things that differentiates research from like other forms of note taking is critical thinking. Do you also think that there is a sort of rigor that is applied? Like maybe when people think research, it means that you&amp;rsquo;re collating things from a lot of different sources? Or do you think that that is necessary for research?&lt;/p&gt;
&lt;p&gt;BIANCA: I think, well, it depends on what you mean by rigor. If you&amp;rsquo;ve been on rigor, like, &amp;ldquo;Oh, more like in the academic sense, you need to write in a given way. You needs to like to have your argument very strong for lots of experiments.&amp;rdquo; I think there are multiple, it can be a little bit more lightweight let&amp;rsquo;s say, when I talk about research in general. But there is a level of rigor that is important, which is related to the critical thinking, which is really like, okay, and I&amp;rsquo;m just like, I just woke up in the morning and I thought about something. I say, &amp;ldquo;Ah, this is true, or this is the thing.&amp;rdquo; Because I think it is. I don&amp;rsquo;t think there is any rigor on that. It&amp;rsquo;s just like someone has their experience and they&amp;rsquo;re right about that.&lt;/p&gt;
&lt;p&gt;But that&amp;rsquo;s not what I mean by research itself. It&amp;rsquo;s really like, try to create an argument. And it&amp;rsquo;s hard when I talk about argument, because when you think about argument, you think about two people fighting. That&amp;rsquo;s not what I mean by an argument. So an argument is really like, &amp;ldquo;I&amp;rsquo;m trying to justify why I believe on something.&amp;rdquo; Rather than just like, &amp;ldquo;I believe on something, this is the truth.&amp;rdquo; It&amp;rsquo;s like, &amp;ldquo;I believe on this and those are the reasons. This is the reasoning behind why I believe on that something.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So this is the level of rigor that we need to have in any research. And sometimes to justify, we need to do full experiments and all those things. That&amp;rsquo;s when there&amp;rsquo;s really like professional research. We need to do experiments, we need to do like a lot of literature research to synthesize literature to justify why you believe on something. But it can be very simple, really like checking a few sources, checking from your experience as well, mixing those things to justify why you believe that something&amp;rsquo;s true of something is the case. So that is a level.&lt;/p&gt;
&lt;p&gt;NICOLE: I like when you say that, when you specify that it&amp;rsquo;s an argument, but not between two people. And it kind of made me think about how when I write something and something that I&amp;rsquo;ve done research on, I like to use steel man arguments. And the idea, I mean you maybe know this, but just to explain to other people, there&amp;rsquo;s something called a straw man where sometimes in order to prove a point, people construct this very flimsy argument and then they show how it&amp;rsquo;s wrong. But I really love constructing a steel man which is a contradicting point of view that is actually valid in some ways. And that way, when you are able to convincingly show that that steel man is incorrect or inaccurate, then it kind of strengthens your own premise. And in that way, it&amp;rsquo;s like an argument not between two people, but kind of between conflicting ideas.&lt;/p&gt;
&lt;p&gt;BIANCA: Yes, yes, yes.&lt;/p&gt;
&lt;p&gt;NICOLE: I wanna shout out as well, there&amp;rsquo;s some people who are saying they use Obsidian for both academic and non-academic research. So Grisha is agreeing that it doesn&amp;rsquo;t matter if the purpose of the research is for academia. And even William who&amp;rsquo;s a retired academic, agrees with you about research as knowledge creation. And a note about another Brazilian talking about PKM and Obsidian. They&amp;rsquo;re a cybersecurity researcher.&lt;/p&gt;
&lt;p&gt;BIANCA: Oh, that&amp;rsquo;s really cool.&lt;/p&gt;
&lt;h2 id="taking-notes-for-topic-research"&gt;Taking notes for topic research&lt;/h2&gt;
&lt;p&gt;NICOLE: There&amp;rsquo;s a question here from Jan.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Could taking notes help in topic research? Using Obsidian to write random notes. And I&amp;rsquo;m interested if I could somehow use it to get some ideas for my thesis engineering field.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This is a perfect question for you.&lt;/p&gt;
&lt;p&gt;BIANCA: I would say you can have a whole system just to help your research. That&amp;rsquo;s the area that I like to talk about. So you can spend one hour, even more hours here just talking about that. But I suppose that you were saying to get idea, so it&amp;rsquo;s really the beginning of the process of research. So it&amp;rsquo;s really like, what do I research about? And I would say definitely, you can definitely use your notes for that. I don&amp;rsquo;t know.&lt;/p&gt;
&lt;p&gt;You may agree with me, Nicole, that our research, our notes taking space, note making space is really to put our thoughts in there, to let our minds really flow into the page or in our case, to the digital page. So when it comes to identifying the top, the first thing that we actually need is like, what are our interests? What do we care about? What do you want to work on? What will be spending, if you are thinking about the research topic, what do you spend the next years work on? So it needs to be something that you have interested in learning more about. So I think our note making space is a perfect place to just like put things out. What are the things that I like? Let me write everything I know about them so that you can then decide, okay, which one I want to maybe pursue, so investigate a little bit more.&lt;/p&gt;
&lt;p&gt;So I think that would be, and I would say, you ask, Jan, could you take notes? Could take notes help topic recency? Definitely. I think that would be one step that would definitely help in defining what is the topic for your research.&lt;/p&gt;
&lt;p&gt;NICOLE: I didn&amp;rsquo;t actually plan on doing this, but I&amp;rsquo;m gonna share my screen because this is something I&amp;rsquo;ve thought about a lot as well. So I have this thing called lightning rods of thought. It&amp;rsquo;s actually from a D&amp;amp;D or an RPG person.&lt;/p&gt;
&lt;p&gt;Sly Flourish is a YouTuber who has the idea of using lightning rods, which is adding things in a game that cause the players to use abilities that they already have. So it&amp;rsquo;s kind of like attracting what the abilities and interests that they already have. So I had this idea of lightning rods of thought. And this is how I try to find out what things I&amp;rsquo;m interested in. I mean, there are many ways, this is one.&lt;/p&gt;
&lt;p&gt;So this is a Dataview query that I use and it says, it spits out all of the notes that I have by the number of outgoing links, and this is just the top 50. But I am trying to identify maps of content, for example, and it&amp;rsquo;s going by descending order on outgoing. And then there&amp;rsquo;s also incoming links. So you could look at it that way. How many notes do you have that are linking to certain notes? And it&amp;rsquo;s like, these are the things that I am interested in apparently. So it&amp;rsquo;s just useful for me to start here. This doesn&amp;rsquo;t mean that I stop here, of course. And I can also embed searches for different keywords. And sometimes, it&amp;rsquo;s useful to look at orphans, the things that have no links to them. And I&amp;rsquo;m not sure why. Maybe I should think about that. That&amp;rsquo;s just as an aside, I didn&amp;rsquo;t intend to show that, but I thought it was kind of relevant.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, I think this is really good. I do something similar, although I don&amp;rsquo;t have the queries anymore &amp;lsquo;cause I&amp;rsquo;m not actively using Obsidian, but I do a similar thing, which I call it generalizations. So you&amp;rsquo;re like, what are the things that are making everything else be glued to each other? Let&amp;rsquo;s say, what are the central topics that everything is linked to or who is linking to everything else? Usually take the ones that is everything links to that, those are the things that I have been working around them a lot. So those are the core for my system as well, so I&amp;rsquo;ll do something similar so that&amp;rsquo;s really nice.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, it sounds like the same thing. It&amp;rsquo;s like abstraction and finding the highest level of abstraction. And from there, you can start digging into it. So I guess to answer the question that Jan asked, yes, they could definitely help. Taking notes could help in topic research. And one way that you can try to find out what topics you&amp;rsquo;re interested in is by trying to find these clusters, like what Bianca said, the generalized, the most generalized topics that you tend to write notes around. There&amp;rsquo;s another question for you from Grisha.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bianca, do you first take notes on paper and then put them in Obsidian?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: No. I still love and in paper, I love it, but there is just no time. So for me everything is like, phone all the time or in the computer is direct and digital because there is just no time. Especially now with small kids, there&amp;rsquo;s just like not an option anymore.&lt;/p&gt;
&lt;p&gt;NICOLE: I definitely get that it&amp;rsquo;s hard. I always have a real notebook and a fountain pen. But my usage of it has shifted to like journaling and brainstorming and not really like as you say, Bianca, sense making.&lt;/p&gt;
&lt;h2 id="ai-for-research-and-note-taking"&gt;AI for research and note-taking&lt;/h2&gt;
&lt;p&gt;NICOLE: Nikhil asks, &amp;ldquo;If applicable, have you come up with a workflow regarding materials? PDFs, videos, etc. to use an Obsidian, ChatGPT or GPT3? I&amp;rsquo;m looking to use it for academic research.&amp;rdquo; Have you looked into that?&lt;/p&gt;
&lt;p&gt;BIANCA: I use ChatGPT most for copy edit for editing. It&amp;rsquo;s really, really good. I was doing a try, I was okay if I want to do a literature review. A base one like a scoping review, which is like the very first type of, could I use that? I even published it on Twitter sometime ago and ChatGPT has some good things and some very bad things. Sometimes, it&amp;rsquo;s just retrieving information that is random. I know there are people who use for example to summarize the source. If you don&amp;rsquo;t want to read the whole source, you just want to know does it talk about it?&lt;/p&gt;
&lt;p&gt;Some people use for that. I haven&amp;rsquo;t tried to use for that. I prefer to process my source in a different way. But those are, I think the best, best, best section on the writing process where it&amp;rsquo;s actually like, &amp;ldquo;Okay, I wrote it this way, can you edit a little bit and see if sounds a little bit better?&amp;rdquo; So I think for copy editing and ChatGPT is really good.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I want to add that I also made a video on AI for PKM. I talk about things like using &lt;a href="https://napkin.one/?via=nicole"&gt;Napkin&lt;/a&gt;. Napkin is something that brings in your highlights from Readwise and auto and in a smart way uses GPT3 to tag those highlights. So since Nikhil was asking about different materials, like PDFs and videos, if &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; processes those, then Napkin could see those and start to intelligently make links.&lt;/p&gt;
&lt;p&gt;With Obsidian in particular, since he asked about that, there&amp;rsquo;s text generator and someone from Mastodon, Rick Raftis actually wrote &lt;a href="https://medium.com/@ricraftis/how-to-use-elicit-research-artificial-intelligence-for-better-results-9d12b611eb3d"&gt;this blog post&lt;/a&gt; that I found really interesting and it is about using Elicit and Consensus, which I don&amp;rsquo;t really know much about, but I thought that the blog post was interesting.&lt;/p&gt;
&lt;h2 id="obsidian-canvas-vs-scrintal"&gt;Obsidian Canvas vs. Scrintal&lt;/h2&gt;
&lt;p&gt;NICOLE: And so what else is there? (Reading a comment in Spanish)&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Greetings from Chile. Últimamente he estado utilizando canva para hacer presentaciones para mis clases, de modo que cuando actualizo la nota citada en la presentación, se actualiza de inmediato visual&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;(English) Oh I&amp;rsquo;m sorry, I didn&amp;rsquo;t even highlight that. So just to translate here, for those who don&amp;rsquo;t speak Spanish. This person is saying Greetings from Chile and they&amp;rsquo;ve been using Canvas, which is an Obsidian feature to create presentations for their classes. And so that when one note that is cited in the presentation is changed, then that Canvas is automatically updated. That this is a really good use case for it. And maybe this is a good time to also talk about another alternative for Canvas, because Canvas is for Obsidian and in many ways, I think it&amp;rsquo;s Obsidian&amp;rsquo;s answer to Scrintal. What do you think about that?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, that&amp;rsquo;s true. Yeah, just for who doesn&amp;rsquo;t know, I was a very passionate, obviously the user until I found Scrintal. Which kind of strange. I still love Obsidian, but I don&amp;rsquo;t use it anymore.&lt;/p&gt;
&lt;p&gt;So Scrintal is an app where you can visually organize your notes. So Obsidian has Canva so you can decide to, let&amp;rsquo;s say just start with Canva, it&amp;rsquo;s more like organized in those stuff. It&amp;rsquo;s too easy to create new notes in Canva, but in Scrintal, everything is visual. So you always like to create a note and then the note appears a card already in the background from what you&amp;rsquo;re creating. So it&amp;rsquo;s really to visually organize the notes.&lt;/p&gt;
&lt;p&gt;And it started before Obsidian and then Obsidian appear with confidence, like features, features, features. So there and there is now also Logseq, which appears now with whiteboard. I didn&amp;rsquo;t check yet, but people are saying that it&amp;rsquo;s actually also really good.&lt;/p&gt;
&lt;p&gt;So yeah, I became a Scrintal user at some time ago. Mostly because I was using the phone and the phone at the time, Obsidian didn&amp;rsquo;t have the mobile app. And for me, one of the main challenge that I had is like, okay, I&amp;rsquo;m writing something and then I write too many notes and just like start linking and connect to the note. And I jumped another note, jumped to another note, jumped another note. And I always found it hard to remember where did I come from. I was like, &amp;ldquo;Where did I come from? Where was I working again before I jump into this note?&amp;rdquo; And Scrintal gave me that automatic note. As I&amp;rsquo;m creating the notes, the notes are in the background. As soon as I close it, i have all the other notes there. They&amp;rsquo;re in that same visual space, the same context, let&amp;rsquo;s say. So that&amp;rsquo;s what made me change.&lt;/p&gt;
&lt;p&gt;I noticed at some point, I was using less Obsidian I was getting kind of stuck in my way of writing notes, in my way of thinking. And then Scrintal was kind of like accelerating, I was like, okay. And that&amp;rsquo;s when I did the change and it was before Canva, before the mobile app was released as well.&lt;/p&gt;
&lt;p&gt;NICOLE: We have a question here from Mickael Fortunato.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;By the way, Bianca, are you only relying on Scrintal?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: Yeah, nowadays for idea management, yes. Now, I moved with everything into Scrintal now.&lt;/p&gt;
&lt;h2 id="how-important-is-visual-thinking-in-pkm"&gt;How important is visual thinking in PKM?&lt;/h2&gt;
&lt;p&gt;NICOLE: So let&amp;rsquo;s talk about this a little bit because I was also an early user of Scrintal. I think I talked to the team before it was released and gave my feedback. Ultimately, I decided that it wasn&amp;rsquo;t for me. I actually really liked the visual part of it. I really, really liked it.&lt;/p&gt;
&lt;p&gt;What I didn&amp;rsquo;t like about it was that it&amp;rsquo;s not plain text markdown files anymore. That view, I mean Canvas is the same. If you use Obsidian Canvas, that&amp;rsquo;s no longer a standard format, which is also why I hesitate to use it because I just really like plain text. But I do love the idea of adding, of bringing in visual thinking into note taking.&lt;/p&gt;
&lt;p&gt;I think it&amp;rsquo;s very visceral because when we see a note or even like something that looks like a note on the screen, instinctively, we know how to use it because that is a metaphor for an actual piece of paper that we can interact with. What do you think about visual thinking? Do you think that it&amp;rsquo;s always necessary for research or is it just something, another avenue that might be useful?&lt;/p&gt;
&lt;p&gt;BIANCA: I find it, personally, extremely important. And the main reason is when you talk about knowledge creation, we need to be able to get our ideas, to put ideas together. Sometimes a big number of ideas so that we can create something from them or take them and break them down.&lt;/p&gt;
&lt;p&gt;So for example, I talk like about sense-making strategies, they&amp;rsquo;re usually like you put the ideas on a space which will be a board, let&amp;rsquo;s say. And how now we can connect them, create new things from them, generalize from them, see the context about them. In all those steps when you&amp;rsquo;re playing with ideas, then you can be creating new ideas. Because what I notice that sometimes, we just take notes about, let&amp;rsquo;s say, what you found, our source. we have quotes, quotes, quotes. But then what is the idea?&lt;/p&gt;
&lt;p&gt;At the end, of the day we want to create knowledge. Where are our ideas? So even my whole note, note making is like each note is one idea, which some people they call the atomic notes, although I don&amp;rsquo;t know anymore because we have many discussions with people who take atomic notes and we have some disagreements. So basically like each node is an idea.&lt;/p&gt;
&lt;p&gt;So when you take ideas and you put them into a board for example, they&amp;rsquo;ll start to organize them. Or where things that are similar, somehow they can be closer together. If they have another type of similarity, you can now add color to them. If you have available shapes, shapes can have meaning as well. So if all those things you can start rearranging the ideas, organizing, grouping them and seeing how can I find the relations between them and which new ideas come out just by putting those things together?&lt;/p&gt;
&lt;p&gt;The visual organization of notes is very important for knowledge creation itself because then, you can see the ideas and reflect about them so they can create something from them. Which pure text usually is really hard to do with pure text. Or with just like 10 notes around the screen, but not in a visual organization.&lt;/p&gt;
&lt;p&gt;NICOLE: So this is a related question from Jan:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;When is creating a Canvas or something similar necessary? Is it not tedious to do every time?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: Well, my take is that it&amp;rsquo;s important to see why you want to create that. Do you want that as a navigational board for example. If you want to have an overview of everything, your vaults for example. Can you have one board that gives you the entry point to all these spaces in your board, in your vault? That&amp;rsquo;s one.&lt;/p&gt;
&lt;p&gt;Things that you can use for, or can use as a sense-making space, you can bring up some notes or cards that you want to make sense of or create something from that. But I would not say that it&amp;rsquo;s always necessary.&lt;/p&gt;
&lt;p&gt;Sometimes, all we want is just like open a note and do a brain dump, for example. Don&amp;rsquo;t need a board for that. Or you just want to work on the content of one single note. Maybe explain a little bit more what their ideas about, so we don&amp;rsquo;t really need a board for that or Canvas for that.&lt;/p&gt;
&lt;p&gt;So I think it depends a lot from what you want to do. What do you think, Nicole? What would be your use for Canva?&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I think, I don&amp;rsquo;t wanna say it&amp;rsquo;s necessary because I just hate imposing what I think on other people.&lt;/p&gt;
&lt;p&gt;For me, some element of visualization is always necessary. Yeah. And sometimes, that is me drawing up like an atomic visual from the beginning and other times, I&amp;rsquo;m just all text and then I rearrange the text on Canvas or something or Excalidraw.&lt;/p&gt;
&lt;p&gt;And then other times it&amp;rsquo;s all purely based on the relationships and I&amp;rsquo;m just visualizing those links in either the graph view or ExcaliBrain.&lt;/p&gt;
&lt;p&gt;But I think our visual processing as humans is much more advanced than maybe other senses. Like common sense isn&amp;rsquo;t common, right? So it is something that we actively have to practice. And so having these visual shortcuts I think is really helpful.&lt;/p&gt;
&lt;p&gt;So for me, it&amp;rsquo;s always necessary, but I don&amp;rsquo;t always go to the extreme for everything &amp;lsquo;cause yeah, that would be tedious in that case.&lt;/p&gt;
&lt;h2 id="note-taking-in-multiple-languages"&gt;Note-taking in multiple languages&lt;/h2&gt;
&lt;p&gt;I want to jump into Scrintal because it&amp;rsquo;s been a while since I&amp;rsquo;ve last seen it, but I can&amp;rsquo;t resist this question from Deb Leg who says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;As someone who also juggles languages, I&amp;rsquo;m curious to know how your knowledge of several languages impacts your thoughts or notes process and which languages you use for research and knowledge creation?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: That&amp;rsquo;s interesting. I just use English all the time. Because I figured I started my research journey even when I was in Brazil, everything was in English, all papers were in English and for computer science all technical language was in English, so everything was always English. So I decided to just have one language for my specific, I don&amp;rsquo;t even know how to call it more knowledge base vaults or anything, I like to call knowledge base.&lt;/p&gt;
&lt;p&gt;But one thing that is interesting that I was discussing with one of the members of my community the other day is that &amp;lsquo;cause you&amp;rsquo;re saying, well, I write in English and in Japanese. And one of the things that we notice with languages is that there is translation and there is how can I actually express this idea in a different language? And sometimes, translation is not the way to doing that. Because I always say, &amp;ldquo;Well if you take notes, for example, if our notes represent an idea, the title of the note is the name for that. How do we call that idea?&amp;rdquo; And sometimes, how we call that idea in English is not just a translation from stock in Japanese or in Portuguese. It&amp;rsquo;s like how do we call that idea in one language and how do we call that idea into the other language?&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s one one of the interesting things because I think the main challenge now is really like if you write in two languages, when it&amp;rsquo;s time to search for your notes, which language would you use to search? So it&amp;rsquo;s really hard. It&amp;rsquo;s like, which word did I use? Did I translate? So one thing could be like, okay, I have a title in both languages, if that&amp;rsquo;s important idea, just have, how do I call that idea in two different languages. But it is really hard to find later if you&amp;rsquo;re not very disciplined on how we name our ideas or how we write.&lt;/p&gt;
&lt;p&gt;NICOLE: For me, I can&amp;rsquo;t really control it all the time. I think my daily notes for instance, are in a jumble of languages, whatever I was thinking in at that time. So they are messy. But what I do is at the end of the day, I then process it and then I do translate most of it to English.&lt;/p&gt;
&lt;p&gt;Some things are naturally in English for me. Like I study, so my native language is Tagalog, English is a second language and it is my best non-native language. It is also the language that I studied in. So when I talk about anything that is like mathematical or computer science related, because in programming, even the keywords are in English, so it makes sense for me to translate those into English.&lt;/p&gt;
&lt;p&gt;But what I&amp;rsquo;ll do is I&amp;rsquo;ll have an alias in Obsidian with something that I might refer to it as in another language. So for example, performance testing is the main note for it in English. And I&amp;rsquo;ll put an alias that is &amp;ldquo;pruebas de carga&amp;rdquo; which is the same thing in Spanish because I might be searching for that.&lt;/p&gt;
&lt;p&gt;And I also noticed that with people, the notes tend to be in whatever language I was speaking to them in. So if I&amp;rsquo;m speaking to someone in Dutch, then my notes will be in Dutch &amp;lsquo;cause that kind of makes sense.&lt;/p&gt;
&lt;p&gt;Omar Ortiz Meraz is saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Usually, I reserve each language based on topic.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah, I have a bunch of private notes around relationships and relationship dynamics that are in Tagalog because that&amp;rsquo;s how I think with relationships. And looks like Omar&amp;rsquo;s also saying English for technical things, yeah.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Filipino, Tagalog and English here too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Hey, (Filipino) compatriot, how are you?&lt;/p&gt;
&lt;h2 id="demo-of-scrintal"&gt;Demo of Scrintal&lt;/h2&gt;
&lt;p&gt;NICOLE: (English) Let&amp;rsquo;s get into Scrintal, Bianca, if you don&amp;rsquo;t mind showing us what it looks like now. It&amp;rsquo;s been a while. It&amp;rsquo;s been like months, maybe a year since I looked at it. Should I add it?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah. Can you add? Can you see my cursor or?&lt;/p&gt;
&lt;p&gt;NICOLE: Yes, we can.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, okay.&lt;/p&gt;
&lt;p&gt;So Scrintal, the hard part is that you are faced with a blank screen and you&amp;rsquo;re like, okay, there is a world of possibilities but I have no idea how to start. So it&amp;rsquo;s really like you can just create a note, which is called card here in&amp;hellip; I like to think like it&amp;rsquo;s similar to the physical world, let&amp;rsquo;s say. You have your desk, you can double click or create that to create a card where you can just write wherever you want and create a title. My idea.&lt;/p&gt;
&lt;p&gt;And then they also have this slash comments to actually add things. A link to a card or a link to a board. You can link to from a card to a board. Upload things, emails, add YouTube videos, tweets, upload, and the normal formatting that we have.&lt;/p&gt;
&lt;p&gt;And if I want to create a link to another idea, I could just here plus. And then there&amp;rsquo;s another idea. So let&amp;rsquo;s say they all just appear on the screen and if you just close everything, they are there in the board already linked to each other.&lt;/p&gt;
&lt;p&gt;So basically that&amp;rsquo;s the basic idea of Scrintal. So you have cards, you can have a desk and you can have a board, which is exactly the same thing of a desk, but you can save a board and give a name to the board. The desk is just one, where boards, you can create as many as you want. So you can just click here. Or for example, if I want to create a board with those, I just right-click, create a board. And then I have this new board, which I can give it a name and add a link for example, inside. Inside of here. So this is a link becomes a link to board rather than linked to a card for example. And it has similarly like have backlinks. So it appears when you have links to boards. In which boards does this card appear? Because a card exists in the panel, the board. It can appear as in multiple boards, it can be no boards at all.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s all those things appear there. And if you want to see the rest here, then you can see all the cards that you have, all the boards you can share, you can actually have multiple people work in the same board. The same set of cards. And here, you can have just a normal search that you can search to find the boards or the cards again. So the cards they exist independent of anything, you can add them to your desk, you can add them to a board. So I can go out here and here on my desk. For example, I clear my desk, my desk is empty. But then the board, you still have those two cards. So you can use a board as an MOC for example if you want. You can use a board to make sense of things and save. It&amp;rsquo;s pretty similar tool to combine that sense because you can also link Canva I think in Obsidian as well. So those are the main feature.&lt;/p&gt;
&lt;p&gt;We can add color as well if you want. You can add tags. Yeah, those are the main things the Scrintal has at the moment.&lt;/p&gt;
&lt;p&gt;NICOLE: So we have two questions here on what were also my objections. Rodrigo Alexandre Costa:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Scrintal&amp;rsquo;s cards or boards format is proprietary.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And a related one:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How can you export your notes from Scrintal?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: Yeah, that&amp;rsquo;s one thing that I have been asking the team for many months, the exporting part. They are working now on a full export of all the cards. Currently, can export one by one in Markdown or by just all the PDF, but they&amp;rsquo;re working on a export all feature. So it should be here, I think in the next months.&lt;/p&gt;
&lt;p&gt;In terms of proprietary, yeah, they just have their own format. They don&amp;rsquo;t share what&amp;rsquo;s the format, but then you can export in Markdown. So ideally, in the future you could have, let&amp;rsquo;s say you write your things in Obsidian, you upload into Scrintal, you change the things there, there download, put back into Obsidian. So you can ideally be able to use both for depending what he wants to do. But yeah, we are not there yet if anyone wants to use that way.&lt;/p&gt;
&lt;p&gt;NICOLE: I wanna say that to be fair, Canvas is the same way. So the Obsidian team hasn&amp;rsquo;t quite figured it out either. That&amp;rsquo;s kind of why I&amp;rsquo;m hesitant to use it because it&amp;rsquo;s no longer Markdown. And technically though, the format is not proprietary, Rodrigo. I don&amp;rsquo;t know about Scrintal, but for Obsidian, it is in JSON. So it is a standard format, but it isn&amp;rsquo;t nice to work with. It isn&amp;rsquo;t really something that you can export to another app or something. I imagine that the Scrintal team are facing the same limitations.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, well to be fair with Obsidian as well, this is a very new area. Like just now, there is like Scrintal, Obsidian and Logseq pushing into that direction. So there are really not no open standards to deal with this type of data because even the different tools are trying to figure out what is it that you&amp;rsquo;re creating, what is it that we want to represent, how we can represent that information.&lt;/p&gt;
&lt;p&gt;So I think it would be very good to like, if in let&amp;rsquo;s say five years time maybe, or hopefully before, there will be open standards for those and multiple apps who maybe even work together to try to create those open standards that they all support. So I say, fingers crossed, that will be the future. But yeah, so far, I&amp;rsquo;m not even sure if there is any open store that would cater for this type of use case. So let&amp;rsquo;s see where it will go.&lt;/p&gt;
&lt;p&gt;NICOLE: I think the closest one would be Mermaid.js. which Obsidian does support, but you have to learn it. And it&amp;rsquo;s also not as flexible as Scrintal is for example. I want to ask about the board and desk concept though. It kind of sounds like their analogous to maybe folders and subfolders or is that completely wrong?&lt;/p&gt;
&lt;p&gt;BIANCA: Well, first there is no subfolders. You cannot have a board inside of a board, for example, board is a separate thing. And they&amp;rsquo;re not totally, they are similar a folder in the sense of container. Like it can bring things inside of it, let&amp;rsquo;s say. You can put cards inside of a board, but the same card can&amp;rsquo;t exist in multiple boards. So they don&amp;rsquo;t have the limitations of a folder because in a folder, like you put on a folder and that&amp;rsquo;s it. You cannot really put in multiple, you can create shortcuts, but that&amp;rsquo;s another story. But then really like folders, is this folder or in that folder? Whereas boards is really like, okay, you can just put on a board, remove, put it back again, put in five different boards. So the boards are much more flexible in that sense.&lt;/p&gt;
&lt;h2 id="taking-notes-on-source-material"&gt;Taking notes on source material&lt;/h2&gt;
&lt;p&gt;NICOLE: So there are a few questions about how you would actually use these boards for research. So for starters, someone said if you were taking or making notes from an article, would you make many atomic notes or one main note? And then my question is, would you also like create a single board for that article and have all of your notes on there? Or would you make a board per day? And then a follow up question is from Jan who is asking about the serendipity aspect of it. So what if you just want to be able to explore your notes and discover new ones?&lt;/p&gt;
&lt;p&gt;BIANCA: Just try to remember everything. I remember this.&lt;/p&gt;
&lt;p&gt;For the input one, as I said, like I work with idea note, let&amp;rsquo;s say, so each note is one idea. So when you&amp;rsquo;re reading a source, there are tons of ideas in the source that you want to capture and understand. And there are main ideas that spring out. Why are you reading the source? So I have like tons of notes that come out from reading one single source. So I have multiple notes from that. They all link back to the source, but I have multiple notes on that.&lt;/p&gt;
&lt;p&gt;But in my case, I&amp;rsquo;m playing now with creating a board for that because someone asked me the same question, I&amp;rsquo;m like, &amp;ldquo;I don&amp;rsquo;t create a board for that.&amp;rdquo; So I was like, &amp;ldquo;I&amp;rsquo;ll try and see if there is any benefit of doing that.&amp;rdquo; I did not find any benefits so far, unless you want to make sense of all those ideas together. But then you can create a board later. But while I&amp;rsquo;m reading a paper, I don&amp;rsquo;t really use a board. I just like, there are many ideas that I start to, many notes, many cards that I start to create, create, create, create. But I don&amp;rsquo;t actually create a board for that specific input. I don&amp;rsquo;t see any specific utility unless I want to make sense of those ideas even in isolation from the source or get group of ideas or things like that. Yeah, so that&amp;rsquo;s that.&lt;/p&gt;
&lt;p&gt;NICOLE: So Niky Dix seems to be familiar with your work. They say that you have a brilliant method for using a combination using OneNote and then making atomic notes. Can you explain what they mean?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, well Nik is from our community. Because there is a process. one thing is like for example, how I do it, I create many notes. And what I talk about this, I&amp;rsquo;m not sure if Niky is referring to that, is the idea when we have the bibliographic note where like I call the input note, it&amp;rsquo;s a note that represents the source itself.&lt;/p&gt;
&lt;p&gt;So this my note that represents the source and I have all my ideas linking to that source. And the reason why I link to that note and not direct to the source then I am talking about is because then I can see, I can answer two questions. One is where this idea came from because it has a link to the source and the other is like, what are all the ideas that came out from this source? So just go into the note, the backlinks shows me all the ideas that are related to this source. So I think maybe that&amp;rsquo;s the what Nik&amp;rsquo;s talking about. Using the OneNote to represent the source.&lt;/p&gt;
&lt;p&gt;So I don&amp;rsquo;t use a board to represent the source to say, ah, this is the source and all the ideas in the source. Instead, I have one note and all the notes that refer to that are linked back to that source. So the backlinks by now can take, what are all the ideas that came out from that source? I don&amp;rsquo;t know, Nik, is that what you&amp;rsquo;re referring to?&lt;/p&gt;
&lt;p&gt;NICOLE: Another person is also asking, &amp;ldquo;So you have a base note for the source and connect all notes?&amp;rdquo; So if I understand what you&amp;rsquo;re saying, yes, you have a note that is for that source and then you either explicitly connect other notes that have, like, you create notes of ideas from that source and you either explicitly link them or rely on backlinks to connect them to the base note. Is that right?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah.&lt;/p&gt;
&lt;h3 id="on-the-usefulness-of-highlights"&gt;On the usefulness of highlights&lt;/h3&gt;
&lt;p&gt;NICOLE: And is it like, do you use something Readwise to do that? Or do you just manually create a base note?&lt;/p&gt;
&lt;p&gt;BIANCA: I manually create, and actually, I was teaching a few weeks ago and one of the outcomes was that many people say, &amp;ldquo;Okay, I&amp;rsquo;ll remove my Readwise subscription.&amp;rdquo; because I&amp;rsquo;m really like, the whole flow, I talk like, highlight is good, but use highlight as a way to say, this is my note. There are many shortcuts especially for research.&lt;/p&gt;
&lt;p&gt;&amp;lsquo;Cause in research, you want to create knowledge. So our note should not be just a highlight. It&amp;rsquo;s like how can we have our own understanding inside of our system? And Readwise sometimes like, okay, I highlighted this in Readwise I can just put later into my system. And what usually happens that when we take that approach, let&amp;rsquo;s say we highlight and see we process later, later never arrives. So we end up just like our notes are just highlights, but we never process our understanding of what are the ideas that came out from reading that, from try to understanding that So that was like, well maybe highlight is good for when you want to reread the source, but if it&amp;rsquo;s the process of understanding, really need to write down what is our understanding. And if we use a tool that just say highlight to see it later, later never arrives.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, I think that&amp;rsquo;s when the problem is when you treat something like Readwise or any read it later app as the end of the process, then that&amp;rsquo;s still a very superficial way of learning really. I kind of treat it as the beginning. And then I process it from there. Jan is saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do you mean highlighting encourages resource hoarding rather than taking notes?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I definitely think it does. Do you agree?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, I agree. Like especially when it&amp;rsquo;s highlight only. If it&amp;rsquo;s highlight only, then I think that&amp;rsquo;s the worst of the worst. Because sometimes, okay, I highlight and then Readwise, you just create my notes. I just import from Readwise into my Obsidian for example, and I have my notes with my highlights. But then like, so what? Those are other people&amp;rsquo;s words, other people&amp;rsquo;s thoughts, something they try to communicate, but what did we understand for that? What do we try to do with that? I think it means a little bit in the personal knowledge management. So I totally agree with you.&lt;/p&gt;
&lt;h3 id="the-one-pass-reading-strategy"&gt;The one-pass reading strategy&lt;/h3&gt;
&lt;p&gt;NICOLE: So Niky Dix is saying that he was referring to the one pass strategy where we use free writing from one source and then make idea notes using the pick a phrase and then create idea notes and reverse outline. Okay, we need to unpack this. Can you explain what he means?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, yeah, yeah. As a solution to this process, the highlight and the process later and later never arrives.&lt;/p&gt;
&lt;p&gt;So when it comes the time to write from our research, there are no notes. Because we didn&amp;rsquo;t actually process those highlights with our understanding and build the knowledge that we want to write about.&lt;/p&gt;
&lt;p&gt;So what I develop is what I call the one pass reading strategy. So that is when you finish reading, you have all your notes ready. Even if you stop in the middle, you are ready, have all your notes ready for you. So the process where you go, I develop a process step by step how we can do that. And that&amp;rsquo;s where all those words come from. We are reading something, we feel the urge to highlight something was either interesting, relevant, or puzzling. We stop immediately rather than just highlight and keep moving on, we stop and then start making sense of that.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s really like, let me free write and just write my understanding of what I just read. Even try to explain what the person tried to tell me or try to explain how does it relate to my work or anything that comes to mind really. So just really like free writing that.&lt;/p&gt;
&lt;p&gt;And then when you talk about idea notes, many people use the thing of atomic notes, I say, or idea notes as like, okay, what are the ideas in the highlighting? And that&amp;rsquo;s why I say don&amp;rsquo;t do that. The highlight is someone else ideas. You want to extract the atomic notes from what you wrote from your free wrote. Because those are your ideas, even if they&amp;rsquo;re just an explanation of what the person said. So those are the ones that become the atomic notes. And then you may want to cite to mention, okay, these thoughts actually are not mine. They came when reading this quote from the source. So that I can say, this is not mine, it came from this source.&lt;/p&gt;
&lt;p&gt;But then that&amp;rsquo;s where I use and some methods that I teach on how to create those idea notes. Those are the pick a phrase and the reverse outline methods. So those are some methods that to help convert a free writing into idea notes. So that&amp;rsquo;s a little bit of what Nik was referring to.&lt;/p&gt;
&lt;p&gt;NICOLE: Okay. So what&amp;rsquo;s so interesting is that you&amp;rsquo;re using different terminology, but I&amp;rsquo;ve kind of arrived at the same conclusion, at the same process.&lt;/p&gt;
&lt;p&gt;I think like Tiago Forte uses the term progressive summarization.&lt;/p&gt;
&lt;p&gt;And since you&amp;rsquo;re a developer, I like to think of it as like continuous note taking in the sense of CI/CD processes. For those who don&amp;rsquo;t know, in tech, we are now emphasizing a more agile way to work where that is more iterative. So it&amp;rsquo;s not like in the first pass, you get everything down and you&amp;rsquo;re done and you move on. It&amp;rsquo;s like you do, it kind of sounds like what you&amp;rsquo;re describing, Bianca, where the initial pass is like freeform. You&amp;rsquo;re not really separating things out yet. You&amp;rsquo;re just getting through it and then you go back and iterate over it, and then you start creating idea notes that are now in your words, not in the author&amp;rsquo;s words. And then you keep like continually processing it from there. So I&amp;rsquo;m seeing kind of a lot of similarities.&lt;/p&gt;
&lt;p&gt;Do you think that it is significantly different from other methodologies like Zettelkasten or progressive summarization?&lt;/p&gt;
&lt;p&gt;BIANCA: I cannot say that I understand completely progressive summarization or the Zettelkasten. What I understand, progressive summarization is that you stop too much on the source side of things. It&amp;rsquo;s like you try to highlight and summarize, is it too much on what the other process try to say, and it takes too much time to arrive on you, let&amp;rsquo;s say.&lt;/p&gt;
&lt;p&gt;Whereas my case, let&amp;rsquo;s say like as soon as you write something that is important, your thoughts should go down, your thoughts should go there immediately.&lt;/p&gt;
&lt;p&gt;But I agree with you on the agile process, actually even the people in the community, they heard me talking about agile a little bit because even I call agile note making. Because like yeah, let&amp;rsquo;s I compare to I guess the waterfall. So there&amp;rsquo;s a lot of like computer science things going on.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, that&amp;rsquo;s awesome. I love that.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, so-&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;ve had a lot of the same thoughts.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, so it&amp;rsquo;s really like the process of really iterative. It&amp;rsquo;s really like put your thoughts out. Because one of the big problems that people have in note making or in writing, especially in research, is that we try to organize first rather than create the things first or express our thoughts first.&lt;/p&gt;
&lt;p&gt;So it happens in some note making tools. They force you to think about that because okay, where would I put this note even when I don&amp;rsquo;t know what I write inside of the note yet. Whereas I see more like, first you express what you want to say. I don&amp;rsquo;t even know what I&amp;rsquo;m gonna say, then just write it all down. And then the process of organizing those notes so that I can find them later.&lt;/p&gt;
&lt;p&gt;And the atomic note is really a process of organization. We are trying to organize our ideas in a way that we can grow them, using some sense making strategies or we want to find them later. I see that that&amp;rsquo;s why like the process really like. Write everything down first, then you express yourself. Now let&amp;rsquo;s start to organize as a second step.&lt;/p&gt;
&lt;h3 id="nicole-showing-her-process"&gt;Nicole showing her process&lt;/h3&gt;
&lt;p&gt;NICOLE: So I want to show quickly this something that&amp;rsquo;s in the process of me going through and creating and synthesizing my thoughts on it. This is an example of highlights from Readwise. And as you say, this is really like, it&amp;rsquo;s all source, there&amp;rsquo;s none of my own thoughts in here, but it&amp;rsquo;s like a prompt for me. It&amp;rsquo;s the beginning and then I remember what I thought was interesting about it, and then I create another note but that is about still what the author is saying, but now it&amp;rsquo;s in my words.&lt;/p&gt;
&lt;p&gt;So I like this thesis, an antithesis, antithesis and synthesis kind of structure. It&amp;rsquo;s the Hegelian dialect and I like that in the first one I talk about what are the main part points of the book? What is the author trying to say? But in my own words. And then I also think about similar ideas that other authors I know or have read, wrote about or said about the situation. Then antithesis is like, what are the things that are wrong or what are the weak points of that book? And then how can they come together?&lt;/p&gt;
&lt;p&gt;So obviously, I&amp;rsquo;m not done with this one and it&amp;rsquo;s still in progress, but I just wanted to show how it can be done like in Obsidian as well. I guess in Scrintal, this would be&amp;hellip; I&amp;rsquo;m interested that the process is really very similar. It&amp;rsquo;s just, okay, the tool is different, but we&amp;rsquo;re actually doing the same thing.&lt;/p&gt;
&lt;h3 id="which-tool-is-best"&gt;Which tool is best?&lt;/h3&gt;
&lt;p&gt;BIANCA: Yeah. This one, I like to say like, because most people they ask, &amp;ldquo;Okay, which tool should I be using? Should I then move to Scrintal?&amp;rdquo; I was like, &amp;ldquo;Wait, what do you want to do?&amp;rdquo; Because it&amp;rsquo;s more about which type of thinking we are trying to support and then which methods we can use to put that way of thinking to practice. And then what is the tool that I want to use?&lt;/p&gt;
&lt;p&gt;So many people say they started with Obsidian, they say, &amp;ldquo;Well that&amp;rsquo;s not for me. I want something else.&amp;rdquo; And they go to Scrintal. Some people start Scrintal, they say, &amp;ldquo;That&amp;rsquo;s not for me. I want something else. They go into Obsidian.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s really like, what do you want to do with the tool? What method supports that? And then, okay, which tool will support me in applying that method? So I like to think more on the mindset, what I call the mindset, and then the methods. Then choose, what&amp;rsquo;s then the best tool for my use case or for this specific use case?&lt;/p&gt;
&lt;p&gt;I think I can maybe share my personal screen. I was saying that I was, I didn&amp;rsquo;t want to&amp;hellip;&lt;/p&gt;
&lt;p&gt;NICOLE: Totally up to you. You don&amp;rsquo;t have to if you don&amp;rsquo;t want to, but yeah, sure. But I really love what you&amp;rsquo;re saying about tools because people think like, &amp;ldquo;Oh, my channel&amp;rsquo;s about Obsidian so I must think that Obsidian is the best tool for everyone.&amp;rdquo; I don&amp;rsquo;t, I hate saying something is the best for everyone. I&amp;rsquo;m like the opposite of that. That is the opposite of inclusivity.&lt;/p&gt;
&lt;p&gt;I always say try it out. a lot of these tools are free or have a free trial or a free tier. Use it all. And if that&amp;rsquo;s Notion or if that&amp;rsquo;s Evernote or Obsidian, like go for it. We all think in different ways. Why do we assume that one tool will placate all of us?&lt;/p&gt;
&lt;p&gt;BIANCA: Exactly. I totally agree with that.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, if you&amp;rsquo;d like to share your screen, you can-&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, I&amp;rsquo;ll try.&lt;/p&gt;
&lt;p&gt;NICOLE: Just go ahead and do that.&lt;/p&gt;
&lt;h2 id="languages-as-thinking-hats"&gt;Languages as thinking hats&lt;/h2&gt;
&lt;p&gt;NICOLE: And Nik was also saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Write first, organize later. Sounds like what Nicole did with her daily notes in multiple languages too.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Absolutely, that is exactly it. My daily note is kind of like Bianca&amp;rsquo;s one pass process, what is it called? One pass reading. And that&amp;rsquo;s because it&amp;rsquo;s just like a log. There are bullet points. I am not really thinking too much about what language I&amp;rsquo;m writing in, but then when they get processed, I mean, very few people are going to want to read a single article in multiple languages that might not coincide with their languages, right?&lt;/p&gt;
&lt;p&gt;Mage Prometheus says:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Writing down your own words immediately helps identify where you don&amp;rsquo;t understand. I don&amp;rsquo;t like to read on if I don&amp;rsquo;t understand what I&amp;rsquo;ve just read.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Yeah, and I would also add to this, something I didn&amp;rsquo;t mention with the multiple languages question is I actually use my knowledge of multiple languages to test myself. And kind of like the question that was asked earlier about AI. One thing that I am actively using AI for is to provide me the opposing argument. Here&amp;rsquo;s what I think, tell me what&amp;rsquo;s wrong. And that is super cool because sometimes the AI, GPT3. or GPT4 says things and I&amp;rsquo;m like, I should have thought of that. That&amp;rsquo;s actually a pretty solid argument that has me rethinking how I should argue, how I should present my evidence.&lt;/p&gt;
&lt;p&gt;And I do the same thing with languages because I find that for me at least, like certain languages are linked with certain attitudes. It&amp;rsquo;s kind of like the six hats, the thinking hats from Edward de Bono. That&amp;rsquo;s what languages are for me.&lt;/p&gt;
&lt;p&gt;If I have a premise out there and I think I want to attack this logically, I might try English because that for me is the logical language. But if I want to think about like, well what does this mean in terms of people? I might do Filipino, Tagalog or Spanish. Then if it&amp;rsquo;s something that&amp;rsquo;s more like, about freedom or liberty, okay, let&amp;rsquo;s do the same thing in Dutch and let&amp;rsquo;s see what I come up with.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s actually interesting, the things that I come up with just from putting the same thoughts in two different languages. It&amp;rsquo;s like, why did I use that word in Dutch? But I didn&amp;rsquo;t use a direct translation in English. It&amp;rsquo;s like, okay, that&amp;rsquo;s kind of interesting.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, that&amp;rsquo;s why you see like it&amp;rsquo;s really about the idea itself, not the words. Because when you start to thinking what is the name for this idea? That&amp;rsquo;s where it&amp;rsquo;s like, oh, okay, what am I actually trying to say here? What&amp;rsquo;s the idea that I try to talk about? So I find that fascinating.&lt;/p&gt;
&lt;p&gt;NICOLE: And also agglutinative languages like German, Dutch or even Esperanto, they just let you freeform, push two ideas together that maybe don&amp;rsquo;t belong. And I love that. We can&amp;rsquo;t just do that in other languages. So it&amp;rsquo;s super useful from that perspective. Just putting a name on a feeling or an idea is so powerful.&lt;/p&gt;
&lt;h2 id="sparking-serendipity-in-research"&gt;Sparking serendipity in research&lt;/h2&gt;
&lt;p&gt;NICOLE: I want to get to the question earlier about serendipity, &amp;lsquo;cause I think that&amp;rsquo;s really important. So we&amp;rsquo;ve talked about how you process something for research, you have a base note for the source, you create idea notes that you pull out in kind of like an atomic note process. And then in the base note are things that are just more free form, but still in your own words, if I understand correctly, or is that like a separate note?&lt;/p&gt;
&lt;p&gt;BIANCA: I feel I can share now. I managed to share so.&lt;/p&gt;
&lt;p&gt;NICOLE: Oh, okay, great, yeah.&lt;/p&gt;
&lt;p&gt;BIANCA: Just look at it.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah.&lt;/p&gt;
&lt;p&gt;BIANCA: So that&amp;rsquo;s, for example, this will be what I call, it&amp;rsquo;s some people call biographic notes, literature note, it&amp;rsquo;s just an information, what it is, some videographic formation, what is the link. And for example, in here, I don&amp;rsquo;t have really anything. It&amp;rsquo;s just a summary. Very tiny one. &amp;lsquo;Cause i still write, see, I&amp;rsquo;m on page six. I read almost nothing from this book.&lt;/p&gt;
&lt;p&gt;But then, those are the backlinks with the ideas that come out of it. There is sometimes information about the person or information about specific idea. And then I have some explanation here, which links to other things. So that&amp;rsquo;s really how I link. I explain the things and link back.&lt;/p&gt;
&lt;p&gt;What I link, I link back to this note, so I can see here what are all the ideas that are related to it. So what I started doing, I started writing sometimes here just like free form, free writing. I just open here. There was something interesting, I just start writing here. And then I separated them as soon as I finished writing.&lt;/p&gt;
&lt;p&gt;Before I started reading again, I separate them into their own notes or put into a note if already existed a note about that specific thing. And that&amp;rsquo;s how I go.&lt;/p&gt;
&lt;p&gt;So I don&amp;rsquo;t keep my original free writing, I just like throw it away, except in some situations. Oh wow. Where it&amp;rsquo;s more like the decision but it&amp;rsquo;s more like I&amp;rsquo;m reporting, I&amp;rsquo;m writing a decision that I took or is more journaling, how I&amp;rsquo;m more about why am I moving my research in that direction? If it&amp;rsquo;s from a source, it cease to exist as one text. It&amp;rsquo;s actually existing multiple cards that&amp;rsquo;s breaking down into multiple cards about different ideas.&lt;/p&gt;
&lt;p&gt;NICOLE: I gotta say, that makes me anxious just thinking about it. You delete it? I do the same thing, but I keep the original.&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah. I say, well if it makes you comfortable, keep it there. And maybe the daily note can come back the best. But for me, it&amp;rsquo;s just like&amp;hellip; Because it&amp;rsquo;s still there, but it&amp;rsquo;s nothing in one single text. It&amp;rsquo;s in multiple place. Each idea is a different note.&lt;/p&gt;
&lt;p&gt;NICOLE: So how would you stumble across? Like this note that you have, this sign or symbol. Is there any way that in Scrintal, you can stumble across that in a different context? Like not when you&amp;rsquo;re looking into this book?&lt;/p&gt;
&lt;p&gt;BIANCA: Yes, and sometimes, it happens with me because when you&amp;rsquo;re creating idea notes, when I talk about ideas, ideas are not just things, for example, this the example here, I have let&amp;rsquo;s say sign or double articulation.&lt;/p&gt;
&lt;p&gt;We could think them as things or concepts, but I can say maybe like signs that have, no something say, double articulation, for example. Let&amp;rsquo;s a statement. I&amp;rsquo;m saying that signs have this property. So in that case, I will say sign. And just by doing that, many times, I started writing and I just say, okay, I&amp;rsquo;ll explain this idea here.&lt;/p&gt;
&lt;p&gt;This is a new idea from me. I don&amp;rsquo;t wanna talk about science or I don&amp;rsquo;t wanna talk about whatever the word articulation is. I want to talk about the relationship between them. And many times, when I&amp;rsquo;m doing that, I notice I may think that this doesn&amp;rsquo;t exist. I will write for the first time, but then as I&amp;rsquo;m writing I say, whoa, I have a note about that already. It happened many times. So when I start thinking about the relationships with between things, I start noticing, I have notes that I didn&amp;rsquo;t know that I had before, and they have text in them, they have already content in them. I was like, whoa, I&amp;rsquo;m really happy with my previous self for having created a note for me, let&amp;rsquo;s say.&lt;/p&gt;
&lt;p&gt;But in terms of serendipity in general, I wouldn&amp;rsquo;t say that Scrintal is focus on serendipity. It&amp;rsquo;s not like Napkin. Napkin focuses on serendipity. You open a note and two other notes just appear beside it. And so the focus of is really serendipity. Obsidian, you still have some plug, let&amp;rsquo;s say, give me a random note that is that level of serendipity.&lt;/p&gt;
&lt;p&gt;In Scrintal, is really up to you. It&amp;rsquo;s really like, just open my card and open a random card and start to read again. And what I find interesting is that&amp;rsquo;s very often, we take notes, but we don&amp;rsquo;t read them. I mean, we always go to read something else from the external word, but we don&amp;rsquo;t read what our previous self wrote, let&amp;rsquo;s say. Very often. So I think a little bit of serendipity comes just by going to our vaults or our systems and reading our notes again.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, there are a few ways that I like to do it. I think last week, I released a video just on Serendipity for Obsidian. But I think that the concepts are the same.&lt;/p&gt;
&lt;p&gt;Although I do use Dice Roller for Obsidian to randomly select elements from tables or also notes. And you can say like, show me all the notes with this tag. Or you can do a bunch of different things with it.&lt;/p&gt;
&lt;p&gt;So I like to use that, but I also like to do chronologically. Like that&amp;rsquo;s why I used daily notes. In every daily note, I have a link that says like, one year ago today, here&amp;rsquo;s the daily note. And then I see what I was looking at or what I created on that day. And sometimes, I find seasonal things, like if I&amp;rsquo;m working on something for Christmas, it&amp;rsquo;s like, hey, this time last year I was working on that too.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s another way, by date, by topic, random or visualization, which I think Scrintal, I don&amp;rsquo;t know if Scrintal can, I guess it is good at letting you visualize different ideas, but is there a way to visualize all of the ideas? Like in all of the boards? I don&amp;rsquo;t really remember.&lt;/p&gt;
&lt;p&gt;BIANCA: No. Not yet. I tried, not a very good idea. I tried to put all my notes into on board and not yet. It just like didn&amp;rsquo;t open, everything crashed. It was just like, okay, lowsy, and we stayed there. I hope that the team has some ideas for that so you can actually see everything. But at the moment, there is no such option.&lt;/p&gt;
&lt;h2 id="how-do-we-find-the-time-to-make-notes"&gt;How do we find the time to make notes?&lt;/h2&gt;
&lt;p&gt;NICOLE: So we&amp;rsquo;re already over time. So I just wanted to end on one question from random user:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;How is there ever enough time to make notes on everything you&amp;rsquo;re interested in?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;BIANCA: There is not enough time to make notes on everything you&amp;rsquo;re interested in, that would be the main answer. But I think for the notes that we can take, I think it&amp;rsquo;s worth taking the time to take and engage with them later on. So I feel that that would be my take.&lt;/p&gt;
&lt;p&gt;NICOLE: That&amp;rsquo;s a really good answer. I totally agree, there&amp;rsquo;s never enough time. I relate so hard to this question because I want to take more notes on things than I actually have time to take notes on them. But just like anything else, prioritize.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;re not gonna be graded on this. Maybe you are actually. But for most other things, if you&amp;rsquo;re just a personal researcher, you&amp;rsquo;re not going to be graded on the thoroughness with which you attacked every single main premise that the author says.&lt;/p&gt;
&lt;p&gt;So feel free to pick the ones that are relevant to you for the work that you are doing. And I think that&amp;rsquo;s a much more sustainable way of doing things because you never have enough time.&lt;/p&gt;
&lt;p&gt;Bianca, thank you so much for joining me. If people want to know more about you, as I&amp;rsquo;m sure they will, where would you suggest they go?&lt;/p&gt;
&lt;p&gt;BIANCA: Well, as we are on YouTube. I&amp;rsquo;m starting &lt;a href="https://www.youtube.com/@BiaResearcher"&gt;my YouTube channel&lt;/a&gt;. I have some livestreams there, but I will start publishing more frequently. And can always comment there and start chatting through there. Otherwise, I&amp;rsquo;m also on Twitter. Much more active in Twitter. Can just DM me at any moment and we can chat from there.&lt;/p&gt;
&lt;p&gt;NICOLE: Awesome. And I also have the links in the description below of this video on YouTube. You can see Bianca&amp;rsquo;s YouTube channel there, but also, I don&amp;rsquo;t know why you didn&amp;rsquo;t even mention it. But you also have now, it&amp;rsquo;s not a course anymore, it&amp;rsquo;s a community, right? It&amp;rsquo;s the &lt;a href="https://biancapereira.gumroad.com/l/prolific-researcher-community"&gt;Prolific Researcher Community&lt;/a&gt;. Can you just talk a little bit about that?&lt;/p&gt;
&lt;p&gt;BIANCA: Yeah, the main idea that I changed from course to a community is that many times we take a course and we say, &amp;ldquo;Wow, I learned a lot.&amp;rdquo; But then it comes a moment to put everything to practice. And I was like, &amp;ldquo;Okay, I&amp;rsquo;m stuck, so how can I get help?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So the idea of the community that you, you come, you have an onboarding course where you learn how to take notes, how to express your thoughts, how to create a idea notes. And then, later in the second follow up course that you can take immediately or a little bit later. Because when you come to the community, come for a few months.
Now that I have my notes, how can I create new ideas from those notes and use and write my output base on my notes.&lt;/p&gt;
&lt;p&gt;So there are the course, the onboarding course and the follow up course, and there are a few others coming up, but there is also events or co-working sessions, Q&amp;amp;As, hot seat coaching, many other things.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s like, okay, you heard from me, now it&amp;rsquo;s time to develop your own practice. So then as you develop your own practice, then you get feedback, then you get support from me and from the community. And that&amp;rsquo;s why I change from a course into more community model because I think the one important aspect, okay, it needs to be something that works for you. That&amp;rsquo;s why I say it needs to be for each person. And we are there to support each one to decide which tool I want to use, how do I want to implement that? What works for my specific case and what doesn&amp;rsquo;t work for my specific case?&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s the idea of the prolific researcher community. And we have also course about research skills specifically. They&amp;rsquo;re related to the process of idea management or note making, but we have other things related to research specifically as well.&lt;/p&gt;
&lt;p&gt;NICOLE: All right. Thank you, Bianca. I&amp;rsquo;m so happy to finally have you on my channel. We&amp;rsquo;ve been talking about it for a while. You&amp;rsquo;re welcome back anytime.&lt;/p&gt;
&lt;p&gt;BIANCA: Thanks a lot for invitation. I I really enjoyed talking to you and thanks for everyone also who join us today. And I hope to be back and I hope to have you my channel at some point as well.&lt;/p&gt;
&lt;p&gt;NICOLE: Yeah, absolutely. I&amp;rsquo;m game, just tell me when and where.&lt;/p&gt;
&lt;p&gt;For everybody else, thank you for sticking around. Later this Friday, &lt;a href="https://youtube.com/live/8IyaSGI8X8Q"&gt;I&amp;rsquo;m having another livestream&lt;/a&gt;. This time, we&amp;rsquo;re going to be talking about something less serious than the topic of today&amp;rsquo;s discussion &amp;lsquo;cause we&amp;rsquo;re talking about all play, we are talking about role playing games. And I am going to be with my friend and dungeon master, &lt;a href="https://polaine.com"&gt;Andy Polaine&lt;/a&gt;. We&amp;rsquo;re going be comparing how he takes notes and how I take notes on the same sessions, on the same campaign. So that should be interesting as well. Thank you, everyone for joining us and I&amp;rsquo;ll see you on Friday. Bye.&lt;/p&gt;
&lt;p&gt;BIANCA: Bye-Bye.&lt;/p&gt;</description></item><item><title>Informed Life Podcast Interview</title><link>https://nicolevanderhoeven.com/blog/20230326-informed-life-podcast-interview/</link><pubDate>Sun, 26 Mar 2023 20:14:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230326-informed-life-podcast-interview/</guid><description>&lt;p&gt;Information architect, author, and educator Jorge Arango &lt;a href="https://theinformed.life/2023/03/26/episode-110-nicole-van-der-hoeven/"&gt;interviewed me on his podcast&lt;/a&gt;, &lt;em&gt;The Informed Life&lt;/em&gt;, about how I apply the principles of CI/CD to taking notes, why I use Obsidian, and how I use it to learn in public and play roleplaying games.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/intentional-life-podcast-interview.png" alt="The Informed Life podcast cover" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Grafana Cloud k6 (k6 Office Hours #83)</title><link>https://nicolevanderhoeven.com/blog/20230324-koh-83-grafana-cloud-k6/</link><pubDate>Fri, 24 Mar 2023 18:00:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230324-koh-83-grafana-cloud-k6/</guid><description>&lt;p&gt;With the release of Grafana Cloud k6, you can get observability and performance testing in the same platform. Senior Product Manager Mark Meier and Frontend Lead Simon Legander join me to talk about what Grafana Cloud k6 is, how you can use it, and demonstrate what it can do to improve your system&amp;rsquo;s reliability.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/products/cloud/k6/"&gt;Sign up to Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/docs/grafana-cloud/k6/"&gt;Learn more about Grafana Cloud k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oIBNIsZaN_8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Introducing Grafana Cloud k6</title><link>https://nicolevanderhoeven.com/blog/20230321-introducing-grafana-cloud-k6/</link><pubDate>Tue, 21 Mar 2023 15:20:58 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230321-introducing-grafana-cloud-k6/</guid><description>&lt;p&gt;Grafana Cloud k6 is a feature available to all users of Grafana Cloud. It allows you to run load and performance tests right from the comfort of your Grafana Cloud instance, without needing to create a separate account on k6 Cloud. Grafana Cloud k6 helps you get started quickly with a GUI Test Builder or with test scripts written in JavaScript, and then visualize your test results in real-time, alongside your other Grafana dashboards that monitor your system infrastructure. With Grafana Cloud k6, you can get a holistic look at your system&amp;rsquo;s performance&amp;ndash; on any environment.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://grafana.com/products/cloud/k6/"&gt;Sign up to Grafana Cloud k6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/grafana-app/"&gt;Learn more about Grafana Cloud k6&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OMh7bWk2qnQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Randomness in Obsidian With Dice Roller</title><link>https://nicolevanderhoeven.com/blog/20230317-randomness-in-obsidian-with-dice-roller/</link><pubDate>Fri, 17 Mar 2023 17:00:25 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230317-randomness-in-obsidian-with-dice-roller/</guid><description>&lt;p&gt;The Obsidian Dice Roller plugin lets you use randomness in Obsidian to provoke serendipity in personal knowledge management. Dice Roller is a plugin that was created for use in tabletop roleplaying games, but you don&amp;rsquo;t have to be a gamer to be able to use it to spark creativity in your thinking for other topics.&lt;/p&gt;
&lt;h2 id="resources-mentioned"&gt;Resources Mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;THEME: &lt;a href="https://www.youtube.com/watch?v=7-SOwxpZQNI"&gt;AnuPpuccin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Obsidian Dice Roller repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=4zrs_vVRwD4"&gt;More about how I create content by leaning into randomness&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wHA5gzPOPPM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Experimental modules in k6 (k6 Office Hours #82)</title><link>https://nicolevanderhoeven.com/blog/20230317-koh82-experimental-modules-in-k6/</link><pubDate>Fri, 17 Mar 2023 16:00:35 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230317-koh82-experimental-modules-in-k6/</guid><description>&lt;p&gt;Experimental modules in k6 were released in v0.40, and new modules for distributed tracing and browser testing have been added since. In this video, k6 Senior Software Engineer Théo Crevon talks to Developer Advocates Marie Cruz and Nicole van der Hoeven about what experimental modules are and how to use them.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0-dfzCUV7m4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The Future of Obsidian with CEO Stephan Ango and Andy Polaine</title><link>https://nicolevanderhoeven.com/blog/20230312-future-of-obsidian/</link><pubDate>Sun, 12 Mar 2023 00:27:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230312-future-of-obsidian/</guid><description>&lt;p&gt;What is the future of Obsidian? The new Obsidian CEO, Stephan Ango (@kepano), talks about why he joined the Obsidian team and what he wants to do next. I&amp;rsquo;m Nicole van der Hoeven, and today I&amp;rsquo;m joined by my friend, Andy Polaine, to find out what&amp;rsquo;s on the horizon for our favourite note-taking app.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TkNTuFF2t-c?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="key-takeaways"&gt;Key takeaways&lt;/h2&gt;
&lt;p&gt;10 notable points raised in the video were:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stephan thinks the proliferation of tools for thought is a positive thing, in that every new tool that uses Markdown makes the standard more futureproof.&lt;/li&gt;
&lt;li&gt;Obsidian&amp;rsquo;s three major pillars are extensibility, privacy, and longevity. Those are things Obsidian excels at.&lt;/li&gt;
&lt;li&gt;The things Obsidian is bad at are the consequences of those three major pillars (such as fragmentation, difficulty in sharing, and being restricted to Markdown).&lt;/li&gt;
&lt;li&gt;The Obsidian team consists of five full-time people, including founders Licat (Shida, dev) and Silver (Erica, product), Liam (dev of Calendar plugin), and Joethei (plugin reviews and dev ecosystem).&lt;/li&gt;
&lt;li&gt;Upcoming features: better metadata format than YAML (think something like Dataview inline fields), better querying of tasks&lt;/li&gt;
&lt;li&gt;Stephan wants to keep the Obsidian team small, and grow only when absolutely necessary.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s difficult to get exact usage figures for Obsidian, but going by downloads of the app bundle, there are about 1 million users.&lt;/li&gt;
&lt;li&gt;The Obsidian team doesn&amp;rsquo;t want to bring on venture capital investors.&lt;/li&gt;
&lt;li&gt;Better sharing in Obsidian is something they&amp;rsquo;re thinking about, but they need to prioritize use cases.&lt;/li&gt;
&lt;li&gt;Artificial intelligence in Obsidian is likely to remain in the realm of community plugins for now.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Below is a transcript of the video.&lt;/p&gt;
&lt;h2 id="introductions-nicole-van-der-hoeven-stephan-ango-andy-polaine"&gt;Introductions: Nicole van der Hoeven, Stephan Ango, Andy Polaine&lt;/h2&gt;
&lt;p&gt;Nicole: Hello, everyone. I&amp;rsquo;m Nicole van der Hoeven, and today I&amp;rsquo;m joined by two special guests. And I&amp;rsquo;d like to introduce first, I guess, Stephan Ango, or you might know him better as Kepano.&lt;/p&gt;
&lt;p&gt;Stephan: Hey, Nicole. Thank you for having me.&lt;/p&gt;
&lt;p&gt;Nicole: You&amp;rsquo;re welcome.&lt;/p&gt;
&lt;p&gt;Stephan: Kepano&amp;rsquo;s great. You can call me Kepano. I&amp;rsquo;m fine with that.&lt;/p&gt;
&lt;p&gt;Nicole: So, Stephan is a designer and an engineer, and most recently, he was announced to be the CEO of Obsidian. So that&amp;rsquo;s going to be interesting. I actually know you more for the stuff that you&amp;rsquo;ve made for Obsidian, like Minimal, and also Hider and Web Clipper. But it looks like you&amp;rsquo;ve been in the industry for a while making, I&amp;rsquo;d say similar tools.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah. Well, I mean, up until now it wasn&amp;rsquo;t really in the consumer space. I was building startups in more in the B2B area, but I&amp;rsquo;ve been using a lot of these tools for a long time. So, as a user, I&amp;rsquo;m older than I look, I guess. I&amp;rsquo;ve been like, building, I think the first thing that I really got into when I was a teenager was Winamp Skins. And so like, this is like, &amp;rsquo;90s, early 2000s, making my first website and things around that time. So that&amp;rsquo;s how, that was my first, I guess, experience, like, building things in the software world.&lt;/p&gt;
&lt;p&gt;Nicole: Awesome. And also here to help me interview you basically, is Andy Polaine, who is a lot of things. Designer, educator, writer, design leadership coach. He&amp;rsquo;s also co-authored a book called, &amp;ldquo;Service Design: From Insight to Implementation.&amp;rdquo; And he has a podcast called, &amp;ldquo;Power of Ten.&amp;rdquo; But really, the most important thing is he&amp;rsquo;s my Dungeon Master. We play D&amp;amp;D every week, and he&amp;rsquo;s also a good friend. We actually met because of Obsidian. So, welcome to the channel.&lt;/p&gt;
&lt;p&gt;Andy: Thanks. Thanks for having me on. I&amp;rsquo;m excited to be a co-host. Or co-interviewer. Co-interviewer.&lt;/p&gt;
&lt;p&gt;Nicole: Yeah, it&amp;rsquo;s really weird for me to not take cues from you and roll dice when you tell me to, but, you know, we&amp;rsquo;ll see how that goes.&lt;/p&gt;
&lt;p&gt;Andy: I&amp;rsquo;ve got the dice here just in case we need-&lt;/p&gt;
&lt;p&gt;Nicole: Okay, well I&amp;rsquo;ve got mine too, so. Anytime you need me to roll a save, I&amp;rsquo;m ready.&lt;/p&gt;
&lt;p&gt;Andy: Well, let&amp;rsquo;s just roll for initiative to see who interviews first, huh?&lt;/p&gt;
&lt;p&gt;Nicole: Yeah. Okay, let&amp;rsquo;s do that. Rollies, what are you going to roll? Okay. Just a d20. I rolled a two, so.&lt;/p&gt;
&lt;p&gt;Andy: I got an 11.&lt;/p&gt;
&lt;p&gt;Nicole: You go first.&lt;/p&gt;
&lt;h2 id="pkm-history-and-getting-started-with-obsidian"&gt;PKM history and getting started with Obsidian&lt;/h2&gt;
&lt;p&gt;Andy: Okay, all right. I will, so, really, the first question for you is, it&amp;rsquo;s kind of under a sort of batch of questions really, about why Obsidian, but how did you get started with Obsidian?&lt;/p&gt;
&lt;p&gt;Stephan: First, can you give me any like, buffs or stats or anything as my character would?&lt;/p&gt;
&lt;p&gt;Andy: Well, I think you get sort of plus one in design and coding, right? So, yeah.&lt;/p&gt;
&lt;p&gt;Nicole: What class do you think Stephan would be, Andy?&lt;/p&gt;
&lt;p&gt;Andy: Wizard, I reckon. Or an arcanist.&lt;/p&gt;
&lt;p&gt;Nicole: Yeah, I was thinking like-&lt;/p&gt;
&lt;p&gt;Andy: No, I reckon-&lt;/p&gt;
&lt;p&gt;Nicole: Sorcerer?&lt;/p&gt;
&lt;p&gt;Andy: Yeah, or a, you know, someone who kind of makes stuff as well.&lt;/p&gt;
&lt;p&gt;Nicole: Artificer.&lt;/p&gt;
&lt;p&gt;Andy: Artificer, yeah. That&amp;rsquo;s what I reckon he is.&lt;/p&gt;
&lt;p&gt;Stephan: Back in the World of Warcraft days-&lt;/p&gt;
&lt;p&gt;Andy: So high end.&lt;/p&gt;
&lt;p&gt;Stephan: I played a lot of the paladin class. I like the hybrid class, but I think that I also in like, &amp;ldquo;Lord of the Rings&amp;rdquo; really love, you know, Gandalf and those types of guy, Radagast, you know. I&amp;rsquo;m definitely into those types of characters.&lt;/p&gt;
&lt;p&gt;Andy: Someone who can produce something out of nothing. So. So. As you were.&lt;/p&gt;
&lt;p&gt;Stephan: I forgot what your question was.&lt;/p&gt;
&lt;p&gt;Andy: Yes, so we&amp;rsquo;re going to lose half the audience straightaway. So, you know, you were a customer, right? You were a user before you became CEO and pretty quickly I seem to remember seeing your, certainly your theme, I think, probably a couple of other things, seeing you in the Obsidian Discord. So, you know, what was your hook into Obsidian in the first place?&lt;/p&gt;
&lt;p&gt;Stephan: We&amp;rsquo;re getting some comments that your mic is very crackly.&lt;/p&gt;
&lt;p&gt;Andy: We are hearing it. This is weird, isn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;Stephan: Yeah. Yeah, yeah.&lt;/p&gt;
&lt;p&gt;Andy: I had it before.&lt;/p&gt;
&lt;p&gt;Stephan: Some people are hearing it.&lt;/p&gt;
&lt;p&gt;Andy: I don&amp;rsquo;t know what&amp;rsquo;s going on.&lt;/p&gt;
&lt;p&gt;Stephan: But to answer your question, I had been using the, over the past like, 15 or so years, I&amp;rsquo;ve used a lot of different tools to kind of try to solve what for me was mostly a journaling question. So, I wanted to be able to just write kind of, my own diary notes in a tool that, over time I discovered that the Wiki type of format was what I really loved. I kind of fell in love with the wiki link kind of idea. And that idea&amp;rsquo;s been around, I&amp;rsquo;m not sure exactly who invented the notation. I think it was the Wikipedia people in the MediaWiki, the kind of like, double-bracket concept. But once I discovered that, I felt that I only wanted to use like, journaling with that. So the one that I used for a long time was TiddlyWiki, and TiddlyWiki has that same kind of bracket notation, but I found that my personal sensibilities as a user, I really wanted something that felt like, very simple and minimalistic. Like, as you may notice from the kind of like, type of themes and things that I&amp;rsquo;ve made for Obsidian. And when Obsidian came out, I found out about it almost right away, like, in, I guess April, 2020, you know, as right as the pandemic was kicking off. Like, I think a lot of people, I don&amp;rsquo;t know, around that time were staying at home, were exploring different things and I found out about it, I had spent probably a year trying to kind of customize TiddlyWiki to be a little bit more user friendly, and Obsidian, even in like, V1 or whatever, not V1, it was like, V0.001, was already better than what TiddlyWiki was doing for me in terms of, it had the quick switcher, it had the prompts, it had the file Nav in the way that I wanted. It didn&amp;rsquo;t quite look like what I wanted, but it had a lot of the kind of, nice user interface patterns that I was looking for. And so I pretty much started making, I took, I was looking back at my notes, kind of preparing for this conversation, and I pretty much went all in on Obsidian after using it just for a couple days. I imported everything, and started making the minimal theme like, immediately. But I was just making it for myself at first. I wasn&amp;rsquo;t intending to publish it, I just kind of made it to solve my own UI preferences.&lt;/p&gt;
&lt;p&gt;Nicole: So I actually used TiddlyWiki quite a bit. The reason that I used it was a lot of, &amp;lsquo;cause I was a consultant at the time, and a lot of the tools that were out there required, like, they were basically on the cloud so it was a SaaS platform that I&amp;rsquo;d have to log into and not, and those sites weren&amp;rsquo;t always allowed by whatever company I happened to be working for, so that&amp;rsquo;s what I loved about TiddlyWiki, that it could just sit on like, a flash drive and it would work. And that&amp;rsquo;s part of the reason that I started using Obsidian too, is &amp;lsquo;cause it&amp;rsquo;s local.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah. Yeah, and that was something, you know, being able to use it on your computer when you&amp;rsquo;re offline, just having that control. I was, you know, using it on flights, and so that local first idea to me is, I don&amp;rsquo;t know, I just find it much more natural and it allows you to do things so much faster. And because I have experience, you know, I wouldn&amp;rsquo;t say that like, being an engineer is first and foremost what I do, but I do dabble in a lot of different things on the code side and using, I use Sublime Text as my main code editor, but having, being used to using like, a code editor, you just expect everything to be there for you, right away, super fast. Like, even a small delay feels like it gets in the way of my productivity in some cases. So, being in the cloud, it always feels a little slow. And I&amp;rsquo;ve used a lot of those tools in my previous, especially for work purposes like Confluence or Google Docs or those things. And the sluggishness I feel like, really gets in the way of being able to make progress on whatever you&amp;rsquo;re trying to do.&lt;/p&gt;
&lt;p&gt;Andy: Yeah. I mean for me, it was the portability thing. I switched to Markdown for everything, I think, for my blog. Like really, really soon after Gruber kind of released it. And I used to use Notational Velocity, which I think it was probably one of the first ones I know of, of a kind of this idea of a database that just sits on top of a bunch of Markdown files. And then Brett Terpstra was putting together NvALT, and nvUltra, which he&amp;rsquo;s still working on. And you know, I&amp;rsquo;ve been pretty disloyal. I&amp;rsquo;ve used lots and lots of like, every and probably most people, every Markdown out there. And a lot of them are starting to do the kind of wiki thing too, but depending-&lt;/p&gt;
&lt;p&gt;Stephan: And there&amp;rsquo;s so many of them and-&lt;/p&gt;
&lt;p&gt;Andy: Yeah. Yeah.&lt;/p&gt;
&lt;p&gt;Stephan: And I think that is such a great thing that now that the ecosystem of Markdown editing tools is so deep and broad, that I often think that Obsidian, to me what&amp;rsquo;s exciting about this whole kind of area is like, I&amp;rsquo;m very curious about how we can make digital information persist over a long period of time. Like, how will the ideas that we have right now continue to persist for hundreds of years in the future? We&amp;rsquo;ve had books for thousands of years, but we&amp;rsquo;ve only had digital files for, you know, 70 or 80 years. And I like the idea that something like, plain text could still be around for the next few hundred years. And so using something like Markdown is, like, the file in a way is way more important than the apps. Like, Obsidian will eventually become obsolete because technology changes so much. But hopefully, the plain text will continue to live forever.&lt;/p&gt;
&lt;p&gt;Andy: Yeah. I mean a bit like you, I&amp;rsquo;m gonna ask you about Computer Show actually later, but a bit like you, I&amp;rsquo;ve been around for quite a long time and I thought, I&amp;rsquo;ve been in digital stuff for like, 30-something years and I got fed up, but one of the reasons I moved to doing everything, I do all that, still do my invoicing, you know, with Markdown and stuff because I had so many times where like, &amp;ldquo;Oh the app&amp;rsquo;s gone out of, you know, out of production,&amp;rdquo; or &amp;ldquo;I&amp;rsquo;ve got so much of my work still on like, CD-ROMs.&amp;rdquo; I keep an old laptop that&amp;rsquo;s still got a CD-ROM drive, just in order to be able to view that.&lt;/p&gt;
&lt;p&gt;Stephan: Oh, really? You&amp;rsquo;ve got to transfer those.&lt;/p&gt;
&lt;p&gt;Andy: It still runs, kinda like, oh, it&amp;rsquo;s a, no, but yeah, but some of it&amp;rsquo;s like, Director MacroMind, actually, Macromedia Director stuff, that that&amp;rsquo;s the only thing you can play on, so you sort of have to keep the machine for it, too. And I transferred a lot of other stuff, but I had the same thing and I started using Evernote once and then trying getting stuff out. It was horrendous. Had the same thing with Notions, of exporting out of Notion, and it kind of dumps all this other crap in there. And so, you know, yeah, I agree. I think the file format is the kind of winner.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, the file is more important than that.&lt;/p&gt;
&lt;h2 id="dealing-with-competitors"&gt;Dealing with competitors&lt;/h2&gt;
&lt;p&gt;Andy: I&amp;rsquo;m interested though more as CEO, that you&amp;rsquo;ve got, you know, there are a whole lot of, well, I kind of would perhaps a little bit rudely say Obsidian clones kind of popping up. It feels like, in the last, you know, even in the last year there&amp;rsquo;s been a lot of stuff coming up. So, you know, whether you perceive those, is that a challenge for Obsidian? Is Obsidian kind of, just take its own path that each of them have their kind of own flavors? Now is it a good thing, you see it as a good thing?&lt;/p&gt;
&lt;p&gt;Stephan: Well, I see it as a good thing because I am still kind of like, a plain text maximalist. So I think that you have to have a diversity of clients in order for that to kind of last forever. Like, I still think the file is more important than the app. I do think that where it gets dangerous is if there&amp;rsquo;s too many app-specific syntaxes that start to emerge. I think that is kind of dangerous because it reduces interoperability. Like, I think that, you know, Markdown, for all its flaws, and I think a lot of people have frustrations with Markdown, it has kind of stood the test of time, at least for the past, however many, 12, 15 years it&amp;rsquo;s been around, I&amp;rsquo;m not exactly sure, but maybe more at this point, I&amp;rsquo;m getting old. And so, I think that that is one of the biggest challenges that we have with Obsidian is sometimes we wanna do something new. Like, recently we launched the Canvas feature and there isn&amp;rsquo;t a, you know, off-the-shelf kind of canvas type of bio format. So we, you know, created a new one that is, you know, open and the type specification for it is out there, but there&amp;rsquo;s no other client for that file format yet. Hopefully there will be, but I think that that diversity of clients is good because there&amp;rsquo;s a lot of people who have lots of different ideas about how thinking should work, and Obsidian is not particularly dogmatic, like, a big part of, you know, one of the main values that we always think about is extensibility. So how do we make it easy for individual users to customize Obsidian? And also, how do we enable developers to build on top of it? But there&amp;rsquo;s a, I think it&amp;rsquo;s very viable to create a very opinionated Markdown or tool, you know, editing tool that takes a different approach than Obsidian. And I&amp;rsquo;ve seen many people who enjoy using more than one, different one for different parts of their workflow. So yeah, I think it&amp;rsquo;s good. I think we&amp;rsquo;re living through a little bit of like, this Cambrian explosion moment because for some reason right now, in the past couple of years, like, people have realized this a really exciting problem to work on and I think we all learn a lot from each other, so, I see it as a good thing.&lt;/p&gt;
&lt;p&gt;Nicole: So one of the things that you said, &amp;lsquo;cause I trolled through your blog while I was thinking of questions for this. You had a post about how great tools choose to be bad at some things. So, what do you think Obsidian has chosen to be bad at?&lt;/p&gt;
&lt;p&gt;Stephan: Well, I think that design principles are only real design principles if you can take both sides of it and create something compelling. Like, for example, we talked about extensibility. That&amp;rsquo;s one of our, I would say there&amp;rsquo;s like, three major pillars to what Obsidian is trying to be. One of them is around privacy, one of them is around longevity of your notes, and one of them is around extensibility. So those three things are the things that we want to continue being really good at. But you can take the extensibility example as kind of one of our design principles. We wanna make Obsidian super extensible. But you could, I can see why some people would prefer an app that&amp;rsquo;s not at all extensible, that is, you know, completely designed by one small group of people who are trying to make a very cohesive experience. I think one of the big challenges with Obsidian is we&amp;rsquo;re always asking ourselves, &amp;ldquo;What should be a community plugin versus a core plugin?&amp;rdquo; We&amp;rsquo;re always asking ourselves, &amp;ldquo;How can we make community plugins feel more native to the app and more cohesive and intuitive to people? Do they make sense with the rest of the app? Because any developer can basically build anything inside of Obsidian. And so it, I think it is a common point of frustration for some new Obsidian users that they have to download a lot of plugins and some of them feel a little janky. So, you know, Obsidian has chosen to be bad at that, with the trade off that it allows a lot of freedom for people to customize the app. And you can take the same example with, you know, privacy and longevity. Those have their own trade offs as well. Andy, did you wanna say something?&lt;/p&gt;
&lt;p&gt;Andy: I was thinking, you know, it reminded me of what you just said. It was just as you talked about the plugin thing. One of the tricks that Apple did with the iPhone, was to make the phone bit an app. And it sounds just like, a really banal thing, but up until then there were phones, smartphones, were kind of phones with sort of app bits in them, and they were really janky. And I think one of the things also, obviously not having a keyboard, having a touch screen, means that that thing where you get whatever app you&amp;rsquo;re in is completely the app. All right? So, you know, I&amp;rsquo;m in FaceTime, it&amp;rsquo;s completely FaceTime, I&amp;rsquo;m in Obsidian and it&amp;rsquo;s completely Obsidian, the whole phone turns into whatever app you&amp;rsquo;re in. And I feel that, you know, in a way that&amp;rsquo;s what the plugin mechanism can do for Obsidian. At its base it&amp;rsquo;s, you know, it&amp;rsquo;s a text editor that&amp;rsquo;s browsing as a viewer on a set of Markdown files. But you know, as soon as you start putting, particularly some of the more powerful plugins in it, it becomes something completely else. And I think, I find it really kind of powerful that you can switch that stuff on and off. I can see that the, you know, I was sharing my students the other day &amp;lsquo;cause they were talking about design research and how you can use Obsidian, and quite a lot of them use Notion. And I can completely see why they use Notion, right? &amp;lsquo;Cause it&amp;rsquo;s just, you know, zero learning curve for them. Until such time as they want to take that stuff with them, and then they&amp;rsquo;ll find out. And I think some of that stuff&amp;rsquo;s a bit like doing backups. You find out the hard way, right? But I kind of feel like that is a, it&amp;rsquo;s been a smart trade off to make with Obsidian, with the plugins. And I was just wondering at this point-&lt;/p&gt;
&lt;p&gt;Stephan: But it has its downsides. I mean, I think the point, you know, on privacy, the way we think about that is that is having ownership over your files. They&amp;rsquo;re not in somebody else&amp;rsquo;s database. They&amp;rsquo;re on your computer, on your device. You know, if you choose to use the first-party sync, everything&amp;rsquo;s end-to-end encrypted, and so we have this kind of strong pillar around privacy, but it has the trade off that it makes certain things harder for us. For example, people ask us, would we ever see a web client for Obsidian? A like, online, you know, cloud-based Obsidian? And that&amp;rsquo;s a lot harder for us to do because we don&amp;rsquo;t have access to your files. We would have to compromise on that value of encrypting your data and kind of being able to see that information on our side in order to be able to present it back to you. And that makes things really tough. Unless, there&amp;rsquo;s some, we&amp;rsquo;ve thought about this question a lot, but it really is a very hard problem to solve. But for someone who, you know, for whatever scenario they might be in, either can&amp;rsquo;t access a local app because they, you know, there were computer restricts, you know, apps and they can&amp;rsquo;t download Obsidian or they&amp;rsquo;re on a school computer and they have to access it from the school computer, it does present a limitation. But I think strong principles force those kinds of trade-offs where you could take either side and make a compelling and legitimate app. We just, you know, have chosen our own particular set of trade off and that&amp;rsquo;s what that blog post was about. So. So there&amp;rsquo;s other things that Obsidian is bad at as well, like, relating to longevity and like, the choice of using Markdown, for example. It&amp;rsquo;s not the most intuitive to some people. I can come up with a long list of things that Obsidian is bad at, in favor of something that it wants to be really good at. And I think that&amp;rsquo;s a, making trade offs is our job.&lt;/p&gt;
&lt;p&gt;Nicole: Well, one of the things that I hear a lot is that Obsidian is too developer focused, or some people think it&amp;rsquo;s not approachable. And I think it comes back to what we&amp;rsquo;ve been talking about. You do have to make a decision, you do sacrifice a little bit of usability in exchange for flexibility and modularity. My background is in performance engineering, so I care a lot about performance and I love this idea of making the most streamlined possible app, and then just leaving room for extensions so that other people can make their own decisions. I would rather have that, than have an app that has everything baked in and I have really no choice as to what to turn on or off because my use case is going to be different from everybody else&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;Andy: That&amp;rsquo;s Microsoft Word, right?&lt;/p&gt;
&lt;p&gt;Stephan: Yeah.&lt;/p&gt;
&lt;p&gt;Andy: When you just have the sort of, bloat and they get those screenshots, sometimes, of every palette open and there&amp;rsquo;s about this much space, they actually edit some text.&lt;/p&gt;
&lt;p&gt;Nicole: By the way, do you like my shirt?&lt;/p&gt;
&lt;p&gt;Stephan: Oh yes. Classic.&lt;/p&gt;
&lt;p&gt;Nicole: Where&amp;rsquo;s yours?&lt;/p&gt;
&lt;p&gt;Andy: Yeah.&lt;/p&gt;
&lt;p&gt;Nicole: How disappointing.&lt;/p&gt;
&lt;p&gt;Stephan: I know, I haven&amp;rsquo;t, I&amp;rsquo;m such a minimalist-&lt;/p&gt;
&lt;p&gt;Andy: It&amp;rsquo;s a print.&lt;/p&gt;
&lt;p&gt;Stephan: I haven&amp;rsquo;t gotten my Obsidian merch yet, but, yeah, you&amp;rsquo;re looking good over there.&lt;/p&gt;
&lt;p&gt;Andy: So, you know, you&amp;rsquo;ve been contributing to Obsidian, pretty much from the get go, and then you started working with them. What is it with them? It&amp;rsquo;s the, the Licat and Silver, basically-&lt;/p&gt;
&lt;p&gt;Stephan: It&amp;rsquo;s the smart, yeah, the smart team.&lt;/p&gt;
&lt;h2 id="joining-the-obsidian-team"&gt;Joining the Obsidian team&lt;/h2&gt;
&lt;p&gt;Andy: Two-person team. So, you know, how did that, I don&amp;rsquo;t know how much you can reveal, how did that come about and then, and what was the sort of transition? When was there this kind of moment of like, &amp;ldquo;Hey, how about becoming CEO?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, well, it was a very organic process because I, you know, was running a different company at the time when Obsidian first came out. And so, I had, you know, started building minimal theme, a bunch of different small plugins here and there, the Web Clipper. And I was a very vocal in the Discord and forum about some of the things that I thought would be, you know, improvements or bug fixes. And at the time, the Obsidian community was way smaller than it is today. And so, I was often interacting with Licat and Silver, the founders of Obsidian, through the Discord. And just kind of, just talking very organically about here are some things that could be improved, here are some, you know, bugs I found. Can you help me with this feature of Minimal that I am trying to, you know, build into my plugin? Can you give me some feedback on how to do this properly? And so, we started interacting, you know, talking about Obsidian for a couple of years. And, I&amp;rsquo;m not exactly sure at what point it started, and maybe it was around the time that, I&amp;rsquo;m trying to like, actually remember, but I think there was like, a Gems of the Year contest where Minimal won like, the Best Theme category, and I think I started DMing more with Silver and Licat around that time, and just kind of getting to know them just over chat in Discord. And they found out that I had been, you know, running some startups and asked me for some advice on a couple small things here and there. And so we just kind of kept that conversation going, and at some point last year, there was this kind of idea that Obsidian wanted to kinda reach the 1.0 release. And the 1.0 release, I mean I think it, you know, it&amp;rsquo;s funny that it, it was really a milestone moment, because we, that&amp;rsquo;s when I started becoming involved in the project and they asked me to basically create the new default theme. And so I was working with them part-time, kind of taking a lot of my experience on Minimal and bringing that into the core app. But also, they were asking me about some of the things that I felt were on my like, top priority list of small details that we felt were still kind of embarrassing or like, wanted to really get nailed down before we could really feel like we could call it a 1.0. And, that&amp;rsquo;s when I started working much more closely with them, as well as Liam, who is now a full-time part of the team. You might know Liam from the calendar plugin. He&amp;rsquo;s amazing. We have basically five people full-time. Joethei, you might have seen around the community who helps a lot with plugin reviews and the developer ecosystem, and then a few other folks who&amp;rsquo;ve been helping us part-time, like MG Meyers, who you might know from the Kanban plugin and style settings is working on, has been working on Canvas and kind of like, led the Canvas effort. And so, the more conversations kept going on with this project, I just realized it was so much fun and I love Obsidian so much. Like I just, I really want it to continue to be an important tool in my life, in a very selfish way, but also I think that Shida and Erica, Licat and Silver, are such mature like, entrepreneurs, they&amp;rsquo;re quite a bit younger than me. They make me feel old all the time. But it&amp;rsquo;s a great exchange of knowledge and yeah, so we started discussing this idea and they were on board. I think it&amp;rsquo;s a very, we have very complimentary skills. I&amp;rsquo;m really excited about, like, Licat&amp;rsquo;s one of the most incredible engineers that I&amp;rsquo;ve ever worked with. I&amp;rsquo;ve worked with a lot of like, amazing engineers throughout my life and I have like, so much respect for him. He&amp;rsquo;s just super, super impressive and continues to be like, they&amp;rsquo;re both gonna continue to be involved for the foreseeable future. And Erica has just an incredible mind for, you know, product and how to think about what users really care about. And so, and has been, I think, the person who&amp;rsquo;s, in a way, influenced why Obsidian has such an amazing community more than anybody else. Just kind of from the beginning, making that an important part of Obsidian, I think is a lot of credit to Erica. So, seeing, like, getting to know them just made me realize like, there&amp;rsquo;s nothing that I would rather do than help that community continue to grow, help make sure that Obsidian has the, kind of like, structure that it can last for a long time, kind of going back to that principle of longevity that matters at the app level. How do we actually make that viable at the company level so that the kind of, product and the company can be aligned? So yeah, that&amp;rsquo;s why I kind of believe that-&lt;/p&gt;
&lt;p&gt;Nicole: I also just wanted to call out-&lt;/p&gt;
&lt;p&gt;Stephan: Very organic.&lt;/p&gt;
&lt;p&gt;Nicole There&amp;rsquo;s some people who are asking-&lt;/p&gt;
&lt;p&gt;Stephan: Oh, where do we get the merchandise?&lt;/p&gt;
&lt;p&gt;Nicole: Where do we get the merch? By the way, I bought this. And it is here.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah.&lt;/p&gt;
&lt;p&gt;Nicole: Just so everybody can see, &amp;lsquo;cause there&amp;rsquo;s some awesome things on there.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, I think it&amp;rsquo;s-&lt;/p&gt;
&lt;p&gt;Nicole: I want I wanted to ask you-&lt;/p&gt;
&lt;p&gt;Stephan: Yeah.&lt;/p&gt;
&lt;h2 id="building-intentional-tools-for-tool-builders"&gt;Building intentional tools for tool builders&lt;/h2&gt;
&lt;p&gt;Nicole: Yeah, it is. So I wanted to also ask you, earlier when I was introducing you, I said that you have worked in similar spaces, which I realize now is a bit odd because the companies that you had worked on before aren&amp;rsquo;t note-taking apps. But what I meant by that, is actually I&amp;rsquo;m seeing a theme in what you&amp;rsquo;ve worked on and it&amp;rsquo;s all about creating things that are minimal, intentional, well-made. And I think like, in your previous company, Lumi, you were talking about packaging, and making that a little bit more transparent and intentional as well. I know you&amp;rsquo;re also an industrial designer, or you claim not to be one anymore, but that&amp;rsquo;s also something that permeates your work there as well, doesn&amp;rsquo;t it?&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, I&amp;rsquo;m a generalist. I like to dabble in a lot of different things. And so, it has taken me in a lot of different directions, but I think the common theme is I&amp;rsquo;ve always been interested in making tools. So everything basically in my professional career has been a tool of some kind. So in the case of Lumi, it was a tool, it was actually two different tools. One was for factories, to help manufacturers kind of bring their capabilities online, and a tool that helped businesses who need to collaborate with manufacturers, find the right manufacturers and work with them. And so, I like building tools that kind of empower individuals to do something that they couldn&amp;rsquo;t do before. And so Obsidian definitely fits into that because I feel like, I mean, in my own personal life, it&amp;rsquo;s been so rewarding and exciting to use Obsidian. Like, I feel like, my thought process is clear and more reliable when I&amp;rsquo;m using Obsidian. And I feel like, that&amp;rsquo;s such an exciting superpower that I have that I want to help more people get that feeling, too. So yeah, like, throughout my life basically like, that theme just keeps coming back of like, making tools that help other people do whatever they&amp;rsquo;re trying to do.&lt;/p&gt;
&lt;p&gt;Nicole: And it&amp;rsquo;s also helping other people make other things, right? &amp;lsquo;Cause like, you know, you&amp;rsquo;ve also worked on things like, that kind of pare down what is out there, because there&amp;rsquo;s an information overload that&amp;rsquo;s out there and I know you&amp;rsquo;ve made like, Tidy, which kind of streamlines what we even see on the page. What do you think, is there anything in Obsidian, &amp;lsquo;cause we&amp;rsquo;ve talked about things that it&amp;rsquo;s bad at. Are there any big features that you&amp;rsquo;d like to introduce to it, that don&amp;rsquo;t detract from, that don&amp;rsquo;t make it like this bloated bit of software but still are along the same lines of being intentional and helping people?&lt;/p&gt;
&lt;p&gt;Stephan: Definitely. I think that the area we want to keep working on is the primitives. Like, what are the basic things that you can use that you can build on top of? So, we have a public roadmap that&amp;rsquo;s not always the most up to date, but one of the big things we&amp;rsquo;re working on right now is around metadata. So, a lot of, I&amp;rsquo;m a huge fan in my personal use, of DataView is one of my favorite plugins for Obsidian, and I use it for everything. And kind of asking ourselves like, &amp;ldquo;What can we do that would enable the user and developer ecosystem of Obsidian to leverage metadata even more?&amp;rdquo; So, you know, you can, there&amp;rsquo;s a couple different ways that you can add metadata to your notes with Obsidian. One of them is through YAML in the frontmatter, and one of them is through DataView has these like, custom fields. So that&amp;rsquo;s an area that, we want to, like, the author of DataView had to create this new notation with the double colon. You know, you put a key in a value and separate them with a double colon, and that notation was essentially invented by the author of DataView because it&amp;rsquo;s so painful to write YAML. And so, what can we do to clean that up a little bit and make metadata feel more like a first-class citizen from the user&amp;rsquo;s perspective, but also enable more developers to build on top of that. Yeah, API docs and developer portal. I&amp;rsquo;m looking, I can&amp;rsquo;t even remember what we have on here. Tasks. There&amp;rsquo;s a few other things that we have up our sleeve at the moment, that I&amp;rsquo;ll be excited to share in a little bit. Talking about the roadmap-&lt;/p&gt;
&lt;p&gt;Nicole: A few questions, Stephan-&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, go ahead.&lt;/p&gt;
&lt;p&gt;Nicole: You mentioned DataView. I know that he&amp;rsquo;s working on DataCore, right? Is that going to be something that&amp;rsquo;s going to be built into Obsidian or is it still going to be a community plugin? Honestly, I would never use Obsidian without DataView.&lt;/p&gt;
&lt;p&gt;Stephan: You know, I haven&amp;rsquo;t really, I&amp;rsquo;m not exactly sure what the goals of DataCore are. I&amp;rsquo;m not super informed about what he&amp;rsquo;s trying to do with that. I think that our job is always to find the right balance between what feels like a core plugin, what feels like it should be part of the community. And so, I think that long term we do wanna have good ways for people to add metadata to their notes and perhaps view kind of an output of that in some way. I think that&amp;rsquo;s kind of a long-term project, but in the short term, the metadata improvements is really about making it a lot easier to add metadata to your notes and then hopefully that makes things like DataView easier to use. But maybe long term will consider some more ways that people can like, look and view their data, or the metadata from their notes. I do found that DataView, one challenge with it is it is pretty nerdy. Like, it does require, it has a syntax that&amp;rsquo;s a little bit, you know, like, SQL and I think that that&amp;rsquo;s not the most user friendly. So we&amp;rsquo;ve seen quite a few plugins pop up, like DB Folder is one that&amp;rsquo;s kind of interesting that makes it a little bit more WYSIWYG. And that&amp;rsquo;s one of the big benefits that we have as a community is that people can build plugins that optimize for different types of users. People who love writing SQL, they&amp;rsquo;re gonna love using DataView, but people who prefer something more WYSIWYG are gonna prefer a different type of UI. And we can be patient in our approach to what we actually wanna build into the core because we could just kind of watch what people like, what people make, and decide later down the road what we wanna build ourselves.&lt;/p&gt;
&lt;h2 id="growth-of-obsidian-as-a-team-and-company"&gt;Growth of Obsidian as a team and company&lt;/h2&gt;
&lt;p&gt;Andy: Do you think there are, I mean are there any plans to then grow the team? Or is partly what makes it special, the fact that you are a very small team?&lt;/p&gt;
&lt;p&gt;Stephan: I think that for now we wanna stay really small. We wanna be as small as we can be because, you know, one of the other things that&amp;rsquo;s really important that made me want to join Obsidian, is that from an early stage, Shida and Erica decided that they didn&amp;rsquo;t wanna bring on investors, like, venture capital investors. And I have, throughout my career, worked and built companies that have used every single funding model under the sun. Like, my first company was one of the very first Kickstarter campaigns ever, back in 2009. I&amp;rsquo;ve gone down the venture capital route, I&amp;rsquo;ve done bootstrapping, like, I&amp;rsquo;ve tried it all. And I think when it comes to the goals of Obsidian that we&amp;rsquo;ve been talking about, like, longevity in particular comes to mind, but also privacy and extensibility, I find that is not very compatible with the VC route. And, you know, if you just kind of survey the ecosystem, you&amp;rsquo;ll find that actually, almost all of the kind of big PKM apps, if you wanna call them that, have raised a lot of money, like, millions of dollars from, or hundreds of millions of dollars, even. And the problem with that is that, I think it&amp;rsquo;s misaligning the incentives in the long term for, you know, the user and how they want to kind of, store their notes. Like, basically it incentivizes certain behaviors that are kind of against our principles. And so for that reason, we&amp;rsquo;re trying to build very intentionally and also work through the extensibility part of our like, principle to enable the community to customize things more. Like, we don&amp;rsquo;t feel like it&amp;rsquo;s necessarily our job to make this like, huge app that has every single feature. We like seeing how the community kind of extends Obsidian in their own ways. So I would say that growing the team, it will be more by necessity than by a desire to like, try to do everything ourselves. We&amp;rsquo;re getting to a point now where, I would guess, we don&amp;rsquo;t actually even know how many Obsidian users there are because we&amp;rsquo;re so focused on privacy, we don&amp;rsquo;t have analytics, we just like, don&amp;rsquo;t know. But we can guess based on a few different like, things like, how many people downloaded the app bundle, that there&amp;rsquo;s probably close to a million users of Obsidian and only basically five core members of the team. And eventually, from a support standpoint are things, things might start to break and we might need to hire people to help on that front. But we&amp;rsquo;re trying to stay small if we can.&lt;/p&gt;
&lt;p&gt;Andy: Yeah. I think you&amp;rsquo;ve been very diplomatic about the VC thing. I mean, in general it&amp;rsquo;s, you know, you&amp;rsquo;ve got, in my coaching practice, and I coach a lot of design leaders who are kind of suffering in startups or scale ups because of this constant pressure to scale, because this constant pressure for just more and you know, I want a 10 X on my, you know, investors want 10 X return on their investment in some stupid amount of time, things like that. And it definitely leads to that, you know, what Cory, Dr. Al calls sort of, an end certification, you know, this thing where then there&amp;rsquo;s a choke point and we have everyone&amp;rsquo;s data on our server and they have to use app and then you just start, it becomes a sort of process of trying to extract value. And I-&lt;/p&gt;
&lt;p&gt;Stephan: Well, I&amp;rsquo;ve touched on the thing-&lt;/p&gt;
&lt;p&gt;Andy: Oh, go on, go on.&lt;/p&gt;
&lt;p&gt;Stephan: To defend VC, I will say there&amp;rsquo;s some businesses where, it kind of is necessary because especially, we&amp;rsquo;re in a privileged position, building software, because software has no cost to us. But there&amp;rsquo;s some companies, you know, that have to produce a physical product in the world-&lt;/p&gt;
&lt;p&gt;Andy: Yeah, that&amp;rsquo;s true.&lt;/p&gt;
&lt;p&gt;Stephan:: And they have to buy the materials and put in orders and so they need to raise money somehow, and VC is one of those paths. You can get loans, like, there&amp;rsquo;s different ways. So I think it, I&amp;rsquo;m not like, I just have a kind of, like, a more zen point of view on that where like, I understand why a lot of companies go that direction and it makes sense. I think in the case of what we&amp;rsquo;re trying to build specifically, it&amp;rsquo;s a bad fit. But it&amp;rsquo;s not necessarily a bad fit for everything.&lt;/p&gt;
&lt;p&gt;Nicole: So-&lt;/p&gt;
&lt;p&gt;Andy: You mentioned anything just now which is, oh sorry, Nicole. What were you gonna say?&lt;/p&gt;
&lt;h2 id="sharing-obsidian-sync-obsidian-publish"&gt;Sharing, Obsidian Sync, Obsidian Publish&lt;/h2&gt;
&lt;p&gt;Nicole: I was gonna say I&amp;rsquo;d like to go back to, and just quickly, to what Obsidian is bad at. And you know, Stephan, I love Obsidian. It is, I&amp;rsquo;m all for it. I am possibly the biggest fan. I think one thing that Obsidian is bad at that I really would love to see improved, is sharing. Because I think that is the thing that stops most people from using it, because, you know, using it on your own in an isolated way is one thing. It excels at that. But anytime that you have other people that you wanna do that with, as an example, Andy and I play D&amp;amp;D. Okay, this not a work thing, right? But it is a recreational use, and honestly, it takes up a lot of, my usage of Obsidian is role playing games. And in that group, there are four of us, three and a half, who use Obsidian. We can&amp;rsquo;t share our notes. We can&amp;rsquo;t have like, one repository for all of us to collaborate on. So we have like, individual notes, and yes, we could use something like Dropbox to share those notes, but then Andy for example, can&amp;rsquo;t, or wouldn&amp;rsquo;t want to share all of his notes with us. Maybe some of them he would. So I would love to see like, a little bit more permissions around sharing.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, I think sharing is a big, like, it&amp;rsquo;s a challenge because there&amp;rsquo;s like, three or four different use cases nested under sharing that are quite different from one another. So, we have published, so we&amp;rsquo;re doing a lot of work right now, actually, on making some publish improvements. There&amp;rsquo;s a big batch of publish improvements that just went live like, a week or two ago, and that&amp;rsquo;s more about sharing to the external world, an entire vault, and we wanna keep improving that. Then there is sync, which is like, has this concept called Shared Vaults. I don&amp;rsquo;t know if you&amp;rsquo;ve tried that out, but Sync Shared Vaults is actually what we use internally on the Obsidian team. So everyone who&amp;rsquo;s like, you know, between the five of us, are working on projects, we keep our notes in one shared vault. Then there&amp;rsquo;s also the idea of, &amp;ldquo;Hey, I&amp;rsquo;m writing this note, I just wanna send a link to someone so that they can view it.&amp;rdquo; They don&amp;rsquo;t have Obsidian or they don&amp;rsquo;t know, you know, I don&amp;rsquo;t wanna like, put them through the process of having to, you know, learn everything about Obsidian just to read this one note. And that note might be, you know, semi-private, like, it&amp;rsquo;s like, something where it&amp;rsquo;s not like, a published use case where you want the world to see it, you just want this one person to see it. And then there&amp;rsquo;s a collaboration use case where like, Google Docs or Notion makes it really easy for a few people to be like, collaboratively editing something, even if they don&amp;rsquo;t, or have Obsidian, for example. So like, those are all kind of different problems to solve in different ways, and I do think that we want to find ways to solve those problems, figuring out what the right order, that&amp;rsquo;s another challenge about being a small team is like, what do we work on now versus later? But I think all of them are problems that we would like to solve, you know, over the kind of medium to long term for sure. We&amp;rsquo;re very aware of that.&lt;/p&gt;
&lt;p&gt;Andy: It feels like there&amp;rsquo;s a bit of a thread here, though, as well, when you&amp;rsquo;ve talked about, you know, &amp;lsquo;cause obviously the sharing bit brings up the privacy issue that you talked about before.&lt;/p&gt;
&lt;p&gt;Stephan: Correct. Yeah.&lt;/p&gt;
&lt;p&gt;Andy: And it also links to the, is there a browser-based version of Obsidian? You know, because one of the ways of obviously, easily sharing and collaborating on a document would be to have kind of a browser-based editor, even if it was just for that one document. And it&amp;rsquo;s almost like, you need a kind of, instead of a separate vault, a sort of enclave in your existing vault that you can say, &amp;ldquo;Oh this the shareable bit and all the rest of it, you know, remains encrypted,&amp;rdquo; let&amp;rsquo;s say, I don&amp;rsquo;t know if the encryption thing is an issue, but you know, at some point once you share it, you have to not do that, right.&lt;/p&gt;
&lt;p&gt;Nicole: So I think-&lt;/p&gt;
&lt;p&gt;Andy: And that may be at the beginning of the browser-based version.&lt;/p&gt;
&lt;p&gt;Nicole: I think my problem is that I am able to do those use cases, but I use separate tools for each of them. I would really love to streamline in this area. Like you were talking about, being able to share a link. I use Etherpad with that, but it&amp;rsquo;s not the best. It works, though. And then when you talk about using Sync, I also subscribe to Sync, but that also requires other people to have Sync. So for those people who don&amp;rsquo;t use Obsidian enough to warrant Sync, I use Dropbox. And then at work, because we have all of our internal docs on GitHub repos, I use GitHub to bring my Obsidian notes and share them. And that brings a lot of things but also brings like, comments and being able to roll back changes, and, you know, handle merge conflicts, and that&amp;rsquo;s not something that Sync does as well for now.&lt;/p&gt;
&lt;p&gt;Stephan: I totally agree. Yeah, I think that those are things that we have to eventually solve. And I do, going back to what feels like it should be a core thing and what feels like it should be a community thing, I think that sharing is something that belongs in core, or at least core needs to have good sharing mechanisms for all of the different use cases. Publishing, collaboration, single note sharing, is just a matter of, how do we do that? In what order do we build those features? And can we build them in a way that is consistent with our principles?&lt;/p&gt;
&lt;h2 id="task-management-in-obsidian"&gt;Task management in Obsidian&lt;/h2&gt;
&lt;p&gt;Nicole: Can we talk about task management? &amp;lsquo;Cause that was something that was on the roadmap. So is there anything you can share with us on that front?&lt;/p&gt;
&lt;p&gt;Stephan: Our goal around that one is fairly conservative, I would say. It&amp;rsquo;s not gonna be a major, you know, complete revamp to everything. It&amp;rsquo;s more about, how do we make tasks queriable in a better way, like, and also adding better date supports? So we&amp;rsquo;ve been thinking a lot about how do due dates work with tasks? So right now, there&amp;rsquo;s ways that you can do that with community plugins, but we wanna figure out, should there be a core way of dealing with due dates? Again, thinking about the API first and how that might, you know, enable developers to come up with some new experiences on top of that. But I would say that that project&amp;rsquo;s been a little bit on the back burner for us because, we had some other ideas that we wanted to prioritize first, like Canvas, and some of the things that we&amp;rsquo;re working on right now, like metadata and publish improvements, for example.&lt;/p&gt;
&lt;p&gt;Nicole: It does occur to me that a lot of these things, like task management, could be helped if you share a log something like DataCorp or DataView. &amp;lsquo;Cause the functionality is there, you just need to make it look pretty, but you&amp;rsquo;re good at that.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, I mean the challenge there is just again, like, you know, two, three people building things. We only have so much bandwidth and kind of finding that happy medium between, we wanna make sure that we&amp;rsquo;re, you know, releasing features at a good pace. But every time we add new capabilities, we also add, you know, add to the surface area of potential bugs of potential issues that might come up or edge cases with certain plugins, we increase the number of feature requests, like, when we add something like Canvas, then we get a whole bunch of new feature requests from people who are like, &amp;ldquo;Oh, Canvas is great, but it doesn&amp;rsquo;t do X, Y or Z.&amp;rdquo; So that, I don&amp;rsquo;t know that anyone has ever solved that problem. It&amp;rsquo;s just kind of a problem of building software in the world. But, that is probably the biggest challenge that we deal with as a team is like, how to find the right balance of what to build now, how comprehensive do we want this feature to be versus, you know, starting small and kind of building on top of it. But trail locking a plugin, we tend to, we&amp;rsquo;ve done it a couple times, and when we do, we tend to rewrite it from scratch pretty much. And so that&amp;rsquo;s a pretty big effort. Like, rewriting something like DataView or Data, I haven&amp;rsquo;t looked at the code for DataCore. It&amp;rsquo;s not a small task. It tends to be a pretty big thing.&lt;/p&gt;
&lt;h2 id="artificial-intelligence-in-obsidian"&gt;Artificial intelligence in Obsidian&lt;/h2&gt;
&lt;p&gt;Nicole: Another question here by Imaginationscene and another one by another user called Remy, &amp;ldquo;What about AI? Or integrating something like ChatGPT?&amp;rdquo; Is that something that&amp;rsquo;s on your radar?&lt;/p&gt;
&lt;p&gt;Stephan: I&amp;rsquo;ve been thinking a lot about this. I think that right now, so this kind of like, goes back to the benefit of the extensibility of Obsidian. I&amp;rsquo;m pretty sure that Obsidian was the first app that had ChatGPT or like GPT-3 integrated into it, because someone in the community built a plugin for that called Text Generator. And now I think there&amp;rsquo;s three or four plug-ins out there that connect to the Open AI API. So, the cool thing for Obsidian is that because it&amp;rsquo;s so easy to build plug-ins, people tend to go really like, we both have the ability to be very fast and very slow, so, the community can go and build a plugin that solves that use case. And I think that they&amp;rsquo;re quite good, actually. I&amp;rsquo;ve used Text Generator a bunch, but we can also be patient about what&amp;rsquo;s the right way of building it for Obsidian. And I think that there&amp;rsquo;s a lot of companies right now rushing into adding GPT to everything. My personal preference when it comes to this, is I would like for it to all be local first, completely private. I don&amp;rsquo;t wanna send, you know, data that I don&amp;rsquo;t, like, I wanna have complete control over any data that is being sent. You know, there&amp;rsquo;s this concept of training and inference in, we&amp;rsquo;re getting like, right into the weeds of how AI works, but I would like, someday, to be able to have maybe a plugin, whether it&amp;rsquo;s a core plugin or a community plugin, that can do some training on your vault and kind of learn from your vault and be able to do the inference locally on your computer, so that it completely aligns with the principles of privacy and local first that Obsidian is known for. The challenge with that right now is that that&amp;rsquo;s quite intensive on the graphics card, and it&amp;rsquo;s quite complicated to set up locally for users, and we&amp;rsquo;re still kind of waiting to see whether a company like Stability, that they made stable diffusion and is an open-source platform for like, image generation, there&amp;rsquo;s been talks about them releasing a language model that would be open source. So we&amp;rsquo;re kind of waiting for all of those things to come together before we make a decision. We would, I think we would prefer to build something that kind of, is aligned with our principles, but in the meantime, there&amp;rsquo;s a bunch of plug-ins that you can use that solve that use case and I think they do quite a good job with them, actually.&lt;/p&gt;
&lt;p&gt;Nicole: Stephan, have you heard of &lt;a href="https://napkin.one/?via=nicole"&gt;Napkin&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;Stephan: No, I don&amp;rsquo;t know Napkin. Tell me more.&lt;/p&gt;
&lt;p&gt;Nicole: It&amp;rsquo;s, yeah, it&amp;rsquo;s an awesome service that I recently have been using. And it uses AI in a really interesting way, because I think there&amp;rsquo;s a lot of focus on using AI for like, generating blocks of text or outlines or images. But what Napkin does is it looks at your vault, well, it&amp;rsquo;s not a vault because it doesn&amp;rsquo;t do it for Obsidian, it looks at your Readwise highlights, and it uses AI to tag them intelligently. So, it has this interface where you can determine, you can click on like, a thought or a highlight, and it shows you intelligently linked other highlights that you already have, that you may not have put together. And sometimes they&amp;rsquo;re like, they&amp;rsquo;re not even using the same keyword or they&amp;rsquo;re not tagged the same way, but somehow it still figures it out. That kind of thing would be invaluable for Obsidian because there&amp;rsquo;s a lot to be said for manually linking things, but getting some help would be nice.&lt;/p&gt;
&lt;p&gt;Stephan: I think that sounds awesome. I&amp;rsquo;m seeing a lot of comments here in the chat of like, people who are suggesting some different ideas and some plugins that I&amp;rsquo;m not even aware of that are already doing some more local AI stuff. I think that&amp;rsquo;s a, I think what&amp;rsquo;s amazing about the Obsidian community is we have people kind of, at every level of the spectrum of nerdiness. Like, we have like, people who are some of the most advanced engineers that I&amp;rsquo;ve ever talked to are developing their own custom plugins, and then we have people who are complete beginners and novices, not engineers, people who are just learning about note taking. We have a lot of young students in the community. And so, I like that we have the ability to have those people who are like, all the way at the deepest end of like, understanding all of those principles, able to start working on, you know, potential plugins and extensions that could do something like that. And that can be kind of a breeding ground where we can learn, what do people actually want out of that type of tool? But I do think that if we want to continue to stay true to these kind of principles of being local and private, there&amp;rsquo;s gonna be some constraints that we have to deal with that are actual like, performance constraints and technical constraints, that may mean Obsidian will be a little slower to get to those features than apps that are completely cloud-based where they can upload that to a server and do that, you know, somewhere else.&lt;/p&gt;
&lt;p&gt;Andy: Hm. Yeah.&lt;/p&gt;
&lt;p&gt;Stephan: So I think it is a very tricky challenge for us to try to solve that right away. I think we&amp;rsquo;re gonna tend to watch what plugin developers do, and then start to think about that in a year or two. &amp;lsquo;Cause right now there&amp;rsquo;s, I mean, literally every month there&amp;rsquo;s something new going on with AI and the open source packages that are going on. So, we&amp;rsquo;re maybe a little less cutting edge than the plugin ecosystem can be, if that makes sense, on the core side it.&lt;/p&gt;
&lt;p&gt;Andy: It feels like you could get dependent on something very quickly there as well, and just kind get really kind of bogged down. And then, you know, a couple of people have said keep that as a plugin, it&amp;rsquo;s much better that way.&lt;/p&gt;
&lt;h2 id="accessibility-in-obsidian"&gt;Accessibility in Obsidian&lt;/h2&gt;
&lt;p&gt;Andy: There was a question, it was from Daniel Gartmann further up yeah, I don&amp;rsquo;t use a screen reader, but I think, you know, something that would need to be much more sort of, core fundamentals as obviously accessibility. I don&amp;rsquo;t know, maybe Daniel can say how, I don&amp;rsquo;t know how accessible Obsidian is to use with screen read, but read is-&lt;/p&gt;
&lt;p&gt;Stephan: We&amp;rsquo;ve done a lot of work in that area with, yeah, I would be curious to hear a little bit more detail from Daniel about what they&amp;rsquo;re looking for, but yeah, Obsidian is already compatible with screen readers. We have done a lot of work on that side, but if there&amp;rsquo;s things that are missing in that respect, I would say let us know in the community, on the forum or on Discord. We&amp;rsquo;re definitely, I agree that building that into core is a must. I think that&amp;rsquo;s super important. We&amp;rsquo;ve added a lot of new customization features over the past year, so I&amp;rsquo;m actually kind of curious to see if there are themes that get developed that are focused on different use cases. It&amp;rsquo;s much easier today to design themes than it was a year ago in my, one of my, that was one of my biggest contributions over the past year from a code standpoint, was rewriting the way that themes can be built. And so that means that you can very easily now create like, very high-contrast themes. Themes with different font sizes, different fonts that might help people who have, you know, who need help on the vision side. But then there&amp;rsquo;s other things like, ARIA labels and other kind of web technologies that we&amp;rsquo;re able to incorporate that make it easier with screen readers for sure.&lt;/p&gt;
&lt;h2 id="tags-vs-links"&gt;Tags vs Links&lt;/h2&gt;
&lt;p&gt;Nicole: Okay, we have a question that is a little bit controversial. It&amp;rsquo;s from Germ Germain, whom I actually, by chance, met a few weeks ago in person. He says, &amp;ldquo;What is his opinion (Well, I&amp;rsquo;m gonna ask both of you) about tags versus links?&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Stephan: In my personal use? Or, how do you wanna clarify that?&lt;/p&gt;
&lt;p&gt;Nicole: Yeah, in your personal use. Which one do you use more?&lt;/p&gt;
&lt;p&gt;Stephan: So I tend to use links more than tags, personally. So, I do have quite a few tags, but I tend to use links because I like to see everything in the, all the relationships in my backlinks, I guess, is how I would say it. And I like that links, for example, like, I&amp;rsquo;ll have a top-level categories for books that I&amp;rsquo;ve read. And so I just have a category called books. And I link to it. In my template, I still use tags. I don&amp;rsquo;t actually really know why. I just feel like I should have it there for future need.&lt;/p&gt;
&lt;p&gt;Andy: Future proofing.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, for future proofing. Like, if I ever create a note about a book, it has both a tag for book and a link to the category books. So that redundancy helps sometimes if I&amp;rsquo;m creating like a DataView list or something I have access to both of those different ways of filtering down. But I tend to prefer links. I think links have a lot, are more powerful and cross over more different things. I think tags, where I use them the most, is for kind of very narrow meta segmentation of a very specific thing, where there&amp;rsquo;s only like, a very narrow subset of notes that needs to be grouped in a way that a link wouldn&amp;rsquo;t make sense, or I don&amp;rsquo;t really wanna have a page for that concept. Am I making sense?&lt;/p&gt;
&lt;p&gt;Andy: Mm hm. I&amp;rsquo;m still here.&lt;/p&gt;
&lt;p&gt;Stephan: But also, it&amp;rsquo;s not-&lt;/p&gt;
&lt;p&gt;Andy: I&amp;rsquo;m still a fan of the folders, you know.&lt;/p&gt;
&lt;p&gt;Stephan: Oh, I hear you.&lt;/p&gt;
&lt;p&gt;Nicole: No. Do you really?&lt;/p&gt;
&lt;p&gt;Andy: Oh, half the people have gone, &amp;ldquo;Oh god!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Stephan: Yeah. I&amp;rsquo;m very-&lt;/p&gt;
&lt;p&gt;Nicole: What are you even doing here?&lt;/p&gt;
&lt;p&gt;Stephan: In my personal organization-&lt;/p&gt;
&lt;p&gt;Nicole: No, I&amp;rsquo;m joking, I&amp;rsquo;m joking.&lt;/p&gt;
&lt;p&gt;Andy: I can explain.&lt;/p&gt;
&lt;p&gt;Stephan: This is why I feel like Obsidian being not dogmatic about this is great, because people think in different ways. Like, I love that people can use folders or tags or links or all of them. Do whatever works for you. If it works for you, that&amp;rsquo;s great.&lt;/p&gt;
&lt;p&gt;Andy: I think partly goes back to what you were saying right at the beginning, which is, you know, where the file format is the thing, right? And so I use several other things on that group of files that I have there. And whilst, you know, it&amp;rsquo;s great if you can search the tags or you can do whatever you want with the tags or links in Obsidian when you are trying to find a file, to kind of pull into something. I use Marked, Brett Terpstra&amp;rsquo;s Marked quite a lot for Output. It&amp;rsquo;s a massive pain in the ass. Well, I mean, I use search a lot anyway on the Finder, but, you know, I much prefer to have some organization that works across other things that aren&amp;rsquo;t gonna handle tags. So that&amp;rsquo;s why.&lt;/p&gt;
&lt;p&gt;Stephan: Well, to be fair, in our team vault, we do use folders for our like, internal grouping. But I think that that use case is very different than my personal notes.&lt;/p&gt;
&lt;p&gt;Andy: Yeah, yeah.&lt;/p&gt;
&lt;p&gt;Nicole: We have an answer from Daniel, actually. He says he has issues both for Windows and iOS screen reader support.&lt;/p&gt;
&lt;p&gt;Stephan: Okay, well let&amp;rsquo;s-&lt;/p&gt;
&lt;p&gt;Nicole: &amp;ldquo;I love the potential that Obsidian has for me as a blind person who&amp;rsquo;s already using notes in a text-based format.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Stephan: Jump into Discord and let&amp;rsquo;s talk about it.&lt;/p&gt;
&lt;p&gt;Andy: I don&amp;rsquo;t know how accessible Discord is, by the way.&lt;/p&gt;
&lt;p&gt;Stephan: That&amp;rsquo;s a great question.&lt;/p&gt;
&lt;p&gt;Andy: Because we might be saying jump into something that&amp;rsquo;s really terrible for you to use on Discord. So, yeah, on the forum, I&amp;rsquo;m guessing the forum-&lt;/p&gt;
&lt;p&gt;Nicole: The forum.&lt;/p&gt;
&lt;p&gt;Andy: It runs on Discourse, doesn&amp;rsquo;t it, of the forum?&lt;/p&gt;
&lt;p&gt;Stephan: Correct, yeah.&lt;/p&gt;
&lt;p&gt;Andy: I would imagine it&amp;rsquo;s kinda more accessible.&lt;/p&gt;
&lt;p&gt;Stephan: If you go to obsidian.md/community, you&amp;rsquo;ll see the links there and send us your feedback. Or if you wanna just email &lt;a href="mailto:support@obsidian.md"&gt;support@obsidian.md&lt;/a&gt; we&amp;rsquo;ll take a look. But the best is definitely through the community and we&amp;rsquo;ll definitely take a look, yeah.&lt;/p&gt;
&lt;p&gt;Andy: Tell us who does that email go to? Of the three of you?&lt;/p&gt;
&lt;p&gt;Stephan: Well, right now it&amp;rsquo;s like, a kind of a shared thing where you kind of look in there, but I think that most people who use the support inbox are for kind of like, our enterprise users. We prefer to use the community as the main place because there&amp;rsquo;s more transparency around that and like, other people can jump in and add their own kind of experiences with whatever the feature request or bug might be. So in general, that&amp;rsquo;s why we kind of direct people towards the community if they wanna provide some feature requests or bug fix requests.&lt;/p&gt;
&lt;p&gt;Andy: I was kind of hoping it triggered like, a kind of a bat signal that projected us an Obsidian sort of into the sky, the Obsidian crystal into the sky, and you all kinda come running.&lt;/p&gt;
&lt;p&gt;Stephan: Yeah, unfortunately, it&amp;rsquo;s just one of those other things that, as we scale up, we have to find good ways of parsing what the community is looking for and how we can fit it into our roadmap.&lt;/p&gt;
&lt;h2 id="message-to-the-community"&gt;Message to the community&lt;/h2&gt;
&lt;p&gt;Nicole: Well, I don&amp;rsquo;t, I would love to have you stay, both of you, stay on for longer. You&amp;rsquo;re both welcome back, but I also wanna be mindful of your time. So thank you for coming on to talk about the future of Obsidian, Stephan, and for helping me interview him, Andy. Stephan, is there anything that you&amp;rsquo;d like to say to the community before we end?&lt;/p&gt;
&lt;p&gt;Stephan: Wow. Thank you. I just, I&amp;rsquo;m so thankful. I think that the thing that I love about Obsidian is, so many smart people and kind and like, kind people are part of the community. I love, you know, watching your videos, Nicole. You do such a great job of kind of making Obsidian feel more accessible. And I think that, in a way, like, beyond what we&amp;rsquo;re working on in terms of features and so on, like, the fact that we have such a friendly and collaborative and helpful community, is one of my favorite things. And so, I&amp;rsquo;m extremely thankful for that. You know, continue to be, continue doing an amazing job, being nice and helpful. Like, I think we&amp;rsquo;re still at the very beginning of people adopting these tools. Like, anyone who&amp;rsquo;s watching this is probably in the like, top 0.01% of people who knows anything about these, whatever you wanna call &amp;rsquo;em, tools for thought, how you like, some people have been calling it integrated thinking environment. Like, we&amp;rsquo;re creating a new generation of tools that help people unlock the way that they think. And anyone who&amp;rsquo;s watching this right now is kind of, pretty much on the cutting edge of that concept. And I&amp;rsquo;m really curious what happens if that idea becomes more pervasive in society. I&amp;rsquo;m very hopeful that it can help us solve a lot of big problems. And so, if you&amp;rsquo;re one of the, you know, nerds, I say that lovingly. Geeks, dorks, that are part of this conversation, I consider myself one of those, introducing people to Obsidian and being part of, you know, helping them learn how to kind of, make their thought process more reliable is just an amazing gift. Like, I just think that&amp;rsquo;s like, and you&amp;rsquo;re doing that every day with your videos, Nicole. And so, I wanna thank you for that. So that, it&amp;rsquo;s not a specific ask, but that&amp;rsquo;s just kind of the way that I feel and I hope we can continue that for a really long time.&lt;/p&gt;
&lt;p&gt;Nicole: Awesome. Thank you. I&amp;rsquo;ll talk to you both in a second, but we&amp;rsquo;ll say goodbye to everybody else. Thank you for joining us on this weekend, and see you next week.&lt;/p&gt;
&lt;p&gt;Andy: Thanks. Bye.&lt;/p&gt;
&lt;p&gt;Nicole: Bye!&lt;/p&gt;
&lt;p&gt;Stephan: Thank you.&lt;/p&gt;</description></item><item><title>Writing a book in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230303-writing-a-book-in-obsidian/</link><pubDate>Fri, 03 Mar 2023 16:51:30 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230303-writing-a-book-in-obsidian/</guid><description>&lt;p&gt;I&amp;rsquo;m writing a book in Obsidian&amp;ndash; about Obsidian! And I want to share it all with you. This is the beginning of that journey: what I&amp;rsquo;m starting with, my idea, and the plugins I&amp;rsquo;m using to get it done. This is all a work in progress, so if you have any suggestions about what I should do, I&amp;rsquo;d love to hear them!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NosD77WX7qM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You can follow along with my progress by &lt;a href="https://patreon.com/nicolevdh"&gt;signing up for my Patreon&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>How to Do Exploratory Testing for Performance (k6 Office Hours #79)</title><link>https://nicolevanderhoeven.com/blog/20230224-koh79-how-to-do-exploratory-testing-for-performance/</link><pubDate>Fri, 24 Feb 2023 23:01:26 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230224-koh79-how-to-do-exploratory-testing-for-performance/</guid><description>&lt;p&gt;Marie Cruz and Nicole van der Hoeven talk about what exploratory testing is, why you should do it, and how to do exploratory testing to improve application performance. They discuss some heuristics to add structure and intention to exploratory testing for both frontend and backend performance.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6wVwdlMwsJ8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My new favorite Obsidian theme</title><link>https://nicolevanderhoeven.com/blog/20230224-my-new-favorite-obsidian-theme-anuppucin/</link><pubDate>Fri, 24 Feb 2023 16:49:38 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230224-my-new-favorite-obsidian-theme-anuppucin/</guid><description>&lt;p&gt;I have a new favorite Obsidian theme, and it&amp;rsquo;s called AnuPpuccin! Anup is as pretty and feature-packed as it is hard to spell/say. Didn&amp;rsquo;t know themes could have features? Anup comes with custom callouts, checkboxes, speech bubbles, and lots of color options.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/7-SOwxpZQNI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My setup in Obsidian for TTRPGs in 2023</title><link>https://nicolevanderhoeven.com/blog/20230203-my-setup-in-obsidian-for-ttrpgs/</link><pubDate>Fri, 03 Feb 2023 16:41:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230203-my-setup-in-obsidian-for-ttrpgs/</guid><description>&lt;p&gt;I heavily use Obsidian for TTRPGs: playing them, running them, and learning new systems. Here&amp;rsquo;s an update of my entire TTRPG setup in Obsidian, including how I create new worlds, sessions, NPCs, places, maps, statblocks, a GM dashboard, and encounter tracking.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.patreon.com/posts/66059374"&gt;Templates on Patreon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/TTRPGs/TTRPGs+Games+Index"&gt;Examples of my TTRPG notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/003Jvume-cA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Integrating k6 and Tracetest (k6 Office Hours #77)</title><link>https://nicolevanderhoeven.com/blog/20230203-koh77-integrating-k6-and-tracetest/</link><pubDate>Fri, 03 Feb 2023 08:00:15 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230203-koh77-integrating-k6-and-tracetest/</guid><description>&lt;p&gt;Tracetest enables trace-based testing with assertions at any point within a request transaction. Using the xk6-tracetest extension, your k6 tests can launch deep testing by unlocking the power of OpenTelemetry.&lt;/p&gt;
&lt;p&gt;Join us as Developer Advocates Nicole and der Hoeven and Paul Balogh are joined by founder Ken Hamric and software engineer Oscar Reyes from Tracetest.&lt;/p&gt;
&lt;p&gt;Check out Tracetest:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://tracetest.io/"&gt;site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/kubeshop/xk6-tracetest"&gt;xk6-tracetest&lt;/a&gt;: repo for k6 extension&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.tracetest.io/tools-and-integrations/k6/"&gt;docs&lt;/a&gt; on how to use Tracetest with k6&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Dog70D7aVyg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Frontend vs Backend Performance Testing</title><link>https://nicolevanderhoeven.com/blog/20230201-frontend-vs-backend-performance-testing/</link><pubDate>Wed, 01 Feb 2023 22:59:18 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230201-frontend-vs-backend-performance-testing/</guid><description>&lt;p&gt;Which should you do: frontend vs. backend performance testing? The short answer is both. Each has its pros and cons, but hybrid load testing combines them and gives you the most holistic view of performance, including frontend concerns like how quickly a page renders or perceived application performance as well as backend concerns like response times of individual components.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xVACRP5qIJI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Organize Testing Scripts in k6 (k6 Office Hours #76)</title><link>https://nicolevanderhoeven.com/blog/20230127-koh76-how-to-organize-testing-scripts-in-k6/</link><pubDate>Fri, 27 Jan 2023 17:00:10 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230127-koh76-how-to-organize-testing-scripts-in-k6/</guid><description>&lt;p&gt;In this video, we talk about how to organize testing scripts in k6 using features like tags, groups, and functions depending on what type of testing you want to do with your test script. Developer Advocates Paul Balogh, Marie Cruz, and Nicole van der Hoeven show us a few examples of how they would organize and modularize scripts in a test suite.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zDtEzp_JUOE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>AI tools for PKM and Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230127-ai-tools-for-pkm-and-obsidian/</link><pubDate>Fri, 27 Jan 2023 16:39:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230127-ai-tools-for-pkm-and-obsidian/</guid><description>&lt;p&gt;Here are some AI tools for learning and taking notes that I&amp;rsquo;ve incorporated into my processes. AI is a controversial topic, but it&amp;rsquo;s important to remember it&amp;rsquo;s just like any other technology: it&amp;rsquo;s only as good as the people that wield it. In this video, I show some ways I use artificial intelligence to improve my learning and note-taking rather than to replace them.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mKWY33MXLvI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Introduction to Performance Testing</title><link>https://nicolevanderhoeven.com/blog/20230125-introduction-to-performance-testing/</link><pubDate>Wed, 25 Jan 2023 22:28:43 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230125-introduction-to-performance-testing/</guid><description>&lt;p&gt;In this introduction to performance testing, we talk about how performance is part of the functionality of an application, why you should do performance testing, and some myths about performance that discourage teams from testing for it and make applications more likely to fail and fail miserably.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FqOwO4y8SbA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Top 10 Core Plugins for Obsidian in 2023</title><link>https://nicolevanderhoeven.com/blog/20230120-top-10-core-plugins-for-obsidian-in-2023/</link><pubDate>Fri, 20 Jan 2023 16:37:32 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230120-top-10-core-plugins-for-obsidian-in-2023/</guid><description>&lt;p&gt;In this video, I talk about my top 10 core plugins in Obsidian: the built-in options that improve your productivity without adding clutter and complexity to your notes. Unlike community plugins, core plugins are a lower security risk, yet provide a lot of extra value&amp;ndash; but they&amp;rsquo;re also easy to overlook. Here are my favourite underappreciated core plugins.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Lq33gNpeDkE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Overview of Obsidian - Obsidian for Everyone course</title><link>https://nicolevanderhoeven.com/blog/20230113-overview-of-obsidian/</link><pubDate>Fri, 13 Jan 2023 16:32:30 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230113-overview-of-obsidian/</guid><description>&lt;p&gt;Here&amp;rsquo;s an overview of Obsidian: what it is, why everyone&amp;rsquo;s using it, and how to get started with Obsidian for beginners with a brand new course called Obsidian for Everyone. I&amp;rsquo;m extremely proud of the course and I can&amp;rsquo;t wait to share it with you after working on it for what seems like forever. It contains everything you need to know to use Obsidian &amp;ndash; but without installing any third-party community plugins.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://courses.nicolevanderhoeven.com/o4e"&gt;Obsidian for Everyone&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com"&gt;My public Obsidian notes&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/HNFF_EeFr9Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Guide to Load Testing Websites</title><link>https://nicolevanderhoeven.com/blog/20230112-load-testing-websites/</link><pubDate>Thu, 12 Jan 2023 17:12:42 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20230112-load-testing-websites/</guid><description>&lt;p&gt;&lt;em&gt;Original article &lt;a href="https://k6.io/docs/testing-guides/load-testing-websites/"&gt;here&lt;/a&gt;, written for k6.io&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This doc explains some key concepts about load testing websites, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The difference between backend and frontend performance testing&lt;/li&gt;
&lt;li&gt;When to choose between protocol-based, browser-based, or hybrid scripts&lt;/li&gt;
&lt;li&gt;Recommended practices about how to load test websites&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All load tests try to simulate real user traffic to prevent failures, improve reliability, and release new code with confidence.
But your approach to load testing must adapt to the type of application you want to test.&lt;/p&gt;
&lt;p&gt;In this guide, learn about strategies to test websites, including specific recommendations for complex scenario scripting and test execution.&lt;/p&gt;
&lt;h2 id="load-testing-approaches"&gt;Load testing approaches&lt;/h2&gt;
&lt;p&gt;When you approach the load test, first consider the following perspectives:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Backend vs. frontend performance&lt;/li&gt;
&lt;li&gt;Protocol-based, browser-based, or hybrid load testing&lt;/li&gt;
&lt;li&gt;Component testing vs. end-to-end testing&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="backend-vs-frontend-performance"&gt;Backend vs. frontend performance&lt;/h2&gt;
&lt;p&gt;Performance has a significant influence on the user experience of a website.&lt;/p&gt;
&lt;p&gt;For example, when users want to visualize or interact with some information, they expect the website to react quickly.&lt;/p&gt;
&lt;p&gt;To measure performance, testers often look at response times, which are affected by two main factors:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Frontend performance&lt;/li&gt;
&lt;li&gt;Backend performance&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="frontend-performance"&gt;Frontend performance&lt;/h3&gt;
&lt;p&gt;Frontend performance testing verifies application performance on the interface level, measuring round-trip metrics that consider how and when page elements appear on the screen. It&amp;rsquo;s concerned with the end-user experience of an application, usually involving a browser.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/frontend-rendering.png" alt="Snapshots over time of webpage elements rendering on a browser" title="Snapshots over time of webpage elements rendering on a browser" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Frontend performance testing excels at identifying issues on a micro level but does not expose issues in the underlying architecture of a system.&lt;/p&gt;
&lt;p&gt;Because it primarily measures a single user&amp;rsquo;s experience of the system, frontend performance testing tends to be easier to run on a small scale.
Frontend performance testing has metrics that are distinct from backend performance testing. Frontend performance tests for things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Whether the pages of the application are optimized to render quickly on a user&amp;rsquo;s screen&lt;/li&gt;
&lt;li&gt;How long it takes a user to interact with the UI elements of the application.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some concerns when doing this type of performance testing are its dependency on fully integrated environments and the cost of scaling. You can test frontend performance only once the application code and infrastructure have been integrated with a user interface. Tools to automate frontend testing are also inherently more resource-intensive, so they can be costly to run at scale and are not suitable for high load tests.&lt;/p&gt;
&lt;h3 id="backend-performance"&gt;Backend performance&lt;/h3&gt;
&lt;p&gt;Backend performance testing targets the underlying application servers to see how they behave under production-like conditions. When it comes to websites, while frontend performance involves how assets included in the page are rendered, backend performance focuses on how those assets are processed by the application servers, served to users, and downloaded by browsers.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/backend-performance.png" alt="Backend components" title="Backend components of an application" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Backend testing is broader in scope than frontend performance testing. API testing can be used to target specific components or integrated components, meaning that application teams have more flexibility and higher chances of finding performance issues earlier. Backend testing is less resource-intensive than frontend performance testing and is thus more suitable for generating high load.&lt;/p&gt;
&lt;h3 id="which-one-should-you-test"&gt;Which one should you test?&lt;/h3&gt;
&lt;p&gt;It depends! Ideally, both.&lt;/p&gt;
&lt;p&gt;Frontend testing tools are executed on the client side and are limited in scope: they do not provide enough information about backend components for fine-tuning beyond the user interface.&lt;/p&gt;
&lt;p&gt;This limitation can lead to false confidence in overall application performance when the amount of traffic against an application increases. While the frontend component of response time remains more or less constant, the backend component of response time increases exponentially with the number of concurrent users:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Frontend-Backend-LoadTesting.png" alt="Backend performance often contributes significantly to overall user experience" title="Backend performance often contributes significantly to overall user experience" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Testing &lt;em&gt;only&lt;/em&gt; frontend performance ignores a large part of the application, one more susceptible to increased failures and performance bottlenecks at higher levels of load.&lt;/p&gt;
&lt;p&gt;Testing &lt;em&gt;only&lt;/em&gt; backend performance, on the other hand, ignores &amp;ldquo;the first mile&amp;rdquo; of user experience and breadth. Backend testing involves messaging at the protocol level rather than interacting with page elements the way a real user would. It verifies the foundation of an application rather than the highest layer of it that a user ultimately sees.&lt;/p&gt;
&lt;p&gt;Testing both frontend and backend performance leads to the best overall performance and user experience for your application. Ignoring one or the other exposes you to performance bottlenecks that significantly decrease a user&amp;rsquo;s satisfaction with your application.&lt;/p&gt;
&lt;p&gt;However, if your testing is smaller in scope, you can choose to focus on either frontend or backend with the goal of eventually building a test suite that encompasses both.&lt;/p&gt;
&lt;h2 id="component-testing-vs-end-to-end-testing"&gt;Component testing vs. end-to-end testing&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re testing a web app, you may wonder whether how you structure your test scripts. Consider the following two methods.&lt;/p&gt;
&lt;h3 id="component-testing"&gt;Component testing&lt;/h3&gt;
&lt;p&gt;One way you could load test a web app is to load test its components. Maybe you know there are issues with a specific functionality due to previous production issues, or maybe you&amp;rsquo;d like to target components that are business-critical to reduce risk exposure.&lt;/p&gt;
&lt;p&gt;In these cases, the type of test you write may:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;be protocol-based&lt;/li&gt;
&lt;li&gt;call only those API endpoints that are relevant&lt;/li&gt;
&lt;li&gt;have smaller or no sleep/think time&lt;/li&gt;
&lt;li&gt;be focused on eventually stress testing a component or service or finding its breaking point&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Testing in this way is more flexible. With protocol testing, you can specify the endpoints or servers you&amp;rsquo;d like to hit, and narrow your test&amp;rsquo;s target that way. You can test specific functionalities while skipping others that come chronologically before it in a standard user flow. You can more finely control the type of traffic that is generated. If you&amp;rsquo;re recreating a specific mix of requests, you can script those requests and reproduce them in a repeatable manner.&lt;/p&gt;
&lt;p&gt;Doing component testing for load may not always require that your script behave like an end user. In fact, it may be necessary to artificially inflate traffic to more quickly reproduce issues, or to deflate traffic to reduce the noise in the logs. By the nature of this type of testing, scripts don&amp;rsquo;t contain the full flow of a request that you would expect to see in production, so realism is not a priority.&lt;/p&gt;
&lt;h3 id="end-to-end-testing"&gt;End-to-end testing&lt;/h3&gt;
&lt;p&gt;You could also do end-to-end testing against a web app. End-to-end testing seeks to replicate real user behaviour and track its effects across the entire stack. When doing end-to-end testing, you might:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;do protocol-level, browser-level, or hybrid load testing&lt;/li&gt;
&lt;li&gt;replicate the actions in a typical user flow&lt;/li&gt;
&lt;li&gt;think about the performance of the entire workflow as well as how long a request took to be processed by each component&lt;/li&gt;
&lt;li&gt;write scripts that access the application the same way users would, such as by browsing to the homepage before finding their way to other parts of the website&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This type of load testing is broader in scope than component testing, but shallower in terms of depth. With end-to-end testing, you get a better idea of the full user experience of the application as a whole. However, it can also be more complex to troubleshoot, as you have more components to monitor and more places to look for issues that are found.&lt;/p&gt;
&lt;p&gt;End-to-end testing is based on real user behavior, so it&amp;rsquo;s often important that end-to-end test scripts also be realistic.&lt;/p&gt;
&lt;h2 id="protocol-based-browser-based-or-hybrid-load-testing"&gt;Protocol-based, browser-based, or hybrid load testing&lt;/h2&gt;
&lt;p&gt;The decision of whether to test the frontend, backend, or both will also affect the type of load testing you should carry out and the kind of scripts you should write.&lt;/p&gt;
&lt;h3 id="protocol-based-load-testing"&gt;Protocol-based load testing&lt;/h3&gt;
&lt;p&gt;Protocol-based load testing verifies the backend performance of an application by simulating the requests underlying user actions. For websites, this commonly involves HTTP requests that bypass the user interface of your application and are sent directly to a server or application component.&lt;/p&gt;
&lt;p&gt;For example, a protocol-based load testing script might request all the resources on a webpage from the application servers, but those resources are merely downloaded. The response times reported by a purely protocol-based script do not include frontend metrics such as the time taken for images to render on a browser. The load is generated by simulating many requests sent to application servers.&lt;/p&gt;
&lt;p&gt;While protocol-based load testing may seem to lend itself better to component testing, you can also do end-to-end website testing with protocol-level scripts.&lt;/p&gt;
&lt;h4 id="sample-protocol-based-test-script"&gt;Sample protocol-based test script&lt;/h4&gt;
&lt;p&gt;The following is an example of a protocol-based load testing script in k6 that fetches the homepage, along with resources embedded into the page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Homepage&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;sec-ch-ua&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#34;Chromium&amp;#34;;v=&amp;#34;94&amp;#34;, &amp;#34;Google Chrome&amp;#34;;v=&amp;#34;94&amp;#34;, &amp;#34;;Not A Brand&amp;#34;;v=&amp;#34;99&amp;#34;&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;accept-encoding&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;gzip, deflate, br&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;accept-language&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;en-GB,en;q=0.9&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 01. Go to the homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;batch&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/style.min.css&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/header.png&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/polyfill.min.js&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Homepage loaded&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Welcome to my site&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 02. View products
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;batch&lt;/span&gt;([
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/products&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com/style.css&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/product1.jpg&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/product2.jpg&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;GET&amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;https://website.com/displaylist.js&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;params&lt;/span&gt;],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;responses&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Products loaded&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;JSON&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;stringify&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;).&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Add to Cart&amp;#39;&lt;/span&gt;),
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;a href="https://k6.io/docs/test-authoring/recording-a-session/browser-recorder/"&gt;Recording browser traffic&lt;/a&gt; helps you prototype to test websites on the protocol level.&lt;/p&gt;
&lt;h3 id="browser-based-load-testing"&gt;Browser-based load testing&lt;/h3&gt;
&lt;p&gt;Browser-based load testing verifies the frontend performance of an application by simulating real users using a browser to access your website.&lt;/p&gt;
&lt;p&gt;For example, a browser-based load testing script might include instructions to navigate to a page, click on a button, and type out text on a form. Those user actions then trigger underlying requests on the protocol layer, but only user actions are scripted in browser-based testing.&lt;/p&gt;
&lt;p&gt;Unlike protocol-based load testing, browser-based load testing scripts generate load by starting multiple instances of browsers and interacting with your application the way real users would. Testing at the browser level can also be the only option for testing Single-Page Applications where a lot of the application logic is executed by client-side scripts.&lt;/p&gt;
&lt;p&gt;Scripting on the browser level usually requires the use of different tools from the ones used to test at the protocol level.
However, k6 has an extension called &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/"&gt;xk6-browser&lt;/a&gt; that allows the creation of browser-based test scripts alongside protocol-based ones.&lt;/p&gt;
&lt;h4 id="sample-browser-based-test-script"&gt;Sample browser-based test script&lt;/h4&gt;
&lt;p&gt;The following is an example of a browser-based load testing script in k6 using xk6-browser on a dummy website. Instead of making an HTTP request, the script views the homepage, then looks for and clicks on a link to the product page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/x/browser&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chromium&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;launch&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;headless&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;false&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;newPage&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 01. Go to the homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;goto&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://mywebsite.com&amp;#39;&lt;/span&gt;, { &lt;span style="color:#a6e22e"&gt;waitUntil&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;networkidle&amp;#39;&lt;/span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;then&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForSelector&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;p[class=&amp;#34;woocommerce-result-count&amp;#34;]&amp;#34;]&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;screenshots/01_homepage.png&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;// 02. View products
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;$&lt;/span&gt;(
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;a[class=&amp;#34;woocommerce-LoopProduct-link woocommerce-loop-product__link&amp;#34;]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;element&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;waitForSelector&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;button[name=&amp;#34;add-to-cart&amp;#34;]&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;screenshot&lt;/span&gt;({ &lt;span style="color:#a6e22e"&gt;path&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;screenshots/02_view-product.png&amp;#39;&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#66d9ef"&gt;finally&lt;/span&gt;(() =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;page&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;close&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="tips-for-writing-browser-level-scripts"&gt;Tips for writing browser-level scripts&lt;/h4&gt;
&lt;p&gt;The following steps can help you get started with a browser-level test script.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Script user actions, not requests.&lt;/strong&gt; Determine what a user might do for a particular task, and script interactions with elements on the browser level. For example, script what buttons the user clicks on.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Identify unique selectors.&lt;/strong&gt; Once you have identified which page elements a user interacts with, use the Element Inspector for DevTools in your browser to find a unique, static, and simple way to identify each element. The script needs selectors to find the right element to interact with.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use elements to verify responses.&lt;/strong&gt; After every action, use &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/api/locator/"&gt;locators&lt;/a&gt; to search for elements on the page that you would expect to find. This verification helps ensure that the script has reached the expected page.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take screenshots for every action while debugging.&lt;/strong&gt; One of the advantages of browser-based testing is the ability to take screenshots. After every user interaction the script simulates, use &lt;a href="https://k6.io/docs/javascript-api/xk6-browser/api/page/"&gt;page.screenshot&lt;/a&gt; to save a visual image of what the script encountered for later troubleshooting.&lt;/p&gt;
&lt;h3 id="hybrid-load-testing"&gt;Hybrid load testing&lt;/h3&gt;
&lt;p&gt;Hybrid load testing is a combination of protocol-based and browser-based load testing. While you can use two tools or two scripts to execute different types of load tests (one protocol-based and one browser-based), having both types of tests executed by the same script and the same tool is ideal. Aggregating results between different tools can be difficult at best and inconsistent at worst.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/hybrid-testing.png" alt="Hybrid of frontend and backend performance testing" title="In hybrid load testing, both the frontend and backend are tested" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A best practice in hybrid load testing is to generate most of the load using the protocol-level test, and then to run a smaller number of the browser-level testing scripts. This approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;reduces the number of load generators needed, since protocol-level testing requires fewer machines to generate the same load&lt;/li&gt;
&lt;li&gt;measures backend and frontend performance in the same test execution&lt;/li&gt;
&lt;li&gt;provides a single source of aggregated output at the end&lt;/li&gt;
&lt;li&gt;reduces complexity in the creation and maintenance of scripts&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="scripting-considerations"&gt;Scripting considerations&lt;/h2&gt;
&lt;p&gt;When you script a test for a website, consider these recommendations.&lt;/p&gt;
&lt;h3 id="consider-factors-that-affect-script-realism"&gt;Consider factors that affect script realism&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Record your user journey.&lt;/strong&gt; Using the browser recorder can facilitate initial test script creation by capturing all the embedded resources on webpages. Check out the &lt;a href="https://k6.io/docs/test-authoring/recording-a-session"&gt;Session Recording guide&lt;/a&gt; to learn more about how to auto-generate your load test from a user session.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Correlate data.&lt;/strong&gt; Recordings often don&amp;rsquo;t take into account dynamic values that are generated anew each time a request is made. Go through the recorded requests and determine whether you need to &lt;a href="https://k6.io/docs/examples/correlation-and-dynamic-data/"&gt;extract values from previous responses&lt;/a&gt; and use parameters in subsequent requests. This practice ensures your VUs behave more like real users would.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Include or exclude static resources.&lt;/strong&gt; Determine whether you should include or exclude static resources on pages such as images, JavaScript, etc. Consider including them if you want to measure overall user experience. Consider excluding them if you are using a Content Delivery Network (CDN) that is under a separate Service Level Agreement (SLA).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exclude third-party requests.&lt;/strong&gt; Don&amp;rsquo;t load test servers that you don&amp;rsquo;t own. Many applications make calls to third-party providers for authentication, social sharing, and marketing analytics. Disable these requests unless you have permission to include them in your tests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use concurrent requests.&lt;/strong&gt; To mimic the way modern browsers download some requests in parallel, use &lt;a href="https://k6.io/docs/javascript-api/k6-http/batch/"&gt;batching&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Determine cache and cookie behaviour.&lt;/strong&gt; k6 automatically resets cookies between iterations, but you can also &lt;a href="https://k6.io/docs/using-k6/k6-options/reference/#no-cookies-reset"&gt;change this behavior&lt;/a&gt; if maintaining cookies would be more realistic.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use dynamic think time and pacing.&lt;/strong&gt; Consider adding varying &lt;a href="https://k6.io/docs/javascript-api/k6/sleep/"&gt;delays&lt;/a&gt; so you don&amp;rsquo;t artificially stagger a script with completely uniform delays.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use test data.&lt;/strong&gt; Real users typically don&amp;rsquo;t search for or submit the same data repeatedly. Consider adding a &lt;a href="https://k6.io/docs/examples/data-parameterization/"&gt;test data file&lt;/a&gt; for the script to iterate through.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Model test parameters and load profile after production.&lt;/strong&gt; In k6, you can use &lt;a href="https://k6.io/docs/using-k6/k6-options/how-to"&gt;test options&lt;/a&gt; to determine the exact shape and profile of your load test script. Select the appropriate &lt;a href="https://k6.io/docs/using-k6/scenarios/executors/"&gt;executors&lt;/a&gt; for the job.&lt;/p&gt;
&lt;h3 id="create-a-reusable-framework"&gt;Create a reusable framework&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use tags and groups.&lt;/strong&gt; Organizing requests by &lt;a href="https://k6.io/docs/using-k6/tags-and-groups/"&gt;tagging and grouping them&lt;/a&gt; helps you consolidate like metrics and makes your test scripts more understandable by others.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Use scenarios.&lt;/strong&gt; When combining protocol-based and browser-based tests, use &lt;a href="https://k6.io/docs/using-k6/scenarios/"&gt;scenarios&lt;/a&gt; to independently control their test parameters and &lt;a href="https://k6.io/docs/using-k6/scenarios/executors/"&gt;executors&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modularize scripts.&lt;/strong&gt; Use &lt;a href="https://k6.io/docs/using-k6/modules/"&gt;modules&lt;/a&gt; to separate and organize functions for protocol-level testing and browser-level testing, and then use a test runner script to execute them. This approach means different scripts can be versioned and changed without affecting each other.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Integrate your tests into your CI pipeline.&lt;/strong&gt; Adopting a &amp;ldquo;tests as code&amp;rdquo; approach enables you to tie your load tests more closely into your project&amp;rsquo;s existing CI/CD processes, helping you get the most value out of every test.&lt;/p&gt;
&lt;h3 id="test-with-thresholds-in-mind"&gt;Test with thresholds in mind&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Create thresholds for both types of testing.&lt;/strong&gt; Some browser-level and protocol-level metrics cannot be combined because they don&amp;rsquo;t measure the same thing. Set &lt;a href="https://k6.io/docs/using-k6/thresholds/"&gt;thresholds&lt;/a&gt; for relevant metrics from both the browser-level script and the protocol-level one.&lt;/p&gt;
&lt;h3 id="when-possible-use-hybrid-load-testing"&gt;When possible, use hybrid load testing&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Use protocol-based scripts to generate majority of the load.&lt;/strong&gt; When writing the test scenario, use the protocol-based requests to simulate most of the traffic and use fewer VUs for the browser-based requests. Relying on the protocol-level traffic helps keep resource utilization on load generators down.&lt;/p&gt;
&lt;h2 id="execution-considerations"&gt;Execution considerations&lt;/h2&gt;
&lt;p&gt;When you run tests, consider the test environment and the load generator location.&lt;/p&gt;
&lt;h3 id="run-your-tests-in-the-appropriate-environment"&gt;Run your tests in the appropriate environment&lt;/h3&gt;
&lt;p&gt;Testing in pre-production environments and in production environments both add value.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing in pre-production environments&lt;/strong&gt; (staging, test, system integration testing, user acceptance testing, and production replica environments) enables you to identify performance defects early, which can save a lot of time and effort (and reputation) later on. Running in test environments also means you can often afford to be more aggressive with your tests. However, it&amp;rsquo;s also more critical to get your load profiles right, and the test results you get may not necessarily apply to production.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Testing in production&lt;/strong&gt; yields the most accurate results, but it&amp;rsquo;s also more risky. Often, testing production is the only feasible alternative. You can reduce the risk of impact to real customers while testing in production by using lower levels of load when running load tests during peak hours, schedule tests for off-peak hours, choosing load test types that are less risky, using techniques like synthetic monitoring that generate less traffic, using real user monitoring tools to get snapshots of user performance at load, and ensuring that your observability stack is working at peak efficiency.&lt;/p&gt;
&lt;h3 id="run-tests-where-your-customers-are"&gt;Run tests where your customers are&lt;/h3&gt;
&lt;p&gt;The location of the load generator(s), where the traffic is coming &lt;em&gt;from&lt;/em&gt;, can also have an impact on your test results. The question is: where are your end users located?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;On-premises load testing&lt;/strong&gt; can be ideal when testing early on in the development a website, or when there are machines that can be repurposed as load generators. However, testing entirely from within a corporate network may also yield false positives, in that response times reported are significantly lower than if the same application servers were accessed from across the country.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Load testing on the cloud&lt;/strong&gt; is an essential part of the testing strategy for many public-facing websites. Using load generators on the cloud gives you access to test in different states and geographical countries, creating a mix of load generators proportional to your users&amp;rsquo; locations. Cloud load generators are easier to provision and cheaper to maintain in the long run than on-premise ones. Load testing on the cloud can help you include the effects of network latency in your tests and yield results that are more realistic.&lt;/p&gt;
&lt;h2 id="recommendations"&gt;Recommendations&lt;/h2&gt;
&lt;p&gt;Here are some recommendations to help you plan, script, and execute your load tests for websites.&lt;/p&gt;
&lt;p&gt;If you want to test the last-mile user experience of your website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;focus on &lt;strong&gt;frontend performance&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;write &lt;strong&gt;browser-based test scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and consider doing more realistic &lt;strong&gt;end-to-end&lt;/strong&gt; tests of the user flow.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to test the underlying infrastructure of your website:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;focus on &lt;strong&gt;backend performance&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;write &lt;strong&gt;protocol-based test scripts&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;and consider starting with &lt;strong&gt;component testing&lt;/strong&gt; and then gradually increasing the scope.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your website is meant for internal or has limited access:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;on-premise load generators&lt;/strong&gt; located within the network that most of your users access the website from.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If your website is external and public-facing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use &lt;strong&gt;cloud load generators&lt;/strong&gt; in the load zones where your users reside.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Test in &lt;strong&gt;pre-production environments&lt;/strong&gt; when you can, but also consider &lt;strong&gt;testing in production&lt;/strong&gt; in a limited capacity.&lt;/p&gt;
&lt;p&gt;Load testing websites can be complex due to the number of viable testing approaches available, the scope for performance testing, and the potential effects of releasing undertested code. By following the recommendations we&amp;rsquo;ve put forward here, you can tailor your testing more closely to your objectives.&lt;/p&gt;</description></item><item><title>My Time Management Setup in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20230106-my-time-management-setup-in-obsidian/</link><pubDate>Fri, 06 Jan 2023 16:09:54 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20230106-my-time-management-setup-in-obsidian/</guid><description>&lt;p&gt;My time management setup in Obsidian consists of a way to set goals, a daily note for rapid logging the present, and a review/retrospective system to evaluate past performance. In this video, I talk about all the plugins and apps I use to get all my responsibilities done&amp;ndash; without me feeling like I&amp;rsquo;m overwhelmed.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/V3-A6j17KsI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Taking Notes From Youtube Videos in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221230-taking-notes-from-youtube-videos-in-obsidian/</link><pubDate>Fri, 30 Dec 2022 11:30:38 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221230-taking-notes-from-youtube-videos-in-obsidian/</guid><description>&lt;p&gt;In this video, I talk about five different ways to take notes on YouTube videos in Obsidian, for those (like me) who love learning things on YouTube and want a way to capture new thoughts in Obsidian. I mention a few community plugins, a browser extension, and a separate service as well as my workflow for just using vanilla Obsidian, so you can take your pick!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/qjWq4ck2-0o?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Mastobot: a Mastodon Bot for Readwise and Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221225-mastodon-bot-for-readwise-and-obsidian/</link><pubDate>Sun, 25 Dec 2022 00:31:28 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221225-mastodon-bot-for-readwise-and-obsidian/</guid><description>&lt;p&gt;I&amp;rsquo;ve had a love affair with &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; for a while, enough to write some code to extend it. I &lt;a href="https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/"&gt;wrote a Python script to save Readwise highlights to my Obsidian vault&lt;/a&gt;, switched to the &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;Readwise Official plugin&lt;/a&gt; when they released it, &lt;a href="https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/"&gt;wrote another script sending Shortform highlights to Readwise&lt;/a&gt;, and then was happy when the two companies established an official integration thanks to me introducing them.&lt;/p&gt;
&lt;p&gt;Maybe I should have learned to just be patient and wait for the awesome Readwise team to build integrations I want, but remembered I&amp;rsquo;m not that patient. This is about how I created a Mastodon bot to send Mastodon posts I like to my Readwise account, and, by extension, to my &lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt; vault.&lt;/p&gt;
&lt;p&gt;You might say there&amp;rsquo;s a pattern here.&lt;/p&gt;
&lt;h2 id="the-problem"&gt;The problem&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve been dabbling in &lt;a href="https://joinmastodon.org/"&gt;Mastodon&lt;/a&gt; for a while, but only recently got extremely involved with it when I decided to start and maintain a Mastodon server, &lt;a href="https://pkm.social"&gt;pkm.social&lt;/a&gt;, for the personal knowledge management community.&lt;/p&gt;
&lt;p&gt;Readwise already has an awesome &lt;a href="https://youtu.be/Rw1L5sxlnuU?t=400"&gt;Twitter integration&lt;/a&gt; that I really enjoyed. Basically, once you&amp;rsquo;ve set it up, sending any tweet to &lt;a href="https://twitter.com/readwise"&gt;@readwise&lt;/a&gt; adds it to your Readwise account. This means that whenever someone says something actually meaningful or interesting on Twitter, I can make sure it gets sent to Readwise, and then from there to my notes in Obsidian.&lt;/p&gt;
&lt;p&gt;I wanted the same setup for Mastodon.&lt;/p&gt;
&lt;h2 id="the-result"&gt;The result&lt;/h2&gt;
&lt;p&gt;First, the end result: I managed to get Mastodon posts I send to my bot to be sent to my Readwise account. Here are some early posts in the &amp;ldquo;Tweets&amp;rdquo; section of my Readwise Library:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/mastodon-on-readwise.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;And here are the resulting notes in Obsidian, also automatically synced and formatted:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/mastodon-in-obsidian.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="the-solution"&gt;The solution&lt;/h2&gt;
&lt;p&gt;Next, here&amp;rsquo;s how to set it up.&lt;/p&gt;
&lt;h3 id="pre-requisites"&gt;Pre-requisites&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ll need a few things to get started:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A Mastodon account (I use and co-host &lt;a href="https://pkm.social"&gt;pkm.social&lt;/a&gt; for free)&lt;/li&gt;
&lt;li&gt;A Readwise account (&lt;a href="https://readwise.io/nicole"&gt;Here&amp;rsquo;s an affiliate link&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Familiarity with GitHub, the command line, Node.js (although I&amp;rsquo;m not a Node.js developer, so you don&amp;rsquo;t have to be, either)&lt;/li&gt;
&lt;li&gt;The willingness/ability to leave a Node.js script running on a server somewhere&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="setup"&gt;Setup&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;Clone &lt;a href="https://github.com/nicolevanderhoeven/mastobot"&gt;my Mastobot repository&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;In your Mastodon account settings, go to the Development section for your Mastodon server (e.g. &lt;code&gt;https://pkm.social/settings/applications&lt;/code&gt;) and click New Application.&lt;/li&gt;
&lt;li&gt;Fill in the application name (this can be anything you want), leave everything else the same, and then click Save Changes.&lt;/li&gt;
&lt;li&gt;Click on the application you just created, and note your client key, client secret, and access token. You&amp;rsquo;ll need these later.&lt;/li&gt;
&lt;li&gt;In this repository, copy the contents of &lt;code&gt;.env.sample&lt;/code&gt; to a new file called &lt;code&gt;.env&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It should look like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;ACCESS_TOKEN&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;CLIENT_SECRET&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;CLIENT_KEY&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;READWISE_TOKEN&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;DOMAIN&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="6"&gt;
&lt;li&gt;Fill out the fields in &lt;code&gt;.env&lt;/code&gt; with the information you just obtained from your Mastodon account.&lt;/li&gt;
&lt;li&gt;For the &lt;code&gt;READWISE_TOKEN&lt;/code&gt; field, enter your &lt;a href="https://readwise.io/access_token"&gt;Readwise access token&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;For the &lt;code&gt;DOMAIN&lt;/code&gt; field, enter your Mastodon server&amp;rsquo;s domain (e.g. &lt;code&gt;https://pkm.social&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;npm install&lt;/code&gt; to install the dependencies.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;node bot.js&lt;/code&gt; to start the bot.&lt;/li&gt;
&lt;li&gt;In Mastodon, find a post you like and reply to it with &lt;code&gt;@accountname Your comment here.&lt;/code&gt; Within a few minutes, the original post you replied to will be sent to your Readwise account as a highlight and your comment as a note.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="limitations"&gt;Limitations&lt;/h2&gt;
&lt;p&gt;This workflow is not without its limitations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You need to keep the script running somewhere to be able to use it. I considered using a polling approach, but decided I wanted to experiment with Mastodon&amp;rsquo;t streaming API, which would also be more responsive, so I went with that.&lt;/li&gt;
&lt;li&gt;Right now, because the bot takes environment variables about &lt;em&gt;your&lt;/em&gt; particular setup, it&amp;rsquo;s not as versatile as the official Twitter implementation. As it is, it&amp;rsquo;s for one person&amp;rsquo;s use only.&lt;/li&gt;
&lt;li&gt;It uses the &amp;ldquo;Tweets&amp;rdquo; category in Readwise, which is not ideal, but I can&amp;rsquo;t really do anything about that until they give Mastodon its own category. This isn&amp;rsquo;t really a big deal.&lt;/li&gt;
&lt;li&gt;Right now, the bot doesn&amp;rsquo;t support images or other media embedded to posts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I may address some of these issues, but for now, I&amp;rsquo;m just happy with the result. I fully expect that the Readwise team will eventually be able to flesh this out into a more robust integration, so I&amp;rsquo;m hesitant to spend too much more effort now that I&amp;rsquo;ve got it doing the minimum of what I wanted.&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re interested in doing this for yourself, here are some resources that might be useful:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/nicolevanderhoeven/mastobot"&gt;Mastobot on GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vanita5/mastodon-api"&gt;Mastodon API client for NodeJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.joinmastodon.org/api/"&gt;Mastodon official API&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Great video tutorial series by &lt;a href="https://www.youtube.com/watch?v=sKSxBd56H70"&gt;The Coding Train&lt;/a&gt; on creating a Mastodon bot&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Note: I&amp;rsquo;ve included affiliate links for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; in this post, in accordance with my &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;Ethics Statement&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Visual Atomic Note Taking With Obsidian Excalidraw</title><link>https://nicolevanderhoeven.com/blog/20221223-visual-atomic-note-taking-with-obsidian-excalidraw/</link><pubDate>Fri, 23 Dec 2022 16:35:57 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221223-visual-atomic-note-taking-with-obsidian-excalidraw/</guid><description>&lt;p&gt;Visual atomic note taking in Obsidian can be a great complement to taking notes in text form if you use tools like the Obsidian Excalidraw plugin. Obsidian Excalidraw lets you link and backlink with images, tag them for querying later, and even embed images AND parts of images. It&amp;rsquo;s an essential part of taking notes visually while not missing out on the benefits of plain text.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GqrczIftYyA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Part of this video was sponsored by &lt;a href="https://brilliant.org/nicolevdh"&gt;Brilliant&lt;/a&gt;. Thanks, Brilliant!&lt;/p&gt;</description></item><item><title>Distributed Load Testing Using Kubernetes With k6</title><link>https://nicolevanderhoeven.com/blog/20221118-koh72-distributed-load-testing-using-kubernetes-with-k6/</link><pubDate>Sun, 18 Dec 2022 15:54:07 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221118-koh72-distributed-load-testing-using-kubernetes-with-k6/</guid><description>&lt;p&gt;My colleague Paul Balogh and I demonstrate how to run distributed load testing using Kubernetes with k6 and k6 operator. k6 can already run up to 40,000 virtual users from a single load generator, but if you want to scale that up further, you can use the Kubernetes operator to create a k6 custom resource within your cluster.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5d5zxsGz8L4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Reading and Taking Notes on Kindle and Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221216-reading-and-taking-notes-on-kindle-and-obsidian/</link><pubDate>Fri, 16 Dec 2022 16:28:29 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221216-reading-and-taking-notes-on-kindle-and-obsidian/</guid><description>&lt;p&gt;Reading on a Kindle can be more convenient than reading paperbacks because you can import your Kindle highlights and notes into Obsidian or your note-taking app of choice. Here are some tips for making the most out of every book you read.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DwgtBGVxHTg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Obsidian Canvas Core Plugin (new in v1.0.0)</title><link>https://nicolevanderhoeven.com/blog/20221209-obsidian-canvas-core-plugin/</link><pubDate>Fri, 09 Dec 2022 16:23:10 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221209-obsidian-canvas-core-plugin/</guid><description>&lt;p&gt;The new Obsidian Canvas core plugin was introduced recently in v1.1.0, currently available only to Insiders but soon available to everyone. Canvas is an optional plugin that gives Obsidian an infinitely scrolling space to arrange notes, media, and other cards (potentially including external websites). If you&amp;rsquo;ve heard of &lt;a href="https://www.scrintal.com/"&gt;Scrintal&lt;/a&gt;, this core plugin brings some of the same visual thinking workflows to Obsidian, which I think is a very smart step.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/rPescoJzcFA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>My Tech Bag for Working Remotely</title><link>https://nicolevanderhoeven.com/blog/20221202-my-tech-bag-for-working-remotely/</link><pubDate>Fri, 02 Dec 2022 16:06:07 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221202-my-tech-bag-for-working-remotely/</guid><description>&lt;p&gt;What&amp;rsquo;s in my tech bag? Here&amp;rsquo;s all the gear I bring with me for work and play, sometimes for months at a time, including my full digital nomad setup. This is also essentially my travel bag&amp;ndash; just add a single packing cube for clothes and toiletries!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fBEJM-31cjs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Making Notes Actually Useful in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221125-making-notes-actually-useful-in-obsidian/</link><pubDate>Fri, 25 Nov 2022 15:57:17 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221125-making-notes-actually-useful-in-obsidian/</guid><description>&lt;p&gt;How do you go about making notes actually useful? Using notes well entails taking good notes in the first place, processing them, and then creating something new out of them. In this video, I talk about the plugins that I use in every stage of the process, and some guidelines for how I actually make a note on something I&amp;rsquo;ve learned into content that I (and others) can make use of.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/v7BbraqevMg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;This video was sponsored by &lt;a href="https://brilliant.org/nicolevdh"&gt;Brilliant&lt;/a&gt;. Thanks, Brilliant! :)&lt;/p&gt;</description></item><item><title>Notion-like Content Calendar in Obsidian Projects</title><link>https://nicolevanderhoeven.com/blog/20221118-notion-like-content-calendar-in-obsidian-projects/</link><pubDate>Fri, 18 Nov 2022 15:38:33 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20221118-notion-like-content-calendar-in-obsidian-projects/</guid><description>&lt;p&gt;If you&amp;rsquo;re looking to create a content calendar in Obsidian just like in Notion, the new Obsidian Projects plugin presents new options for managing content using multiple views: Table, Board, Calendar, and Gallery to start with, but hopefully more in the future. Projects is a framework for creating new views for the same data and aims to play well with other plugins.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ny8lksaQ5A8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How Many Obsidian Vaults Should You Have?</title><link>https://nicolevanderhoeven.com/blog/20221111-how-many-obsidian-vaults-should-you-have/</link><pubDate>Fri, 11 Nov 2022 14:08:39 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20221111-how-many-obsidian-vaults-should-you-have/</guid><description>&lt;p&gt;The more notes you have, the more you might wonder if you should have multiple vaults in Obsidian. There is no definitive answer, but in this video, I talk about reasons you should have only one vault as well as good reasons to have several vaults, based on my own experience. Like with anything I say, take what&amp;rsquo;s useful and do what makes sense!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IV3PHeyCHvc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Notion Database Views in Obsidian (Live)</title><link>https://nicolevanderhoeven.com/blog/20221107-notion-database-views-in-obsidian/</link><pubDate>Mon, 07 Nov 2022 14:06:02 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20221107-notion-database-views-in-obsidian/</guid><description>&lt;p&gt;Have you ever wanted rotating Notion database views in Obsidian? Marcus Olsson&amp;rsquo;s Obsidian Projects plugin does exactly that, letting you create Table, Board, Calendar, and Gallery views for the same notes in Obsidian, just like in Notion! Join us as Marcus shows us how this awesome new plugin works and how it can be used to display the same data in different ways.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LdaMe2rzAW8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://marcus.se.net/announcing-obsidian-projects/"&gt;Marcus&amp;rsquo;s post on the plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/marcusolsson/obsidian-projects"&gt;The Obsidian Projects GitHub repo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/users/marcusolsson/projects/4/views/14"&gt;The Projects roadmap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;My video on &lt;a href="https://www.youtube.com/watch?v=iU60ItemuDo"&gt;the old way to create a Content Calendar in Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Distributed Tracing With Grafana k6 (k6 Office Hours #70)</title><link>https://nicolevanderhoeven.com/blog/20221104-koh70-distributed-tracing-with-grafana-k6/</link><pubDate>Fri, 04 Nov 2022 14:03:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20221104-koh70-distributed-tracing-with-grafana-k6/</guid><description>&lt;p&gt;Just announced: distributed tracing with Grafana k6 x Tempo! Daniel González Lopes joins us to talk about what distributed tracing is, and how traces using the Tempo backend could help you troubleshoot your performance issues and improve overall reliability. This new integration was just announced at ObservabilityCon 2022, and Daniel&amp;rsquo;s here to tell us all about it!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/g9xU_pFr-Vc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/2022/11/03/how-to-correlate-performance-testing-and-distributed-tracing-to-proactively-improve-reliability/"&gt;Blog post on k6 x Tempo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://grafana.com/blog/2022/11/02/observabilitycon-2022-announcements"&gt;Other announcements from ObservabilityCON 2022&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to Organize Your Notes in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221104-how-to-organize-your-notes-in-obsidian/</link><pubDate>Fri, 04 Nov 2022 13:57:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20221104-how-to-organize-your-notes-in-obsidian/</guid><description>&lt;p&gt;Wondering how to organize your notes in Obsidian? In this video, I talk about some methods in Obsidian for imposing structure and organization, the LATCH method for adding data to your data, and which methods I would use in Obsidian for each part of LATCH (Location, Alphabet, Time, Category, and Hierarchy). This is not meant to be a definitive or prescriptive guide for how YOU should organize your notes. Instead, take this as a look into how I prefer to do it, in the hopes that you may find inspiration for how you&amp;rsquo;d like to do it as well.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vS-b_RUtL1A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Taking Better Notes From Books: Shortform-Readwise-Obsidian</title><link>https://nicolevanderhoeven.com/blog/20221028-taking-better-notes-from-books-shortform-review/</link><pubDate>Fri, 28 Oct 2022 16:00:34 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221028-taking-better-notes-from-books-shortform-review/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/JfL9iAEfSCg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve been using &lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; for over a year. I&amp;rsquo;ve written &lt;a href="https://github.com/nicolevanderhoeven/shortform-to-readwise"&gt;some code&lt;/a&gt; for it and I&amp;rsquo;ve also written &lt;a href="https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/"&gt;a blog post&lt;/a&gt; about it. It&amp;rsquo;s an essential part of my workflow for taking better notes from books, particularly in conjunction with &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; and my current note-taking tool of choice, &lt;a href="https://obsidian.md/"&gt;Obsidian&lt;/a&gt;. Here&amp;rsquo;s what you need to know!&lt;/p&gt;
&lt;h2 id="what-is-shortform"&gt;What is Shortform?&lt;/h2&gt;
&lt;p&gt;Shortform is a service that creates book summaries out of popular books, but it&amp;rsquo;s also so much more than that! They&amp;rsquo;re like Netflix but for books, if you can imagine that. The summaries that Shortform gives you are not just your typical high school level summaries of a book report that we used to do when we were younger.&lt;/p&gt;
&lt;p&gt;Sound familiar?&lt;/p&gt;
&lt;h2 id="what-makes-shortform-different"&gt;What makes Shortform different?&lt;/h2&gt;
&lt;p&gt;Here are things that differentiate Shortform from other book summary services.&lt;/p&gt;
&lt;h3 id="researched-commentary"&gt;Researched commentary&lt;/h3&gt;
&lt;p&gt;Shortform has really thoughtful and nuanced commentary that place it firmly head and shoulders above other services.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a screenshot of some Shortform commentary from the book &lt;a href="https://amzn.to/3gO0gmP"&gt;Why We Sleep&lt;/a&gt;, taken on the Shortform mobile app.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shortform-why-we-sleep.jpg" alt="Screenshot of Shortform commentary from the book “Why We Sleep”" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The highlighted section is a Shortform note&amp;ndash; additional commentary that the Shortform team added. In this case, they are fact-checking the author, citing &lt;a href="https://www.sleep.pitt.edu/wp-content/uploads/2020/03/The-AASM-Manual-for-Scoring-of-Sleep-and-Associated-Events-2007-.pdf"&gt;sources&lt;/a&gt; that prove a statement the author made to be false.&lt;/p&gt;
&lt;p&gt;When I was reading this book, I didn&amp;rsquo;t really think about questioning those claims. But Shortform thoroughly goes over every claim that Walker, the author, made in thsi book.&lt;/p&gt;
&lt;p&gt;Reading with Shortform is like having somebody else read a book with you&amp;ndash; a more critical and more well-informed someone who has the time to fact-check statements. It&amp;rsquo;s a bit like having your own personal book club.&lt;/p&gt;
&lt;h4 id="shortform-vs-blinkist"&gt;Shortform vs. Blinkist&lt;/h4&gt;
&lt;p&gt;Another service in this vein that I&amp;rsquo;ve used is &lt;a href="https://blinkist.com/"&gt;Blinkist&lt;/a&gt;. Let&amp;rsquo;s look at the same book in Shortform and Blinkist to figure out why I like Shortform so much better.&lt;/p&gt;
&lt;p&gt;This is what the Blinkist summary for the book &lt;a href="https://amzn.to/3W8rFQH"&gt;Indistractable&lt;/a&gt; looks like.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/blinkist-indistractable-summary.jpg" alt="Screenshot of Blinkist summary of Indistractable" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Blinkist is based on the idea that every book can be distilled into these &lt;em&gt;blinks&lt;/em&gt;: very short summaries of every idea. For this book it has eight. Each of these blinks is a few paragraphs long. Here&amp;rsquo;s what the first looks like.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/blinkist-indistractable-first-section.jpg" alt="Screenshot of Blinkist’s Indistractable blink" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A blink is a straight summary. There&amp;rsquo;s no commentary. There&amp;rsquo;s no research or anything like that. It seems like the whole focus of this is to be able to distill exactly what the author has said and let other people do the work of trying to figure out for themselves whether something is true or not. There&amp;rsquo;s really not much more than just these blinks.&lt;/p&gt;
&lt;p&gt;In contrast, if we look at the one on Shortform, this is the same book and it also has like a one page summary like Blinkist did.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shortform-indistractable-summary.jpg" alt="Screenshot of Shortform summary of Indistractable" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;But then it also has a full book guide, which goes through every single chapter or part and adds more detail into it.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shortform-indistractable-first-section.jpg" alt="Screenshot of Shorform’s Indistractable first part" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;As you can see, Shortform takes a different approach: instead of just summarizing the book, they&amp;rsquo;re truly trying to explain it in their own unique way, providing examples and making it more readable using bullet points.&lt;/p&gt;
&lt;h3 id="action-oriented-exercises"&gt;Action-oriented exercises&lt;/h3&gt;
&lt;p&gt;Shortform also has these exercises based on the things that the author has said in the book. These exercises are peppered throughout and between these chapters, and they really force you to put things into practice right away as soon as you learn them, which is another element of learning.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shortform-indistractable-exercises.jpg" alt="Screenshot of an exercise in Shortform’s Indistractable summary" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="critical-thinking-comparisons-to-other-ideas"&gt;Critical thinking: comparisons to other ideas&lt;/h3&gt;
&lt;p&gt;Shortform tries to examine ideas in the context of other books they&amp;rsquo;ve made summaries for. Here&amp;rsquo;s an example of a Shortform note where Shortform suggests the summary of the book &lt;a href="https://amzn.to/3NdqE5C"&gt;How to Stop Worrying and Start Living&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shortform-indistractable-comparison.jpeg" alt="Screenshot of Shortform note connecting Indistractable to another book" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Fans of the Zettelkasten method will be happy to see this, because Shortform often prompts me to consider the differences or similarities between ideas from different authors. It helps me see connections I might not have considered. Incidentally, I&amp;rsquo;ve also found many good books this way!&lt;/p&gt;
&lt;h2 id="how-to-use-shortform-with-obsidian"&gt;How to use Shortform with Obsidian&lt;/h2&gt;
&lt;p&gt;The other thing that really sells it for me is the integration. Because I don&amp;rsquo;t want that learning to stop in the Shortform app. You know me, and I want everything in Obsidian. And Shortform has an integration that Blinkist does not.&lt;/p&gt;
&lt;p&gt;I actually tried to solve this problem myself a year ago, because no integration existed. I &lt;a href="https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/"&gt;wrote a Python script&lt;/a&gt; that would take the Shortform highlights, because it has an API, and then call the Readwise API and kind of string them together. Now, that still works as far as I know, but that&amp;rsquo;s not what I recommend anymore. I talked to the Readwise founders and suggested to them that Shortform was a great company to partner with. Not too long after that, they came out with &lt;a href="https://readwise.io/changelog/shortform-import"&gt;an awesome integration&lt;/a&gt;!&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;First, sign up to both &lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; and &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. They both have free trials, so you don&amp;rsquo;t have to commit to anything just yet.&lt;/li&gt;
&lt;li&gt;Then, &lt;a href="https://readwise.io/welcome/sync#shortform"&gt;click on this link to connect&lt;/a&gt; your Readwise account to Shortform.&lt;/li&gt;
&lt;li&gt;(optional) If you use Obsidian like I do, &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;follow these instructions&lt;/a&gt; to install the Readwise Official plugin for Obsidian.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;That&amp;rsquo;s pretty much it!&lt;/p&gt;
&lt;p&gt;From now on, here&amp;rsquo;s how things will work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You make highlights on books on Shortform.&lt;/li&gt;
&lt;li&gt;Those highlights are sent to Readwise automatically.&lt;/li&gt;
&lt;li&gt;Through the Readwise official plugin, those highlights get synced into your Obsidian vault.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="the-result-shortform-highlights-in-obsidian"&gt;The result: Shortform highlights in Obsidian&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s what my Shortform highlights look like in Obsidian. Note that after setting this up, all I had to do was make highlights on Shortform&amp;ndash; it&amp;rsquo;s quite low-touch after that.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-shortform-indistractable.png" alt="Shorform highlights synced to Obsidian vault via Readwise" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I tweaked the export settings in Readwise to set the format I want the note to have in Obsidian. You don&amp;rsquo;t have to do this, but if you want to, you can change those settings &lt;a href="https://readwise.io/export/obsidian/preferences"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="my-shortform-workflow-for-taking-notes-on-books"&gt;My Shortform workflow for taking notes on books&lt;/h2&gt;
&lt;p&gt;This is pretty much how a lot of my book-buying and -reading goes:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I start by browsing books on Shortform and read the one-page summaries.&lt;/li&gt;
&lt;li&gt;If I find one I like, I buy the book on Kindle.&lt;/li&gt;
&lt;li&gt;I make highlights on the Kindle version. (Those are synced to Obsidian too!)&lt;/li&gt;
&lt;li&gt;If I really like the book, I flip back to the Shortform detailed chapter summaries as I finish each chapter, because they provide more context. I make highlights and notes from Shortform here sometimes.&lt;/li&gt;
&lt;li&gt;Sometimes I do the Shortform exercises too.&lt;/li&gt;
&lt;li&gt;After I finish the book, I go back to the Shortform summary and make more highlights/notes.&lt;/li&gt;
&lt;li&gt;After I&amp;rsquo;ve read my fill of both the Shortform summary and the book itself, I go back to Obsidian and write my own notes that combine what I&amp;rsquo;ve learned.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If that sounds like a lot, it is! But keep in mind that I don&amp;rsquo;t do this for &lt;em&gt;every&lt;/em&gt; book. At every step of the way, Shortform helps me filter out books that I don&amp;rsquo;t want to read, or don&amp;rsquo;t want to finish.&lt;/p&gt;
&lt;p&gt;Shortform definitely saves me money: it costs less than a book a month and it stops me from reading more than one book a month. From that perspective, it&amp;rsquo;s already worth it.&lt;/p&gt;
&lt;p&gt;But more than that, the thoughtfulness of the summaries and the research that goes into those commentaries save me more than just money: &lt;em&gt;they save me time&lt;/em&gt;. And that&amp;rsquo;s really what I keep coming back for.&lt;/p&gt;
&lt;h2 id="related"&gt;Related&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;The easiest way to sync Kindle highlights to Obsidian - Readwise to Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/"&gt;How to process notes in Obsidian with Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220907-what-is-readwise-reader/"&gt;I can finally tell you about Readwise Reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220902-how-to-take-notes-from-a-book-with-obsidian/"&gt;How to take notes from a book with Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220519-use-it-or-lose-it/"&gt;Use it or lose it: what to do with all those notes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Some of the links on this page are affiliate links. Click &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;here&lt;/a&gt; to check out my ethics statement and see how I decide what to promote in this way.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>All About Load Testing Metrics (k6 Office Hours #69)</title><link>https://nicolevanderhoeven.com/blog/20221028-koh69-all-about-metrics/</link><pubDate>Fri, 28 Oct 2022 15:00:07 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221028-koh69-all-about-metrics/</guid><description>&lt;p&gt;Leandro Melendez and Nicole van der Hoeven discuss all about load testing metrics. What do they all mean? Which ones do you REALLY need? Understanding metrics and analysing test results is arguably the most important part of a load test&amp;ndash; and also the most difficult! We&amp;rsquo;re answering all the questions you ever had about the many metrics that come with load and performance testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/c3mNes0BxG8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Obsidian for Non-coders</title><link>https://nicolevanderhoeven.com/blog/20221021-obsidian-for-non-coders/</link><pubDate>Fri, 21 Oct 2022 18:17:53 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221021-obsidian-for-non-coders/</guid><description>&lt;p&gt;In this video, I talk about how to get started with Obsidian for non-coders, specifically tackling topics like what Markdown is and how to use it to write notes in Obsidian. I also talk about some Obsidian-specific syntax that help you do things like embed Obsidian notes, create footnotes, and create queries to find the right note.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5qRVquqRH0k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In the video, I mention &lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt;&amp;ndash; follow that link to get 20% off an annual subscription!&lt;/p&gt;
&lt;h2 id="related-articles"&gt;Related Articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/"&gt;How to import Shortform highlights to Obsidian via Readwise&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220907-what-is-readwise-reader/"&gt;I can finally tell you about Readwise Reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/"&gt;How to process notes in Obsidian - Readwise Official Obsidian plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220512-how-real-people-process-notes/"&gt;How real people process notes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220902-how-to-take-notes-from-a-book-with-obsidian/"&gt;How to take notes from a book with Obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220812-how-i-learn-in-obsidian/"&gt;How I learn in Obsidian - keeping up with tech trends&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Assertions in k6 (k6 Office Hours #68)</title><link>https://nicolevanderhoeven.com/blog/20221021-koh68-assertions-in-k6/</link><pubDate>Fri, 21 Oct 2022 16:29:35 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221021-koh68-assertions-in-k6/</guid><description>&lt;p&gt;How do you do assertions in k6? CTO Pawel Suwala talks about different ways to implement BDD/TDD in k6, including an assertion library called k6chaijs. We also discuss the differences between checks, thresholds, and assertions.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/k98Ej3xvTQM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="related-articles"&gt;Related articles&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220422-koh-51-end-to-end-browser-testing-with-k6/"&gt;End-to-end browser testing using xk6-browser&lt;/a&gt; (k6 Office Hours #51)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Browser-based+testing"&gt;Browser-based testing&lt;/a&gt; (notes)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20211112-koh35-browser-testing-and-api-load-testing-with-k6/"&gt;Browser testing and API load testing in the same script with k6&lt;/a&gt; (k6 Office Hours #35)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220210-in-search-of-the-best-pokemon/"&gt;In search of the best Pokémon: Browser automation and load testing in one script with k6&lt;/a&gt; (presentation at Automation Guild 2022)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220315-real-browser-testing-with-xk6-browser/"&gt;Real browser testing with xk6-browser&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to Take Notes for D&amp;D in Obsidian, with Leah Ferguson</title><link>https://nicolevanderhoeven.com/blog/20221015-how-to-take-notes-for-dnd-in-obsidian/</link><pubDate>Sat, 15 Oct 2022 22:38:50 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221015-how-to-take-notes-for-dnd-in-obsidian/</guid><description>&lt;p&gt;Obsidian moderator and my friend Leah Ferguson and I talk about how to take notes for D&amp;amp;D in Obsidian, including TTRPG plugins we use to prepare for, play, and process our D&amp;amp;D (and other TTRPG) sessions. We take our play seriously! :)&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MqN04ZXWufc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Testing Types and k6 Executors (k6 Office Hours #67)</title><link>https://nicolevanderhoeven.com/blog/20221014-koh67-load-testing-types-and-k6-executors/</link><pubDate>Fri, 14 Oct 2022 18:36:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221014-koh67-load-testing-types-and-k6-executors/</guid><description>&lt;p&gt;What are the different load testing types, and how do they relate to the k6 executors? We go through every single k6 executor and how, when, and why you should use each one in this week&amp;rsquo;s episode of k6 Office Hours.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ypli_y3UryU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Tabs in Obsidian (new in v1.0)</title><link>https://nicolevanderhoeven.com/blog/20221013-obsidian-v1/</link><pubDate>Thu, 13 Oct 2022 22:28:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221013-obsidian-v1/</guid><description>&lt;p&gt;Introducing: Tabs in Obsidian v1.0! Obsidian&amp;rsquo;s latest release brings tab functionality to Obsidian, further adding to its flexibility in terms of letting us build workspaces the way we want. We can now have tabs in Obsidian and use them the way we would browser tabs. This release also came with some improvements for themes and the overall Obsidian UI.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mmmJCttfA_o?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Real Use Case for Obsidian with Dataview</title><link>https://nicolevanderhoeven.com/blog/20221007-real-use-case-for-obsidian-with-dataview/</link><pubDate>Fri, 07 Oct 2022 18:23:05 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221007-real-use-case-for-obsidian-with-dataview/</guid><description>&lt;p&gt;In this real use case for Obsidian, I use plugins like Dataview, Database Folder, QuickAdd, Templater, and Buttons to create a database in Obsidian to track Kickstarter projects I&amp;rsquo;ve backed. I show two approaches to creating a database and demonstrate a relatively new plugin, Database Folder, which shows a lot of promise.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Ak7cuIyQeYw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>All About Web Performance (k6 Office Hours #66)</title><link>https://nicolevanderhoeven.com/blog/20221007-koh66-all-about-web-performance/</link><pubDate>Fri, 07 Oct 2022 17:25:24 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20221007-koh66-all-about-web-performance/</guid><description>&lt;p&gt;My fellow Developer Advocate and tester Marie Cruz and I talk all about web performance and best practices for making websites faster. What&amp;rsquo;s the difference between performance testing a website vs. an API? What are some things you should keep in mind when testing a web app?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gYfUoX85ElA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What's in my EDC Bag (2022)</title><link>https://nicolevanderhoeven.com/blog/20220930-whats-in-my-edc-bag-2022/</link><pubDate>Fri, 30 Sep 2022 12:47:32 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220930-whats-in-my-edc-bag-2022/</guid><description>&lt;p&gt;What&amp;rsquo;s in my tech EDC bag? In this video, I show you the sling bag I bring around on a daily basis, and every bit of gear in it. This is my everyday carry for 2022, and everything I take with me to stay productive on the go.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dddHAwrCpog?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;rsquo;s everything I mentioned in the video above that I could find a link for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xX8y1A"&gt;Samsung Galaxy Active 2&lt;/a&gt;: my smartwatch&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.etsy.com/listing/1108272100/critsuccess-d20-dice-ring-in-black"&gt;d20 spinner ring&lt;/a&gt;: a ring that acts like a 20-sided die for roleplaying games on the go&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fls6Gu"&gt;Samsung Galaxy Z Fold 3&lt;/a&gt;: my primary mobile phone&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aersf.com/day-sling-3-xpac-black"&gt;Aer Day Sling 3 X-Pac&lt;/a&gt;: my sling bag of choice&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fnkTp6"&gt;Nitecore Tini 2 USB C flashlight&lt;/a&gt;: tiny USB-C rechargeable flashlight&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SuWBru"&gt;Nite-Ize locking S-biners&lt;/a&gt;: for a little extra security for zippers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SyDpJI"&gt;Orbitkey holder&lt;/a&gt;: to hold my keys&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nanobag.net/"&gt;Nano bag 2.0&lt;/a&gt;: compactable bag&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3r7zGXK"&gt;Kable Card&lt;/a&gt;: all essential cables and adapters, a light, a mobile stand, and a memory card reader all in one card&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SfNP11"&gt;Aurtech bluetooth keyboard&lt;/a&gt;: portable bluetooth keyboard&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DWI6ZQ"&gt;Samsung Galaxy S Pen Fold Edition&lt;/a&gt;: stylus for my mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3RhiFoL"&gt;Sony WF 1000 XM3&lt;/a&gt;: wireless noise-cancelling earbuds&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3RgZrj4"&gt;Spigen Arc Powerstation 20W&lt;/a&gt;: small GaN charger&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LOwYA6"&gt;Secrid mini-wallet&lt;/a&gt;: my minimalist wallet&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dispeldice.com/collections/legacy/products/lavender-dreams-7-piece-polyhedral-set"&gt;Dispel Dice Lilac Song&lt;/a&gt;: a full-sized d20 I carry around&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttonshygames.com/collections/current-collection/products/sprawlopolis"&gt;Sprawlopolis&lt;/a&gt;: small cooperative card game&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SibAW9"&gt;LIE&lt;/a&gt;: fun party game for 2-6 players and is the size of a pack of gum&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.victorinox.com/us/en/Products/Swiss-Army-Knives/Small-Pocket-Knives/Jetsetter/p/0.6263"&gt;Victorinox Jetsetter&lt;/a&gt;: small, travel-friendly multitool&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mightyhanks.com/index.php?route=product/category&amp;amp;path=29"&gt;Mighty Hanks&lt;/a&gt;: microfiber on one side, cotton on the other&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DW1RRa"&gt;Burts Bees&lt;/a&gt;: lip balm&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SDfc4H"&gt;Small red Sharpie&lt;/a&gt;: mini marker&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ClU7Xz"&gt;Joby Gorillapod GripTight Smartphone Micro Tripod&lt;/a&gt;: tripod for my mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dIL4pR"&gt;Samsung Galaxy Note 10+&lt;/a&gt;: secondary mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://topodesigns.com/products/accessory-bags?variant=39887314157621"&gt;Topo designs micro pouch&lt;/a&gt;: small pouch&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LOOeoD"&gt;Tile Mate Pro&lt;/a&gt;: bluetooth tracker&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shop.trezor.io/product/trezor-model-t"&gt;Trezor Model T&lt;/a&gt;: hardware wallet and security key&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Performance testing for beginners (k6 Office Hours #65)</title><link>https://nicolevanderhoeven.com/blog/20220930-koh65-performance-testing-for-beginners/</link><pubDate>Fri, 30 Sep 2022 12:45:08 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220930-koh65-performance-testing-for-beginners/</guid><description>&lt;p&gt;My colleague &lt;a href="https://javaducky.com"&gt;Paul Balogh&lt;/a&gt; and I interview the k6 technical writer, Matt Dodson, who asks all the questions about load and performance testing that you were always afraid to ask.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oNWigNvQ9Tg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The future of k6 (k6 Office Hours #64)</title><link>https://nicolevanderhoeven.com/blog/20220923-koh64-future-of-k6/</link><pubDate>Fri, 23 Sep 2022 12:18:07 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220923-koh64-future-of-k6/</guid><description>&lt;p&gt;We&amp;rsquo;re talking about the future of k6 with CEO Robin Gustafsson and CTO Pawel Suwala. What&amp;rsquo;s next for k6? What new features are we working on? What&amp;rsquo;s the plan for further integrations with Grafana? What are the plans for the k6 team as we transition out of the honeymoon period after the Grafana acquisition?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/r1kj3oGHDmo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Learn Languages in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220923-how-i-learn-languages-in-obsidian/</link><pubDate>Fri, 23 Sep 2022 12:14:58 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220923-how-i-learn-languages-in-obsidian/</guid><description>&lt;p&gt;In this video, I demonstrate how I learn Swedish in 30 days using Obsidian and other apps. Learning foreign languages is never easy, but having a system in place definitely makes the process easier. The Obsidian Spaced Repetition plugin in particular helps create flashcards that I can use on my laptop or mobile devices.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/b_P5yIBkYLg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Visit &lt;a href="https://brilliant.org/nicolevdh"&gt;Brilliant&lt;/a&gt; &lt;em&gt;(affiliate link)&lt;/em&gt; to get started learning STEM for free, and the first 200 people will get 20% off their annual premium subscription. Check out my &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;Ethics page&lt;/a&gt; to see how I decide on products to promote.&lt;/p&gt;</description></item><item><title>Getting started with xk6-browser (k6 Office Hours #63)</title><link>https://nicolevanderhoeven.com/blog/20220916-koh63-getting-started-with-xk6-browser/</link><pubDate>Fri, 16 Sep 2022 12:13:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220916-koh63-getting-started-with-xk6-browser/</guid><description>&lt;p&gt;Marie Drake, the newest Developer Advocate to join the k6 team, shares her experience in getting started with xk6-browser: how to install it, issues she encountered, and the state of browser testing with k6 as she sees it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/CRSTQ6n05hM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Use the Excalibrain Obsidian Plugin</title><link>https://nicolevanderhoeven.com/blog/20220916-how-to-use-the-excalibrain-obsidian-plugin/</link><pubDate>Fri, 16 Sep 2022 12:11:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220916-how-to-use-the-excalibrain-obsidian-plugin/</guid><description>&lt;p&gt;In this video, I demonstrate how to use the ExcaliBrain Obsidian plugin and what it can be used for. ExcaliBrain is a very powerful plugin, and it can significantly improve your Obsidian workflows. I also mention go through installing and getting started with ExcaliBrain at four different levels of uses for it: letting it infer relationships, setting explicit relationships, creating custom relationships, and finally creating semantic relationships in ExcaliBrain.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gqEtn3gCZF0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Testing Apache Kafka using k6 (k6 Office Hours #62)</title><link>https://nicolevanderhoeven.com/blog/20220909-koh62-load-testing-apache-kafka/</link><pubDate>Fri, 09 Sep 2022 12:09:36 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220909-koh62-load-testing-apache-kafka/</guid><description>&lt;p&gt;Senior Software Engineer Mostafa Moradian joins us to talk about load testing Apache Kafka using k6 and the extension he created, called xk6-kafka. He describes what Kafka is, the basics of Kafka, and why he thinks load testing it is important. Mostafa works on the backend team at k6/Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NQ0fyhq1mxo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>I can finally tell you about Readwise Reader</title><link>https://nicolevanderhoeven.com/blog/20220907-what-is-readwise-reader/</link><pubDate>Wed, 07 Sep 2022 18:01:12 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220907-what-is-readwise-reader/</guid><description>&lt;p&gt;Readwise Reader is the latest read-it-later app, except not just for books. Reader brings in your highlights from books, articles, tweets, PDFs, epubs, emails, and even newsletters! While it&amp;rsquo;s not yet officially launched, it&amp;rsquo;s now in public beta and you can sign up to be put on a wait list to try out this awesome product that&amp;rsquo;s been so essential to my workflows.&lt;/p&gt;
&lt;p&gt;Note: I do have an affiliate link of &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;, but this video was not sponsored. They know I&amp;rsquo;m making this video, because I had to reach out to get permission to post the screenshot of a private email, but they did not review this video and had no idea what I was going to say. :)&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uNH1JDOmGJw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Take Notes from a book with Obsidian (The Culture Map)</title><link>https://nicolevanderhoeven.com/blog/20220902-how-to-take-notes-from-a-book-with-obsidian/</link><pubDate>Fri, 02 Sep 2022 17:58:52 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220902-how-to-take-notes-from-a-book-with-obsidian/</guid><description>&lt;p&gt;I demonstrate how to take notes from a book (The Culture Map) using Obsidian. In the process of taking notes, I also create learning exhaust in the form of notes, an atomic essay to go on Twitter, a visual that summarises a concept, and a video presentation. Taking notes from books is more than just understanding what the author wanted to say; it should also involve consolidation and interrogation of the book&amp;rsquo;s ideas into our personal knowledge management systems.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VumFk-C4iFc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Resilience and Chaos Testing with SteadyBit and k6 (k6 Office Hours #61)</title><link>https://nicolevanderhoeven.com/blog/20220902-koh61-resilience-and-chaos-testing-with-steadybit-and-k6/</link><pubDate>Fri, 02 Sep 2022 16:56:14 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220902-koh61-resilience-and-chaos-testing-with-steadybit-and-k6/</guid><description>&lt;p&gt;What is the difference between resilience testing and chaos testing? SteadyBit CEO and co-founder Benjamin Wilms talks about how to integrate SteadyBit with k6 for both resilience and chaos, and why he prefers &amp;ldquo;chaos testing&amp;rdquo; to &amp;ldquo;chaos engineering&amp;rdquo;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GhyKF7oP21M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Study Using Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220826-how-i-study-using-obsidian/</link><pubDate>Fri, 26 Aug 2022 17:53:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220826-how-i-study-using-obsidian/</guid><description>&lt;p&gt;Visit &lt;a href="https://brilliant.org/nicolevdh/"&gt;https://brilliant.org/nicolevdh/&lt;/a&gt; to get started learning STEM for free, and the first 200 people will get 20% off their annual premium subscription. I also talk about how I study in Obsidian: the courses, platforms, and apps I use&amp;ndash; and how I make sense of it all using Obsidian. Studying isn&amp;rsquo;t just for students. as a professional, I am also constantly learning. To make sure I make the most of the costs of education, I&amp;rsquo;ve made a deal with myself to commit to processing everything in Obsidian.&lt;/p&gt;
&lt;p&gt;This video was sponsored by &lt;a href="https://brilliant.org/nicolevdh"&gt;Brilliant&lt;/a&gt;! (affiliate link)&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FAy9ZWaHSIw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Live - Visual PKM With Zsolt Viczián</title><link>https://nicolevanderhoeven.com/blog/20220820-visual-pkm-with-zsolt-viczian/</link><pubDate>Sat, 20 Aug 2022 17:48:41 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220820-visual-pkm-with-zsolt-viczian/</guid><description>&lt;p&gt;What is a visual Personal Knowledge Management (PKM) and how can it help you make connections between your notes? Zsolt Vizcain, developer of the Obsidian Excalidraw and Excalibrain plugins, joins me to talk about how to use his plugins to make your PKM system more visual.&lt;/p&gt;
&lt;p&gt;Zsolt makes videos too! Check his channel out: &lt;a href="https://www.youtube.com/c/VisualPKM"&gt;https://www.youtube.com/c/VisualPKM&lt;/a&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fXGcOWycgG4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What is browser testing, with Marie Drake (k6 Office Hours #60)</title><link>https://nicolevanderhoeven.com/blog/20220819-koh60-what-is-browser-testing-with-marie-drake/</link><pubDate>Fri, 19 Aug 2022 17:51:38 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220819-koh60-what-is-browser-testing-with-marie-drake/</guid><description>&lt;p&gt;What is browser testing, and do we really need it? What does browser or automation testing have to do with load testing? Our new colleague, Marie Drake, joins us today to talk about why she joined k6 and why she is an advocate for browser testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ieQwRy9UVo4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Make Your Notes Visual in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220818-how-to-make-your-notes-visual-in-obsidian/</link><pubDate>Thu, 18 Aug 2022 16:21:10 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220818-how-to-make-your-notes-visual-in-obsidian/</guid><description>&lt;p&gt;In this video, I demonstrate how to make your notes visual with visual PKM plugins like Excalidraw, Excalibrain, Advanced Slides, and Mind Map. Adding visual elements to your notes, whether through distinguishing text or adding images and video, helps make notes more meaningful to you, increasing understanding and retention.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/9ELqSWucVYo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Observability Trends and Future Best Practices (k6 Office Hours #59)</title><link>https://nicolevanderhoeven.com/blog/20220812-koh59-observability-trends-and-future-best-practices/</link><pubDate>Fri, 12 Aug 2022 16:19:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220812-koh59-observability-trends-and-future-best-practices/</guid><description>&lt;p&gt;What are some observability trends and best practices in 2022 and going forward? Technical Program Manager Daniel González Lopes joins Developer Advocates Nicole van der Hoeven and Paul Balogh to chat about trending concepts and new areas of exploration in the field of observability. We&amp;rsquo;re going to talk about distributed tracing, continuous profiling, eBPF monitoring, and more!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4NPCzt5eF9w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How I Learn in Obsidian - Keeping up with tech trends</title><link>https://nicolevanderhoeven.com/blog/20220812-how-i-learn-in-obsidian/</link><pubDate>Fri, 12 Aug 2022 16:17:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220812-how-i-learn-in-obsidian/</guid><description>&lt;p&gt;Here&amp;rsquo;s how I learn in Obsidian by processing articles I&amp;rsquo;ve read into consolidated notes that help me understand technical concepts. I also show how I improve my learning by incorporating visual elements using Obsidian Excalidraw, Excalibrain, and Advanced Slides.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6kzsCBKCl94?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using the Obsidian QuickAdd Plugin</title><link>https://nicolevanderhoeven.com/blog/20220805-using-the-obsidian-quick-add-plugin/</link><pubDate>Fri, 05 Aug 2022 16:15:15 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220805-using-the-obsidian-quick-add-plugin/</guid><description>&lt;p&gt;The Obsidian Quick Add plugin won #10 in the Obsidian Gems of the Year 2021, but how do you use it? There are four types of &amp;ldquo;choices&amp;rdquo; in the plugin: multi, template, capture, and macro. Learn how to use each one with examples for real use cases.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LrQVQ37y6IU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>1 Year Ago We Were Acquired. Here's what happened next. (k6 Office Hours #58)</title><link>https://nicolevanderhoeven.com/blog/20220729-koh58-1-year-ago-we-were-acquired/</link><pubDate>Fri, 29 Jul 2022 16:12:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220729-koh58-1-year-ago-we-were-acquired/</guid><description>&lt;p&gt;In June 2021, CEO Raj Dutt announced that k6 had become part of the Grafana Labs family, and the year that followed has been replete with changes in features, organizational structure, and overall culture within the k6 team. In this video, Nicole van der Hoeven and Paul Balogh reflect on everything that&amp;rsquo;s happened in the last year and how k6 has fared 1 year after the acquisition.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LjC--G-QLpk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Do D&amp;D Prep in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220729-how-to-do-dnd-prep-in-obsidian/</link><pubDate>Fri, 29 Jul 2022 15:57:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220729-how-to-do-dnd-prep-in-obsidian/</guid><description>&lt;p&gt;In this video, I show you in detail how I do D&amp;amp;D prep in Obsidian as I prepare for my D&amp;amp;D 5e game. I also show my setup using plugins like Obsidian Templater, Callouts, Leaflet, QuickAdd, Buttons, Initiative Tracker, and more.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/0ohV4CpXX5w?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Why You Should Move to Another Country</title><link>https://nicolevanderhoeven.com/blog/20220722-why-you-should-move-to-another-country/</link><pubDate>Fri, 22 Jul 2022 19:00:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220722-why-you-should-move-to-another-country/</guid><description>&lt;p&gt;If you&amp;rsquo;re wondering why I&amp;rsquo;ve lived in 5 countries, here&amp;rsquo;s a video to explain it. Living abroad is something I do intentionally, and with an eye on how it would affect me financially. 5 countries might sound extreme, but I&amp;rsquo;ve enjoyed every one! Every country has its taxation quirks, but doing the research will reveal a lot of opportunities to live the life you want while effectively earning more.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oUMk5jejTfU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Workload Modeling for Performance Testing (k6 Office Hours #57)</title><link>https://nicolevanderhoeven.com/blog/20220722-koh57-workload-modeling-for-performance-testing/</link><pubDate>Fri, 22 Jul 2022 17:00:05 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220722-koh57-workload-modeling-for-performance-testing/</guid><description>&lt;p&gt;What exactly is workload modeling for performance testing, and why is it so important? In this video, Leandro Melendez and I talk about the shape of your load profile, why increasing the number of users may not be enough, and how you can make your load tests more realistic.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mWqlZAyRXr0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Creating k6 Scripts With the Browser Recorder and IDE</title><link>https://nicolevanderhoeven.com/blog/20220721-creating-k6-scripts-with-the-browser-recorder-and-ide/</link><pubDate>Thu, 21 Jul 2022 14:33:05 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220721-creating-k6-scripts-with-the-browser-recorder-and-ide/</guid><description>&lt;p&gt;In this video, I talk about creating k6 scripts with the browser recorder and by using your favorite IDE. Scripts in k6 can be created through the Test Builder on the k6 Cloud, but sometimes you just want to hit record instead of starting from scratch. Also in this video is a rundown on the basics of using the k6 CLI and some important commands for running tests locally and on the cloud&amp;ndash; right from your command line.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jEfrw5x2Cbk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Why Is Everyone Talking About Chaos Engineering? (k6 Office Hours #56)</title><link>https://nicolevanderhoeven.com/blog/20220715-koh56-why-is-everyone-talking-about-chaos-engineering/</link><pubDate>Fri, 15 Jul 2022 18:00:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220715-koh56-why-is-everyone-talking-about-chaos-engineering/</guid><description>&lt;p&gt;Why is everyone talking about chaos engineering anyway? How different is it from testing? What does it have to do with performance? In this k6 Office Hours, k6 Technical Program Manager Vince Huang joins me and my colleague, Paul Balogh, to talk about these topics and more.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GXEB2LZ4wfw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Introducing Popout Windows for Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220715-popout-windows-for-obsidian/</link><pubDate>Fri, 15 Jul 2022 16:00:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220715-popout-windows-for-obsidian/</guid><description>&lt;p&gt;Obsidian Desktop v0.15.6 has just released, and with it is a new feature: popout windows for Obsidian! This gives us the functionality to open multiple windows of the same Obsidian vault&amp;ndash; great for anyone who&amp;rsquo;s been running out of visible space while working on their personal knowledge management system.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TiVVFBhkJU4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to migrate to Kubernetes, with Carlos Ruiz Lantero (k6 Office Hours #55)</title><link>https://nicolevanderhoeven.com/blog/20220708-koh55-how-to-migrate-to-kubernetes/</link><pubDate>Fri, 08 Jul 2022 17:00:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220708-koh55-how-to-migrate-to-kubernetes/</guid><description>&lt;p&gt;k6 Cloud Backend developer Carlos Ruiz Lantero joins Developer Advocates Nicole van der Hoeven and Paul Balogh to discuss how to migrate to Kubernetes. Carlos has been working on migrating k6 Cloud services from ECS to EKS, and in this video, he shares his best practices for migration and things he wishes he&amp;rsquo;d done differently.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wPX0QP45Yo4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>June 2022 Patreon Q&amp;A</title><link>https://nicolevanderhoeven.com/blog/20220708-june-patreon-q-and-a/</link><pubDate>Fri, 08 Jul 2022 16:00:39 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220708-june-patreon-q-and-a/</guid><description>&lt;p&gt;So you&amp;rsquo;re using Obsidian Templater, but what do you do when your template changes? What is YNAB? How do you use daily notes in workspaces? How do you process emails? These questions were sourced from the awesome &lt;a href="https://patreon.com/nicolevdh"&gt;Patreons&lt;/a&gt; that support these videos. Thanks to you all!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3HsZm5owieg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Regular Reviews With Obsidian Periodic Notes</title><link>https://nicolevanderhoeven.com/blog/20220701-regular-reviews-with-obsidian-periodic-notes/</link><pubDate>Fri, 01 Jul 2022 16:09:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220701-regular-reviews-with-obsidian-periodic-notes/</guid><description>&lt;p&gt;The Obsidian Periodic Notes plugin is the best way to do regular reviews. It allows you to create daily, weekly, monthly, quarterly, and yearly note templates to automate the process of doing personal retrospectives.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5Uxj0XgMp0k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Use Maps in Obsidian - Leaflet and Kanban</title><link>https://nicolevanderhoeven.com/blog/20220624-how-to-use-maps-in-obsidian/</link><pubDate>Fri, 24 Jun 2022 17:00:54 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220624-how-to-use-maps-in-obsidian/</guid><description>&lt;p&gt;I share how to use maps in Obsidian using the Obsidian Leaflet and Kanban plugins, specifically for planning a move to another country. Using a map and marking places on it is a great way to keep track of your exploration of a country when you&amp;rsquo;re not quite sure where to live yet!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/BQglSUCKpho?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to create things with your notes</title><link>https://nicolevanderhoeven.com/blog/20220617-use-it-or-lose-it/</link><pubDate>Fri, 17 Jun 2022 17:37:14 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220617-use-it-or-lose-it/</guid><description>&lt;p&gt;What do you do with all those notes? In this presentation, I talk about how to create things with your notes. I demonstrate my process of going from raw notes to this very presentation and share some of my strategies for creating output with little effort by learning in public and identifying topics to create content about using existing notes.&lt;/p&gt;
&lt;p&gt;On May 19th, I did a talk at the &lt;a href="https://nicolevanderhoeven.com/blog/20220519-use-it-or-lose-it/"&gt;Linking Your Thinking Conference&lt;/a&gt; about using your notes (or losing them), and about what we can do to make something useful of all our notes. This was my run through!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/4zrs_vVRwD4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>DevOps Paradox: Performance Testing With k6</title><link>https://nicolevanderhoeven.com/blog/20220608-performance-testing-with-k6/</link><pubDate>Wed, 08 Jun 2022 17:40:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220608-performance-testing-with-k6/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/DarinPope"&gt;Darin Pope&lt;/a&gt; and &lt;a href="https://twitter.com/vfarcic"&gt;Viktor Farcic&lt;/a&gt; from the &lt;a href="https://www.devopsparadox.com/"&gt;DevOps Paradox podcast&lt;/a&gt; and the &lt;a href="https://www.youtube.com/c/DevOpsToolkit"&gt;DevOps Toolkit YouTube channel&lt;/a&gt; invited me onto their show to talk about performance testing with k6, and why it&amp;rsquo;s awesome to be able to write load tests in languages that aren&amp;rsquo;t vendor-specific!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/162-social.webp" alt="DevOps Paradox podcast 162" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.devopsparadox.com/episodes/performance-testing-with-k6-162/"&gt;Listen to the podcast here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Visual Map of Content in Obsidian // Excalidraw plugin</title><link>https://nicolevanderhoeven.com/blog/20220603-visual-map-of-content-in-obsidian-with-excalidraw/</link><pubDate>Fri, 03 Jun 2022 15:30:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220603-visual-map-of-content-in-obsidian-with-excalidraw/</guid><description>&lt;p&gt;Did you know you can create a visual map of content in Obsidian to consolidate your notes? The Excalidraw plugin by Zsolt Viczian can be used to create a dashboard in Obsidian, take sketchnotes instead of text notes, express your ideas visually, and many more. Maps of content are useful for bottom-up thinking, and having a visual representation of your notes can inspire you to consider other perspectives or communicate your ideas in a clearer way.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/erKrXsIwbAg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Be a Gish - API, browser, and chaos testing in one script (ExpoQA 2022)</title><link>https://nicolevanderhoeven.com/blog/20220601-how-to-be-a-gish-expoqa/</link><pubDate>Wed, 01 Jun 2022 14:06:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220601-how-to-be-a-gish-expoqa/</guid><description>&lt;p&gt;For the ExpoQA 2022 conference in Madrid, Spain, I presented a talk about how to be a gish. In this talk, I covered the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;what a gish is, and how it applies to the field of testing&lt;/li&gt;
&lt;li&gt;how testing is a multidisciplinary field, and why generalists triumph over specialists in the face of uncertainty&lt;/li&gt;
&lt;li&gt;how the tool we choose to do our testing informs the type of testing and the type of results we get&lt;/li&gt;
&lt;li&gt;a hands-on example of how to do API load testing, browser automation, and chaos engineering in one script using a tool like &lt;a href="https://k6.io/"&gt;k6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There was no recording of the conference talk, but here is a video of me going through my presentation beforehand:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/aq0XSNcXDb0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;You can find the slides &lt;a href="https://slides.nicolevanderhoeven.com/2022-how-to-be-a-gish/#/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;And here are some photos from the event!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-3.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-1.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/expoqa-4.jpeg" alt="Me speaking at ExpoQA 2022 in Madrid, Spain" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Presentations as Code - How to use Obsidian Advanced Slides</title><link>https://nicolevanderhoeven.com/blog/20220527-presentations-as-code-advanced-slides/</link><pubDate>Fri, 27 May 2022 17:00:03 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220527-presentations-as-code-advanced-slides/</guid><description>&lt;p&gt;The Obsidian Advanced Slides plugin is a great way to create presentations as code (or notes) from right inside your Obsidian vault. Using this plugin has helped me reduce the friction and the time between creating something and sharing it, whether that&amp;rsquo;s a presentation, a coding project, a video, or a blog post.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/LtBK_iNcVEQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Use It or Lose It - Linking Your Thinking Conference</title><link>https://nicolevanderhoeven.com/blog/20220519-use-it-or-lose-it/</link><pubDate>Thu, 19 May 2022 14:03:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220519-use-it-or-lose-it/</guid><description>&lt;p&gt;Today I spoke at the &lt;a href="https://lu.ma/3m1fh781"&gt;Linking Your Thinking&lt;/a&gt; conference about what I do with notes I take, and how I manage to use them to actually create stuff.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SMNSUs6ffnE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;If you&amp;rsquo;d like to see the result for yourself, &lt;a href="https://slides.nicolevanderhoeven.com/2022-use-it-or-lose-it/#"&gt;here are the slides&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>How Real People Process Notes</title><link>https://nicolevanderhoeven.com/blog/20220512-how-real-people-process-notes/</link><pubDate>Thu, 12 May 2022 17:00:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220512-how-real-people-process-notes/</guid><description>&lt;p&gt;There&amp;rsquo;s a glaring gap in most productivity systems: time. How do REAL people, with real jobs and obligations, find the time to process notes? Is Inbox Zero an achievable and sustainable goal? I think the answer is no. In this video, I talk about what to do instead, and what is a healthier way to look at productivity.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6Bbj7xYj3Bc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What Is Grafana Mimir? (k6 Office Hours #53)</title><link>https://nicolevanderhoeven.com/blog/20220506-koh53-what-is-grafana-mimir/</link><pubDate>Fri, 06 May 2022 17:00:28 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220506-koh53-what-is-grafana-mimir/</guid><description>&lt;p&gt;Maintainer Marco Pracucci talks about the new Grafana project, Mimir, a next-generation time-series database for Prometheus. He joins Developer Advocates Nicole van der Hoeven and Paul Balogh to talk about what Mimir is, why it was needed, and how he helped scale it using k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2P1UViYf1mQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using the Obsidian Templater Plugin</title><link>https://nicolevanderhoeven.com/blog/20220505-using-the-obsidian-templater-plugin/</link><pubDate>Fri, 06 May 2022 16:00:22 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220505-using-the-obsidian-templater-plugin/</guid><description>&lt;p&gt;What IS the Obsidian Templater plugin and more importantly, how do you use it? I outline the three main use cases for it, from the simplest to the most complex, to show off its capabilities and usefulness in a personal knowledge management system.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5j9fAvJCaig?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>API load testing using k6, with Tom Miseur (k6 Office Hours #52)</title><link>https://nicolevanderhoeven.com/blog/20220429-koh52-api-load-testing-using-k6/</link><pubDate>Fri, 29 Apr 2022 17:00:26 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220429-koh52-api-load-testing-using-k6/</guid><description>&lt;p&gt;In this second part of demonstrating the dogfooding we do at k6, I talk to Tom Miseur, Technical Specialist, who shows how he wrote API load testing scripts with k6 to test k6 Cloud&amp;ndash; and what his results were after his testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D8Ax-ONLJLo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Actually Getting Things Done With Obsidian - Checklist plugin</title><link>https://nicolevanderhoeven.com/blog/20220429-actually-getting-things-done-with-obsidian/</link><pubDate>Fri, 29 Apr 2022 16:00:31 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220429-actually-getting-things-done-with-obsidian/</guid><description>&lt;p&gt;The Getting Things Done methodology is showing its age now, but there are still some parts of it that can be updated and used in the digital age. In this video, I talk about how to actually get things done with Obsidian using the Obsidian community plugin called Checklist.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ODhHTngIMJE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>End-to-end browser testing using xk6-browser, with Thomas Wikman (k6 Office Hours #51)</title><link>https://nicolevanderhoeven.com/blog/20220422-koh-51-end-to-end-browser-testing-with-k6/</link><pubDate>Fri, 22 Apr 2022 17:00:12 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220422-koh-51-end-to-end-browser-testing-with-k6/</guid><description>&lt;p&gt;Have you ever wondered how to test a platform built for testing other products? Our frontend developer, Thomas Wikman, joins us on k6 Office Hours to talk about his experience being a user of one of our tools - xk6-browser - and how he uses it to test the entire k6 Cloud frontend.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UtMJfasNjSY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Obsidian task management with Dataviewjs, Templates, Daily Notes</title><link>https://nicolevanderhoeven.com/blog/20220420-obsidian-task-management-with-dataview/</link><pubDate>Wed, 20 Apr 2022 17:00:25 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220420-obsidian-task-management-with-dataview/</guid><description>&lt;p&gt;Ever wanted to use Obsidian for managing your tasks? In this video, I demonstrate one way to consolidate tasks from all your notes and show them on the date they&amp;rsquo;re due, using DataviewJS. Obsidian Dataview is a community plugin that can be used to show a task list.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ccN5vJzXwvo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Use the Obsidian Dataview Plugin</title><link>https://nicolevanderhoeven.com/blog/20220413-how-to-use-the-obsidian-dataview-plugin/</link><pubDate>Wed, 13 Apr 2022 17:00:06 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220413-how-to-use-the-obsidian-dataview-plugin/</guid><description>&lt;p&gt;What even IS Obsidian Dataview? Dataview has quickly become one of the most popular plugins for Obsidian, but how do you actually use it? Whether you&amp;rsquo;re a non-programmer or an expert coder, here&amp;rsquo;s how to use the Obsidian Dataview plugin and some common use cases for it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/JTObSymEvWA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Run a Load Test With the k6 Cloud Test Builder</title><link>https://nicolevanderhoeven.com/blog/20220412-how-to-run-a-load-test-with-the-k6-cloud-test-builder/</link><pubDate>Tue, 12 Apr 2022 17:00:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220412-how-to-run-a-load-test-with-the-k6-cloud-test-builder/</guid><description>&lt;p&gt;In this video, I demonstrate how to create and run a load test from scratch without coding, using k6 Cloud&amp;rsquo;s Test Builder. k6 Cloud is a load testing platform as a service, and you can run 50 &lt;a href="https://app.k6.io/account/register"&gt;free load tests on the cloud here&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3ZFGyp-gHoA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The dev behind the Obsidian TTRPG plugins - Jeremy Valentine</title><link>https://nicolevanderhoeven.com/blog/20220409-jeremy-valentine-and-his-obsidian-plugins/</link><pubDate>Sat, 09 Apr 2022 19:00:57 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220409-jeremy-valentine-and-his-obsidian-plugins/</guid><description>&lt;p&gt;Jeremy Valentine is the developer behind 13 Obsidian plugins, including 5e statblocks, Admonition, Dice Roller, Fantasy Calendar, Initiative Tracker, Leaflet, and more, and he joins me today to talk about all things Obsidian, plugin development, and maybe even what he&amp;rsquo;s working on next&amp;hellip;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2Jm5lZWy-0Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load testing results in the k6 Cloud App for Grafana, with Edgar Fisher (k6 Office Hours #49)</title><link>https://nicolevanderhoeven.com/blog/20220408-koh-49-load-testing-results-in-k6-cloud-app/</link><pubDate>Fri, 08 Apr 2022 18:00:18 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220408-koh-49-load-testing-results-in-k6-cloud-app/</guid><description>&lt;p&gt;There are many ways to get k6 load testing results into Grafana, but our frontend software engineer, Edgar Fisher, talks to us about the easiest way of them all: the new k6 Cloud App for Grafana.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bt6civUmHUU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>TestOps Ask Me Anything on Devops Toolkit</title><link>https://nicolevanderhoeven.com/blog/20220407-testops-ama-on-devops-toolkit/</link><pubDate>Thu, 07 Apr 2022 18:00:30 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220407-testops-ama-on-devops-toolkit/</guid><description>&lt;p&gt;I joined my friend Viktor Farcic on his channel, DevOps Toolkit, to do an Ask Me Anything on the topic of TestOps.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IRAa81s3WQQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;We ended up talking a lot about &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;, different &lt;a href="https://grafana.com"&gt;Grafana Labs&lt;/a&gt; open-source projects, and what performance testing has to do with DevOps and Site Reliability Engineering.&lt;/p&gt;</description></item><item><title>Notion vs Obsidian - Databases vs Dataview</title><link>https://nicolevanderhoeven.com/blog/20220406-notion-vs-obsidian/</link><pubDate>Wed, 06 Apr 2022 17:00:26 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220406-notion-vs-obsidian/</guid><description>&lt;p&gt;Notion and Obsidian are similar in many ways, but they have a fundamental difference in philosophy and the way they structure notes. In this video, I talk about structure as well as Notion databases vs. Obsidian&amp;rsquo;s Dataview plugin, and tell you why I ultimately ended up with Obsidian.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/AhhFLXfldJQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Building Reliable Systems With k6 (k6 Office Hours #48)</title><link>https://nicolevanderhoeven.com/blog/20220401-koh48-building-reliable-systems-with-k6/</link><pubDate>Fri, 01 Apr 2022 10:02:29 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220401-koh48-building-reliable-systems-with-k6/</guid><description>&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, my colleague Pandurovic, an engineering manager/backend lead at k6, joined &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and me to talk about how k6 works on the backend, and how the backend team is working to make it even more reliable.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Eex7KHNaxeU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Working in Devrel Chat (with Gift Egwuenu)</title><link>https://nicolevanderhoeven.com/blog/20220331-working-in-devrel-chat/</link><pubDate>Thu, 31 Mar 2022 09:58:46 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220331-working-in-devrel-chat/</guid><description>&lt;p&gt;My good friend &lt;a href="https://www.youtube.com/channel/UCgUgg53iJX1pdabUxpkgozA"&gt;Gift Egwuenu&lt;/a&gt;, a Developer Advocate at &lt;a href="https://cloudflare.com"&gt;Cloudflare&lt;/a&gt;, invited me to a livestream on her channel to talk about what Developer Advocacy is, what I do at k6, and how we both got started in the Netherlands. Gift and I have a lot in common, so I was happy to be on her channel!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Zvju5J0MNwQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>New in Obsidian: Obsidian Callouts (available now)</title><link>https://nicolevanderhoeven.com/blog/20220330-new-in-obsidian-obsidian-callouts/</link><pubDate>Wed, 30 Mar 2022 17:36:20 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220330-new-in-obsidian-obsidian-callouts/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TqYQ0kA1yAo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Transcript:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One thing I&amp;rsquo;ve learned from writing technical documentation in the last few years is that good writing is skimmable, at least in the digital age. So since I look at my notes in Obsidian the same way as I do a sort of personal documentation, I think that a lot of the same principles apply.&lt;/p&gt;
&lt;p&gt;Today I wanna talk about an early access feature that the Obsidian team rolled out two weeks ago, and it&amp;rsquo;s called Callouts. So before I demonstrate this, I want to say that this is only available right now in the Insider Build version 0.14, but that build always gets pushed to the public, it&amp;rsquo;s just a little bit ahead of the public release. So think of this as a bit of a sneak preview. &lt;em&gt;(Note: Obsidian callouts is &lt;a href="https://help.obsidian.md/How+to/Use+callouts"&gt;out now&lt;/a&gt;!)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-about-obsidian-admonition"&gt;What about Obsidian Admonition?&lt;/h2&gt;
&lt;p&gt;Now, before Obsidian Callouts was released, I was using something called Obsidian Admonition. So if we go here, I can bring up my Obsidian Admonition page, and it looked something like this.&lt;/p&gt;
&lt;p&gt;You would do three backticks. That&amp;rsquo;s kind of the code block syntax. And you would do something like add note. Maybe you&amp;rsquo;d have a title here, like reminder, and then you&amp;rsquo;d have your note here. And because I have Live Preview turned on, if I enter out of this, it&amp;rsquo;s going to look like this. So this is what Obsidian Admonition always looked like.&lt;/p&gt;
&lt;p&gt;So in general, the idea here is that to make your writing more skimmable, you have these kind of, well, callout boxes that highlight sections of your text and make sure that they address something that is about the notes that you&amp;rsquo;re writing, kind of like meta notes, they&amp;rsquo;re notes about your notes, but because they&amp;rsquo;re visually distinguished from the rest of the text, it&amp;rsquo;s a lot easier for you or for your readers to easily figure out whether something is important to read or only in specific situations.&lt;/p&gt;
&lt;h3 id="admonitioncallout-example"&gt;Admonition/callout example&lt;/h3&gt;
&lt;p&gt;And that happens a lot in technical documentation, so it&amp;rsquo;s no secret that I have used it a lot in sort of programming kind of notes. So if we go back to my vault here, let&amp;rsquo;s look at &lt;a href="https://notes.nicolevanderhoeven.com/g"&gt;my note on g&lt;/a&gt;. g is a package manager for Go, the language.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s a type of callout or admonition that I used. And this is kind of like this page tells you how to use, what g is and how to use it. But this note, this particular callout, is kind of like an aside. It&amp;rsquo;s like, hey, just in case you get this error, here&amp;rsquo;s how to troubleshoot it. And it&amp;rsquo;s really cool that it&amp;rsquo;s hidden by, it&amp;rsquo;s collapsed by default. And you can just click on that, and then it says, oh, if you get the error, g not found, hey, maybe restart your shell session after installation.&lt;/p&gt;
&lt;p&gt;So that sort of callout really helps when you&amp;rsquo;re trying to quickly skim a page. So programming is certainly one use for it, and another one is tutorials in general. You know, I have this a lot for my Obsidian stuff in case I need to say that this only works for Mac or this only works for windows or something like that.&lt;/p&gt;
&lt;p&gt;And I also use it a lot in my D&amp;amp;D games. As a Dungeon Master, I have different scenarios that I may not even need to go into depending on what my players decide to do. That is the perfect task for callouts or for admonitions.&lt;/p&gt;
&lt;h2 id="enter-obsidian-callouts"&gt;Enter Obsidian Callouts&lt;/h2&gt;
&lt;p&gt;So I was using this admonitions format with a code block for, basically, since I learned about it. It is made by a TTRPG plugin developer called Jeremy Valentine, and he&amp;rsquo;s made a lot of very popular ones, like the Dice Roller and the Initiative Tracker and Leaflet, and it just goes on and on. But I&amp;rsquo;m digressing.&lt;/p&gt;
&lt;p&gt;This plugin was apparently so good that even the Obsidian team realized that it really should be part of Obsidian, because a key part of Obsidian&amp;rsquo;s functionality is documentation.&lt;/p&gt;
&lt;p&gt;So the big release is that they&amp;rsquo;ve now incorporated Admonitions-like functionality into core Obsidian, not a core plugin, so it&amp;rsquo;s not something that you even have to install or enable, it just ships by default with Obsidian, which is really awesome.&lt;/p&gt;
&lt;h2 id="how-to-use-obsidian-callouts"&gt;How to use Obsidian Callouts&lt;/h2&gt;
&lt;p&gt;So let&amp;rsquo;s look into how to use it. I&amp;rsquo;m going to go to my Obsidian Callouts page here. And the syntax is a little bit different from the admonitions one. Instead of the code blocks with the three backticks, this callouts functionality now uses blockquotes.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;&amp;gt; &lt;/span&gt;&lt;span style="font-style:italic"&gt;[!info] Your title
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;&amp;gt; &lt;/span&gt;&lt;span style="font-style:italic"&gt;The contents of your note here
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So you do a single blockquote like an arrow, and then you do brackets, and then an exclamation point. And then there are a bunch of different types, which we&amp;rsquo;ll get into, but the most common one, I guess, is note. Then you would put your title here, and then you can put the rest of the note here. So this is now doing it as a blockquote. And if I exit out of that, you&amp;rsquo;ll see that it has a nice icon of a kinda pencil or pen there, and it is visually distinguished from the rest of the note.&lt;/p&gt;
&lt;h2 id="types-of-callouts"&gt;Types of Callouts&lt;/h2&gt;
&lt;h3 id="note"&gt;note&lt;/h3&gt;
&lt;p&gt;Now, let&amp;rsquo;s go into the types, &amp;lsquo;cause there are a few of them.&lt;/p&gt;
&lt;p&gt;The first one I already showed you, this is a note. I put this within code blocks just to show you the syntax. And then this is what it looks like. Basically, this is the standard format of callouts, you just change whatever&amp;rsquo;s here. And then you always put the title outside of the brackets, and then the content of the note below it. So this is what a note looks like. That&amp;rsquo;s probably the most common.&lt;/p&gt;
&lt;h3 id="abstract-summary-tldr"&gt;abstract, summary, tldr&lt;/h3&gt;
&lt;p&gt;And then another one is abstract, summary, or TLDR.&lt;/p&gt;
&lt;p&gt;Now, all of these are the same, so like this is a TLDR, so I can actually edit it here as well. So here in this case, I was using TLDR, but if I do abstract, it&amp;rsquo;s going to look, actually, it looks a little bit different now that I think about it I thought it was going to look the same, but it&amp;rsquo;s also dependent on the theme that you&amp;rsquo;re using.&lt;/p&gt;
&lt;p&gt;Yeah, so these three are actually different, even though they&amp;rsquo;re semantically the same. Well, that&amp;rsquo;s interesting. I just literally found that out right now as well.&lt;/p&gt;
&lt;h3 id="info-todo"&gt;info, todo&lt;/h3&gt;
&lt;p&gt;And there&amp;rsquo;s info and todo. So this I believe is the todo. And if I go to info, it looks slightly different, just has a little eye here.&lt;/p&gt;
&lt;p&gt;This is what I use for descriptions. What we call it in TTRPG is what we call box text, when players enter a new scene and there&amp;rsquo;s a part that you read out word for word, rather than improvising it. This is what I use for it.&lt;/p&gt;
&lt;h3 id="tip-hint-important"&gt;tip, hint, important&lt;/h3&gt;
&lt;p&gt;Then you have tips, hint, tip, hint, or important. This one is a tip.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s see what important looks like. All right. Yeah, all right. So there&amp;rsquo;s some highlighting going on there as well, and it&amp;rsquo;s marked by an asterisk.&lt;/p&gt;
&lt;h3 id="success-check-done"&gt;success, check, done&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s success, check, done. I particularly like, I think it was done. It&amp;rsquo;s kind of like the todo had a checkbox. This one actually has the check.&lt;/p&gt;
&lt;h3 id="questions-help-faq"&gt;questions, help, faq&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s questions, help, or faq.&lt;/p&gt;
&lt;h3 id="warning-caution-attention"&gt;warning, caution, attention&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s warning, caution, or attention, which is what I use for errors or gotchas when you&amp;rsquo;re programming or something things that you might fall into that I want to call out, because I did fall into it.&lt;/p&gt;
&lt;h3 id="fail-failure-missing"&gt;fail, failure, missing&lt;/h3&gt;
&lt;p&gt;And there&amp;rsquo;s also fail, failure, and missing. So this is all bad stuff, essentially.&lt;/p&gt;
&lt;h3 id="danger-error"&gt;danger, error&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s danger, error. It looks like this with a little lightning symbol.&lt;/p&gt;
&lt;h3 id="bug"&gt;bug&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s bug, which I use quite a bit when I&amp;rsquo;m reporting bugs or documenting bugs, anyway. This example, which kind of looks like abstract, actually.&lt;/p&gt;
&lt;h3 id="quote-cite"&gt;quote, cite&lt;/h3&gt;
&lt;p&gt;Quote, and cite, which is kind of a blockquote, except a little bit fancier.&lt;/p&gt;
&lt;h2 id="collapsing-and-expanding-callouts"&gt;Collapsing and expanding callouts&lt;/h2&gt;
&lt;p&gt;So as you can see, there are a lot of different types of callouts. And aside from all of those, you can also choose whether it&amp;rsquo;s collapsed or expanded, and that&amp;rsquo;s kind of the folding behavior that I showed you earlier. So let&amp;rsquo;s just do that now as well.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to say bug, and I&amp;rsquo;ll say bug detected, let&amp;rsquo;s say. And this time though, where just before the title, right outside of the parenthesis for the type that I&amp;rsquo;m using, I&amp;rsquo;m going to type a minus. And I&amp;rsquo;ll put, this is a bug. And I get out of that. This is what it looks like.&lt;/p&gt;
&lt;p&gt;So it is very different from this one where it&amp;rsquo;s just expanded by default, that&amp;rsquo;s a default behavior, but if you add the minus there, that means that you&amp;rsquo;re saying that this must be minimized or collapsed by default. So then you can always click on that, and look, you see what was in the text there. You can also specify that it&amp;rsquo;s always expanded by default, but it already is always expanded by default, so you don&amp;rsquo;t really have to set that, unless you&amp;rsquo;ve changed the settings.&lt;/p&gt;
&lt;h2 id="benefits-of-obsidian-callouts"&gt;Benefits of Obsidian Callouts&lt;/h2&gt;
&lt;h3 id="better-documentation"&gt;Better documentation&lt;/h3&gt;
&lt;p&gt;So this is a really cool and easy way of having these different colors. I know a lot of people that have come from Notion are kind of missing some of that in Obsidian. Well, this is an easy way to do that.&lt;/p&gt;
&lt;h3 id="ability-to-modify-callouts"&gt;Ability to modify callouts&lt;/h3&gt;
&lt;p&gt;And you can also change how it looks by modifying either the CSS of the theme or by selecting themes that just really use it and display it to its advantages.&lt;/p&gt;
&lt;p&gt;This theme here that I&amp;rsquo;m using is, let me check that, because I&amp;rsquo;m sure that people will ask. This is one of the gems of the year, one of the themes that won, it&amp;rsquo;s called Primary. Yeah, it&amp;rsquo;s really cool, and it&amp;rsquo;s on the light setting. This is a test vault.&lt;/p&gt;
&lt;h3 id="callouts-are-native-on-obsidian-publish"&gt;Callouts are native on Obsidian Publish&lt;/h3&gt;
&lt;p&gt;And one of the coolest things about this new callouts feature is that it now works natively on Obsidian Publish. So I use Obsidian Publish for my public Obsidian vault, that&amp;rsquo;s &lt;a href="https://notes.nicolevanderhoeven.com/Obsidian+Callouts"&gt;notes.nicolevanderhoeven.com&lt;/a&gt;. There&amp;rsquo;ll be a link in the description if you want to see what that looks like. It&amp;rsquo;s basically my way of learning in public. And I select different notes to publish on there for people to see, for anybody to see.&lt;/p&gt;
&lt;p&gt;Now, for a long time, admonitions, because it&amp;rsquo;s a plugin, wouldn&amp;rsquo;t show up up there. And then there was a way to do it where you can change the CSS and then kind of do it that way, but now that callouts is in core Obsidian, you don&amp;rsquo;t even have to do that. It&amp;rsquo;s just going to work right out of the box. So all of your notes that have the Obsidian callout syntax on them will show up the same way in your Obsidian Publish site, which is really awesome.&lt;/p&gt;
&lt;h2 id="why-did-the-format-change-from-admonition-to-callouts"&gt;Why did the format change from Admonition to callouts?&lt;/h2&gt;
&lt;p&gt;So you might think, this is really just a format change, right? From admonition to callout, and part of it is that. I asked about why they changed the format, and the answer was that having the blockquote format falls back to blockquotes in unsupported Markdown renderer.&lt;/p&gt;
&lt;h3 id="new-format-works-better-even-if-callouts-arent-supported"&gt;New format works better even if callouts aren&amp;rsquo;t supported&lt;/h3&gt;
&lt;p&gt;So for example, if you&amp;rsquo;re reading this note in an ID and IDE that doesn&amp;rsquo;t support that syntax, it&amp;rsquo;s at least still just going to look like a blockquote, which does make more sense than it looking like a code block, because you might not have code there. This is not just for code, this is for any sort of like sticky note that you wanna put on your notes.&lt;/p&gt;
&lt;h3 id="markdown-inside-blockquotes-gets-parsed"&gt;Markdown inside blockquotes gets parsed&lt;/h3&gt;
&lt;p&gt;And also because it just uses blockquotes, this means that all of the Markdown inside it also gets parsed, including links and embeds and even Dataview queries apparently.&lt;/p&gt;
&lt;p&gt;And that also means that spellcheck can check it. Because if you put something in a code block, that&amp;rsquo;s kind of a signal for spellchecks not to have a look at the contents of that code block.&lt;/p&gt;
&lt;h2 id="does-this-completely-replace-obsidian-admonition"&gt;Does this completely replace Obsidian Admonition?&lt;/h2&gt;
&lt;p&gt;So, what happens with admonition? Because it&amp;rsquo;s been around for a while, it&amp;rsquo;s actually still up. And in fact, admonition-style code blocks will continue to work. They&amp;rsquo;re now supporting, Obsidian is now supporting both the callouts and admonition if you have admonition plugin still enabled, then you&amp;rsquo;re still going to be able to use both. So it&amp;rsquo;s not like it&amp;rsquo;s going away, but you should probably use the callout syntax going forward, just because that&amp;rsquo;s what everyone&amp;rsquo;s going to be developing based off of.&lt;/p&gt;
&lt;h3 id="admonition-can-convert-between-formats"&gt;Admonition can convert between formats&lt;/h3&gt;
&lt;p&gt;So there is also another thing that admonition is going to do is it does conversion. So if you have existing code block admonitions, then those can be converted to callouts. Actually, I want to show where you can find that.&lt;/p&gt;
&lt;p&gt;So if you go to settings here and look at admonition, there are a bunch of settings here, but let&amp;rsquo;s look at, yeah, the conversions. You convert MSDoc admonitions to callouts, and you can convert code block admonitions to callouts as well. Now, this will modify your notes, so just be a little bit careful with it. Save a backup or do a push to Git if you save it in a Git repo like I do. But that&amp;rsquo;s what admonition is going to be doing.&lt;/p&gt;
&lt;h3 id="admonition-lets-you-change-callout-appearance"&gt;Admonition lets you change callout appearance&lt;/h3&gt;
&lt;p&gt;And in addition to that, it&amp;rsquo;s also shifted to being able to let you change the appearance of those callouts.&lt;/p&gt;
&lt;p&gt;So it has a bunch of functionality like, do you wanna add drop shadows? And do you want it to be collapsible by default? Because I said that it&amp;rsquo;s expanded by default, but you could change that behavior and toggle it. And then, you could still just expand it on a case-by-case basis. But if you don&amp;rsquo;t specify anything, then it&amp;rsquo;ll just say that it should be collapsed.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s also the add copy button, which is actually really interesting because a lot of times that is something that I just want to copy and paste to like my players or something if I wanna paste a description or if it actually is a code block or some sort of troubleshooting thing, so I enable that. And you can set admonition colors.&lt;/p&gt;
&lt;p&gt;You can also change the icons that are loaded there. So right now, admonition uses the Font Awesome icons. So I was showing you all of these different types of callouts, right? But those are the default ones. And admonition adds the Font Awesome ones as well. And you can even add your own types of icons. So you can load additional icons. There&amp;rsquo;s Octicons and RPG-Awesome, which sounds really interesting, actually.&lt;/p&gt;
&lt;p&gt;And a cool effect of that is we need to do this in admonition syntax, so it&amp;rsquo;s code blocks. Let&amp;rsquo;s say, let&amp;rsquo;s just go with question. This is a question. A cool thing that you can do with admonition is you can do icon, and then choose an icon that isn&amp;rsquo;t already in there. So as an example, I happen to know that there is a Font Awesome icon that&amp;rsquo;s a cloud, so I&amp;rsquo;m just going to put cloud there and then I&amp;rsquo;m going to put, here&amp;rsquo;s the answer. If I go out there, look, now it looks like a little green cloud, so I can change everything about how it looks. This is still in the admonition syntax, though, but it functions the same way as callouts, just extended.&lt;/p&gt;
&lt;p&gt;I really like this for being able to give instructions and then say, you know, this is Apple-only and not for Windows. So that&amp;rsquo;s really cool.&lt;/p&gt;
&lt;h2 id="should-you-keep-using-obsidian-admonition"&gt;Should you keep using Obsidian Admonition?&lt;/h2&gt;
&lt;p&gt;So I guess the question is, and this was my question when I learned about these changes, is it still worthwhile to use admonitions because of all these quality-of-life improvements?&lt;/p&gt;
&lt;p&gt;I think it is, because, don&amp;rsquo;t get me wrong, I&amp;rsquo;m very happy that callouts is part of Obsidian now, that just made sense for an app that is so focused on notes and note-taking and documentation. You really need these different ways to take notes on your notes.&lt;/p&gt;
&lt;h3 id="custom-icons-and-admonition-types"&gt;Custom icons and admonition types&lt;/h3&gt;
&lt;p&gt;But I do think think that admonition is still worthwhile installing and using if you want to delve down into the specifics of this feature. So if you want different icons that make sense to you, but maybe not to other people, this is still the best way to do it.&lt;/p&gt;
&lt;h3 id="user-interface-for-inserting-callouts-or-admonitions"&gt;User interface for inserting callouts OR admonitions&lt;/h3&gt;
&lt;p&gt;Another cool thing that I didn&amp;rsquo;t show, let me show that now, is maybe you don&amp;rsquo;t want to remember the syntax with either with the blockquotes or with the code blocks.&lt;/p&gt;
&lt;p&gt;So with admonition turned on and enable, installed and enabled, you can bring up your command pane, which for me is Command + P, and I&amp;rsquo;m gonna type in admonition, and then you can just either a callout or an admonition and a bunch of other things as well, but I&amp;rsquo;m just going to insert a callout. And if you didn&amp;rsquo;t remember what the types were, they&amp;rsquo;re all here. And this is what they&amp;rsquo;re going to look like.&lt;/p&gt;
&lt;p&gt;Now, as I mentioned, I think these, the ones that I grouped, are actually supposed to look the same without the admonition plugin, it&amp;rsquo;s just that either the admonition plugin or my theme is making them look a little bit different, but these are the standard ones.&lt;/p&gt;
&lt;p&gt;So then you can choose which one you want. You can have the title there. You can choose whether or not it is collapsible. It even shows you a preview. So let&amp;rsquo;s insert that. And look, I didn&amp;rsquo;t have to type out any of that and I didn&amp;rsquo;t have to remember any of that syntax. So that&amp;rsquo;s just a nice little upgrade that you can only get with admonitions.&lt;/p&gt;
&lt;h2 id="obsidian-callouts-is-available-now"&gt;Obsidian callouts is available now&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Note: Obsidian callouts is available for all users for free now!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Again, Obsidian callouts, at the time of this recording, is only available in Insider Build version 0.14, which means you can only get it right now, if you need to get it right now, you&amp;rsquo;d have to pay for the Catalyst plan, which is a one-off $25 fee. I&amp;rsquo;ve paid that just because I wanted to give back to the Obsidian developers for this amazing tool that they just give for free.&lt;/p&gt;
&lt;p&gt;But if you&amp;rsquo;re willing to wait, this feature, like all features, will soon be publicly available, Insiders just get it a little bit earlier. And when that happens, I&amp;rsquo;ll pin a comment in the comments below for this video so that you know when it&amp;rsquo;s available.&lt;/p&gt;
&lt;p&gt;And if you&amp;rsquo;d like to learn about other Obsidian plugins, I do have &lt;a href="https://youtu.be/W7kTtn9empU"&gt;a video on the top 10 Obsidian plugins&lt;/a&gt;, so maybe check that out.&lt;/p&gt;
&lt;p&gt;Thank you for watching!&lt;/p&gt;</description></item><item><title>How to Analyze Load Testing Results with k6 (k6 Office Hours #47</title><link>https://nicolevanderhoeven.com/blog/20220325-koh47-how-to-analyze-load-testing-results-with-k6/</link><pubDate>Fri, 25 Mar 2022 18:00:56 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220325-koh47-how-to-analyze-load-testing-results-with-k6/</guid><description>&lt;p&gt;In this k6 Office Hours, Paul Balogh and I discuss the different ways to turn k6 metrics into graphs for analyzing performance testing results.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IW7I_vWV93A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Process Notes in Obsidian // Readwise Official Obsidian plugin</title><link>https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/</link><pubDate>Wed, 23 Mar 2022 16:00:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220323-how-to-process-notes-in-obsidian-with-readwise/</guid><description>&lt;p&gt;How do you process notes in Obsidian? I demonstrate how to use the Readwise Official Obsidian plugin to go from raw content to notes in a Zettelkasten-like Obsidian vault. &lt;a href="https://readwise.io/nicole"&gt;Sign up for Readwise using my link&lt;/a&gt; and get double the trial period.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Rw1L5sxlnuU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Obsidian Dataview, building a second brain, and more about me // Q&amp;A Livestream</title><link>https://nicolevanderhoeven.com/blog/20220319-obsidian-dataview-livestream/</link><pubDate>Sat, 19 Mar 2022 17:42:54 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220319-obsidian-dataview-livestream/</guid><description>&lt;p&gt;In celebration of reaching 1000 subscribers &lt;a href="https://youtube.com/nicolevanderhoeven"&gt;on my personal channel&lt;/a&gt;, I did a live Q&amp;amp;A where I demonstrated how to use Obsidian Dataview, my personal philosophy about building a second brain, and how I stay organized.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6pGdU4e3A6s?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to Make Kubernetes Clusters Production Ready using Crossplane, with Viktor Farcic (k6 Office Hours #46)</title><link>https://nicolevanderhoeven.com/blog/20220318-koh46-how-to-make-kubernetes-clusters-production-ready-with-crossplane/</link><pubDate>Fri, 18 Mar 2022 17:30:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220318-koh46-how-to-make-kubernetes-clusters-production-ready-with-crossplane/</guid><description>&lt;p&gt;In this video, Viktor Farcic, Paul Balogh and I talk about how to make Kubernetes clusters production-ready. Viktor is a Developer Advocate from &lt;a href="https://www.upbound.io/"&gt;Upbound&lt;/a&gt;, and he demonstrates a solution that ties together &lt;a href="https://crossplane.io"&gt;Crossplane&lt;/a&gt;, &lt;a href="https://grafana.com"&gt;Grafana&lt;/a&gt;, &lt;a href="https://prometheus.io"&gt;Prometheus&lt;/a&gt;, and &lt;a href="https://grafana.com/oss/loki/"&gt;Loki&lt;/a&gt; to deploy and manage clusters in production.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cPVrCNhHo7Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>E-residency Benefits: Why and How to Start a Company in Estonia</title><link>https://nicolevanderhoeven.com/blog/20220316-e-residency-benefits-why-and-how-to-start-a-company-in-estonia/</link><pubDate>Wed, 16 Mar 2022 17:09:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220316-e-residency-benefits-why-and-how-to-start-a-company-in-estonia/</guid><description>&lt;p&gt;In this video, I talk about why I got e-residency four years ago, and how I used it to start a company in Estonia. I also mention a service called &lt;a href="https://www.xolo.io/ref/NICVAN2"&gt;Xolo&lt;/a&gt; that I use to manage my Estonian company and do my taxes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/k0whs1m5OYQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;85,000 people from all over the world are Estonian e-residents. And in 2018, I became one of them. I set up my own Estonian company. And for the last four years I&amp;rsquo;ve been doing some freelance work through it with clients in the U.S. and the EU. In this video, I&amp;rsquo;m gonna talk about why I started an Estonia company, and if you&amp;rsquo;re interested, how you can do it too.&lt;/p&gt;
&lt;h3 id="tax-benefits"&gt;Tax benefits&lt;/h3&gt;
&lt;p&gt;My first reason was taxes. Now, wait, if you are one of those people that think that Estonia is some sort of tax haven, you&amp;rsquo;d be wrong. You&amp;rsquo;re not going to be paying no taxes but you may be paying lower taxes than what you&amp;rsquo;re used to, depending on where you live.&lt;/p&gt;
&lt;p&gt;The Estonian tax system is also simple&amp;ndash; well, simpler than most tax systems. Everything is in English. I personally don&amp;rsquo;t speak Estonian, but I haven&amp;rsquo;t had any difficulty finding out rulings, everything is online and accessible in English via the Estonian government&amp;rsquo;s site.&lt;/p&gt;
&lt;h3 id="control"&gt;Control&lt;/h3&gt;
&lt;p&gt;The second reason I started my company there was control.&lt;/p&gt;
&lt;p&gt;As a freelancer, you may not have as much control over your financial affairs as you would like. The government probably dictates to some extent what you can declare as expenses or how much you get to take as income. There are still rules around that for Estonian companies, but in general I&amp;rsquo;ve found the rules to be way more reasonable and lenient than I would otherwise have to contend with.&lt;/p&gt;
&lt;p&gt;For example, if you&amp;rsquo;re a small business and you choose to reinvest the profit that you&amp;rsquo;ve made into your business, so for example, buying equipment that you need or paying for other sort of operating expenses, then you don&amp;rsquo;t have to pay taxes on that income.&lt;/p&gt;
&lt;h3 id="remote-friendly"&gt;Remote-friendly&lt;/h3&gt;
&lt;p&gt;My third reason is that Estonian companies are set up to be remote friendly.&lt;/p&gt;
&lt;p&gt;That is a very big deal to me, because when I set up a company here in the Netherlands, I had to be here, I had to have a permanent address where I could send correspondence by snail mail and they would piecemeal like my password and little bits of information and other unique IDs that I would later need to lodge my tax returns and other paperwork. There was so much back and forth.&lt;/p&gt;
&lt;p&gt;Estonia isn&amp;rsquo;t like that. Everything is completely online. You do have to still have a physical address for your company, but there&amp;rsquo;s a way around that which I will get to soon.&lt;/p&gt;
&lt;h3 id="the-cool-factor"&gt;The Cool Factor&lt;/h3&gt;
&lt;p&gt;The fourth reason, of course, is, honestly, the cool factor.&lt;/p&gt;
&lt;p&gt;I am very much a proponent of new technologies and being able to take advantage of things that are cool about other countries is something that I&amp;rsquo;m a fan of. So when Estonia set up this e-residency program I was pretty sure that I was going to be applying for e-residency, even if I didn&amp;rsquo;t go ahead with my company.&lt;/p&gt;
&lt;p&gt;I think this is the way of the future. And I can&amp;rsquo;t wait to see how many more countries are going to do it, following in Estonia&amp;rsquo;s footsteps.&lt;/p&gt;
&lt;h3 id="should-you-manage-your-company-yourself"&gt;Should you manage your company yourself?&lt;/h3&gt;
&lt;p&gt;So that&amp;rsquo;s why I started a company, but usually it&amp;rsquo;s the logistics around actually starting it that are more difficult than the decision itself.&lt;/p&gt;
&lt;p&gt;I am a kind of person who prefers to do everything on her own. Just to give you an idea, I do my taxes, my husband&amp;rsquo;s taxes and company taxes here in the Netherland in Dutch. I specifically got lessons on reading the tax code in the Netherlands in Dutch. I also do it for Australia because we still have a property there and some other things.&lt;/p&gt;
&lt;p&gt;And so I&amp;rsquo;m telling you this to say, I am not one to shy away from reading tax laws of another country, getting up to speed, and doing it myself. I&amp;rsquo;ve found that that is often not just the most cost efficient way, but actually the best way to maximize it because nobody else cares about my finances more than me. That&amp;rsquo;s not the strategy that I took with Estonia. I actually have hired a company to do that for me which is quite unusual, and they&amp;rsquo;re called &lt;a href="https://www.xolo.io/ref/NICVAN2"&gt;Xolo&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="what-does-xolo-do"&gt;What does Xolo do?&lt;/h3&gt;
&lt;p&gt;Quick disclaimer here, this is not sponsored by Xolo or anybody else. I haven&amp;rsquo;t spoken to them. They don&amp;rsquo;t know I&amp;rsquo;m making this video. My communications with them have been related to my personal financial circumstances. So they in no way had anything to do with what I&amp;rsquo;m about to say.&lt;/p&gt;
&lt;p&gt;The only reason that I&amp;rsquo;m using my referral link is that I think it&amp;rsquo;s actually pretty useful. So the deal is that I get 150 euro if you use the link but you get 265 euro, which is exactly how much it costs for you to start up a company. I mean, if you want to go and try Xolo without using my referral code, please feel free to&amp;ndash; it&amp;rsquo;s xolo.io. But 265 euro is also a lot of money. So it&amp;rsquo;s up to you. I do have an ethics statement about this sort of thing. Basically I will never promote or even talk about a product or service positively unless I&amp;rsquo;ve been consistently using it.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an email from Xolo in 2018, Back when they were still called LeapIn, just to prove to you that I&amp;rsquo;ve actually been using them for four years and heartily recommend their service.&lt;/p&gt;
&lt;p&gt;You can start up an Estonian company all on your own without really any help from any other company, but it will take a lot more work if you&amp;rsquo;re just trying to find the easiest way possible. I&amp;rsquo;ve found that this is it.&lt;/p&gt;
&lt;h3 id="xolos-offerings"&gt;Xolo&amp;rsquo;s offerings&lt;/h3&gt;
&lt;p&gt;Xolo offers a few services. First, they help you with registering your company. So you pay the fee to the state, not to them. It&amp;rsquo;s 265 euro.&lt;/p&gt;
&lt;p&gt;They provide a physical address that your company can use. That includes mail forwarding, if you happen to use that for any company-related or government-related communication.&lt;/p&gt;
&lt;p&gt;They help you with applying for a VAT number if you need that.&lt;/p&gt;
&lt;p&gt;And they also help you with opening up a bank account. Now, I think that there are ways so that you can just use something like PayPal or Wise for your bank account. I did those, but I also chose to have an actual bank account in Estonia. That is the only part in this process where you actually have to be in Tallinn, in Estonia. Personally, I was looking for an excuse to go to Tallinn, so I went there and set one up. It was pretty easy but you can certainly start a company without it.&lt;/p&gt;
&lt;p&gt;The most important thing that Xolo do is that they lodge the taxes for you every year. They give you advice on your company structure. They keep track of your expenses.&lt;/p&gt;
&lt;p&gt;And the best part about Xolo is that everything is done online. They have a really nice web app which is pretty slick and modern and user friendly, and that&amp;rsquo;s what I use to upload my receipts, or if I need something reimbursed or marked as an expense, or if I&amp;rsquo;ve paid for something with my own pocket, and need the company to reimburse me, then everything is just handled for me. I really think that this is one of the selling points because if I have to get on the phone and actually talk to someone and explain something, I&amp;rsquo;m out. I&amp;rsquo;d rather just do it on my own at that point. But in the four years that I&amp;rsquo;ve been with Xolo, I haven&amp;rsquo;t had to be on the phone with them once. Their entire staff corresponds by email promptly and really in a thorough, professional way.&lt;/p&gt;
&lt;h3 id="xolos-pricing"&gt;Xolo&amp;rsquo;s pricing&lt;/h3&gt;
&lt;p&gt;So let&amp;rsquo;s talk pricing. Xolo costs either 49, 79 or 199 euros a month. And that includes all of those services.&lt;/p&gt;
&lt;p&gt;The only thing that&amp;rsquo;s not included is the state fee. And that&amp;rsquo;s something that you pay to the Estonian government. That&amp;rsquo;s the 265 euro to actually get your company registered. You can check that out for yourself on the government site. This is something that you&amp;rsquo;ll have to pay even if you don&amp;rsquo;t go through Xolo.&lt;/p&gt;
&lt;h3 id="step-by-step-process-of-starting-a-company"&gt;Step-by-step process of starting a company&lt;/h3&gt;
&lt;p&gt;So if you wanna start a company in Estonia, here&amp;rsquo;s what you have to do.&lt;/p&gt;
&lt;h4 id="step-1-click-on-my-referral-link-to-sign-up-to-xolo"&gt;Step 1: Click on my referral link to sign up to Xolo&lt;/h4&gt;
&lt;p&gt;First, click on &lt;a href="https://www.xolo.io/ref/NICVAN2"&gt;the referral link&lt;/a&gt; before the end of March. So March 31st, 2022, you have to have clicked the link.&lt;/p&gt;
&lt;p&gt;That doesn&amp;rsquo;t mean that you have to have paid by then. You just have to have clicked it and gone through the signup process to create a completely free account. At this point, there is no obligation that you&amp;rsquo;re going to continue.&lt;/p&gt;
&lt;h4 id="step-2-apply-for-e-residency"&gt;Step 2: Apply for e-residency&lt;/h4&gt;
&lt;p&gt;Secondly, you have to apply for e-residency.&lt;/p&gt;
&lt;p&gt;This is something that you&amp;rsquo;ll have to do directly with the Estonia government&amp;rsquo;s site, which is pretty easy. There&amp;rsquo;s a link below to an application form that you&amp;rsquo;re gonna need to fill out with your information and identification. And then you wait around for, usually it takes less than a month. For me, I think it took a couple of weeks.&lt;/p&gt;
&lt;p&gt;And when it&amp;rsquo;s approved you&amp;rsquo;ll get an email notification asking you to go to your local embassy. So in my case, I applied while I was already in the Netherlands. So I went to the embassy or consulate of Estonia here in the Netherlands just to pick up this ID and get fingerprinted. The e-residency itself costs 120 euro, but it is a one-off fee and you never have to pay for it again.&lt;/p&gt;
&lt;h4 id="pay-for-xolo-leap"&gt;Pay for Xolo Leap&lt;/h4&gt;
&lt;p&gt;And the last step is to pay for a Xolo leap plan before May 31st, 2022.&lt;/p&gt;
&lt;p&gt;So you essentially get two full months to do your e-residency. And it shouldn&amp;rsquo;t really take that time. And if you used my referral link, once you sign up for the plan, then they&amp;rsquo;ll waive the 265 euro that you would need to pay to the state for your company&amp;rsquo;s registration.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s pretty much it. After that, Xolo will tell you how to proceed and give you the options for banking and that, depending on your business&amp;rsquo; unique requirements.&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Please don&amp;rsquo;t take any of this as tax or financial advice because I&amp;rsquo;m not a tax professional and I&amp;rsquo;m not a financial advisor. I am simply sharing my experiences and referring you to experts who will certainly know better than me on Estonian taxation law.&lt;/p&gt;
&lt;p&gt;Having a company in Estonia is an essential part of my strategy for maximizing my freedom and building the life that I want by moving aspects of my life to countries that are best suited for them. This practice is called flag theory. And if you wanna learn more about that, check out this video to see how I use it to improve my life. Thank you for watching. Or as they say in Estonian, I think, &lt;em&gt;aitäh&lt;/em&gt;!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This contains an affiliate link for &lt;a href="https://www.xolo.io/ref/NICVAN2"&gt;Xolo&lt;/a&gt;. That means that if you use the link to sign up for Xolo, you get some money off your plan, and so do I! &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;Read my Ethics Statement&lt;/a&gt; to find out how I decide whether or not to promote a product or service.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Real Browser Testing With xk6-browser</title><link>https://nicolevanderhoeven.com/blog/20220315-real-browser-testing-with-xk6-browser/</link><pubDate>Wed, 16 Mar 2022 16:55:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220315-real-browser-testing-with-xk6-browser/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y04wavsZxSs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Transcript:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Without a doubt, my favorite k6 extension is xk6-browser. xk6-browser finally brings browser test automation to k6. So you don&amp;rsquo;t need to learn a new tool or figure out how to integrate it if you already have load tests. You can create JavaScript-based, browser-driven tests with k6. Here&amp;rsquo;s how.&lt;/p&gt;
&lt;p&gt;Since xk6-browser is an extension, we&amp;rsquo;re gonna need to build a custom version of k6 that includes that extension. And the thing that builds that is called xk6. What I&amp;rsquo;m doing here is I&amp;rsquo;m instructing xk6 to create a build using version 0.35 of k6, that includes xk6-browser. And this is a link to the repository where xk6-browser is stored.&lt;/p&gt;
&lt;h2 id="writing-a-browser-testing-script"&gt;Writing a browser testing script&lt;/h2&gt;
&lt;p&gt;So now that we have a version of k6 that includes xk6-browser, the next step is to create the browser script. Now you can do that in the one script, but just for ease of debugging I&amp;rsquo;m gonna put it in another script for now. We&amp;rsquo;re not going to be using the HTTP requests anymore so I&amp;rsquo;m going to import launcher from k6/x/browser. And I&amp;rsquo;ll save that as browser.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m definitely going to be using sleep, so let me go ahead and import that now as well. We&amp;rsquo;ll also need a default function for this. We&amp;rsquo;re setting up an instance of the launcher that&amp;rsquo;s going to launch Chromium in particular, and we do want to see it so I&amp;rsquo;m going to say &lt;code&gt;headless: false&lt;/code&gt;. If you set this to true, that means that you won&amp;rsquo;t actually see the web browser being driven by the script, which is handy to see during demos. So we&amp;rsquo;ll do that, and then we have to set up the context.&lt;/p&gt;
&lt;p&gt;So browser, oops, new context. And then we set up a page. The first one is go to the homepage. The second one is to view a product. Third, add the product to the cart. Fourth is go to the cart and then last, I want to check out. So to do that, I&amp;rsquo;ve already defined the browser context in page. Now I need to do &lt;code&gt;page.goto http://ecommerce.k6.io&lt;/code&gt; and I will also want to wait for &lt;code&gt;waitUntil: networkidle&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Great. I wanted to add some sort of check to make sure that I&amp;rsquo;ve actually gotten to a place so, let&amp;rsquo;s open up DevTools here and I wanna make sure that some results are displayed. I don&amp;rsquo;t necessarily need, you know 1-12 of 17 but, I want this one. Okay, so I&amp;rsquo;ll also say &lt;code&gt;page.waitForSelector&lt;/code&gt; and that&amp;rsquo;ll be this.&lt;/p&gt;
&lt;p&gt;And then let&amp;rsquo;s do a screenshot, because we just for, just in case we wanna debug later we wanna make sure that we will be able to have a look at at this screenshot to see what exactly went wrong. And I&amp;rsquo;ll put that in screenshots and I&amp;rsquo;ll say &lt;code&gt;01_homepage&lt;/code&gt;. Then let&amp;rsquo;s do a sleep. And I always like to do the random one. Random, and let&amp;rsquo;s say it from zero to four. This time I&amp;rsquo;m doing the custom k6 version &lt;code&gt;browser.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;For browser-based tests, I find it much more useful to actually see what&amp;rsquo;s going on rather than to look at the output. Because as you can see there are all sorts of errors here and I believe that they&amp;rsquo;re actually application errors so they can be a little bit misleading. It looks like that happened but let&amp;rsquo;s just look at the screenshots. Screenshot, yeah. That, that loaded fine. So we can continue.&lt;/p&gt;
&lt;p&gt;Next step is to view a product. Okay, let&amp;rsquo;s go back here. This time I want to click this thing. It doesn&amp;rsquo;t really matter which, which item it is. I&amp;rsquo;ll just choose the first one. Looks like this is the actual product link. So let element = page. And this is where we actually paste the selector which is what I got from DevTools.&lt;/p&gt;
&lt;p&gt;And then we haven&amp;rsquo;t done anything yet with it. We want to actually click it. So &lt;code&gt;element.click&lt;/code&gt;. After that though, I&amp;rsquo;m going to want to make sure that we get to the right page. So, let&amp;rsquo;s see what happens when we click it. What can we look for? I guess we can look for this add to cart button, cuz if the item didn&amp;rsquo;t show up then we wouldn&amp;rsquo;t be able to add it to the cart. So let&amp;rsquo;s grab that. Button, button name is add to cart. Copy that.&lt;/p&gt;
&lt;p&gt;So then I&amp;rsquo;ll say &lt;code&gt;page.waitForSelector&lt;/code&gt;, the selector with a button name there. Take another screenshot because why not? I&amp;rsquo;ll say &lt;code&gt;02_view-product&lt;/code&gt; and then another sleep. From here it was pretty much more of the same. Here&amp;rsquo;s me scripting adding the product to the cart, viewing the cart and then finally going to the checkout page. And here&amp;rsquo;s what happened when I played it all back. Here it is going to the homepage, and then clicking on the first product, and then adding that product to the cart, and then clicking view cart, and then proceeding to checkout.&lt;/p&gt;
&lt;p&gt;The best part about this is that you don&amp;rsquo;t have to choose between the browser test and the protocol test. They&amp;rsquo;re both in k6 and written in JavaScript so you could include them in the same script. You can use stages to schedule when one starts and when one ends. You can change the load profile, add checks and thresholds. And you can also use all of the output options that are available for protocol tests for the browser tests as well.&lt;/p&gt;
&lt;p&gt;The catch is that xk6-browser is really new. We&amp;rsquo;ve just announced it. It&amp;rsquo;s still in beta so you are likely to come across more than a few bugs. However, I&amp;rsquo;d still recommend that you give it a go. I&amp;rsquo;ve been playing around with it and I&amp;rsquo;ve found it more than serviceable for a lot of my use cases. Plus it&amp;rsquo;s just really cool to be able to test front-end performance along with back-end performance in the same testing script.&lt;/p&gt;
&lt;p&gt;Thanks for watching. I will put a link to the xk6-browser repository below and happy testing.&lt;/p&gt;</description></item><item><title>Load Testing for DevOps with Victor Farcic (k6 Office Hours #45)</title><link>https://nicolevanderhoeven.com/blog/20220311-koh45-load-testing-for-devops/</link><pubDate>Fri, 11 Mar 2022 11:12:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220311-koh45-load-testing-for-devops/</guid><description>&lt;p&gt;How can you use load testing for DevOps? What kind of performance testing can or should be included in CI/CD pipelines? Viktor Farcic from Upbound and DevOps Toolkit join Nicole van der Hoeven and Paul Balogh to discuss how he sees k6 fitting into the daily duties of a DevOps engineer.&lt;/p&gt;
&lt;p&gt;{{ youtube xUlNdsr6y_E }}&lt;/p&gt;</description></item><item><title>Why I Chose Obsidian Over Roam Research (as a Roam investor)</title><link>https://nicolevanderhoeven.com/blog/20220309-why-i-chose-obsidian-over-roam/</link><pubDate>Wed, 09 Mar 2022 10:03:41 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220309-why-i-chose-obsidian-over-roam/</guid><description>&lt;p&gt;I was a Roam Research power user, a Believer, and investor before I discovered Obsidian. Here&amp;rsquo;s why I still ended up choosing Obsidian over Roam as my personal knowledge management tool of choice. My goal with this video is to share with you my reasons for making the choice that I did, not to judge you or anyone else who disagrees. In the end, we all have to decide for ourselves what tool fits best in our lives.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/AWUk8-6yG2g?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Private Load Zones for Load Testing (k6 Office Hours #44)</title><link>https://nicolevanderhoeven.com/blog/20220304-koh44-private-load-zones-for-load-testing/</link><pubDate>Fri, 04 Mar 2022 10:01:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220304-koh44-private-load-zones-for-load-testing/</guid><description>&lt;p&gt;Load testing on the cloud definitely has its advantages, but what if you need to load test behind a firewall? Here to talk about using private load zones in k6 are k6 CTO Pawel Suwala and k6 Backend Lead Samuel Regandell. Private load zones are a new feature of k6 Cloud that will allow you to run load tests against applications that are not publicly accessible and also use your own AWS account to generate the load.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sqKc95zdXyI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Basics of Chaos Engineering for Testers</title><link>https://nicolevanderhoeven.com/blog/20220302-basics-of-chaos-engineering-for-testers/</link><pubDate>Wed, 02 Mar 2022 09:59:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220302-basics-of-chaos-engineering-for-testers/</guid><description>&lt;p&gt;What is chaos engineering? And what does it mean for testers? In this video, I go through the basics of chaos engineering from the perspective of a software tester. How can we go about incorporating principles of chaos into our testing activities?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/z1-_R-h2unE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Postman for load testing using k6, with Tim Haselaars (k6 Office Hours #43)</title><link>https://nicolevanderhoeven.com/blog/20220225-koh43-postman-for-load-testing-using-k6/</link><pubDate>Fri, 25 Feb 2022 18:00:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220225-koh43-postman-for-load-testing-using-k6/</guid><description>&lt;p&gt;&lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; is a near-ubiquitous tool for anyone doing API testing, and many teams use collections to create and organize complicated test suites. However, there&amp;rsquo;s one thing that Postman isn&amp;rsquo;t good at: load testing. That&amp;rsquo;s where k6 comes in.&lt;/p&gt;
&lt;p&gt;In this video, &lt;a href="https://twitter.com/timhaselaars"&gt;Tim Haselaars&lt;/a&gt; joined k6 Office Hours to talk to &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and me about how to use Postman collections to run load tests using k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Be66Db4wHLA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone and welcome to another k6 Office Hours. I am Nicole van der Hoeven and today I have two guests. One of them may already be familiar to you, Paul Balogh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hey everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And our special guest is Tim Haselaars. Tim, would you like to introduce yourself?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, hi, nice to meet you Nicole and Paul. I am Tim Haselaars. I&amp;rsquo;m living in Belgium. I&amp;rsquo;m a product manager, and I work at the marketing automation company called Selligent. I have a passion for APIs. I love music, I&amp;rsquo;m a DJ as well in my spare time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And if I still have some spare time left, I like to contribute to a number of open source projects, which the Postman-to-k6 is one of the projects I&amp;rsquo;ve been working on together with the k6 team in the past. So that&amp;rsquo;s a bit of why I&amp;rsquo;m here today. So nice to meet you both.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s a pretty big if though, if you have time, you&amp;rsquo;re a DJ.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s a hobby thing, but I&amp;rsquo;m really proud of it actually, because I&amp;rsquo;ve been playing a lot, and there&amp;rsquo;s one festival in Europe, Tomorrowland, I&amp;rsquo;ve been playing it each year for the past 10 years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, wow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So it&amp;rsquo;s a small stage, but I&amp;rsquo;m really proud of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, that is awesome. You should be proud of that. I think that kind of makes sense, because product management is such a multidisciplinary role as well. Like, it&amp;rsquo;s not all technical, and it&amp;rsquo;s not all people skills. It&amp;rsquo;s a mixture of both, and a lot of other things.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s also what keeps it interesting, at least for me, what keeps it interesting, actually, so yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So what do you typically do in your current job, and what does it have to do with k6?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, in my current job, I&amp;rsquo;m a product manager, so we have a digital platform, marketing automation platform and I&amp;rsquo;m spearheading the API renewal program. So we had a number of APIs in our company which customers use to connect and exchange data with marketing data, and we&amp;rsquo;re renewing that, and performance is critical, because we have a number of really big customers in Europe, or , the Dutch luxury brand, and we talk about huge volume, so our APIs has to be scalable, and performant, and we use k6 to guarantee that we keep them up to standard, actually. So that&amp;rsquo;s what we do. And my role there is to make sure the teams, I help with the API design, and I check with the teams, and I document stuff together with the teams, we try to do that. So what I&amp;rsquo;m going to talk about is also my experience with k6 and the way we use it at the company a bit more.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cool, so how did you first start, what made you start to use k6? Did you try other things before that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. In a previous job, a couple of years ago, I was working at a hosting company, and they were doing a, there was an anniversary of the national lottery, it&amp;rsquo;s like the lottery company, so it had,, they expected a lot of visitors to the website, and we wanted to make sure the hosting was up to par, and it was able to handle the volumes. And I tried to test it, performance test it, load test it, and I used Jmeter, and the experience was, I struggled a lot with it. And I started browsing for another solution, and then I hit, I found k6. text was really nice. You could really quickly start nice documentation, and that&amp;rsquo;s how I rolled into k6. And then I shifted jobs, and at the current job, I said we have to use k6, because it&amp;rsquo;s so much easier than using JMeter. You can script it, you can automate it, and that&amp;rsquo;s it, yeah. I used it once, and never looked back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So nice, with the automation, did you put hook that in your CI/CD pipeline as well?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes we do. I can, I have a diagram. Like, I&amp;rsquo;m really proud of it. Maybe I&amp;rsquo;m a bit, how do you say, biased by it, but I&amp;rsquo;m really proud of what we&amp;rsquo;ve achieved with the automation aspect actually. And we came from a far away, a far place, but now, we have a nice automated flow, actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Which I hope I can showcase a bit later on in the talk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;rsquo;d love to see it. And do you use k6 Cloud or k6 OSS?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We had used Cloud in the past, I think right now, my team are mostly using the OSS version of it. I don&amp;rsquo;t know why. I have to check with them, actually, but I think we had a number of dashboards set up, and they were a bit detailed to what we need, or what I needed at least, and that&amp;rsquo;s why I think we stick with, for now we stick with the OSS version of k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, awesome. So I guess people might be wondering, seeing the title of this video, what Postman has to do with either Selligent or k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, actually that&amp;rsquo;s a story I want to tell, how did we ended up with k6, and the whole story. So what typically happens if you start developing an API is you build your API, and then you want to test it, you want to play around with it. You want to experiment with it. And the first thing that you do as a non-technical user like, I take Postman. Postman is an application where you can model your request in a nice tool, and then you can just fire them. You don&amp;rsquo;t have to a curl script, or you don&amp;rsquo;t have to use any CI tools for making API calls. So that was the logical step. So we build an API, I want to experiment, play around with it, so we ended up using Postman for it. But maintaining Postman is not so easy when you go for automation flows. And then when you want to take a step further, if you want to do performance tests, that&amp;rsquo;s another a thing. And yeah, that&amp;rsquo;s why I think we went from what we did to Postman just the next, as a first phase. But sooner, the more end points we have, the more we wanted to test and the more we wanted to play around with it, the bigger everything became. So that&amp;rsquo;s why, yeah, we wanted to make it an automation level and make it a bit more streamlined so that the manual work would go down a lot.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sounds like you have a fan out in the viewers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. I like to make things visual, because it helps me visualize my thoughts and everything. So yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve used Postman before. I think it&amp;rsquo;s almost ubiquitous now for anyone who&amp;rsquo;s doing any sort of API testing. I think at some point people would&amp;rsquo;ve used Postman just because it is very easy to get started, but I do, I have also run across some of the issues that you describe when you&amp;rsquo;re scaling up, when you have a very complex test suite or you want to have one, it is, I think I personally still like the scripting approach of being able to have the full, you know, being able to have condition loops and that sort of thing. There&amp;rsquo;s still a lot more flexibility when, when you&amp;rsquo;re just dealing with pure code. But I know that I think it was, I mean, relatively recently when I started using Postman, it was just firing off requests, and it was like a single user kind of thing, but what are the features available for performance testing for Postman, you alluded to it, them, and you said that maybe they&amp;rsquo;re not, they weren&amp;rsquo;t exactly what you were looking for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no. Maybe I should quickly show a bit how I&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Work with it if that&amp;rsquo;s okay for you. Okay, I&amp;rsquo;m gonna showcase my, so well, just as a reference, I created fake endpoint and I was set up a Postman collection. So what you do typically in Postman is you have an API that you define. In our case, I created a k6 office hour CRM API, just plain and simple where you can see, yeah, you could see some context you potentially want to interview in the future, and you model them. So you have your endpoint, you just put them in. You say, it&amp;rsquo;s a get post, put, whatever you need, and then you can just fire it and it&amp;rsquo;s response. And so this is an actual API request happening behind the scenes. That&amp;rsquo;s really nice because as a non-technical user, you don&amp;rsquo;t have to have any technical expertise. You just enter the endpoint percent and you&amp;rsquo;re up and running. But it also has some nice features if you want to make complex things, like you said, Nicole, if you want to use variables, because you might want to experiment with your API endpoints in different environments, so you can use variables. That&amp;rsquo;s what they use with the curly brackets here. So it&amp;rsquo;s a base URL. So I can shift around so if I want to switch, I have potentially two environments. I have a production one and a dev one. I can easily switch between them and then the variables will also switch along. That&amp;rsquo;s a really nice thing to do with Postman. The next thing, what I really like about Postman is that you can use it to create cruds and you can create flows with it. So it&amp;rsquo;s really straightforward. So if you say, I want to create one item and then I want to use the item in my detailed call in my, so I have all leads, create a lead and I want to get the leads, so this is the end point, you could just define it as a variable. You could say, I want to, that this lead ID can be used to fetch the right lead ID. So if you create one, that&amp;rsquo;s the body, I do a post request. And what happens is you get a new ID back, which is unique because I just created a new contact in our CRM application. And you can use scripting in Postman to say, ah, there is a data response, and I&amp;rsquo;m gonna store that response in my lead ID variable. So it allows some scripting within a GUI which is really nice, and it also allows you to define tests. Like I want to check what&amp;rsquo;s the response. It should be 200. You can define a Postman test. They use a bit of assertion, kind of syntax for that. So what started out as something really straightforward, I wanted to just test and play around with it, experiment of the endpoints. It became much more. And we started building like a full suite out of Postman, in Postman itself, a test suite. And that&amp;rsquo;s really cool because as a non-technical user, you could just share this collection with anybody on the team and they could just run the same request and play around with it. You can even pass it on to partners or colleagues or customers, when they say, when they want to use your API, you can just say, ah, you can use a Postman collection to play around with it. And another nice thing about Postman is that you can run scenarios, like I said, and you can run them at scale. So right now I&amp;rsquo;m doing get leads, creating a lead. Then I&amp;rsquo;m gonna fetch the lead that I just created. So I created Elon Musk as a user. I can update that one as well. So I can put a body and touch and I can even delete it. So if I would run this in a cycle, I would test actually the whole flow of a typical crud operation. You can fetch one, create one, edit one, delete one, and then it&amp;rsquo;s back to normal again. And so lemme talk about, yeah, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Sorry, I just wanted to, sorry to interrupt, but would it be possible to try and zoom here in this one to see if you can make it just a little bit bigger?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay, something like that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes. Thank you. Sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, no, no worries. So what you can do Postman, if we talk about test automation, you can just say, I want to run all these, these API requests in the sequence, like they&amp;rsquo;re organized here, and you can just run them. So if you run them, you see you put in some test, this one is a success, success, creation successful. And so actually testing if your API&amp;rsquo;s responding as you expected, but you cannot test it at scale or at high volume. The only thing you could do in Postman is if I press run, I could define a number of iterations. So if I would say, I want to do 10 iterations, I&amp;rsquo;m just gonna run them now, so you can see, you can see it just creates blocks. but while I&amp;rsquo;m talking, it took to run all these 10, five times 10 requests, it took me, let&amp;rsquo;s say one minute to run. So we cannot really test at scale if, that&amp;rsquo;s not the use case of Postman. The use case of Postman is to experiment with request, do some testing on some validation of the response and the inputs are okay and that&amp;rsquo;s about it. So I needed something more if you want to do that scale. So while I discovered k6, k6 has this nice scripting language, you could define&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Tim before you, sorry. Before you move on, we do have a question. Chaitra asks, can you share this collection please, just to get along with Postman.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Is there a way that you could share, make that public or something?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can, I haven&amp;rsquo;t tried it, but I guess if I click share and I could, can I create a JSON link? Maybe could JSON link, update the link, maybe like that? I haven&amp;rsquo;t tried this actually before either so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Awesome, we&amp;rsquo;re learning in public.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Exactly. No pressure, no pressure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Oh, should I put it in the comments, or how would I do that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, sure. That would be great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, otherwise I was gonna say we could probably put something together too for after, you know, the presentation if someone wants to access that, if there&amp;rsquo;s no issue with that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Okay, I&amp;rsquo;ll put that in the comments.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So I was asked as well from the k6 team to update our blog post about Postman and k6. So what I&amp;rsquo;m gonna do after this session is going to review the blog post that they have already on the website and then update it with maybe some content that I&amp;rsquo;m talking about in this show here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Great.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] And we also got a comment from Jim Munro who says Postman is definitely not designed for load testing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, no.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] And that&amp;rsquo;s what it seemed like. So it seemed like you could only do iterations. Is that right? You can&amp;rsquo;t set, you can&amp;rsquo;t have more threads or users.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No, that&amp;rsquo;s it. So the only thing you can do is you can run a sequence and you can run it in a number of iterations, but you can, you can&amp;rsquo;t define how many users, you can&amp;rsquo;t define how long iteration, you can define sleep, but that&amp;rsquo;s difficult. So Postman is great for what it is. It&amp;rsquo;s great for testing some of your contracts of your API, is great for experimenting with your API, and really kickstart using your API, but if you want to do volume, to test the volume at scale, I wouldn&amp;rsquo;t recommend Postman at all. But that&amp;rsquo;s also a bit the problem, because you already spent a lot of time making a nice collection, preparing it, grooming it, updating all the time. If you then want to go to k6, you would have to rewrite everything. So if you, this is how k6 syntax looks so you can define your iterations. You know this better than me actually. And you can just use a get request. And you can script your request. You can also check it. So that&amp;rsquo;s the same as you would do in the Postman where you test your response. You could check if it&amp;rsquo;s a 200. But if you have a complex scripts, you can, they become really large to maintain and to keep them up to date. And that&amp;rsquo;s what I struggled with because it felt like I&amp;rsquo;m reinventing the wheel. So I made a diagram out of it just to explain it. So if you have an API and you have to update it, you would have to really update your collection and say, every time something changes an endpoint was added or a property was changed, you needed to update, go into the Postman collection, manually correct everything, extend it, and yeah, keep it up to date. But if you would go to k6, you have twice the work, actually. You have your API that&amp;rsquo;s changing. So you need to update your collection. You need to update your k6 scripts. So if you have five endpoints, that&amp;rsquo;s doable. But if you have 20 endpoints for one API, that&amp;rsquo;s a lot of work to keep them in sync, because this is a moving target, but it forces you to keep in sync to other moving targets because you want to be able to experiment and test them, contract, and you also want to test them at scale with the load. And I was looking really for a way, like how can I leverage this nicely prepared Postman collection and use for k6 scripts? And that&amp;rsquo;s what I, when I ended up with this scenario where you have your API, I update my post collection, I want to generate a k6 script. And I was looking around like, how can I do that? And I found on the k6 website, I found some blog items on, on how that they provided a Postman to k6 converter. And that really triggered me and I started playing around with it. And I really, really liked it. So it gives me all the flexibility of modeling everything in Postman, preparing the whole flow. So if I want to run it in sequence, I could do that. But then it also converted it into a k6 script where I had no maintenance on it, and that was really nice. And when I found the Postman k6 package, like a year ago or something, the purpose of that was to kickstart your k6 experience. And I said, but you can do much more with it. You could even fully automate it with some parameters because the first time I converted my collection, it had like 20 endpoints. I still needed to do add some minor things, I needed to add some k6 specific stuff to it, like how many iterations do I want to do, is there certain parameters I want to add that are not by default converted over. So I said, okay, what can I do to make it even better? And I don&amp;rsquo;t have to touch the k6 script anymore. So the first time that you converted it, I had to modify it still. So each time that I would do this kind of a behavior, the API changes, I need to update my Postman collection and I needed to update my k6 script. I want to, my ideal world would be, I don&amp;rsquo;t have to touch the k6 script at all. I just convert it and I was able to run it in one go. And I can show you how it works, because it&amp;rsquo;s really straightforward in the end.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If it&amp;rsquo;s okay, you can export your collection&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So if you do export, you can just say export and you download a JSON file and you can do the same thing with your own environment. So if you want to have your test environment and you want to also convert them you can because you can also export these from Postman. And what you end up with, I&amp;rsquo;m gonna close this one, you end up with two JSON files. So as you can see, it&amp;rsquo;s the k6 office hours. It has some syntax in it, like the test scripts are there, the endpoints are there, the way you connect to them. So all the request information is in this configuration, in the environment file. You can find all your variables that you have defined. So let me just now showcase it. Sorry, I&amp;rsquo;m gonna, this one. So if you run the Postman-to-k6 converter, it expects actually two things. You define an input, my Postman collection, and you define an output. So if I would run this, just closely watch what happens there, it does some things behind the scenes, and once it&amp;rsquo;s finished, you would get, actually, if things go well, let&amp;rsquo;s see if it&amp;rsquo;s there, you would get this. Yeah, that that&amp;rsquo;s the goal of CLI. It should be fast. You get the k6 script. I&amp;rsquo;m gonna go over that later on, and you get this library folder. The library folder, what it is is because the converter, Postman uses number of functions, some methods that are not mapping exactly towards k6. So once this package, it adds some additional functionality that Postman uses. Like it uses low dash and some encryption, stuff like that, and it just adds the libraries there. So if you would do this manually, you would also have to include the libraries, but it does it for you. It includes all the libraries. And it&amp;rsquo;s actually a wrap around the, let&amp;rsquo;s go for the SHIM quickly. If it&amp;rsquo;s not clear what I&amp;rsquo;m trying to explain, stop me, Nicole.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, but we can also answer this question from Carlos Ramirez. You can also integrate, well, not a question, a comment. You can also integrate your process using the Postman API key to request information about your collection and environment. And he also adds, oh, no, sorry, this is from Chaitra Nanjesh, this is interesting, because we use k6 in Tesco, says load test, and I think we can try this to see if it works for us. So people are already liking what you&amp;rsquo;re sharing Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, that&amp;rsquo;s the goal, That&amp;rsquo;s also why I liked it actually&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Do you also do what Carlos was suggesting?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, and I even go a step further, but that&amp;rsquo;s, I&amp;rsquo;m gonna come back to that later. I&amp;rsquo;m gonna showcase how we do the Full Monty in the end, actually. I&amp;rsquo;m building up.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Awesome. Sorry, people are excited.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, I&amp;rsquo;m also excited, so I hope that I&amp;rsquo;m coming across properly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] You&amp;rsquo;re doing great, don&amp;rsquo;t worry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay. Just for reference, you have to think of this Postman-to-k6 thing as it&amp;rsquo;s wrapping Postman functions and k6 functions and combining them in one place. So it&amp;rsquo;s abstracting away the k6 part and it matches with the Postman stuff. So that&amp;rsquo;s what it does behind the scenes. So if you see, if you do an execute request, which is an, it&amp;rsquo;s a function actually, behind the scenes, it just does the HTTP dot request, which is a k6 function. So it wraps a lot of things together, and I think if I would go to execute test, you would also see it uses the k6 check function. Just for reference, this is the wrapping part. This is all not so relevant. You don&amp;rsquo;t have to care about it. What&amp;rsquo;s relevant is what&amp;rsquo;s being generated for you. So it says on top, it&amp;rsquo;s an autogenerated file here. It does some imports. It imports also k6 related items and it sets default options. By default, it says maximum redirects. And then it does some strange things which are not k6 related, but that&amp;rsquo;s typically what the package does. That&amp;rsquo;s the wrap that you see. It defines a collection with a base URL, and then you will see that my group is there, I have my request get all leads. It showcases the URL. It showcases that it does a test here. So everything that you had defined in your Postman collection, sorry&amp;hellip; Get all tests and you could see the test here. It&amp;rsquo;s translated into a k6 kind of syntax and it&amp;rsquo;s ready to be used. And you see all the requests on here, all ready to be used. It even matches a response codes that you can match to a variable in Postman. You could do anything. The body is there that I inserted that you can create. So if I were now just say k6, sorry, k6 run k6 scripts. Oh, dunno know why this is happening? Give it a second to start up. There you go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So I haven&amp;rsquo;t touched anything, I just took my Postman collection, converted it with the converter that we built a while ago together with k6 and then you can see the tests there. So I created a number of tests. Postman expects to, the response is expected to be 200. I get all the data. My average is my group duration because you also have a group there. So if you have 20 endpoints, you will test 20 endpoints, but I don&amp;rsquo;t need to write any k6. So I only do my maintenance for, my maintenance only happens in here. I only have to maintain my Postman collection and my k6 gets generated out of them. So that&amp;rsquo;s really nice thing here. Yeah, that&amp;rsquo;s the library that we&amp;rsquo;re using. No, that&amp;rsquo;s not, that&amp;rsquo;s not my library actually. I think it&amp;rsquo;s moved to&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Uh-oh.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Hope this is the right one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, we gotta update our show notes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, we do. Oh, with the API deck one. Sorry about that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] No worries. I think I made a pool request a while ago, so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Ah, I see. Okay, I will update the description.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] But I, just to continue.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Can you also post, Tim, the link?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, I&amp;rsquo;ll post it. Of course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Thanks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] But it&amp;rsquo;s really cool. Maybe cool&amp;rsquo;s not the right word because the package supports a number of things so that you can even tweak the output even further. So by default, I just say, give me the Postman collection and generate a k6 and it would work. But if you want to automate this on a higher level, need to do work for automation, you wanted to tweak some things. Maybe I want to play around with some k6 parameters, or I wanted to do something else, or I want to exclude stuff, or I want to include my environment because, if you see here, there is no, there&amp;rsquo;s only my base url, but I have a lot of variables I want to use in my Postman collection that I already defined. I have login information. I have some Postman base URL. So you can take it even further because now you just get a script, but it&amp;rsquo;s just, the script is already addressed. So you can take it step further. So for example, if you would say, I want to increase the number of iterations, you could just say like this. You have this parameter, says iteration 10. I&amp;rsquo;m not going to convert it. There we go. And if you see my script now has options already set at 10. That&amp;rsquo;s nice. That&amp;rsquo;s handy because you want to automate this, of course. And you can even go, take a step further. I want to include my Postman environment variables. So I&amp;rsquo;m gonna, there&amp;rsquo;s also a parameter for that. So you can pass some environment variables. So you can even pass some global variables. This is typically Postman, but you can just take the ones that Postman provides, export them and use them. So if I now do this kind of thing, so this is my file with my Postman variables, like I showed. Let&amp;rsquo;s do this again. And here, you&amp;rsquo;ll see all my variables that were exposed in my environment are now available for my k6 script to be used in automation workflows. So that&amp;rsquo;s really nice, but I can even take it a step further. What if I have special k6 related parameters? I&amp;rsquo;m just gonna copy paste them here for the sake of the demo, but I might want to define my iterations or my maximum redirects because k6 offers a lot of parameter options. Like I want to use cookies. I want to use headers. The number of redirects. I want to set some text. I want to define a timeout. All these k6 related parameters, I want to make sure that my automation flow was able to process them because I want to run the script without touching it. So I want to be able to just say, take these parameters for this pipeline, these parameters are applicable for production. So you could switch environments. For example, what we do is we have different test scenarios defined. So if we go for a small test, we run it like this, we define stages and thresholds. Well, if we want to really do performance testing, we have different ones. So these options, we use them to pass them along to the pipeline. So I could do something again with the generation part.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Question from Sri. Is it one environment at a time only?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, because what you generate is what you inject the script. So it, you would then have to generate a second script, but that&amp;rsquo;s really easy to do because you would just say, I want to have, for example, just showcasing it here, I&amp;rsquo;m gonna take this script is for the second test stage. You just run it and then you get a second script next to it. So you don&amp;rsquo;t have to worry about it. You don&amp;rsquo;t think about one script. You just fork it as much as you need with different configuration options defined that you would use.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, and Sri, I wanted to also add here that with k6, you can have, you can test more than one environment at a time. What Tim is showing here is that for, because of the way that the that Postman treats these collections separately, every environment is separate. And so the converter also converts them to separate k6 scripts. However, once they&amp;rsquo;re in k6 script format, once it&amp;rsquo;s all JavaScript, you could use k6 executors and scenarios to run them simultaneously, if that&amp;rsquo;s what you&amp;rsquo;d prefer or anything else.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So in this example, what I&amp;rsquo;m doing, I&amp;rsquo;m going to pass on my K6 parameters as a JSON file so that I can put them in a Git somewhere. And if I then just say, press go, you will see that it also just updates this option spot on the top. There we go. So you will see, I have defined it to be in this case five virtual users, 10 iterations, maximum redirects, and just adds it on top. So I can switch around in my pipeline without touching anything. I just prepare everything, and then it&amp;rsquo;s just a matter of defining which command I should to run and it just does it for me. So that&amp;rsquo;s really handy and it really makes automation a lot easier in that regard. And there&amp;rsquo;s one thing I really like. It&amp;rsquo;s a small thing, actually. Now it generates one big file. So everything is in this one big file, all the request, it&amp;rsquo;s doable if you have like me, for example, four requests or five requests. But if you have like 20 endpoint or 20 requests, it&amp;rsquo;s a huge file. And to handle that, you can just pass along one parameter. I&amp;rsquo;m not sure if it&amp;rsquo;s commonly used a lot, but I&amp;rsquo;m a big fan of it. It&amp;rsquo;s called a separate parameter. So what happens now? The options are there. The request configuration is there. But you just get this in your k6 script. I&amp;rsquo;m not sure which one, I&amp;rsquo;m gonna remove one because otherwise I might get confused. There we go. You get this, and this is actually, it splits all your requests in a separate folder like you would see them in Postman and each request would be separated from the rest. And that makes it really easy. If you want to test something specifically, if you would have one script, it would run everything. But now I can just comment out, I don&amp;rsquo;t want to do the create, I don&amp;rsquo;t want to do the update and delete. I only want to test to get all leads. You just say k6, k6 run k6 script. Give it a second to warm up. There you go. It will only test that request that I defined. So if your 20 endpoints, your k6 script has been generated for you will have 20 lines and all your requests will be nicely separated from each other. So you can even say, I want to tweak it a bit, or you have all flexibility then, while if you don&amp;rsquo;t use a separate parameter, it just generates one file with everything in it. Do I make sense still?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes you do. But there&amp;rsquo;s a comment here from one of our engineers who wrote that initial blog post that you may be updating, Mostafa said last time you wrote an article about it, it needed a few changes to make things work, so well done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah. Yes, that was one of my first VRs that I did. I wanted to make separate flow over pretty much everything. And there&amp;rsquo;s one final thing I want to showcase for, with the k6 part, is now you have to really, like all these parameters, they become very long and difficult. You could also just define them as a JSON file and just pass them along. And now you can just define the one file, put the main Git, and then you could just say, I want, this is the output, my environment. You can even define that it uses a handle summary, or you can add request tagging on top of it. And if you do it like that, you get, you just have to do one parameter, one command, actually. So if I do it like this, you see, it just says, this is my input file. I&amp;rsquo;ve defined an options file, which I referred to. And if I then just do it, it would take all these parameters that I&amp;rsquo;ve defined and you would get, again, everything nicely generated for you. All the requests are there and it even added the handle summary thing on top of that, which is something&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Oh nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So everything is there. And so this is the automation flow that&amp;rsquo;s really powerful because otherwise you would have to add, if you want to have a summary, you have to add a modified file. But now I just define one configuration file, I define my parameters, I define whatever I need. Just run it, and my script, I don&amp;rsquo;t need to touch it. I can just say, okay, k6 run k6 script. And you would see that it generates, yeah, it generates a test. It does, I think five or 10 iterations. There we go. And it doesn&amp;rsquo;t open anymore. It generates the JSON file. If I close my, quickly here, you would see a summary report is here. So it just, yeah, there is no manual work anymore to run k6, just keep your equipment collection up to date.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] And you&amp;rsquo;re helping folks out with your example here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yeah, okay, great. Okay, that&amp;rsquo;s in summary, the things that I want to showcase about the converter. There are some nice things added since the last releases from the k6 team. So I added some, requested and changed some things, and I&amp;rsquo;m really happy with it. It works flawless at the moment in our organization actually. So I&amp;rsquo;m really happy with it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, it seems really, I think I tried this initially, like when Mostafa was saying, there are a few things that you, you had to get done, but this seems way slicker, and it seems like you&amp;rsquo;ve really focused on making it automatic so that don&amp;rsquo;t, there is no manual intervention, which totally makes sense in a CI/CD pipeline.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Yes, correct. And I wanted to put my effort on the Postman and the management of the Postman collection, because that was a tool where we were all working on and maintaining it. And I wanted to keep the workload on k6 as low as possible. And I think we succeeded it quite well on that regard. There are some things that are not available out of the box. Like you cannot do the send request. You cannot set next request. But what I did add was, what I&amp;rsquo;m also really proud of, the dynamic functions from Postman. You could just add any, pretty much any generated stuff. Let&amp;rsquo;s see if it shows, if it works like that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] There&amp;rsquo;s also some nice comments for you. There&amp;rsquo;s Gertjan De Wilde, who says, Go Tim. There&amp;rsquo;s Pepe Cano as well from k6 chiming in with his support. James is saying nice to see this getting the love it deserves, much better experience. And Charly is saying, Very useful tool, congratulations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Lots of love in the comments for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Definitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Okay. But honesty, we took it a even a level further, but maybe I should, maybe there are, if there are other questions we should talk about or not, I&amp;rsquo;m not sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] I&amp;rsquo;m interested in this. So what were you saying, the dynamic part that you added parameters?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] Let&amp;rsquo;s see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] I mean, you also don&amp;rsquo;t have to demonstrate everything. Can we just like acknowledge the fact that Tim who doesn&amp;rsquo;t even work for k6 or Postman volunteered to do like a live demo about this. So that&amp;rsquo;s awesome. Don&amp;rsquo;t feel like you have to show us everything. You can just talk about it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Postman really provides this nice, what they call dynamic variables. And so it&amp;rsquo;s, this is a screenshot of it. So if you use curly brackets, it&amp;rsquo;s random, and then you can say, I want the full name, I want the bank account or anything that uses Faker behind the scenes, and you can make dummy data out of it. So that&amp;rsquo;s really handy if you want to really make, yeah, realistic data without having to use for loops or anything, just put in the variable. And that was not fully supported in Postman to k6. So we brought in that support as well to make sure that you could have the full functionality of the dynamic variables attached to that. So yeah, there are a number of things we did since the last release of it, and I think dynamic variables was in much demand at that moment. There you go. Yeah, and I&amp;rsquo;m really happy for Mostafa, I&amp;rsquo;m not sure how to pronounce it correctly, because I think he was one of the first ones who pointed out in his blog post about functionality. So thank you for pointing it out to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, now that I think about it, I should have asked Mostafa to be here too. Oh, I missed that opportunity. Sorry about that Mostafa. That&amp;rsquo;s so good about the dynamic variables, because that&amp;rsquo;s one of the things that you have to think about when you shift from just a purely automization mode, like automated testing mode to load testing is that you can&amp;rsquo;t, you then have to start thinking about the data that you&amp;rsquo;re sending too, because if you&amp;rsquo;re trying to get realistic response times it could trigger caching on the service side if you&amp;rsquo;re just requesting the same thing. So yeah, totally makes sense. k6 can already, you can already import faker with k6, so great, great job for putting that together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, no, that&amp;rsquo;s very cool though, but yeah, it&amp;rsquo;s like, you can use Postman for your user, your UI, your, you know, your development environment and do all this stuff and then even goes through there and generates some random data. So, yeah, that&amp;rsquo;s cool. Very cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, go on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But maybe I&amp;rsquo;m gonna talk first before I want to show the final piece of what we did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, just, just quickly, I just wanted to ask about the limitations of this approach that you see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not all functions of Postman are supported. So that&amp;rsquo;s the downside of it actually. But for the use is that that we are using it, we have everything covered. Like you have the, the dynamic variables, you have the environment variables, you can define k6 parameters. Yeah, there was nothing stopping us. I think if you want to do complex scenarios and you want to do if-else situations, there it&amp;rsquo;s not suited for. That&amp;rsquo;s the same problem you would have in Postman. It would be difficult to make these if-else conditions in Postman as well. So that&amp;rsquo;s, if you do simple tests, functional tests in Postman, you can really easily port them to k6 and then you have performance tests end points.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And in the spirit of the whole free and open software. I mean, do you have issues where like you&amp;rsquo;re looking for help? Is there any gaps that you&amp;rsquo;re still looking to fill?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There are some bugs I cannot reproduce at the moment, something with XML conversions, but right now it&amp;rsquo;s feels quite feature complete. I haven&amp;rsquo;t added that much, actually. The base was already there by the k6 team members who built the initial library. So I just added some sugar coating on top to make the automation flows much smoother and less manual work, or linked actually. But if people have great ideas, I think they should just make a PR and add it to the package.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, did you want to show us something else?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, I want to show how we ran a step further even, because yeah, if you update your API and then you have to update your Postman collection, it then generates a nice k6. But we also use openAPI as a documentation tool where we document and design our API. So every change that you do on your API, you need to add them to your API, and then you, so you still have to maintain not one output, the Postman, but you also have to update your documentation. And I want to flip that around. I want to make the API documentation leading, generate the Postman collection out of it and generate out of the Postman collection, a k6 suite. So that as a product manager, I don&amp;rsquo;t have to maintain all these documents anymore. I just maintain one thing, and that&amp;rsquo;s my openAPI and my team or our team then only just need to develop the application itself. And it&amp;rsquo;s called spec driven approach. It&amp;rsquo;s nothing new, but I&amp;rsquo;m a really big fan of it and I&amp;rsquo;m a really, yeah, we introduced it a year ago and it solved so much and it brought so much quality on the company level, in our documentation, in our test suites. So that&amp;rsquo;s something I want to share as well, because it&amp;rsquo;s so valuable once you get how it works and if the right tools and properties, you can really do it. And this is actually where we are right now. I can also demo how it works. So we have, I&amp;rsquo;m managing an openAPI documentation. We use the formatting and we validate it if it&amp;rsquo;s valid. And then we use a generated one. And from the generated one, we generate documentation. So public documentation, stop lights, just like whatever you call it, we generate a Postman collection that we can share with the customers and we run contract tests, we run soak tests and we run smoke tests all based on this openAPI documentation. So, and again, there&amp;rsquo;s no no contact or no changes involved. We just, we managed the spec on its own and it&amp;rsquo;s really, really something powerful and useful. And I can quickly show how it would work actually if you&amp;rsquo;re interested.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yes, but before you do, a wild Mostafa appears.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hello.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How awesome is that? Let&amp;rsquo;s just say hello to Mostafa, who just joined last minute since he was already in the comments anyway.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nice to meet you. And I&amp;rsquo;m grateful that you wrote the blog post so many, so many months or years ago, so thank you for that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, yeah, I really felt the need that we needed this article, so that&amp;rsquo;s why I wrote it in the first place. And then, yeah, I found a lot of issues that you solved, and thank you, it was a great job you did, and well done.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you. And thank you for putting out the 90% of it. I said I only had to put in the sugar on the top of it and the cherry on the top.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no, no, no, that&amp;rsquo;s not true, that&amp;rsquo;s not true.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;In the first place just to clarify.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Mostafa while you&amp;rsquo;re here can you quickly introduce who you are and why we&amp;rsquo;ve randomly invited you onto the stream?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course. Okay, so I am a backend developer at k6. I&amp;rsquo;m almost three years with k6, like it was called Load Impact before being renamed completely to k6, and now Grafana. I&amp;rsquo;ve been a developer advocate when the first like idea came into place that we want to have a developer advocacy program. And yeah, I&amp;rsquo;ve been a developer advocate for a year and then came back to back it. So I worked with lots of these tools and tried to help others because like, there were no other resources available. Like there was this read-me on the project and that was it. No mention of it anywhere. Only the hidden knowledge of everyone inside the company of how to use this tool, but nobody knew without outside the company. So tried to learn it from others, specifically, Pepe, thanks for that, from here. And I tried to write that blog post and try to share the knowledge. So that&amp;rsquo;s basically it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great, so we also got a comment: Great with the diagram. Can you share this?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course I can. Yeah, I&amp;rsquo;ll do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right, I guess that&amp;rsquo;s our cue to head back. Please continue, Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, I&amp;rsquo;m not gonna, I&amp;rsquo;m just gonna showcase it, and then I hope everybody will really appreciate and see the power that it brings actually. So, okay, so maybe start with the beginning. I&amp;rsquo;m gonna close my screens a bit to clean it up. So I have this openAPI spec that I, it&amp;rsquo;s just a copy of what we just described. So this is how it looks, this is documentation using Docly. You can see it&amp;rsquo;s the k6 office hours CRM application. You can see the list in there. You can see the create, the get. So it&amp;rsquo;s just the definition of what the API would look like. This is the documentation part of it. So I&amp;rsquo;m using now two tools. I&amp;rsquo;m gonna use Portman as another package that I built together with API Deck and make an API Deck where we can convert the openAPI to Postman, and from the Postman, you can generate a k6 one. And that&amp;rsquo;s really nice because you only need two commands, one source file, and you have two outputs out of the box. So that&amp;rsquo;s really powerful. I find it powerful at least. So I&amp;rsquo;m gonna take my commands correctly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So If it&amp;rsquo;s okay, can you, I&amp;rsquo;m not, I&amp;rsquo;m not up to speed with Portman. So it creates a Postman collection already given openAPI, is something in openAPI specification?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There was, Postman built a patch like Mostafa, k6 build a patch where you can convert from Postman to k6, and Postman build a Postman where you can convert from openAPI to Postman. And when I found out, I said, that&amp;rsquo;s amazing. You don&amp;rsquo;t have to maintain a Postman collection anymore, but it wasn&amp;rsquo;t, it was missing some functionality, and the major thing that I was missing, it was just creating the request than Postman, but not the tests. It was not handling the tests of it. It was not assigning variables. It was just taking the Postman request and converting them into openAPI requests, into Postman. So you still needed to maintain and modify them. And I said, it has to be, because an openAPI documentation or specification, it describes everything, the request type, the body, the properties, if you do it properly, you have all, everything in one go. And I said, why not use that to create a test suite, update your variables, do all the dynamic stuff you would expect it to come out of the box. And that&amp;rsquo;s why we created Portman. It started as a PR on that openAPI to Postman package, but then I met Nick from openAPI, from API Deck, sorry. And then we came together and we said, let&amp;rsquo;s collaborate, and let&amp;rsquo;s make a startup package out of it that you can plug in and use it to automate these kind of workflows. And it&amp;rsquo;s really, yeah, I&amp;rsquo;m biased again, but I really like it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, it sounds awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A question here. May I ask a question here? So have you seen the openAPI generator package that I&amp;rsquo;ve written?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, I saw that and that I had the same comments as I had initially. It generates a nice k6 script, but it it&amp;rsquo;s usually you still have to manually adapt a lot of things and correct it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, but sorry that I interrupted you. There&amp;rsquo;s this latest PR point? I think Michael, if I&amp;rsquo;m currently remembering his name, so Michael added a feature to, to be able to add certain extension to the, to your Swagger or openAPI collection so that it generates everything for you. And if you add examples to your API output, to your responses, then it can extract those examples and put it in your script so you don&amp;rsquo;t need to modify anything. So you can create basically the same thing you did for Postman, you can do it for the openAPI. So the new revision, the new PR and the new version that is released by Ophelia, the maintainer of the openAPI project helps you create a complete test from start to finish with no modification.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think that&amp;rsquo;s great, but we do two types, three types of tests. We will do contract tests, and then we use Newman for it. And we want to use k6 because Newman, it can do schema validation, it can do a lot, I think a lot more than k6 can right now. I think it&amp;rsquo;s also the goal for k6 to do all these contract validation. It can, I guess, but I treat them differently. I think the Newman Postman has more contract testing capabilities, while I think k6 is perfect for performance and load testing at scale, where you only focus on what&amp;rsquo;s the response, is it 200 or is it not a 200, at least that&amp;rsquo;s how I use it actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s fair enough.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, what Portman does it converts openAPI to Postman. So I&amp;rsquo;m gonna showcase that quickly. So it just took the, this openAPI that&amp;rsquo;s here now, and then gives a while to spin it up. There we go. It&amp;rsquo;s converting it. And if things go well&amp;hellip; Let me check something happening here. Here it is. So here&amp;rsquo;s my Postman collection. It&amp;rsquo;s just generated it. It does everything for you. So it creates, recreate, so there wasn&amp;rsquo;t a collection there. It just recreated for you. And I hope things, it&amp;rsquo;s not showcasing it here. That&amp;rsquo;s bad, too bad. So it just generates and if I would import in Postman, let&amp;rsquo;s quickly do that&amp;hellip; Give me a second to find everything. There we go. So this is the k6 and it&amp;rsquo;s generated by Portman. There we go. If you see you have the same endpoints&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Oh, nice.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Tim] So the first thing it&amp;rsquo;s great because you don&amp;rsquo;t have to recreate your Postman collection. You just, you just run it from your openAPI specification and you get, as a result, you get your requests pre-tailed already, also your post exercise is ready. So you can see here, it inserts a body, everything, I don&amp;rsquo;t have to do anything. It just takes your openAPI and converts it to Postman. Plus it adds a lot of tests already. You see, it does contract testing by design. So it includes automatically 200 contact applications. So it just injects your contract test in there. And that&amp;rsquo;s really nice because I only need to maintain one document, my openAPI specification, as a result, I get all my requests in Postman, and I get all my tests in Postman without writing any code. I just need to maintain it in the openAPI documentation.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wow this is really awesome, Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So keep in mind that this was the flow before you had to create your Postman collection and add the tests, and then you could generate k6. Now we turn it around. Now we generate the Postman and request, and then we can use that to generate, okay, six scripts. And so we only need to maintain this part in, yeah, or you know, that&amp;rsquo;s the only thing I need to maintain as a product manager and the team, of course, they built the API and the service and everything, but I get this and I can focus only on this. And this is easy to manage because it&amp;rsquo;s a YAML, you can play around, you can add endpoints, you can remove endpoints and just run it. A minute later, I have a Postman collection to play with it and I can run it at scale with k6, doing the volume tests. What else can I showcase quickly here? Let me see if I can. I just&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Some more nice comments here. Such an awesome flow, says Gertjan, and James says his mind is blown and, and I join him on that sentiment right now.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Mostafa] Exactly. That&amp;rsquo;s a full test suite, like from start to finish.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and like example, schema validation. It comes out of the box. You don&amp;rsquo;t have to add it. It just does it for you. And the richer you make a documentation, the richer the test suite will become. And it also, Portman, be extended, you can also do variations. So now it just validates if it&amp;rsquo;s a 200, but you can also have it generate 404s, and then it will remove items from it. If it&amp;rsquo;s a required property, it&amp;rsquo;ll create a variation out of it. And then you can test I&amp;rsquo;d the 404s are not present. And so you get two test suites in one go, actually.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wow. That is, that&amp;rsquo;s so awesome. Maybe we can like, try and summarize this as we try to collectively recapture our blown minds. So I think that there are two different tools here, Postman and k6, which are really for different things. The Postman is really better for API testing, and as you mentioned, Tim ,contract testing, and k6 is better for load testing. And their features are pretty divergent after a certain point, but they do have a commonality, and it seems like that&amp;rsquo;s what you&amp;rsquo;ve really capitalized on. Mostafa and Tim both have worked on this. and you you&amp;rsquo;re trying to make, you&amp;rsquo;ve gotten us closer to this ideal of having just one set of test suites, and it doesn&amp;rsquo;t really matter whether it&amp;rsquo;s automation test suites or load test suites or, it can just be the one thing and you no longer have to maintain two separate ones. And that&amp;rsquo;s having like the amount of time that you need to set it up, but also running it. Because having to explain this to somebody else is also a huge deal when you&amp;rsquo;re not the only tester on your team.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Nope, exactly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And the nice thing is as a product manager, I&amp;rsquo;m not technically, so but I can contribute to it. I can, I just need to maintain the openAPI specification and the whole team benefits from anything that I do. If we need to add a new endpoint, I can design it. Not even five minutes later, one minute later, I can just run it in a pipeline, see if it works, and that&amp;rsquo;s a bit, the cycle of spec driven development. You put your spec at the center, the spec at the center, and then you design it, simulate it, fill it, Then you build it, you test it. But the spec is a test driver here and then you can even run it on production and yeah, do the management aspect as well, because then you can monitor it as well based on your API specification. So that&amp;rsquo;s, as a product manager, I&amp;rsquo;m really proud that we pulled this off because that was one of the ambitions when we wanted a newer, or API program, like how can we use a manual workload, what can we automate, and yeah, I&amp;rsquo;m really happy because it&amp;rsquo;s all open source based. There is no other software involved. We just use k6. It has excellent dashboards to individualize reports. We use Postman to generate contract testing and manage it, play around with it. And we benefit from such large ecosystem , Swagger as documentation interface, where you can display or openAPI as well. So it&amp;rsquo;s almost full cycle or I don&amp;rsquo;t know what&amp;rsquo;s the term for it, but yeah, I really, I&amp;rsquo;m really happy with where we are right now. It&amp;rsquo;s a good place to be in an API landscape actually, especially from, yeah&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;ve taken it a step further, right? This is no longer just about test suites. It&amp;rsquo;s also because you are building on the openAPI specifications, it&amp;rsquo;s all connected even from not just the development part, but the design part. And Pepe actually has a question about this. He says, can you show us more about the process that updates the APIs? What does it do?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you mean? This flow, this one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sorry, which one? Yes, I believe so.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The powerful thing about this can also be because if you have an openAPI specification, you can even generate clients or service side code from it so that in the end, your API service can also just be generated from an API specification. There is a really nice openAPI, there&amp;rsquo;s a really nice openAPI open source project, it&amp;rsquo;s called I think openAPI Generator, and then you can just run a C# library or an API for that. You just take your openAPI documentation and you run, you run it and you get as a result, you get C# code that you can run in production. And that&amp;rsquo;s also what we use in our company. You have some teams that just manage to build the openAPI specification and they use that to generate C# code and have APIs up and running in no time. I hope that this is the answering this question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, Mostafa, Paul, anything you want to say to Tim.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, no questions but, yeah, that would come later, but I need to definitely pass this along, this video along to some people that I used to work with, because this will blow their minds as well. This is something that they definitely need.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great job, great job.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, great job, exactly. I&amp;rsquo;m literally speechless because I&amp;rsquo;ve worked with all these tools and I know all the&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Clearly not literally.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, not the ones that Tim wrote, the ones that we had before. But anyhow, this is a great addition to this mix of open source software that was out there and that we used, and this is basically end-to-end testing. So based on a YAML file, which is an openAPI specification, you can generate tests for your API. You can generate load tests. You can generate, I don&amp;rsquo;t know, like literally everything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s also documentation. You get documentation, nice looking documentation out the box, a playground with Postman and you get the numbers to back it up with even graphs from k6. I really like your dashboarding. So if you have a customer and they they&amp;rsquo;re asking about SLA, we just pull up some graphs from k6 and everybody&amp;rsquo;s happy with that. So we, the full ecosystem has really matured a lot over the last couple of years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bravo.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, this is so freaking awesome. Thank you so much, Tim, for coming on. By the way, he&amp;rsquo;s not even working for k6. He&amp;rsquo;s just, and I think you said at one point, oh, I&amp;rsquo;m a product manager. I&amp;rsquo;m not technical. I beg to differ. This is pretty amazing things that you&amp;rsquo;ve put together. There&amp;rsquo;s a bunch of comments here too. James says he&amp;rsquo;s literally waiting for the livestream to end, so he can link to the video with a timestamp. Well, let&amp;rsquo;s just try and drag it on for him, shall we? Thanh says plus a thousand votes, and people are also saying thank you, and outstanding, almost the holy grail. So lots of fans in comments. Thank you so much, Tim, for joining us. I know we&amp;rsquo;re a bit over time. I&amp;rsquo;m kind of taken aback by how much value you just showed us. This is amazing, I think we need to have you back.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;rsquo;m gonna write a blog post for k6 and one for API Deck where I&amp;rsquo;m going to get more into the details because yeah, it&amp;rsquo;s a show now, it&amp;rsquo;s a difficult to but I&amp;rsquo;m gonna try to write it up and then extend a bit on what, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mostafa, apologies, I&amp;rsquo;m really bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s fine, it&amp;rsquo;s fine, no worries.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think can be really powerful to share with the rest of the world that they can, yeah, maybe use some parts of it or not, but I benefit a lot from it. The whole team benefits a lot from it, actually. I can showcase, this is a pipeline we use, for example. So this is we do tests, then we run Postman and we do tests and if it&amp;rsquo;s 100%, it gets deployed. So it&amp;rsquo;s not just a gimmick, me showcasing it. This is really happening in our company. So we use it to build it. We use it to have nice dashboard with k6 attached to that. So yeah, I&amp;rsquo;m grateful that you put it out there for us to benefit from it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s so great, thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go on, Mostafa..&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Review the article that you want to write.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, I&amp;rsquo;ll keep Pepe in the loop and then you&amp;rsquo;ll reach out.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Of course, of course.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great, thank you. Thank you as well, Paul and Mostafa, for coming on, Mostafa, even though, sorry, I should have invited you even earlier. Thank you everybody for watching. Thanks everyone in the chat. Have a great weekend, everybody.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Absolutely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you for having me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, all right, see you all.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Top 10 Obsidian Plugins I Can't Do Without</title><link>https://nicolevanderhoeven.com/blog/20220223-top-10-obsidian-plugins/</link><pubDate>Wed, 23 Feb 2022 17:00:08 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220223-top-10-obsidian-plugins/</guid><description>&lt;p&gt;In this video, I talk about my experience in getting started with &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, and how I went from thinking it wouldn&amp;rsquo;t meet my needs at all to not being able to shut up about how awesome it is.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/W7kTtn9empU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;The first time I tried to use Obsidian, I didn&amp;rsquo;t like it. It didn&amp;rsquo;t seem intuitive to use. I couldn&amp;rsquo;t quite get it to do what I wanted. And frankly, I just didn&amp;rsquo;t get all of the hype.&lt;/p&gt;
&lt;p&gt;Today, I have over 10,000 notes over multiple vaults in Obsidian.&lt;/p&gt;
&lt;p&gt;So what changed? Well, it turns out that there&amp;rsquo;s a pretty crucial element of the experience that I was missing the first time around and that&amp;rsquo;s plugins. Here are my top 10 community plugins for Obsidian so that you don&amp;rsquo;t make the same mistake. \&lt;/p&gt;
&lt;p&gt;Obsidian already comes with some core plugins, some of which are enabled by default. Today, I&amp;rsquo;m talking about community plugins, which are extensions to Obsidian that are created by other Obsidian users. The security of your notes is still on you though so think about what you&amp;rsquo;re comfortable with before installing anything. \&lt;/p&gt;
&lt;h2 id="obsidian-calendar-and-fantasy-calendar"&gt;Obsidian Calendar and Fantasy Calendar&lt;/h2&gt;
&lt;p&gt;These 10 plugins are arranged alphabetically and the first one is Calendar.&lt;/p&gt;
&lt;p&gt;Calendar is the most popular Obsidian plugin and for a reason. I don&amp;rsquo;t know at this point why you would ever install Obsidian without the Calendar plugin because Obsidian doesn&amp;rsquo;t have a native implementation of a calendar. The Calendar plugin doesn&amp;rsquo;t just show the calendar. It also lets you create daily notes and see those daily notes over the entire month. And it also lets you create weekly reviews if you have that option enabled, which I do.&lt;/p&gt;
&lt;p&gt;Recently, I&amp;rsquo;ve been using Calendar and this other plugin, Fantasy Calendar. Even though Fantasy Calendar definitely was made for use in a tabletop role playing game like Dungeons and Dragons, you don&amp;rsquo;t have use it as that. I&amp;rsquo;ve used Fantasy Calendar as my content calendar in Obsidian. It just provides a little bit more customization than the Calendar plugin can but I install and use both heavily.&lt;/p&gt;
&lt;h2 id="obsidian-dataview"&gt;Obsidian Dataview&lt;/h2&gt;
&lt;p&gt;Number two is Dataview.&lt;/p&gt;
&lt;p&gt;Dataview has changed the way I use Obsidian. It&amp;rsquo;s changed the way I format my notes. It essentially allows you to define parameters and values in the YAML front matter or the metadata of your notes and then it lets you search for them. So it essentially lets you create your own database in Obsidian with custom fields for anything that you want.&lt;/p&gt;
&lt;p&gt;You could use it for meetings or people or tools or books that you&amp;rsquo;ve read. The possibilities are endless. By the way, in addition to the very SQL-like query language that they have, you can also use JavaScript in Dataview. There&amp;rsquo;s just so much to do with this plugin. And I really haven&amp;rsquo;t even scratched the surface of it.&lt;/p&gt;
&lt;h2 id="obsidian-editor-syntax-highlight"&gt;Obsidian Editor Syntax Highlight&lt;/h2&gt;
&lt;p&gt;Number three is so small but so useful that I had to include it in the list. It is Editor Syntax Highlight.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever copied over any code into Obsidian, you may find that it lacks a little bit in readability. Editors Syntax Highlight dramatically improves readability by changing the syntax highlighting depending on the programming language that you select. It isn&amp;rsquo;t going to replace VS Code anytime soon, but if you&amp;rsquo;re like me and you use it sort of as a dev log while you&amp;rsquo;re trying figure something out and you include your final solution or the code into your note, then I think that this is a must-have.&lt;/p&gt;
&lt;h2 id="obsidian-kanban"&gt;Obsidian Kanban&lt;/h2&gt;
&lt;p&gt;Number four is Kanban which is funny because I don&amp;rsquo;t even usually like the Kanban approach. I never understood Trello and I never liked Post-it Notes. I don&amp;rsquo;t use Kanban for task management.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve discovered what it&amp;rsquo;s really good for is a content calendar. I create a card in Kanban for every bit of content that I&amp;rsquo;d like to work on, whether that&amp;rsquo;s code or a section in a workshop, a blog post, a video, or really basically anything. I really like being able to create my own columns and spicing it up by embedding photos within the card itself. It just makes the whole process a lot more visual.&lt;/p&gt;
&lt;h2 id="obsidian-outliner"&gt;Obsidian Outliner&lt;/h2&gt;
&lt;p&gt;Number five is Outliner. Before Obsidian, I was using Roam and it definitely shows. While I&amp;rsquo;ve moved on philosophically from Roam Research, I still love the very task-oriented bulletin format that it had.&lt;/p&gt;
&lt;p&gt;Well, Outliner brings the same thing to Obsidian. So you can have your keyboard shortcuts for quickly moving something up and down a list or indenting and unindenting as well. It has made my transition from Roam Research significantly easier.&lt;/p&gt;
&lt;h2 id="obsidian-periodic-notes"&gt;Obsidian Periodic Notes&lt;/h2&gt;
&lt;p&gt;Number six is Periodic Notes.&lt;/p&gt;
&lt;p&gt;I think one of the most fundamental philosophical differences between Obsidian and tools like Evernote is that Obsidian doesn&amp;rsquo;t want you to just capture it all. Obsidian is about bringing those notes to the forefront, processing them, analyzing them, really learning them, and then changing them as your knowledge changes and Periodic Notes really helps with that.&lt;/p&gt;
&lt;p&gt;It is particularly useful for OKR or objective setting because it provides a system for reviewing notes daily, weekly, monthly, quarterly, and yearly. You don&amp;rsquo;t have to use all of those, but I find that using some of them is really useful in helping me step back and think about what I actually want to accomplish.&lt;/p&gt;
&lt;h2 id="obsidian-publish"&gt;Obsidian Publish&lt;/h2&gt;
&lt;p&gt;Number seven probably would be my number one if I were ranking these, but since it&amp;rsquo;s alphabetical, number seven is Obsidian Publish.&lt;/p&gt;
&lt;p&gt;Obsidian Publish is a premium add-on to Obsidian that lets you instantly publish all of your notes or at least the notes that you select to be published to a certain domain. Now I have it going to a custom domain and yes, it&amp;rsquo;s not free. And yes, I do know that there are other ways that you could do this with markdown files. I have my personal blog using Hugo as a static generator for instance, but there&amp;rsquo;s just something about Publish and just it taking just a few clicks between writing something and putting it out there that really reduces the inertia for me to learn in public.&lt;/p&gt;
&lt;p&gt;Learning in public and growing a digital garden that is constantly changing is really important to me and it has been essential to my professional and personal development. So Obsidian Publish has to be, hands-down, my favorite plugin for Obsidian.&lt;/p&gt;
&lt;h2 id="obsidian-readwise-official"&gt;Obsidian Readwise Official&lt;/h2&gt;
&lt;p&gt;Number eight is the Readwise Official plugin and this is a plugin that I&amp;rsquo;ve been wanting for a very long time. In fact, before the official plugin came out, I created my own Python script that I was running regularly just to be able to move my things from Readwise to Obsidian.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://readwise.io"&gt;Readwise&lt;/a&gt;, if you don&amp;rsquo;t know, is a way to collect all of the things that you&amp;rsquo;re doing on the internet. It&amp;rsquo;s an easy way to collect eBooks, web articles, audiobooks, tweets, and even PDFs. And it all brings your highlights of those into your Obsidian vault.&lt;/p&gt;
&lt;p&gt;It is a really essential part to my learning process because it ensures that everything I&amp;rsquo;ve learned from a variety of different sources ends up in my Obsidian vault for me to process and analyze.&lt;/p&gt;
&lt;h2 id="obsidian-sync"&gt;Obsidian Sync&lt;/h2&gt;
&lt;p&gt;Number nine is Obsidian Sync and it is also a premium add-on, kind of like Obsidian Publish, but it&amp;rsquo;s also totally optional.&lt;/p&gt;
&lt;p&gt;You don&amp;rsquo;t really need Obsidian Sync. I already use Dropbox, but unfortunately, one of the problems with Dropbox is that you can&amp;rsquo;t yet use it to sync between different devices. I use Obsidian on my laptop, on my iPad, and on my Samsung mobile. So I have three different devices that I need all of my notes on.&lt;/p&gt;
&lt;p&gt;There are currently two options for this. It&amp;rsquo;s either iCloud or Obsidian Sync. I don&amp;rsquo;t like iCloud, and so, Obsidian Sync is my service of choice.&lt;/p&gt;
&lt;h2 id="obsidian-templater"&gt;Obsidian Templater&lt;/h2&gt;
&lt;p&gt;Number 10 is the most recent plugin of this 10 and it is Templater.&lt;/p&gt;
&lt;p&gt;Now don&amp;rsquo;t get it confused with Templates which is an Obsidian core plugin. TemplateR is a community plugin that&amp;rsquo;s like Templates on steroids. It extends templating functionality by letting you run JavaScript in your vault. This blows the functionality of Obsidian wide open as now I can run JavaScript in my vault to do certain things for me.&lt;/p&gt;
&lt;p&gt;I was already a fan of the core plugin Templates, so having Templater and all of the customization options that are possible is just amazing. Definitely recommend it.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve made it this far and you&amp;rsquo;re wondering what the heck is Obsidian, well maybe take a step back and watch this video on how to get started with Obsidian. And if you want to know about my usage of any of the particular plugins that I mentioned, leave me a comment below so that I know that I should make a video on that next.&lt;/p&gt;
&lt;p&gt;Thank you for watching. Happy note taking!&lt;/p&gt;</description></item><item><title>How to design a workload model in k6, with the k6 Developer Advocates (k6 Office Hours #42)</title><link>https://nicolevanderhoeven.com/blog/20220218-koh42-how-to-design-a-workload-model-in-k6/</link><pubDate>Fri, 18 Feb 2022 18:20:21 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220218-koh42-how-to-design-a-workload-model-in-k6/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt; and &lt;a href="https://twitter.com/srperf"&gt;Leandro Melendez&lt;/a&gt; join me to talk about how to design workload models in k6 load testing scripts using scenarios and executors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3AJLSH0Ifm4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone, and welcome to another k6 office hours. I am Nicole van der Hoeven, and for the first time, all three of us developer advocates are in one stream. Could you please introduce yourselves?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, who&amp;rsquo;s going first?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess you are.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right, age before beauty, as they say. Okay, well, hey, I&amp;rsquo;m Paul Balogh, the newest DevRel here at k6, nice to meet you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And on my end Leandro Melendez, also known as a Senor Performo, very happy to contribute here and bringing, usually it&amp;rsquo;s knowledge, but this time I&amp;rsquo;m gonna be a little bit on the learning side, which is super exciting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We learn together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I mean, I don&amp;rsquo;t think you can really have one without the other. I think it&amp;rsquo;s super valuable to also just ask questions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And Nicole, I&amp;rsquo;m a little disappointed that you don&amp;rsquo;t have a fake mustache to support Leandro and I.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. That is not something that I just have lying around, unfortunately.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We may have to fix that. I was commenting the equivalent here in Mexico is the unibrow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I could potentially draw something on my face, maybe, I could try that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is that the Frida Kahlo?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So, Leandro and Paul are relatively new to k6. I think you both have been here for less than a month.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just a month here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, just a month now, that&amp;rsquo;s awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Three.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But this is the first time, I&amp;rsquo;ve been here with you with each of you separately, but this is the first time that all three of us are here. It is pretty cool, welcome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exciting, hopefully it&amp;rsquo;s not overload for everybody watching.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. One thing that I wanted to get out of the way is that we have a very awesome community, we have several community champions, but one of them, NaveenKumar, just posted a couple of videos on how to use checks and thresholds in k6. So I&amp;rsquo;m going to put that in the comments, as well, because I thought that they were pretty awesome videos. NaveenKumar has a YouTube channel where he goes through a bunch of different tools, including k6, but also like JMeter and Gatling, and he always does a good job, so check those out. Oops, I actually didn&amp;rsquo;t post his videos, I think I posted the documentation for what we were talking about, so that&amp;rsquo;s a little premature. Sorry about that, let me put the actual links this time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, this is a live podcast.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, obviously. Sorry, you get what you get. So if that hadn&amp;rsquo;t already tipped you off, what we actually want to about today are scenarios and executors in k6. You may have been confused by the thumbnail because it was like, I realized afterwards, that it was the three of us, our photos, and then the words executors in k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here come the executors, the three of us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess that&amp;rsquo;s our new name or something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You know, if you invert the k6 logo, it almost looks like a guillotine, so maybe we are the executors.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I had not noticed that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s a little morbid.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, you know, hey, I do what I can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You&amp;rsquo;re going like play Beatles songs backwards and all that type of stuff, man. I&amp;rsquo;m sure it was not on purpose.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It looks like we&amp;rsquo;ve lost access to LinkedIn for some reason, but, oh well, this has happened before. Thank you, Mark, for saying we&amp;rsquo;re killer performance engineers, love the pun. So the reason that I wanted to talk about this was that, I don&amp;rsquo;t know if you also have got the same, Leandro, Leandro and I were both in the Automation Guild 2022. We both had a talk there and there are a lot of common questions that come up with regards to load testing. And a lot of it has to do with the results, specifically when, I&amp;rsquo;m not sure if you can actually hear the wind in my background.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Is that you, oh wow.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Are you okay?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m okay, but apparently there&amp;rsquo;s a storm that&amp;rsquo;s in Northern Europe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was gonna say, hopefully you&amp;rsquo;ll still be in Kansas, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I know. It&amp;rsquo;s like 140 kilometer per hour winds.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Don&amp;rsquo;t end up in Kansas.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But can I be the straw man, at least, in this Oz thing?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I always liked him.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess I&amp;rsquo;m Dorothy. Or the wizard.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I ask Toto, please.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;ve got Toto around here somewhere, let her in.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So one question that I was getting a lot, or I saw other people talking about variations of it, was the situation where you might have already run your load test and seen all check marks and everything passed, and the response times were within the expected results, and yet when the application goes live, suddenly there&amp;rsquo;s all these errors, and performance issues, and maybe production incidents that you never saw in any of your tests. And the question is, how can that be when you&amp;rsquo;ve done your testing and you didn&amp;rsquo;t find any of that and you only see it in production?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes, of course I experienced that several times, but many things come to mind on, in what environment did you test? What happened in this environment? If you test in production, hopefully &amp;lsquo;cause we are modern performance engineers that are not afraid of testing in production. Settings, changes, what was the workload? I mean, I don&amp;rsquo;t know, the list is pretty long.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, there&amp;rsquo;s a lot that, that could, that&amp;rsquo;s why that question is hard to answer because there&amp;rsquo;s no one answer. It&amp;rsquo;s like, oh and that happens, always check this. And that&amp;rsquo;s also because it could be that there&amp;rsquo;s something different with the environment. Like maybe it&amp;rsquo;s you didn&amp;rsquo;t test the same version of the code even, or maybe you were testing in not a production-like environment in terms of size, or test data, or something like that. But another reason that I think is easier because we testers normally control it is on the side of the script. It could be that you weren&amp;rsquo;t testing the things that you actually wanted to test. And a big part of that, I think, is workload modeling.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s one that I also wanted to comment, &amp;lsquo;cause that has been a pain in different occasions. On one hand, watch model, &amp;lsquo;cause from what you&amp;rsquo;re saying, there were these projects where in the end we were told, hey, this is a workload, this is a utilization that we are expecting to have in production or that we actually have in production, we want you to test for this. And it was nothing like that. We were told, yeah, it&amp;rsquo;s a thousand clicks per day, but you wanna test an emergency center when there&amp;rsquo;s a tornado. How is that true, how is that relevant, or vice versa? For some reason, our scripts are just simulating a thousand clicks per day where it&amp;rsquo;s 10,000 billions, gazillions, what would&amp;rsquo;ve been the right thing. Of course your performance test is gonna be awesome if you underdid it. And the other side of the risk, everyone running and, like, the system is dying, what is happening? Oh, we&amp;rsquo;re pressing it too hard, sorry, our bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s true, could go both ways.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But definitely you always have to worry about configuration drift anyway. Differences in your environments, unless you&amp;rsquo;re using something like a terraform or something, infrastructure is code where you can make sure that your environments are equal. So if you do your load testing and performance testing in a lower environment or isolated environment that it gets some of that, that it is truly configured the same.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, even when the environments are exactly identical, though, let&amp;rsquo;s just say that it&amp;rsquo;s possible to say that, yeah, there are still situations where if your load tests weren&amp;rsquo;t simulating realistic enough load, then you can&amp;rsquo;t really, you may not be able to apply those results to production either.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And one thing, as I said earlier, on one hand, the problem to getting those realistic numbers, at times, the team doesn&amp;rsquo;t even know, they have no idea what are you asking for. All they know is we want to be able to handle 10 users in the system. I&amp;rsquo;m kind of simplifying it, usually it&amp;rsquo;s 10 billion users or something like that, right. Okay, 10 billion users, what does that translate into in terms of utilization? And they go like utiliti-what? And that&amp;rsquo;s the first struggle, right. Supposing that you get the right numbers that you know exactly how much to stress each thing, &amp;lsquo;cause there there&amp;rsquo;s another differentiator, right. We get this action a thousand times, okay, but to get to that action at times or on some systems that are the same, you have to do others many more times, less times, and they are just telling you about this one. What is the proportion, how much to stress the other one that the other one does need not that many times? So that&amp;rsquo;s one discussion. If you get the numbers right then to landing it into the script and your scenarios, also, it&amp;rsquo;s a very interesting situation, headache-bringing situation at times.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think part of the problem is that a lot of times, when we think about load testing, there are only a few parameters that we think about immediately. One them is the number of virtual users. Another one is the test duration. And sometimes you might get like a request per second, like you were saying, Leandro, but those three don&amp;rsquo;t really describe the shape of a load. It&amp;rsquo;s kind of like trying to encapsulate test results into an average figure, like when you get the geometric mean of something, it&amp;rsquo;s not a great way to express the distribution. You know, if you say that the average response time is three seconds, that doesn&amp;rsquo;t mean that you don&amp;rsquo;t have really high response times. Like you could still have a handful of requests that are at 15 seconds, but maybe the rest of them are a hundred milliseconds. It doesn&amp;rsquo;t really&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There is context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Accurately describe the whole context, the big picture of the load. And in the same way, things like the number of virtual users, and duration, and requests per second also don&amp;rsquo;t show the entire picture.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, wen you&amp;rsquo;re describing it that way, it makes me think when you are asked to describe someone, oh, has beautiful glasses. I mean, I was talking about Paul, sorry, Nicole.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, sorry.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, no, I like your glasses, too. But you need a full picture, right? There are so many elements that a scenario or a workload model includes, so many variations, details that, yeah, as you were saying, I need 10 million users in the system doing what, how often, how long, how many of them are doing which ones? And many of those things, you have to get into the weeds to truly understand and design &amp;lsquo;cause this is another one, you will want different workloads for different type of load scenarios. You should not, I was gonna say you cannot, but you can try, but it&amp;rsquo;s not recommended at all to try to kill too many birds with a single stone. You may be able to get two, but more than that gets complicated, gets crazy. So you have to create a work model for that specific risk situation, that scenario that you want to test for. Just one at a time gets challenging, getting all those components, all those items and things that you need to be careful putting together to model and simulate something that resembles realistically that risk scenario, that risk circumstance that you want to test for.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And here you go again with that killer mentality there, killing multiple birds with one stone. And now Mark&amp;rsquo;s making comments here that actually for killers.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, okay, let&amp;rsquo;s say you may be looking for a needle into multiple haystacks, no killing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;There we go.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was thinking about what you were saying about the hypothetical scenario of a thousand requests over 24 hours. There&amp;rsquo;s still so many ways to interpret that, right? Because it could be, one interpretation could be, take a thousand requests divided by 24 hours and that&amp;rsquo;s the amount of load that you want to test with a one-hour load test. It could be like that, but if it&amp;rsquo;s emergency services, there are certain times of the day when emergencies are more likely. It could be seasonal, as well, like the incidents of emergencies of ambulances that are sent out increases over the holidays for inexplicable reasons. That kind of thing does give more context than just a thousand over 24 hours. I mean, if you just look at a period of 24 hours, those thousand could have been simulated, could have happened in one hour for all you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Step in a little far from the ambulance example, don&amp;rsquo;t wanna go more on the killer topic. Let&amp;rsquo;s think of a restaurant, if they say, this Golden Arches restaurant, we sell a thousand burgers per day. Okay. Most probably you are selling 80% of that at lunchtime and the rest of the hours we don&amp;rsquo;t care about. So those different behaviors during that period of time is what we should focus on, or care for, or have better information. Well, in the morning you get more, what&amp;rsquo;s the name of the thing, hash Browns, no burgers. Even if you are the same restaurant, which one do you want to simulate? What is the utilization at different periods in time during the day? &amp;lsquo;Cause yeah, probably no one, not that many people get a milkshake in the morning, but most of them getting in the night. So some of those variations, you want to make sure that you are doing the right mix, not only how many at a single number per long period of time, what happens each hour of the day, which ones do you care for. As a restaurant, I would say I don&amp;rsquo;t wanna simulate a load test of, I don&amp;rsquo;t know, after lunchtime where everyone is gone and we are super quiet. I don&amp;rsquo;t care load test-wise, right. But lunch time, breakfast time, I don&amp;rsquo;t know, 7:00 AM in a gym, I want to test those type of things of what people are doing and focus on, get a good work load model for what is happening at those times, right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So I thought, Mark has a couple comments here. I think also the number of vusers or threads compared to the target arrival rate or expected response time for me is the health of the workload generation. And he follows up with, also synchronizing or rendezvous vuser requests is underused in my opinion. Do you agree, Leandro.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, it&amp;rsquo;s in my personal experience, there have been a few times, at least on the render view or synchronizing part, there are not that many times where I had to leverage those functionalities. I think it kind of depends on the projects that you work on. One that comes to mind, and I really love this example for workload modeling in general, is I worked at a gaming company, Australia&amp;rsquo;s largest gaming company, and the project that I worked on was for the Melbourne Cup. So they sold tickets for the Melbourne Cup. And if you don&amp;rsquo;t know, and probably you don&amp;rsquo;t unless you&amp;rsquo;re Australian, but the Melbourne Cup is a horse race. It is like a two-minute horse race that is for some reason incredibly popular in Australia, in my state, in Victoria, &amp;lsquo;cause I lived in Melbourne, we actually got a public holiday for it. So, it&amp;rsquo;s that big. And for some companies, for a lot of these betting companies, the revenue from that one race could be up to 80% of the entire year&amp;rsquo;s revenue. So it is that big.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Just in that two minutes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and that&amp;rsquo;s the thing. Betting is open until the race starts. And yet when you look at the workload model for that, it really, the load spikes, the betting spikes just in the few seconds before the race. And that&amp;rsquo;s for a number of reasons, people might not have had the chance to bet earlier in the week because they were working or something. And if you have a public holiday, then you do have the time to just be there watching. And also there are, depending on the types of bet that you placed, there could be a difference in odds. So they&amp;rsquo;re trying to get the last possible information that they can before they have to make a decision about which horse to back. And that&amp;rsquo;s a good case for a rendezvous because there is a clear cutoff and sometimes you see the reverse, like for example, in a university portal or one of these shopping sales, where at midnight all the sales go live. And so you get people maybe refreshing that page all up to that point and then, bam, all of a sudden they start checking out things. And that would be, I think, a good time to use rendezvous.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, and in a quick example, you got me thinking, as well, video gaming, when you are on these multiplayer games, most probably everyone watching this are familiar, campaigns, online campaigns, certainly there are so many things happening, there are people playing other things, but a campaign is gonna start at this moment, this schedule. I think there a rendezvous would be a very good use of those type of things. Sadly, in my experience, some of those situations were solved with a spike scenario run out here with an average day in production, so overlapping scenarios. But that&amp;rsquo;s interesting &amp;lsquo;cause, as well, it depends on how do you want to tackle that problem. We are going to have a normal day and suddenly something&amp;rsquo;s gonna happen. How do we simulate it? How do we model that workload? What tools do we use? That&amp;rsquo;s a very good point, and again, with performance testing and load testing, there&amp;rsquo;s no one size fit all or the way to do everything. No, it depends, and you can get two very similar loads, simulations, workloads with different approaches, with different things. And that&amp;rsquo;s one that I also wanted to mention, like when modeling, it&amp;rsquo;s something that when you wanna try to get, there are two elements that I like a lot and I struggle a lot of times, when you are modeling your workloads, you have to somewhat randomize the actions. A big thing that we used to leverage in the load runner days was randomized think time in between steps. But eventually you have to say, okay, it&amp;rsquo;s randomized, it&amp;rsquo;s happening, like real people is using the system, but in the end I want just this process, just this virtual user to iterate a thousand times in an hour. Oh, but I have random times in between, okay let&amp;rsquo;s, that modeling, as well, I can tell got so interesting. And even like mathematic, not too complex, but mathematic functions like, okay, over time we have this deviation, if everything goes in the higher random wait time, we may get up here, we may get down there, so on average we&amp;rsquo;ll be simulating this. It&amp;rsquo;s all so challenging.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, those delays are definitely part of the workload model. In k6, we call them sleep. In JMeter, they&amp;rsquo;re timers. LoadRunner is think time. There are a lot of different terms for it, but basically a delay is some sort of planned sleep in your script that is meant to simulate a real user maybe taking time to think about what they&amp;rsquo;re going to do next, or read the text on the screen, or type out something in a form. And it actually can have a pretty significant impact on your load tests. First of all, if you don&amp;rsquo;t have any think time at all, then you need to be careful that you&amp;rsquo;re not maxing out your CPU and memory utilization on your load generator because that situation where you&amp;rsquo;re just very quickly firing off requests may not be entirely realistic. And I think that if you have think time that&amp;rsquo;s always the same time, like this is what you were talking about, having dynamic ones, if you always use the same value for your think time, you might see the staggering in your results, but that&amp;rsquo;s due to how your test is set up and not at all to do with how your application is responding. And then if you use dynamic think time, like you said, it can make it harder to plan because it&amp;rsquo;s more difficult to know exactly how many iterations your test is going to complete. So there&amp;rsquo;s always trade-offs, right. There&amp;rsquo;s no one way that&amp;rsquo;s always the best way.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And it depends, as well, on what are you actually trying to simulate. As you mentioned, there are times where we put think times that want to simulate a real person using the system. There are some others where you just don&amp;rsquo;t want these events to happen at the same time. To give you an example would be like if your script was a soldier marching one, two, one, two, and you&amp;rsquo;re adding soldiers at the same pace, one, two, eventually they all will be doing the same step at the very same time. If you are simulating a military parade or something like that, that&amp;rsquo;s awesome. You have the test. On that time, you may want that to happen or, or work it out with some rendezvous continuously happening. But if not, if you just want to simulate a regular march or people passing in the subway, they are not like one, two, one, it would be very interesting to see, but that&amp;rsquo;s not how real people walk in the every day. There are situations for everything, and it&amp;rsquo;s challenging at times, as you say, not only wait in between steps, but waiting after you complete a cycle and you want to start another one. There, you may also want some randomization or not to be that static so that your generally load simulations do not have to be that robotic, even if they are done by robots or virtual users. So there are several trade-offs.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have an extension to your metaphor, I think you&amp;rsquo;ll like, Leandro, what if instead, this is a way that your script might change depending on the business processes and the context of the industry. So what if instead of trying to simulate a military, what you&amp;rsquo;re actually trying to do is simulate Fremen running across the open sand, trying to not have patterns in their steps to avoid attracting Shai-Hulud, the great worm. If you don&amp;rsquo;t know the reference, I&amp;rsquo;m sorry. But in that case you do not want anything constant. You want something more dynamic, something that isn&amp;rsquo;t easily noticeable, that won&amp;rsquo;t skew the results as much. Oh, we have a question from ChipsAho. I don&amp;rsquo;t know if it&amp;rsquo;s just the Filipino thing, but there&amp;rsquo;s actually a good packet of cookies that&amp;rsquo;s called Chips Ahoy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ahoy, love them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If you are faced with budget constraints, how would you prioritize the workload model to use? That&amp;rsquo;s really good. And they follow up with, as performance engineers, I know sometimes our curiosity tends to get the best of us, trying to see how the system behaves in different circumstances.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, answering to, oh yeah, ChipsAho, is from Ahoy, very good cookies, put &amp;rsquo;em in the microwave eight seconds and you&amp;rsquo;ll love &amp;rsquo;em. So it depends a lot, I would say, and your budget constraints, what are you testing would be my question. What risks does your application will face, or what are the most common reasons? Again, there&amp;rsquo;s no silver bullet or single test that will clear all your performance risks ever again that you may have under loads. What loads were you? What things may harm your system? Those are the ones that you need to focus and prioritize based on that risk. If you already tested one, you know that it&amp;rsquo;ll survive, next test, maybe go to the next one and down the ladder, the risk ladder. But first it depends on your system. What is it going to subject to? What are the processes? And the risks may be different a spring ago from today. You may be releasing a new process that is super critical, super dangerous, will be touching databases or doing important or even dangerous queries. This time, you may want to focus on that one. There&amp;rsquo;s no one test to rule them all, one workload scenario, so it depends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think there are a few things that I would think about first. What is, like Leandro said, what&amp;rsquo;s the biggest risk? Meaning if there&amp;rsquo;s something where if you don&amp;rsquo;t load test this component there might be security implications, test that. Anything that&amp;rsquo;s critical, like payment or something that might affect compliance regulations for whatever industry it is, meaning like how you handle individuals&amp;rsquo; data, potentially identifiable data, that would be worth load testing. And also anything that&amp;rsquo;s very public, so maybe something like you&amp;rsquo;re about us page is nowhere near as public as your homepage. It can deal your company very significant damage, but hard to quantify damage, in terms of reputation, if your entire homepage is down, rather than if your about us page is down. So that could be a situation where something is not really mission critical or important to the business functionality, but it still would deal a lot of damage. So that&amp;rsquo;s a lot of reputation risk, I guess. A question here not about executors, but we can quickly talk about that. Do we get any performance HTML report in browser k6 load testing? Not yet &amp;lsquo;cause this person specified browser. So I don&amp;rsquo;t think that we have that yet for browser, but there are a few extensions. There&amp;rsquo;s the xk6 dashboard one by Ivan Skiba. And there&amp;rsquo;s also xk6, what is it called, xk6 HTML report or something like that. Go have a look at the session that I just had, the show that I just had with Paul last week, actually, where we talked about this very thing. They&amp;rsquo;re both extensions and they&amp;rsquo;re both awesome. They give like a, the Ivan Skiba one, I think, is the one that you did, Paul, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and actually I was gonna show that a little bit later here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, all right, well let me know when you want to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stay tuned, yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We might as well jump into that, &amp;lsquo;cause I definitely want to show some things about how to actually implement these workload models in k6. So one way that you can do that is by using scenarios. So I have, let&amp;rsquo;s just start with this one. So I have one script here, it is a protocol level script. And I&amp;rsquo;m just putting it in a separate JavaScript file just so this is a little cleaner to look at, so that we can focus on the scenario. In k6, we have something called scenarios that are ways to set things that run independently of each other. So you can have it be consecutive, or run one before the other, or you can have them run simultaneously. So this one just has, this example that I&amp;rsquo;ve got up now is just one scenario and it has an executor. So let&amp;rsquo;s talk a little bit about executors because this is something that&amp;rsquo;s specific to k6. So let&amp;rsquo;s look here. An executor is basically a way to change the way that the load looks. There are a bunch in k6 and I&amp;rsquo;m actually going to, I already, &amp;lsquo;cause I get this question a lot, I&amp;rsquo;m going to put this in the chat because I have this cheat sheet for how to go about thinking, deciding which one to use. So I&amp;rsquo;m going to post it in the chat and we, I think that the rule of thumb is if you want to just try one, you can, or you want a simple one, it&amp;rsquo;s probably ramping-vus that you want. And that&amp;rsquo;s because this is the default one and a lot of load testing tools where you set the number of virtual users and duration and then sometimes you might have stages. This is also what k6 defaults to. So let&amp;rsquo;s have a look. This is what that looks like. As you can see, I have ramping-vus set here, and this is a way to change the load depending on the number of virtual users. I also have these stages here. The first one is kind of like, I was trying to simulate a ramp up. So from when the test starts, this will start with zero virtual users. I&amp;rsquo;ve got that set here. And then it&amp;rsquo;ll gradually ramp up to 10 over five minutes. This is shorter because I think I was trying to, this was from a demo, so I was trying to make it something that we&amp;rsquo;d actually get results from, but this could be, you know, 30 minutes, if you wanted, depending on your test. And then this is kind of what we call steady state, where the number of virtual users doesn&amp;rsquo;t fluctuate. It&amp;rsquo;s just holding steady for this period of time, in this case 10 minutes. And this last one where it goes from 10 virtual users to zero is reflective of a ramp down. Paul, did you want to share your screen &amp;lsquo;cause I know you said you had some things in cloud to show us.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did, yes. And then unfortunately I wasn&amp;rsquo;t able to share for my script, there&amp;rsquo;s something going on with my system here. But let me go ahead and share my browser, which is working. So yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So this is a script that I had done and what I did was, as I was trying to go through and then figure out all these different executors, I wanted to see the pattern that each of these executors applies. So now here, let me, maybe it&amp;rsquo;s better if I start down here. So this is the actual script that I executed. So if you look here, you&amp;rsquo;ll see that in these scenarios and hopefully, let me see if I can.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah, I was just going to ask.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] A little bit more legible, there we go. I&amp;rsquo;m not the only one that may have old eyes and just can&amp;rsquo;t see. So I loaded up the options so that I would have all these different scenarios. &amp;lsquo;Cause I wanted to see every one of these executors and I wanted to be able to see what kind of pattern that they applied. And originally you&amp;rsquo;ll see that some of these numbers are a little bit different, but these are all the very specific things that each one requires. So in this case, the shared iteration scenario, and again, I&amp;rsquo;m not gonna be the expert on what each of these different executors provides, but they&amp;rsquo;re in the docs. So yeah, we can go through there. I&amp;rsquo;m gonna be working on these docs, as well, in the next couple weeks and try to clean these up a little bit more, maybe make &amp;rsquo;em a little bit more, I don&amp;rsquo;t know, state it a little bit differently or to help my understanding anyway. But yeah, so I loaded this up, so I have each one of the different executors set up. So here&amp;rsquo;s the ramping, so similar to what Nicole was talking about with the different durations. So here over a ten-second period, I had it ramp up to, I think, from zero to 10 vus. And then for 10 seconds I would have it keep going at a level 10, so it would be a flat top. And then the last 10 seconds would be ramping down to zero. All these other ones here, too. So, I put every one of these in there so that way then we could go ahead and compare them and, whoa, let me, all right. So each one of these is kind of denoted here and I guess I can&amp;rsquo;t, I wish I could isolate these and then what&amp;rsquo;s really, I guess, the most important here is the purple line and hopefully you&amp;rsquo;re not, no one&amp;rsquo;s really color blind or missing the color differences here. But yeah, so the purple line is the actual number of the request coming through. And then this blue line, or the aqua, is the actual response time for the service. We&amp;rsquo;ll just kind of focus on the purple line that&amp;rsquo;s what these executors are really affecting more so. And then the gray line, this shaded area is actually the virtual users. So you&amp;rsquo;ll see that here it started at zero, and then it ramped up for a period of time, and then it started kind of flattening, and then it would ramp down. Now this is for the accumulation of all the different executors. Unfortunately, and this might be something I might put in as an issue to possibly add or an enhancement is that each one of these lines here is a scenario. So this actually has the shape from that particular executor. So it&amp;rsquo;d be nice to show the vus in here, as well, but you can kind of infer it based on the activity, the request. So again, that&amp;rsquo;s the purple line again. And so here, you see this executor actually ran pretty quickly to get to the number of requests. I was trying to keep them about the same because I wanted to do, like, a progress bar race. So when I was running this locally, I could see the different areas in which was actually completing the same number of requests faster and all that. But yeah, so this was kind of my playing around and, again, this is on the cloud product. So this is an add feature. But now with talking about the HTML reporting, this is what I actually did here. So let me go ahead and I&amp;rsquo;m gonna go ahead and run this script again. Now unfortunately, you&amp;rsquo;re not gonna be able to see the actual execution as I run it locally, but let&amp;rsquo;s see.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Paul, we got a question about the k6 cloud results that you were showing. Could you create a shareable link so that people can also have a look at it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Well, let&amp;rsquo;s see. How can I do that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] You can go to the three dots in the upper right. Yep, and then share test results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] All right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] We can just copy and paste that into the chat.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Leandro] And then they are out into the world.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Out into the world, yeah. Awesome, cool. See, today I learned again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Nicole] Yeah. Awesome. I&amp;rsquo;m so glad you did this, though, because I wanted to, but I didn&amp;rsquo;t get around to doing it. So I&amp;rsquo;m really glad you did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;[Paul] Yeah, and then I wanted to actually have them separate so I could kind of show each one&amp;rsquo;s pattern again. That&amp;rsquo;s the thing that I was really trying to get to, and I&amp;rsquo;ll probably put together a blog post, so keep an eye out for that, where I&amp;rsquo;ll kind of go through that, and describe, and show patterns that are created by the executors. And then that is as I learn more. Again, so this is, this dashboard that I&amp;rsquo;m showing here, this is actually an extension. So I did compile this into the k6 binary, custom with this output. And this is available here. This is this xk6 dashboard, and this is also included in our registry on the site, so you&amp;rsquo;ll be able to find this as well. Pretty easy to do this, the xk6, to create the extension and build it. But anyway, we can always give help. Anyway, I&amp;rsquo;m gonna go ahead in this other window, and I&amp;rsquo;m gonna go ahead and start this test running. So now as we see here, and I shouldn&amp;rsquo;t have to refresh, but let&amp;rsquo;s see, go ahead and refresh here. All right. So now this test is running in the background. And then we should start seeing the output. There we go. Now, there is a delay. So behind the scenes, this is actually using, it&amp;rsquo;s creating Prometheus-based metrics and then it&amp;rsquo;s serving that up in a little web server locally. So it&amp;rsquo;s really cool. So I haven&amp;rsquo;t been able to play around with it nearly as much as I need to, but anyway, but this is something, it&amp;rsquo;s a nice little tool to be able to use if you don&amp;rsquo;t want just the plain text display in your console. But yeah, so this test is actually already completed. Now, it&amp;rsquo;s actually still running in a way, though, because we have this externally controlled executor where now from another terminal I could sit there and I could say, okay, yeah, now I wanna ramp up the vus to 10 or that type of a thing, just via rest API. But unfortunately, due to technical difficulties, I can&amp;rsquo;t show you that, but I will definitely put that in the blog post when I start putting that together. Anyway, this is one of those cool little tools with this extension that you can kind of, I don&amp;rsquo;t know, really get some cool results. But yeah, that was the big thing. Here&amp;rsquo;s for the external access, this is the rest API where I could sit there and call that custom executor and say pause testing or even to ramp up the number of vus. Still figuring this out a little bit. It&amp;rsquo;s a little, I don&amp;rsquo;t know, it needs some play around with it a little bit to get a good understanding of it. But yeah, I wanted to show that, again, you can do this stuff, have the graphics there. Now, the HTML report that Nicole was talking about, that&amp;rsquo;s something where, yeah, you could save that off, and again, it doesn&amp;rsquo;t have the graphics, I don&amp;rsquo;t think, if I remember correctly, but it does have it where you could then save that off.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not real time either. But it is more like a report.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, yeah. That&amp;rsquo;s it, let me go ahead and stop that test. Oh yeah. So again, I will put together something so that way then if anybody wants these details and obviously you can use that link, so it&amp;rsquo;s now shareable, so I will make sure to not delete it .&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great. I do want to share something, Paul, if you&amp;rsquo;re okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, absolutely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Great. So I also wanted to talk about the fact that we can do it, you can put together a scenario using different executors, but another thing that you could do is have each scenario be a completely different test. One could be a load test. Another could be a chaos engineering test, for instance. Like this is one that I had where this get Pokemon is an HTTP request that just hits the API. And this is intended to be more of a load test, but then you could have a chaos scenario and you can say that at a certain point, you fire off this thing that then terminates one of the pods in Kubernetes, according to certain conditions. This is using the xk6-chaos extension. But in this way, you can see that these are not just load-testing scenarios. These are just testing scenarios and they&amp;rsquo;re different types of testing that you could use. Another type other than chaos is browser testing now that we&amp;rsquo;ve got xk6 browser. So now you can do things where you have one scenario that&amp;rsquo;s doing some sort of protocol level test and the other one is doing a browser level test. And because those two are fundamentally different, you may want to be able to control them separately. You probably won&amp;rsquo;t be wanting to generate majority of the load with a browser level test, for instance, you probably wanna do that with your protocol level test, but you might want to piggyback off of the protocol test and run a few, like a handful, of browser users just to be able to get some front-end metrics. So, I think it&amp;rsquo;s kind of cool that you can do that. Another thing that you can do with scenarios and executors, well, it&amp;rsquo;s something with workload modeling anyway for k6, this is a script that I&amp;rsquo;ve got for percentages. Now, I think the use case for this, I mean, there are a lot of use cases, but what I actually think this could be used for is an e-commerce scenario where a typical scenario is to have like 100% of the virtual users go into your homepage, and then maybe 50% of them go and browse through the product pages, and then of that 50%, maybe only half of those actually added to the cart. So that is also something that isn&amp;rsquo;t directly related to scenarios and executors, but it does have something to do with the workload model of your test. So in this example, I&amp;rsquo;m setting a random number between one and 100, and then depending on that, I have this combination, in this case, I&amp;rsquo;m setting different clients for it. So let&amp;rsquo;s say that there&amp;rsquo;s a really big client that we want to use 50% of the time, you could use that, and then pass that on to some request that you&amp;rsquo;re sending. And in this way, you&amp;rsquo;re already making something that&amp;rsquo;s more realistic than just get a client, just get details for a client. Well, which client is that because maybe that&amp;rsquo;s being cached? Maybe you do want it to be cached, you&amp;rsquo;d have to see what you want, what you&amp;rsquo;re trying to achieve with that particular test, but it all has an impact on your testing results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and if I may add for learning some of these functionalities, it makes, and I think I started a comment how the situations, how the ramp-ups work, how when we want to model these targets in the old days, as I said, getting these, okay, my user takes this amount of time of execution, it has this amount of random timers, and it&amp;rsquo;s a pain at times when your process starts to degrade a little bit of performance, and because of that, they don&amp;rsquo;t go as fast as you need them to, as you want to generate, because you did the calculations based on optimal response times, right. So some of these controls will be very useful depending on the scenario that you are wanting to focus and not to do all that type of crazy math that we had to do. I remember with the load runner days, it was like, okay, but if the response time starts to deviate a little bit, this we need to, there&amp;rsquo;s so much that on this situation with some of these options, k6 can mutate may be the wrong word, but adapt to what you&amp;rsquo;re trying to do, right, and keep doing the loads and doing those processes that you are aimed for. There are some others that you are like, if the system starts to go slow, the users will slow down and that&amp;rsquo;s right, that&amp;rsquo;s okay, that&amp;rsquo;s normal, but on others it&amp;rsquo;s like, no, I absolutely want that the users keep coming, keeps hearing the system, even if the system is slowing or many other things that can start to happen. These controls truly make our lives easier. in so many of those situations like crazy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We have a question from SJ who says, is there a pacing config in k6 or maybe a throughput controller equivalent? So let&amp;rsquo;s talk about pacing, Pacing and load testing terms is related to think time in that it does impose some sort of timing on the requests, but while a think time is more like a direct sleep on a thread, pacing is more like the space between each iteration and there are different ways to achieve this. k6 doesn&amp;rsquo;t have something that is exactly pacing. But for instance, the way that JMeter would do this is by using the throughput controller, which is what I think SJ is alluding to. And so instead of specifying the time between each iteration, JMeter does it by allowing you to set a target request per second, some sort of throughput. And we do have that. Let me just share my screen again. So this is the executors that we have. And I think this constant arrival rate would be the best for that. Because if we look at the example here, you can set a rate here, a requests per second, that is your target. What k6 does is it sends a request or it does one iteration, sees how many requests were sent, and then adjusts the next one, waits a certain time so that before it does the next iteration to adjust to that. So if it already did, you know, 200 requests per second the first iteration, then maybe it&amp;rsquo;ll just do the same thing for the second iteration. And it will dynamically change throughout the test. So maybe at the beginning of the test, response times are faster because not all the users have ramped up yet. In that case, the pacing might be slower because there&amp;rsquo;s no delay on the server side. And so the script is easily hitting the 200 requests per second, but you&amp;rsquo;ll find that later on throughout the test, you may experience higher response times, and in that case, the pacing will be quicker. So that number will be lower so that it still reaches the 200 requests per second.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s part of what I was mentioning that easiness of. JMeter, I remember before they didn&amp;rsquo;t have that plugin for the throughput, what was the name, I just forgot about it. At the very first times that we started to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Throughput controller.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Throughput controller, thank you. We didn&amp;rsquo;t have those type of controllers, ways to managing them. And again, bringing the load runner days, I don&amp;rsquo;t remember many useful devices to go through this. And on this case, when you have a scenario that at times when we were designing this workflow, this scenario, we would know, okay, I know that per user, I want that in an hour these many iterations happen. So if you want that, you can use the per vu iterations executor that will help you to quickly configure and manage that, you do have the iterations per user, and maybe you have 10 users, 20 users, you don&amp;rsquo;t care about the number of users. Then you select the shared iterations. I just need this throughput to happen this number of times in this period of time, maybe next time I will have more virtual users, maybe next time I will have less. So you have more control on the end game, to call it in a way, that you&amp;rsquo;re looking for, rather than, and I cannot say this enough, it was a struggle to try to control, and simulate, and reach those goals that you were trying to get in your simulation, and there are so many reasons, as I said, the wait times in between steps were randomized before, as Nicole says, you have the pacing times in between each cycle, and it was so many, like three factors, main factors, I would say, wait time, pacing time, and processing time, each step would add up to that time that there are so many variables that were somewhat random that you could not control. So here you would have some assistance, some help on hitting those goals that you&amp;rsquo;re trying to simulate and having it realistic or on the goal that you&amp;rsquo;re trying to reach, right. It&amp;rsquo;s that difference, I don&amp;rsquo;t know if anyone has gym experience or has ever visited one of those things, but they will tell you, hey, I want to work leg today. Okay, do five repetitions three times. That&amp;rsquo;s if you wanna think of that, how long do you take and do each sit up to go, to give an example, that will be your think time, your wait time in between steps. Okay, you need some rest time before you do the next one. That&amp;rsquo;s the pacing. So for the ones that are not so familiar with those terms, just wanted to throw out that silly example.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s one of those things I&amp;rsquo;d like to, I don&amp;rsquo;t know, I keep thinking of playing around with, you know, if you look at say HTTP audit logs or something like that, they have a timestamp on there as far as when everything came in. Well, if you take that and use that as the basis to basically replay your activity, I don&amp;rsquo;t know, that&amp;rsquo;s one of the things that I keep thinking about, that would be cool to do, or to have, you know, all your activity going into Kafka, and then being able to repeatedly replay the exact same, perfect storm scenario without having the randomness injected in there. I don&amp;rsquo;t know, I&amp;rsquo;m probably going off on a tangent, but that immediately made me think of that, though. It&amp;rsquo;s like this is one of those things where it&amp;rsquo;s like I always kinda wanna play around with this idea.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think that there&amp;rsquo;s a time for that. I think there&amp;rsquo;s a use case for it, but there are also some disadvantages, I think. that people should be aware of. If it&amp;rsquo;s information from a production environment, there are potentially security concerns there for using a user&amp;rsquo;s data to test or a user&amp;rsquo;s account to test. And what happens if that actually gets replayed on their account, which it could be, it, it might not be. Sometimes it doesn&amp;rsquo;t work, sometimes sending the same request, even if it&amp;rsquo;s exactly the same, won&amp;rsquo;t work. I think that that&amp;rsquo;s, I think, more experimental, I guess, when you don&amp;rsquo;t really know what you&amp;rsquo;re looking for and you&amp;rsquo;re trying to narrow it down, but I also think that once you&amp;rsquo;ve narrowed it down, it&amp;rsquo;s probably easier and cleaner to script it up so that you can consistently reproduce that scenario. And you can also use test data. Also, you&amp;rsquo;d be able to kind of break it down, you&amp;rsquo;d control all the variables, so you know with certainty that when there&amp;rsquo;s only one thing that changed and it was a negative result, then you know that that was the cause of it. But yeah, I think that there&amp;rsquo;s a valid reason to use that, as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, there&amp;rsquo;s definitely data sanitization that you gotta be concerned about unless we&amp;rsquo;re replaying activity on Leandro&amp;rsquo;s credit card, then it&amp;rsquo;s okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, please don&amp;rsquo;t. Oops, there are 10,000 charges per hour in your credit card. What?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Load testing your credit card. Navin Kumar, whose videos I was just plugging at the start of this has a question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very good question.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can we intentionally include sleep time in the response time? Now, Mihail, who&amp;rsquo;s one of our developers, if I say something wrong, tell me in the comments, but I believe that there isn&amp;rsquo;t a way, that there&amp;rsquo;s no k6 specific function to do this or option. What I&amp;rsquo;m thinking of is you could create a custom metric because you can create really a bunch of different metrics, counters, and timers, and gauges, and whatever in k6. So you could definitely do that and have that reported and you could set the timing manually, as well. Another thing that I&amp;rsquo;m thinking of is if I had to do this, I&amp;rsquo;d probably just use the xk6 browser extension, because that&amp;rsquo;s already going to include everything, the actual render time. &amp;lsquo;Cause now we&amp;rsquo;re getting, if you&amp;rsquo;re including the sleep time or the think time, this is more like getting into the front-end performance side of things and I think it might just be easier to do that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That was gonna be kind of a question that I wanted to do, too, Naveen. Like why do you want to include the sleep time programmatically that you are generating in your script? I mean, as you say, Nicole, the front end is important to know those render times, those wasted moments in the response or back-and-forth communication, but what are you trying to use it for? It would be very interesting if you can share it. I&amp;rsquo;m curious what&amp;rsquo;s the use. Oh, okay, you were just being creative.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I think that, yeah, probably if you want to just see front-end experience, I do think it would be more useful if in this case, if you&amp;rsquo;re including it in the response time, then maybe have a constant sleep, actually, because then it&amp;rsquo;s consistent because you don&amp;rsquo;t want the sleep to be influencing your results.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I did use something like that a long time ago, but precisely to model this workload to calculate. I generally recommend do a small-ish version of the load test that you want to do, let it run for a while so that you can massage those values of how much random time to sleep here, how much random pacing you have here, and how is the response time affected so that you can balance it out. That could be an interesting use, real-life example, but that&amp;rsquo;s a good question, as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I mean, injecting a network latency and things like that is always a nice thing for backend services. I mean, with microservices, because one single API call on the front end could be going through 10 different microservices ultimately. And to be able to test something where if halfway through those calls if you have a network hiccup where one of the services is not accessible, but it&amp;rsquo;s, anyway, but it&amp;rsquo;s all one of those things where it&amp;rsquo;s like this feels a little bit more on the chaos engineering aspect of things, you know, how is your application going to behave when something goes wrong? If all of a sudden your network grinds to a halt where it&amp;rsquo;s going really slow, is your application handling that scenario appropriately?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay, and on that note, we are actually a little bit over on time already, that went by really quickly. Thank you both for coming and for sharing your thoughts on these topics and also for demoing the k6 cloud stuff that you already had, Paul. Yeah, you are welcome back anytime and I hope we do this again. And for everybody,&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought that was the last one.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, well, sorry to disappoint you. You&amp;rsquo;re stuck now, like you&amp;rsquo;ve signed the contract, that was it. You didn&amp;rsquo;t read the fine print. Must come to office hours every Friday.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This would be the last time that you would want me on here.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, for those of you who are watching, thank you for watching. Thank you for all the awesome questions we got this week and have a good weekend. And if you are in a place where it&amp;rsquo;s very stormy, good luck, hope we all survive it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Stay safe.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye everyone, have a good weekend.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Take care everyone, adios.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to get started with Obsidian in 2022 - from scratch</title><link>https://nicolevanderhoeven.com/blog/20220216-obsidian-for-beginners/</link><pubDate>Wed, 16 Feb 2022 17:00:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220216-obsidian-for-beginners/</guid><description>&lt;p&gt;In this video, I talk about how to ignore all the complicated methodologies for note-taking and just get started with the good old-fashioned art of taking notes - with &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, of course!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OUrOfIqvGS4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Getting started with using k6 extensions, with Paul Balogh (k6 Office Hours #41)</title><link>https://nicolevanderhoeven.com/blog/20220211-koh41-getting-started-with-xk6/</link><pubDate>Fri, 11 Feb 2022 18:00:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220211-koh41-getting-started-with-xk6/</guid><description>&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, I was joined by my new colleague &lt;a href="https://twitter.com/javaducky"&gt;Paul Balogh&lt;/a&gt;, to talk about his experience in joining the k6 team and his first impressions of the xk6 extension system.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d_xpsKz-pSA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Foreigners Try Latvian Food (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20220210-foreigners-try-latvian-food/</link><pubDate>Thu, 10 Feb 2022 20:04:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220210-foreigners-try-latvian-food/</guid><description>&lt;p&gt;Latvia was the last country we travelled to in 2018. We took the bus out of Tallinn and into Riga, Latvia. We unfortunately didn&amp;rsquo;t have much time there before we had to fly back to our home in the Netherlands, but we DID have enough time to sample some Latvian food!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZrFP8nhiKMY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>In search of the best Pokémon: Browser automation and load testing in one script with k6 (Automation Guild 2022)</title><link>https://nicolevanderhoeven.com/blog/20220210-in-search-of-the-best-pokemon/</link><pubDate>Thu, 10 Feb 2022 12:01:53 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20220210-in-search-of-the-best-pokemon/</guid><description>&lt;p&gt;Being a tester is like being a pokémon trainer: we want to choose the right pokémon for the job. The problem with doing different types of testing is that we also end up with multiple scripts in different languages and testing tools. We end up choosing a squad of pokémon: one for unit testing, one for automation testing, one for load testing, and so on. Making sure they all work together is a task in itself!&lt;/p&gt;
&lt;p&gt;But what if we could just use one? What if we only needed one Mega-evolved pokémon that could fulfill multiple roles? Is it really possible to write a browser automation script and then reuse it for load testing?&lt;/p&gt;
&lt;p&gt;In this presentation, I talk about my search for the elusive one pokémon that does multiple jobs, the advantages of hybrid load testing, and how to pick pokémon that make our life as trainers and testers easier.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SFag8ggkXKo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Reclaim.ai Review - Smart calendar blocking for the productive engineer</title><link>https://nicolevanderhoeven.com/blog/20220209-reclaim-ai-review/</link><pubDate>Wed, 09 Feb 2022 19:56:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220209-reclaim-ai-review/</guid><description>&lt;p&gt;For the last few months, I&amp;rsquo;ve been trying out an app called &lt;a href="https://reclaim.ai"&gt;Reclaim&lt;/a&gt; that has been changing my mind about the feasibility of calendar blocking for time management in general.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my (rave) review of the app!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cBVjpFDltvQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using Executors and Stages in k6 with Théo Crevon (k6 Office Hours #40)</title><link>https://nicolevanderhoeven.com/blog/20220204-koh40-executors-and-stages-in-k6/</link><pubDate>Fri, 04 Feb 2022 20:01:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220204-koh40-executors-and-stages-in-k6/</guid><description>&lt;p&gt;Today, Théo Crevon, one of our newest Senior Software Engineers at k6, joined me and my colleague, Leandro Melendez, to talk about his experiences in joining k6, and why scheduling in a load testing tool is simultaneously difficult and important to get right.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wj3KjJth1SU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Pizza and Antiquing in Tallinn Estonia (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20220203-pizza-and-antiquing-in-tallinn-estonia/</link><pubDate>Thu, 03 Feb 2022 10:59:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220203-pizza-and-antiquing-in-tallinn-estonia/</guid><description>&lt;p&gt;In December 2018, my husband and I went with a few friends to Tallinn, Estonia, where we spent some time going around the cool district of Kalamaja. We ended up doing a bit of antiquing, thanks to some local friends who were willing to show us around!&lt;/p&gt;
&lt;p&gt;{{ youtube UieJylnc_b0 }}&lt;/p&gt;</description></item><item><title>Creating a D&amp;D DM's Brain Attic With Obsidian</title><link>https://nicolevanderhoeven.com/blog/20220202-creating-a-dnd-dms-brain-attic-with-obsidian/</link><pubDate>Wed, 02 Feb 2022 10:46:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220202-creating-a-dnd-dms-brain-attic-with-obsidian/</guid><description>&lt;p&gt;I started using &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; for professional reasons. I use it daily as my main task management and personal knowledge management system for my main job as a software developer advocate at &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;. However, a surprising use case of mine for Obsidian is playing Dungeons &amp;amp; Dragons, the tabletop roleplaying game.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a video of me walking through my setup for how to use Obsidian to create my own &amp;ldquo;DM&amp;rsquo;s Brain Attic&amp;rdquo;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Fblwp-Uop_8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="other-resources"&gt;Other Resources&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/"&gt;Non-Lazy DMs use Obsidian for D&amp;amp;D&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20211113-how-i-use-obsidian-to-run-and-play-dnd-online/"&gt;How I use Obsidian to run and play D&amp;amp;D onliny&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20220109-5-ways-to-use-obsidian-as-a-software-engineer/"&gt;5 ways to use Obsidian as a Software Engineer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20211117-how-i-use-obsidian-for-work-as-a-software-developer-advocate/"&gt;How I use Obsidian for Work as a Software Developer Advocate&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Realistic Calendar Blocking for the Agile Knowledge Worker</title><link>https://nicolevanderhoeven.com/blog/20220201-realistic-calendar-blocking-for-the-agile-knowledge-worker/</link><pubDate>Tue, 01 Feb 2022 16:07:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220201-realistic-calendar-blocking-for-the-agile-knowledge-worker/</guid><description>&lt;p&gt;Calendar blocking is the only way to identify and avoid distraction.&lt;/p&gt;
&lt;p&gt;In a world that tempts us with &amp;ldquo;a little bit of everything, all of the time,&amp;rdquo; resisting distraction is the most valuable skill. Yet distraction isn&amp;rsquo;t always easy to recognize, especially when it comes in the guise of other things we need to do.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to use calendar blocking to gain control over your schedule.&lt;/p&gt;
&lt;h2 id="set-realistic-schedules"&gt;Set realistic schedules.&lt;/h2&gt;
&lt;p&gt;Setting an overly ambitious schedule inevitably leads to disappointment.&lt;/p&gt;
&lt;p&gt;The hard part is figuring out what&amp;rsquo;s infeasible, and that has to come with time. In the meantime, &lt;em&gt;expect to change your schedule.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="use-digital-tools"&gt;Use digital tools.&lt;/h2&gt;
&lt;p&gt;Calendar Tetris isn&amp;rsquo;t fun&amp;ndash; but there are tools that can help.&lt;/p&gt;
&lt;p&gt;If you expect to change your schedule, choose tools that make that easier. I use &lt;a href="http://Reclaim.ai"&gt;Reclaim.ai&lt;/a&gt; to change my calendar in response to changing priorities.&lt;/p&gt;
&lt;h2 id="do-a-weekly-review"&gt;Do a weekly review.&lt;/h2&gt;
&lt;p&gt;Review how well you stuck to your schedule and adjust it accordingly.&lt;/p&gt;
&lt;p&gt;A good schedule, like a good budget, changes over time. Set aside a time every week to assess the previous week and set priorities for the next week.&lt;/p&gt;
&lt;h2 id="relate-your-schedule-to-your-core-principles"&gt;Relate your schedule to your core principles.&lt;/h2&gt;
&lt;p&gt;Your calendar should be the reflection of the values you hold.&lt;/p&gt;
&lt;p&gt;But what are those values? Keep a list of the principles you live by (or want to live by). Look at your calendar as a way to keep yourself on track.&lt;/p&gt;
&lt;h2 id="reframe-restriction-as-freedom"&gt;Reframe restriction as freedom.&lt;/h2&gt;
&lt;p&gt;When you don&amp;rsquo;t set your calendar, others set it for you.&lt;/p&gt;
&lt;p&gt;Restriction isn&amp;rsquo;t following a schedule &lt;em&gt;you&lt;/em&gt; set. Restriction is being subject to the passing whims of bugs and meetings that demand your attention.&lt;/p&gt;
&lt;h2 id="calendar-blocking-defends-your-time"&gt;Calendar blocking defends your time.&lt;/h2&gt;
&lt;p&gt;It frees you to do things you decide are important.&lt;/p&gt;</description></item><item><title>5 Things the Obsidian Templater Plugin Can Do That Templates Can't</title><link>https://nicolevanderhoeven.com/blog/20220131-5-things-the-obsidian-templater-can-do-that-templates-cant/</link><pubDate>Mon, 31 Jan 2022 22:46:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220131-5-things-the-obsidian-templater-can-do-that-templates-cant/</guid><description>&lt;p&gt;The Templater plugin is what the core Templates plugin should have been.&lt;/p&gt;
&lt;p&gt;The name is unfortunate, as it implies that the two plugins are similar. Turns out they&amp;rsquo;re only similar in that one is a limited version of the other.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what you can do with Templater&amp;ndash; and not with Templates.&lt;/p&gt;
&lt;h2 id="add-dynamic-variables-to-your-notes"&gt;Add dynamic variables to your notes&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;re probably thinking, &lt;em&gt;but Templates can already add dates&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Templater can do that, &lt;em&gt;and more&lt;/em&gt;. You can use it to fetch values in YAML frontmatter, random quotes from the interwebs, and even clipboard contents.&lt;/p&gt;
&lt;h2 id="make-your-notes-context-sensitive"&gt;Make your notes context-sensitive&lt;/h2&gt;
&lt;p&gt;Templater can create notes with different templates depending on context.&lt;/p&gt;
&lt;p&gt;For example, you could set up Obsidian to create a new note using the &lt;em&gt;Person&lt;/em&gt; template in the &lt;em&gt;People&lt;/em&gt; folder but a &lt;em&gt;Weekly Review&lt;/em&gt; note on Sunday nights.&lt;/p&gt;
&lt;h2 id="increment-your-notes-automatically"&gt;Increment your notes automatically&lt;/h2&gt;
&lt;p&gt;Templater can automatically increment new instances of a series.&lt;/p&gt;
&lt;p&gt;You can set it up to create a session log for your 100th D&amp;amp;D session, a review note for your 12th monthly review, or your 10th book review.&lt;/p&gt;
&lt;h2 id="interact-with-other-plugins"&gt;Interact with other plugins&lt;/h2&gt;
&lt;p&gt;Templater leverages all the best parts of Obsidian&amp;rsquo;s ecosystem.&lt;/p&gt;
&lt;p&gt;You can read from and write to YAML frontmatter using Dataview, or run commands that create notes based on text input with Buttons.&lt;/p&gt;
&lt;h2 id="write-and-run-your-own-scripts"&gt;Write and run your own scripts&lt;/h2&gt;
&lt;p&gt;Templater lets you write and call user scripts within an Obsidian note.&lt;/p&gt;
&lt;p&gt;This is the ultimate in extensibility. The ability to run custom JavaScript means you&amp;rsquo;re limited only by your imagination (and skill).&lt;/p&gt;
&lt;h2 id="templater-lets-you-turn-obsidian-into-exactly-what-you-want"&gt;Templater lets you turn Obsidian into exactly what you want.&lt;/h2&gt;
&lt;p&gt;And isn&amp;rsquo;t that what a PKM should do?&lt;/p&gt;</description></item><item><title>10 Mandatory Obsidian Plugins for Every Software Engineer</title><link>https://nicolevanderhoeven.com/blog/20220129-10-mandatory-obsidian-plugins-for-every-software-engineer/</link><pubDate>Sat, 29 Jan 2022 23:58:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220129-10-mandatory-obsidian-plugins-for-every-software-engineer/</guid><description>&lt;p&gt;If you haven&amp;rsquo;t installed any Obsidian plugins, you&amp;rsquo;re missing out.&lt;/p&gt;
&lt;p&gt;Many other mainstream PKM apps seem to have been built with the intention of hand-holding users through every step using a pretty interface. On the other hand, Obsidian is perfectly suited to power users who want to change the tool to meet their needs exactly. But you can only do that with plugins.&lt;/p&gt;
&lt;p&gt;Here are 10 Obsidian plugins you should install if you work in tech:&lt;/p&gt;
&lt;h2 id="enable-these-core-plugins"&gt;Enable these Core Plugins.&lt;/h2&gt;
&lt;p&gt;Core plugins are shipped with Obsidian but are disabled by default.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Daily notes&lt;/em&gt;&lt;/strong&gt;: Creates a new Markdown page according to a specified template that serves as a scratchpad and springboard for every new day.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Templates&lt;/em&gt;&lt;/strong&gt;: Lets you define predetermined formats that can be inserted into notes. Some template examples: Daily/Weekly/Monthly/Yearly notes, meeting notes with agendas, person notes to create your own CRM.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Backlinks&lt;/em&gt;:&lt;/strong&gt; When you have a note open, this shows you all the other notes that have referred to it, explicitly (via [[links]]) or implicitly (unlinked).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Quick switcher&lt;/em&gt;:&lt;/strong&gt; Lets you find any note by hitting CMD+O and showing search results as you type. With this enabled, I never bother with folders.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Workspaces&lt;/em&gt;:&lt;/strong&gt; Lets you save the exact arrangement of notes and sidebar options you have selected, and then load it quickly later. I have workspaces for writing, processing content, playing D&amp;amp;D, and making videos.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="install-these-community-plugins"&gt;Install these Community Plugins.&lt;/h2&gt;
&lt;p&gt;Community plugins are created by users and open-sourced on GitHub.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Calendar&lt;/em&gt;&lt;/strong&gt;: Adds a real-world calendar to your side panel that shows daily and weekly notes. Use Fantasy Calendar for even more customization.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Editor Syntax Highlight&lt;/em&gt;:&lt;/strong&gt; Formats text in code blocks according to the programming language set. Drastically improves readability of any code.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Readwise Official&lt;/em&gt;:&lt;/strong&gt; Regularly imports your highlights from ebooks, web articles, audiobooks, tweets, and PDFs into your Obsidian vault.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Templater&lt;/em&gt;:&lt;/strong&gt; Extends templating functionality by letting you run JAVASCRIPT. In your vault! This blows the functionality of Obsidian wide open.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dataview&lt;/em&gt;:&lt;/strong&gt; Turns your Obsidian vault into a database using custom parameters in YAML frontmatter. There&amp;rsquo;s even a way to write queries in js!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Señor Performo's Week of Load Testing (k6 Office Hours #39)</title><link>https://nicolevanderhoeven.com/blog/20220128-koh39-leandros-week-of-load-testing/</link><pubDate>Fri, 28 Jan 2022 23:27:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220128-koh39-leandros-week-of-load-testing/</guid><description>&lt;p&gt;This week for k6 Office Hours, I talked to one of the newest members on our team, &lt;a href="https://srperf.com"&gt;Leandro Melendez, aka Señor Performo&lt;/a&gt;, about his experience in joining k6/Grafana Labs. We ended up talking about performance &amp;ldquo;deadly sins&amp;rdquo; and how the practice of performance engineering has changed in the last decade.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bi-RuT9eZdA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Old Town Walking Tour of Tallinn Estonia (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20220127-old-town-walking-tour-of-tallinn-estonia/</link><pubDate>Thu, 27 Jan 2022 23:25:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220127-old-town-walking-tour-of-tallinn-estonia/</guid><description>&lt;p&gt;Here&amp;rsquo;s a walking tour we went on in Tallinn, Estonia, in December 2018.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/hWjw1Y__p-o?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Why I'm Leaving the Netherlands</title><link>https://nicolevanderhoeven.com/blog/20220126-why-im-leaving-the-netherlands/</link><pubDate>Wed, 26 Jan 2022 21:15:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220126-why-im-leaving-the-netherlands/</guid><description>&lt;p&gt;It&amp;rsquo;s been almost five years since I first moved to the Netherlands, and while I love the country and I&amp;rsquo;m grateful for all the experiences I had here, I&amp;rsquo;ve decided to move away. Here&amp;rsquo;s why.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wfPLkNA2Ha8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Why All Roads Lead to Testing</title><link>https://nicolevanderhoeven.com/blog/20220125-all-roads-lead-to-testing/</link><pubDate>Tue, 25 Jan 2022 23:59:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220125-all-roads-lead-to-testing/</guid><description>&lt;h1 id="why-all-roads-lead-to-testing"&gt;Why all roads lead to testing&lt;/h1&gt;
&lt;p&gt;Testing is a skill every software engineer should develop.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to dismiss testing as a responsibility only some carry, but it&amp;rsquo;s best thought of as a hat that &lt;em&gt;anyone&lt;/em&gt; can put on. How well you learn to wear this hat affects your career whether or not you&amp;rsquo;re a tester. Here&amp;rsquo;s why.&lt;/p&gt;
&lt;h2 id="ideas-are-cheap"&gt;Ideas are cheap.&lt;/h2&gt;
&lt;p&gt;In tech, having an idea isn&amp;rsquo;t what sells&amp;ndash; the success is in the execution.&lt;/p&gt;
&lt;p&gt;iPhones didn&amp;rsquo;t become popular because it was the first mobile with a touchscreen. The Nintendo Switch isn&amp;rsquo;t ubiquitous because of its revolutionary hardware. Behind every successful product is a lot of testing.&lt;/p&gt;
&lt;h2 id="testing-isnt-just-for-testers"&gt;Testing isn&amp;rsquo;t just for testers.&lt;/h2&gt;
&lt;p&gt;Every good software engineer does testing.&lt;/p&gt;
&lt;p&gt;Debugging is a form of testing. Questioning requirements is a form of testing. Testers don&amp;rsquo;t (and shouldn&amp;rsquo;t) have a monopoly on testing. The reality is that everyone is doing it, often without calling it &amp;ldquo;testing&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="testing-is-about-people-more-than-it-is-about-machines"&gt;Testing is about people more than it is about machines.&lt;/h2&gt;
&lt;p&gt;The fundamental goal of any app is to address a human need.&lt;/p&gt;
&lt;p&gt;Testing is finding new ways to represent and understand this need at all stages of development. Testing is a people problem, not a technical problem.&lt;/p&gt;
&lt;h2 id="humans-are-irrational"&gt;Humans are irrational.&lt;/h2&gt;
&lt;p&gt;The biggest challenge in building apps is human irrationality.&lt;/p&gt;
&lt;p&gt;We don&amp;rsquo;t always &lt;em&gt;want&lt;/em&gt; what we need, we don&amp;rsquo;t always &lt;em&gt;know&lt;/em&gt; what we need, and even when we&amp;rsquo;re building &lt;em&gt;for&lt;/em&gt; others, we don&amp;rsquo;t always &lt;em&gt;work&lt;/em&gt; towards what we need. Testing is an attempt to make sense of this irrationality.&lt;/p&gt;
&lt;h2 id="testing-is-an-attitude"&gt;Testing is an attitude.&lt;/h2&gt;
&lt;p&gt;Getting good at testing extends to aspects beyond work.&lt;/p&gt;
&lt;p&gt;Testing is a discipline of questioning. It&amp;rsquo;s having curiosity as a default state and trying to meet people where they are. These are things every project, and every community, needs in spades.&lt;/p&gt;
&lt;h2 id="testing-is-rarely-the-destination"&gt;Testing is rarely the destination.&lt;/h2&gt;
&lt;p&gt;But some time, some how, all roads lead to testing.&lt;/p&gt;</description></item><item><title>How to Actually Remember What You Learn, for Engineers with Long Reading Lists</title><link>https://nicolevanderhoeven.com/blog/20220124-how-to-actually-remember-what-you-learn/</link><pubDate>Mon, 24 Jan 2022 21:47:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220124-how-to-actually-remember-what-you-learn/</guid><description>&lt;p&gt;Who says you need the terminology of the Zettelkasten process? Here&amp;rsquo;s how I&amp;rsquo;ve learned how to learn and how to apply new ideas to my daily work.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re reading this, you probably make your living on what you&amp;rsquo;ve learned that other people haven&amp;rsquo;t. Unfortunately, if you don&amp;rsquo;t have a written system to keep track of new ideas, you&amp;rsquo;ll probably unlearn everything in a few years.&lt;/p&gt;
&lt;h2 id="most-people-think-reading--learning"&gt;Most people think reading = learning.&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s why reading isn&amp;rsquo;t enough.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Our brains are best at linking concepts, not at remembering them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Writing doesn&amp;rsquo;t help us learn; it IS how we learn.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can&amp;rsquo;t learn to swim by reading about it.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If reading isn&amp;rsquo;t enough, then what should you do instead?&lt;/p&gt;
&lt;h3 id="step-1-consume"&gt;&lt;strong&gt;Step 1: Consume&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The first step is to consume content, but &lt;em&gt;selectively&lt;/em&gt; so.&lt;/p&gt;
&lt;p&gt;Content could be a book, a video, a podcast, an article, or even a conversation. &lt;em&gt;Take notes&lt;/em&gt; on the author&amp;rsquo;s main points.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Shape Up is a methodology emphasising iterative cycles, &amp;ldquo;betting&amp;rdquo; on work to be done, and building fully integrated slices of work.&lt;/p&gt;
&lt;h3 id="step-2-redefine"&gt;&lt;strong&gt;Step 2: Redefine&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Next, go beyond facts and add your thoughts.&lt;/p&gt;
&lt;p&gt;Think about the broader picture of what the author might be saying, and supplement it with &lt;em&gt;your&lt;/em&gt; opinions. &lt;em&gt;Example:&lt;/em&gt; Shape Up is an Agile methodology concerned with the limits we should apply to different stages of work.&lt;/p&gt;
&lt;h3 id="step-3-contextualize"&gt;&lt;strong&gt;Step 3: Contextualize&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Think about what the content means to you, specifically&amp;ndash; how does it stack with other things you&amp;rsquo;ve learned? Where does it fit into your interests? Accept that your context, and your notes, will change.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt; Shape Up&amp;rsquo;s idea of fully integrated work supports the notion of context-switching (see: Continuous integration, Multithreading) but could be in contention with productivity concepts like deep work (David Allen), batching, and Productivity Momentum.&lt;/p&gt;
&lt;h2 id="its-your-brain"&gt;It&amp;rsquo;s your brain!&lt;/h2&gt;
&lt;p&gt;In the end, nobody can tell you the &amp;ldquo;right&amp;rdquo; way to learn.&lt;/p&gt;</description></item><item><title>My Workflow for Making Tech and Travel Videos Online</title><link>https://nicolevanderhoeven.com/blog/20220123-my-workflow-for-making-tech-and-travel-videos-online/</link><pubDate>Sun, 23 Jan 2022 16:16:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220123-my-workflow-for-making-tech-and-travel-videos-online/</guid><description>&lt;p&gt;In the last 5 years, I&amp;rsquo;ve made ~220 videos across 4 YouTube channels. Here&amp;rsquo;s what I&amp;rsquo;ve learned so far about making videos.&lt;/p&gt;
&lt;h2 id="why-make-videos"&gt;&lt;strong&gt;Why make videos?&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;A 10-minute video takes me anywhere from 7 to 15 hours to produce. I wouldn&amp;rsquo;t be doing it if I didn&amp;rsquo;t enjoy it!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;It can be the most genuine form of expression.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Videos were a big part of how &lt;em&gt;I&lt;/em&gt; got into tech, and I want to pass that on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;d rather make a video once than explain the same thing to 100 people.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I don&amp;rsquo;t think my way is the &lt;em&gt;best&lt;/em&gt; way, but maybe sharing my workflow will make it easier for you to get started, too!&lt;/p&gt;
&lt;h3 id="pre-production-ideation"&gt;&lt;strong&gt;Pre-production: Ideation&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Ideas are cheap&lt;/strong&gt;. The best idea is worthless if I can&amp;rsquo;t convey it well.&lt;/p&gt;
&lt;p&gt;I start with the idea, then the title and thumbnail. I search YouTube to see what titles have worked for others. Then, I use @Canva for thumbnail creation and &lt;a href="http://thumbsup.tv"&gt;thumbsup.tv&lt;/a&gt; to test combinations.&lt;/p&gt;
&lt;p&gt;Only then do I start to outline the video or research it. I use @obsdmd as my project management tool and content calendar.&lt;/p&gt;
&lt;h3 id="production-filming-and-editing"&gt;&lt;strong&gt;Production: Filming and editing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I like to film with talking points rather than a full script. It saves me time, and it comes across as more natural. My main gear: Sony A6600 + Sigma 16mm f/1.4, Røde PodMic, Elgato keylight.&lt;/p&gt;
&lt;p&gt;I edit everything myself in Final Cut Pro, using stock footage from @StoryblocksCo and sound effects/music from @epidemicsound.&lt;/p&gt;
&lt;h3 id="post-production-publishing"&gt;&lt;strong&gt;Post-production: Publishing&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;I export and upload the video to YouTube, adding the title, thumbnail, description, cards, end screen&amp;hellip; I have a checklist so I don&amp;rsquo;t forget these.&lt;/p&gt;
&lt;p&gt;I send most videos to humans at @Rev for captioning. I then use the captions to create YouTube chapters. From there, it&amp;rsquo;s just about publishing to appropriate platforms.&lt;/p&gt;
&lt;h2 id="optimize-for-consistency-and-fun"&gt;Optimize for consistency and fun&lt;/h2&gt;
&lt;p&gt;When in doubt, I chuck technique out the window and do what will keep video creation fun for me!&lt;/p&gt;</description></item><item><title>How to Do What Kind of Testing When: Testing Types by Scope</title><link>https://nicolevanderhoeven.com/blog/20220122-how-to-do-what-kind-of-testing-when/</link><pubDate>Sat, 22 Jan 2022 16:42:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220122-how-to-do-what-kind-of-testing-when/</guid><description>&lt;p&gt;Correctly identifying &lt;em&gt;when&lt;/em&gt; you test could be just as important as &lt;em&gt;what&lt;/em&gt;. Below are types of testing according to scope.&lt;/p&gt;
&lt;h3 id="static-testing"&gt;Static testing&lt;/h3&gt;
&lt;p&gt;Static testing occurs when requirements are written. Question requirements and spell out what each one means.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Setting up a system to track and link requirements to test cases, negotiating business needs with technical feasibility, clarifying scope.&lt;/p&gt;
&lt;h3 id="unit-testing"&gt;Unit testing&lt;/h3&gt;
&lt;p&gt;Unit testing occurs when coding begins. Practice Test-Driven Development by translating requirements into tests before writing the code.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Treating test code like application code, getting developer buy-in, communicating technical implementation, performance, pair programming.&lt;/p&gt;
&lt;h3 id="system-testing"&gt;System testing&lt;/h3&gt;
&lt;p&gt;System testing occurs when a build is released. Employ black-box testing: step back from the code and assess the feature as a whole for consistency.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Adherence to common design standards, equivalence partitioning, boundary value analysis, fighting scope creep, usability, creating test data.&lt;/p&gt;
&lt;h3 id="system-integration-testing-sit"&gt;System integration testing (SIT)&lt;/h3&gt;
&lt;p&gt;SIT occurs when integrating multiple components. Use white-box or grey-box testing to target the interactions and traffic between components.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; API testing, stubbing and mocking, identifying request paths throughout the system, performance benchmarking, observability and analysis.&lt;/p&gt;
&lt;h3 id="business-acceptance-testing-bat"&gt;Business acceptance testing (BAT)&lt;/h3&gt;
&lt;p&gt;BAT occurs when the code is assessed against overall business goals. Seek out SMEs who can help you verify expected outcomes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Adherence to business requirements and regulations, process testing, simplifying request flows, identifying potential customer pain points.&lt;/p&gt;
&lt;h3 id="user-acceptance-testing-uat"&gt;User acceptance testing (UAT)&lt;/h3&gt;
&lt;p&gt;User acceptance testing occurs before code is released to production. Map test cases to requirements and test real-world scenarios.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Testing for superuser workflows, data cleansing, verifying real user behavior from historical logs, exploratory testing, end-to-end performance.&lt;/p&gt;
&lt;h3 id="regression-testing"&gt;Regression Testing&lt;/h3&gt;
&lt;p&gt;Regression testing occurs between builds. Supplement a robust automation test suite with nuanced manual test cases that address known problem areas.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Concerns:&lt;/em&gt; Setting up a CI/CD pipeline, deciding what to automate, consolidating test and development tools, tracking failures over time.&lt;/p&gt;
&lt;h3 id="question-everything"&gt;Question everything&lt;/h3&gt;
&lt;p&gt;Remember: &lt;strong&gt;testing is an attitude.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Canonical Observability with Simon Aronsson and Michele Mancioppi (k6 Office Hours #38)</title><link>https://nicolevanderhoeven.com/blog/20220121-koh38-canonical-observability/</link><pubDate>Fri, 21 Jan 2022 18:23:47 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220121-koh38-canonical-observability/</guid><description>&lt;p&gt;Today, my former colleague &lt;a href="https://simme.dev"&gt;Simon Aronsson&lt;/a&gt; brought his &lt;em&gt;new&lt;/em&gt; colleague, &lt;a href="https://twitter.com/mmanciop"&gt;Michele Mancioppi&lt;/a&gt;, to k6 Office Hours to talk about observability, and how they do it at &lt;a href="https://canonical.com"&gt;Canonical&lt;/a&gt;. It turned into a great conversation about trends in observability from the last decade, and how it relates to performance and reliability testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/SD5Y4QejEu4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone, and welcome back to the first k6 Office Hours of the year. Happy 2022, I&amp;rsquo;m Nicole Vander Hoeven.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I&amp;rsquo;m Simme, we&amp;rsquo;re back from the dead.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I&amp;rsquo;m Michele.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Simme is back. Yes, so Simme unfortunately is only temporarily back, and he&amp;rsquo;s brought his new colleague. I mean, I&amp;rsquo;m kind of sad, but I&amp;rsquo;m happy to meet you Michele Manciopi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Hello everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Welcome. Simme why don&amp;rsquo;t you first tell everybody, how you betrayed us at k6.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure, I&amp;rsquo;m so sorry for that, was a couple of months ago now. I think I quit at k6 in October, beginning of October something like that, to join Canonical and Michele, where we are trying to build a really awesome observability stack to know little part built on top of Grafana products.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it has been a very interesting three months. It&amp;rsquo;s actually a pretty refreshing to be able to use high quality software and compose it in ways that are, you know, they just work through, cool.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So we already have a few people in the peanut gallery, there&amp;rsquo;s Simme and Michele and our newest colleague, I think senior performer, all saying hi to you Simme. so you&amp;rsquo;re very much missed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Congratulations to k6 for bringing Leandra.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Definitely, and by the way, Leandra will be on k6 Office Hours next week, he just accepted the invite. So when I&amp;rsquo;m letting him like relax, and do his bootcamp onboarding things, and his week of load testing this week. . Ooh Danielle is here as well. Michele, why don&amp;rsquo;t you talk about yourself, and what you do at Canonical?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, I am a product manager at Canonical, for observer BD team. I was brought in with the goal of making the entirety of the product line of Canonical observable. Canonical is chiefly known for Ubuntu, but we have like a meter other products and they all need to be observable because they all sit at different levels of critical pieces of the infrastructure. Before Canonical, I was the technical product manager at Instana, which has been what baby ham it&amp;rsquo;s a product that does very automated observability. It&amp;rsquo;s mostly proprietary, but it was a lot of fun trying to make observability the way it&amp;rsquo;s supposed to be. That is seamless. Very easy to roll out. Before that I was at SAP where I was the technical lead of the performance team for SAP cloud platform, where my job was mostly to figure out where things were slow and fix it. And then I realized that rather than helping one single developer at the time, would they be more productive in actually providing pretty decent tools to do that at scale so people could do it themselves, which then brought me down the path of figuring out it&amp;rsquo;s actually fun here to make an observability product than it is to using one. And then the CircleCI.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So Simme what was it about Canonical that won you over?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I actually think it was to no little part Michele won me over with his argumentation for&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Okay. I&amp;rsquo;m taking him off the stream sorry. No, no, No.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;lsquo;Cause I got you everyone, bye.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No. We&amp;rsquo;re still all friends.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do really miss the k6 family for sure. But yeah, it was just such a cool and exciting opportunity to be able to make this huge leap in observability with Canonical, for such a vastly used project or suite of tools and products. So that&amp;rsquo;s mainly one of them.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m sorry. Can we stop to remark? That was the coolest cup I&amp;rsquo;ve seen in a long.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is as if this is sponsored, this is a hydrate spark, it&amp;rsquo;s a smart water bottle. And it&amp;rsquo;s marketed like for people like me because it&amp;rsquo;s a water bottle, but it has Bluetooth and LED light. So, you know, obviously I had to buy.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, just out of curiosity, what are the key values of the Bluetooth support?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh, it tells me when I need to drink water. It&amp;rsquo;s very important stuff.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How do you monitor that A, the Bluetooth is working and how do you receive those notifications?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, it&amp;rsquo;s funny that you ask, there is an app for it. This is totally not sponsored. Okay. But there is an app for it. I was gonna say Simme that it seems like there was a slight change in your focus as well, because at k6, we&amp;rsquo;re more focused on the performance and reliability testing part of it. But definitely we&amp;rsquo;ve also dabbled in the observability space, especially with the acquisition of Grafana. So it seems like your new role is also more focused towards observability. Was that one of the considerations?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure it is. And then that was definitely one of the considerations during my, what is it now? 12 or something years in tech, I&amp;rsquo;ve been doing way more observability and monitoring work than I&amp;rsquo;ve been doing performance testing. And so that definitely felt like coming home in a sense to me.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And I wanna ask you both this because you&amp;rsquo;ve both been in observability for awhile. How do you think observability and performance testing go together? Do you see them as separate disciplines entirely, there&amp;rsquo;s clearly some sort of overlap, right? Should companies be doing both, one or the other?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I definitely think there is a lot of overlap. One thing that I know that you and I have been pushing forward when we&amp;rsquo;ve been discussing this previously on the stream is that performance testing is great, but it usually only allows you to do a black box perspective testing, right? You&amp;rsquo;re able to measure the performance of your system, given certain interfaces or end points that you are able to observe the performance off and pairing that with observability tools, like for instance, loci or tempo, or Prometheus&amp;rsquo;s allows you to really drill back into the stack and figure out what is causing those problems. So I definitely think that it makes sense to combine the both to be able to observe the whole system and not just the edges of it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Do you agree with that Michele?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, very much, over go and say that actually, it&amp;rsquo;s very hard to draw a demarkation between the performance and of observability, especially since in the last few decades and the increasingly disproportionately larger role that internet and internet systems taking our lives. We have come to see, you know, slow as the new down, which means that not only the software needs to work but it needs to be fast. And if you observability is fundamentally the art of understanding, are there problems? I mean, so how bad was impacted and how badly, and that is both in terms of software, it is broken as software is luck. Many of the techniques that you would use in, for example, a QA system to check the scalability of your software is something that you can use at scale in production to make sure that you&amp;rsquo;re at least carrying that much load, as well as techniques for example, for performance testing, you often do a lot of black box monitoring. The techniques that you use to check if today in SIL on a mobile connection, your web store is reachable is very similar in terms of technologies and capabilities and as technical requirements. So the technology is there to use, to throw a lot of requests security to your software. So it&amp;rsquo;s fundamentally the performance tools are versatile like that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, I totally agree with that. I have always taken the stance that it&amp;rsquo;s definitely better when you have both of them because observability is great. But then in pre-production environments, it can be a little tricky &amp;lsquo;cause you don&amp;rsquo;t have real traffic and that&amp;rsquo;s where performance testing can come in handy and performance testing is great, but you don&amp;rsquo;t always want to run it in production. And also you, it&amp;rsquo;s not always a good idea to be reliant on the results of the performance testing tool. You know, sometimes it makes a lot more sense to be already using the same observability stack that you use in production. And I also want to call out that performance testing is often thought of as load testing, but that&amp;rsquo;s really just one kind of performance that is being measured there. And so what about a related topic to observability as monitoring? I know Michele, you have a lot to say on that topic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh my, can I rant?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. Go ahead. I&amp;rsquo;m familiar with your blog posts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ooh influence. I have a &amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do research, you know.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I thought you came across it because, you know, super rabid spike. No, the, so I have been around the observability industry for awhile and I have a certain annoyance towards what the industry has done by rebranding perfectly good monitoring and application performance tools in terms of the hot new term up observability that you need to sell to sort of the software. The way I see it&amp;rsquo;s a much more formal, shall we say way. Observability is a property that you want your systems to have, monitoring is the way that we have to make most systems observable. However, something that I hope we will see in our lifetime, our software systems and such a level of quality and standardization in our profession of creating software systems. So that monitoring and observability becomes build team in the softwares we create. If you think about it all the for example, automatic distributed tracing and all the amazing innovations that have occurred over the past 15 years are effectively reckoning the lack of observability as a functional requirement of a piece of software. Monitoring is the art to collecting data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, and I think that there&amp;rsquo;s also a connotation of monitoring being a bit more passive. Would you agree with that?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Not necessarily, no. At the end of it so there is, I really take the view that monitoring is a means to the end of observability. It is true that in the past few years, with new generations of tools, we have made leaps and bounds in both the capability of collecting useful telemetry with very little work in terms of toil to roll it out, without the proper tools are there and I used to work for one where you deploy an agent and it automatically discovers all around it. There is a lot of dark magic going on, but it works. And then it becomes very cheap to actually get to the holy grail of monitoring that is to have as little silos as possible. Telemetry wants to have friends. You want to see end to end systems how they relate to one another. Now, the moment that something that has changed recently in the industry is we have gotten better, not only at collecting telemetry, but analyzing it. When you compare monitoring tools that we started with right there the Nagios of the world. You&amp;rsquo;ll need it to know in advance what you were looking for. Now with broader collection of telemetry, for example, distributed tracing, a very powerful type of telemetry, very little underutilized in terms of the insights can provide you, you end up having a lot of data that is likely going to be useful, and you have much more freedom in how you analyze it, both in terms of discovering issues as they occur, as well as afterwards in terms of post-mortem.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do have, however one, I agree with you completely Michele. I do however, think Nicole has a point in that if you look at the traditional monitoring tools that people used to use, like Nagios for instance, it was always this very weird situation where you put up SNMP traps or collected, you know, logs that were thrown at you in a very passive manner. But I would say that it turned monitoring itself has come to evolve into a state where it very much is an active practice in the same way as people would describe observability.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Oh. So you are making a very interesting distinction of rather than receiving as a data sync telemetry that was emitted, but something else that you go and get it through RTI, things like deploying an agent that does stuff. That&amp;rsquo;s pretty interesting.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. Or for instance, actually triggering a synthetic test that just prompts a common user flow and make sure that that still works. I mean, as compared to just admitting this passive telemetry data that just keeps rolling on, but maybe lacks the context as you put it on more advanced workflows where you&amp;rsquo;d correlate multiple sources of data or the multiple actions to derive your data that you want to.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It is true that in the past 15, 20 years, there has been an increase of active monitoring. I remember doing it back in the day with smoke tests that were of a crunch up every 15 minutes. I was so young. And now it&amp;rsquo;s that it&amp;rsquo;s kind of a baseline of observability. I mean, you need to want to catch everything, but if there is catastrophic failure, you will know hopefully before someone starts opening tickets or you&amp;rsquo;re upping your drops. Yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. I think Simme it was right when he was saying, what I was talking about was like the more traditional approach that it&amp;rsquo;s just something that&amp;rsquo;s there in the background whereas these days, the way that it should be done is a lot more proactive.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And also they focus on actually gathering telemetry to be able to detect failure modes rather than probing for a certain thing. It used to be much more focused on a single point that you would probe for data. And&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It used to have simpler software too.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;We sure did.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, that&amp;rsquo;s for sure. But I also wanted to say that there&amp;rsquo;s also been, there&amp;rsquo;s still some push based monitoring, but we&amp;rsquo;re also now seeing more poll based monitoring systems, more event driven ones. And I think this is all the evolution of monitoring and observability, right? Because these things did not exist not too long ago.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;To be fair, the one should, it is pretty true. We have much more pool and pool length. This is something that a permit use has pretty much popularized with the concept of scraping, but there are entire domains where we deploy a software that is still very much push based. For example, IOT, for very basic reasons of network visibility, it&amp;rsquo;s very hard to go and reach out into someone else&amp;rsquo;s rooftop and go get the data. So there is still the mechanics of push buffer and pulled it for example, gave us in the primitive ecosystem, push gateway mechanism.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Grafana agent that actually sits in between you and a cloud service or something else, and allows you to not punch holes in your firewall, but rather reach out and deliver data to something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah, it&amp;rsquo;s kind of like you mentioned that our applications in general are just getting more and more complex, it reminds me the push the trend from monolith to microservices and then now some people are also going back. It&amp;rsquo;s never really gone, right. And it&amp;rsquo;s really difficult to say, no, this is the new way, nobody else is doing or should do the other way. It&amp;rsquo;s not really like that. A lot of things in tech are cyclical.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;When I actually spoke about our systems are getting more complex. I was thinking exactly of micro services because we made a trade as an industry for very, very simple, very small components. And then pushing all the complexity that you cannot make disappear under the carpet of service meshes, many containers, things that need to be versioned independently remain compatible, which is actually one of the main drivers why in the observability industry, we moved from the very traditional, I don&amp;rsquo;t like the word pillars, but the very traditional telemetry types of logs and metrics with the occasional sprinkling of profiling to rather extensive use of distributed tracing because all of a sudden the problem was less often in the single simpler components and much more often in between.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But this is kind of a funny conversation to me &amp;lsquo;cause I don&amp;rsquo;t know if you remember, but 10 years ago we used to talk about microservices as well, but then we called it service-oriented architecture and it wasn&amp;rsquo;t the new cool thing. And then we decided that that was kind of cumbersome and powerful to work with. And we started to merge together our software, again, introduced monoliths.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But in a service record architecture, we tended to have a very expensive, very large piece of machinery called the enterprise service bus that actually was providing to some extent that kind of visibility that today we need to have through tracing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And let&amp;rsquo;s also not discount the effect of the proliferation of cloud providers, because when you have your own data center and your audiences, maybe your internal company or something, maybe it is a good thing to go from one huge complex monolith to three simpler services. But when it&amp;rsquo;s not three, it&amp;rsquo;s like hundreds, maybe then you start needing like another layer to orchestrate and manage and all of the traffic between each of those components. It&amp;rsquo;s definitely not that clear cut to say which one is better.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I definitely think you&amp;rsquo;re bang on in that case, Nicole, &amp;lsquo;cause we&amp;rsquo;ve moved from maybe having a couple of software devs for a company that did some kind of HTML that website with some access database backend in the worst cases, right? We now have these huge teams of hundreds of developers that are all working on a compost system together. And having that as a monolith would in practice require us to either do these huge orchestrations of release trains that no one is able to do in a proficient fashion. Or we would have to have downtime all the time &amp;lsquo;cause we would need to redeploy everything every time we made a change. So in that sense, it really makes sense to split it up as we grow our teams and we grow our development efforts as well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I have a rather, so coming from a very enterprise background I have a rather newest feel to be on the subject. And my take is that usually technological problems are not technological problems, there are people problems. One of the main motivators that was towards going to the extreme distribution of microservices. &amp;lsquo;Cause I tried to fight back against the Conway&amp;rsquo;s law. The fact that roughly the architecture of your system mirrored the architecture of your organization. So we said, look, we have all these teams, these pizza teams, it&amp;rsquo;s very hard to make them cooperate to create a well-behaved monolith. So let&amp;rsquo;s give each of them their independent infrastructure and talk over standardize protocols like most of the HTTP and some sort of RPC built on top of it. And that would provide for them a way to be productive independent of each other.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Exactly.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;As an industry, we dramatically underestimated the cost and complexity that comes from the need of coordination and compatibility and understanding among these teams, because now you no longer have one code base that you can run tests against. You have to have multiple ones that may interact surprisingly at Atlanta. These for example, has led to introduction of contract based testing, where teams contribute to each other interface tests. And there&amp;rsquo;s also the saying, which is something that is a harsh reality that every observable behavior of an application with a large enough user base, will become a dependency for somebody somewhere.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think this is the whole premise of Conway&amp;rsquo;s law, right? The idea that our architect, the software architecture or the infrastructure that we put into place in a lot of ways starts to evolve depending on how our team is structured. And I think it&amp;rsquo;s both a technological and a human problem as well. When you talk about coordination between teams or between services, it&amp;rsquo;s really the same thing.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. We have made actually strides in how easy it is to make software inter operate with each other. If you go back, we started, we were talking about SOA. SOA came with a curse called SOAP. It was incredibly complicated, mindbogglingly hard to make run at scale. Today, we have a bunch of, so we are using HTP for other things. Sometimes I would think too many, we have good stuff like GRPC, like arrow, a lot of different protocols that can be very efficiently used to either make a synchronous message passing happen or synchronous invocations. We have a lot of tools that in the past year and half, I think we&amp;rsquo;ve got the big two trigger happy in deploying a lot of new tools in production. And I&amp;rsquo;m saying this with a background of someone that fundamentally had to support every single piece of technology that made input or output, for example, on Java. It would surprise you how many different HTTP clients for Java are I think in production, I lost count. There were 50, it&amp;rsquo;s insane. And I&amp;rsquo;m, for example, you raised your mark right with a very, very beautiful LED and Bluetooth. And it&amp;rsquo;s super cool. I feel&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I was trying to share something that Simme was sharing there, but I can&amp;rsquo;t actually see it for some reason. Oh, there it is.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s okay.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&amp;rsquo;s this Simme?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I love to say, I like to bring out this picture whenever we talk about why observability is needed. &amp;lsquo;Cause while it&amp;rsquo;s a lot larger than most of us operate with, and it&amp;rsquo;s still very striking that they think this is supposed to be Netflix&amp;rsquo;s is a microservice architecture at some point, whether it is or not, I don&amp;rsquo;t really know, but it&amp;rsquo;s supposed to be and trying to&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Can I be trashy? Can I be able to trashy?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Architecture has an element of deliberation that they do not believe there&amp;rsquo;s an actual out of the system has, this is an emergent system is a lot of architectures that then meshed into something.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Definitely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s remarkable that it works so well.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. And one of the cool things there, I think is the fact that without observability where this big ball of yarn, it would be completely unfeasible to reason about anything this system is doing at scale. You wouldn&amp;rsquo;t be able to reason about the particular part, maybe that you are working on one of these small dots that we can&amp;rsquo;t even see because of all the lines. But to reason about what it does is as a whole would be completely unreasonable. But with tools like, for instance, distributed tracing, we&amp;rsquo;re suddenly able to follow end to end an action of a user or an agent within this system. That was all I wanted to think of that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I love distributed systems, distributed tracing in distributed systems, because it actually gives you the means of answering the most important question or you&amp;rsquo;re faced with an issue, who is affected and how badly? When you go on an enterprise setting and our people are often databases service, your application completely blowing up, could be a drop in the bucket of their system. They will not probably have the central entry you have to have a very different take on priorities unless you have agreed upon a slice on the silos and the failure that you are fundamentally up streaming through your users may not be their concern, but the moment you have the shooting tracing, that goes from the deepest database to the device in the face of your user, yet you have a very clear perception of how bad is something that is the one most important piece of information that you need in front of your face when the pager goes off again at 3:00 AM, you need to decide whether it&amp;rsquo;s time to go on to Batman, or if it can wait until the third coffee tomorrow morning.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I think that&amp;rsquo;s the real success of the &amp;ldquo;Squid Game&amp;rdquo; right? Because that image that you had up Simme, and just imagine that times 114 million users that are potentially using many of those systems, it&amp;rsquo;s amazing that it works at all at that scale, especially.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Something that always gives me those thoughtful moments of, oh my God, what are we doing as an industry? Is that a potentially simple issues have disproportionate impact on popular services to the life of many, many people. It goes from lack of entertainment. You&amp;rsquo;re there you want to see the latest, &amp;ldquo;Witcher&amp;rdquo; episode, cool stuff. You&amp;rsquo;re disappointed if the thing is on top, multiply that by a medium people that cannot get there, there are fix, Hey, you have a significant amount of life around that has gotten worse, but it goes also to something that is maybe much more limited, but much more tragic. For example, when I was working at SAP, one of our customers was, I cannot say the country, but it was the first aid response service of one of the countries. We were scared plus that something so important that either the platform, because downtime would have consistent consequences to real people, something that we have seen recently with the move to the cloud and the disproportionate role that for example, U.S system one has on everybody&amp;rsquo;s life today. We have seen how the risk is getting more and more concentrated into fewer and fewer, very large, very complex, very reliable, but critical pieces of infrastructure, in ways that I do not believe as a society we have had yet. And that is where it really humbles me as an engineer to think, well, this has to work, right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. We went through that in, I think in the last k6 Office Hours, I had somebody from oil funk, who is an emergency services provider in Austria, and it was cool, but also a little scary to find out that they are using k6 for, in part to also handle the traffic from the 112 emergency hotline. So it&amp;rsquo;s cool to see something that you&amp;rsquo;re working on, be used in such a critical industry, right. But at the same time, it&amp;rsquo;s also a little scary because it could actually be lives that are lost if you know, we don&amp;rsquo;t do our jobs well enough, it&amp;rsquo;s a little humbling to think of that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I guess the closest resemblance we&amp;rsquo;ve had to these critical infrastructures that everyone relies on would it be like the transatlantic Telegraph cable? I mean, that has like in, I think it&amp;rsquo;s currently 19 cables or something like that, that make up the transatlantic telephone cable. But I really any catastrophic failure there would really isolate us in terms of cross continental communication.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But that is less likely to result in loss of life. Then, for example, your neighbor want service, not being able to follow you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;For sure.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I&amp;rsquo;m sorry for having completely spoiled the mood. I think that as an industry, we need to go in deserve the role of engineers. If we built bridges the way we push software to production, in some cases, I don&amp;rsquo;t think anybody would cross a river without crossing themselves first.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;What&amp;rsquo;s interesting is in that spaghetti soup of microservices that you showed Simme, now we&amp;rsquo;re seeing that our observability stack is part of those. They are also contributing back to the system that we have to monitor. I don&amp;rsquo;t know if either of you saw the post-mortem by roadblocks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was classic. I had ops to them. It&amp;rsquo;s a, we have all been there.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes yes. Do you have to talk about it Michele?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I do, but I don&amp;rsquo;t think I would be able to be nearly as good as a Simme for this.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I just came to be honest. So I don&amp;rsquo;t have any detail commentary on that either.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It was the classic fallacy of oh jolly, oh golly. The same infrastructure that is powering my observability system was probably the system that went down.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right. All right. Yeah, that really is something that you&amp;rsquo;ll see a lot. I mean, for instance, say that you have a deployment of the classic Grafana suite somewhere, and you have that running in the same data cluster maybe, or at least the same cloud provider as you have your critical workloads and to make it even worse, you could go down to having it in the same geographic region, or even on the same cluster nodes or the same hardware that you&amp;rsquo;re using for the rest of your critical infrastructure. When something goes south there, in terms of your critical infrastructure, it is likely that that was all will also, as I think, where to kick would roadblock, spill over to your monitoring system. And if that happens, how are you gonna be able to tell that you&amp;rsquo;ve been hit?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;This is the classic blast radius question. Everything has failure modes, actually, several of them, and the more abstractions we deploy, the more failure modes we introduce, for example, Simme and I are building an observability system based on Kubernetes natives. Our guidance is if you deployed, deployed to a different cluster on different hardware, because you should never put the monitoring system on the same infrastructure, close to the infrastructure stuff we monitor.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s not only that. We also usually recommend that if you deploy our monitoring system, deploy another monitoring system that makes sure that your monitoring system is up and set them up in a, what did they call it? That dead mans trigger?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The dead man switch is the idea that, for example, do you know in the movies when the hero goes in front of him and says, if you kill me, you will be exposed in two days time. That&amp;rsquo;s the classic deadness which is something that happens unless someone periodically goes there and tells him not to. In this case, in the case of monitoring is unless your system, your monitoring system is telling you that it&amp;rsquo;s fine, assume tragedy. It never goes to the level of a specific use cases, but first of all, you need, let me take a step back. The best monitoring system is the one that tells you whether it&amp;rsquo;s something to look at, right? You actually do not want to have dashboards, however, colorful and beautiful in front of your face all the time, unless it is for Ferguson purposes, you actually want to be able to focus on something else and jump into the action when stuff is hitting the fan. In order to do that, you must have the guarantee that is the easy model of notification. You will receive it because silence, you want to know that it means that it&amp;rsquo;s good. You don&amp;rsquo;t want to have to doubt if there is something going on that my sister should tell me but doesn&amp;rsquo;t, which is why you set up fundamentally a health check thing that says I&amp;rsquo;m thinking here and all it&amp;rsquo;s fine. That is the diagnose switch.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I found it so interesting to read through the post-mortem and props to them too, by the way, for releasing something so detailed, they were not afraid to, you know, say what they&amp;rsquo;d done wrong and what they were doing to address it. I thought it was really well-written, but I want to read one part of it, because I thought it was so good. They said, &amp;ldquo;There was a circular dependency between our telemetry systems and console, which meant that when console was unhealthy, we lacked the telemetry data that would have made it easier for us to figure out what was wrong. We&amp;rsquo;ve removed the circular independency, our telemetry systems no longer depend on the systems they&amp;rsquo;re configured to monitor.&amp;rdquo; I thought that was a great takeaway from that whole incident. And because they&amp;rsquo;ve shared it in the post-mortem, they&amp;rsquo;re not the only ones who can learn from it.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Very generous of them to expose themselves that way and actually left the rest of the industry learn from their mistakes. And so hard work as you said, Michele, our love to the team at the roadblocks who probably need needed a bit of time out after that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;But there is also another component of a human component here. They did the right thing. They reestablished trust. They are telling us, we learned from our mistakes so that you can as well. In the scope of monitoring systems, trust is the ultimate currency because a monitoring system is literally a measurement system for the health of other systems. If you cannot trust your measurement system, what is the point of it?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And you usually only get one go with that as well. If you burn that trust, it&amp;rsquo;s gonna be very, very hard to build up again.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So this is something that touches me very personal because I used to work on a solution that was exquisitely powerful, but therefore also very complicated and complex. And the moment you have automation, someone somewhere sometimes is going to be broken by it. And reestablishing that trust was never easy and sometimes impossible depending on the scale of failure that you&amp;rsquo;re well-intended means of automatically monitoring something I should have brought to the customer. Something that we seldom say as an industry, when we try to sell a product to somebody else, is that everything has a cost. If you want to take away complexity from you to roll out very simple systems and set up that thing, reports stuff over there, and you want it to automatically, there&amp;rsquo;s a higher risk that the automation will cause an issue. Of course, that in many cases is a justified risk. You can roll out the monitoring gradually and the easier it is to roll out a monitoring system at scale, the more you reach the holy grail of monitoring, that is the network effect. The moment that you can start observing how issues in systems propagate, correlate, or are not correlated there is something very important.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So let&amp;rsquo;s talk a bit more about the characteristics of a good observability stack. We&amp;rsquo;ve already mentioned a few we&amp;rsquo;ve mentioned that, it should be independent as much as possible from the systems that they&amp;rsquo;re trying to monitor. We&amp;rsquo;ve also said that maybe we should also take into account the human side of things rather than just the technological. Maybe you should tailor the complexity of your observability stack to the size and experience and structure of your teams. What are some other things that you both could name in your ideal observability stack?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One thing that I really like to highlight here is the ease of use or the economics of the system that you are using. I used to do a analogy to how EpiPens work for people with allergies. If you&amp;rsquo;re eating a peanut and you&amp;rsquo;re allergic to peanuts, you don&amp;rsquo;t want to have to assemble the cure for that, right. Or something that alleviates or takes you out of immediate danger. You need it to be simple, just as take it out, push it in your leg, and it&amp;rsquo;s done. You don&amp;rsquo;t have to think about it. The same goes for monitoring or observability systems as well I would say. If you have to, when you&amp;rsquo;re awakened by a notification in the middle of the night, and maybe you&amp;rsquo;re even hung over or worse, and you are supposed to fix something that is critical, and you have to start thinking about what to do, then your observability system has in my eyes, at least failed you, you need to be able to get a notification that says this is wrong, here&amp;rsquo;s the data that proves that, click here to get a closer look and just be presented with all the information you need to be able to make a decent decision on how to proceed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;One thing recently on that note that I&amp;rsquo;ve come across is how potentially easy it is for a new Blake me to set up a whole observability stack or at least monitoring, but he could definitely expand upon it is EBPF, because we&amp;rsquo;ve been talking about distribution of systems and also of observability related services, but there&amp;rsquo;s also a trend of going lower and lower level, right? And EBPF monitoring is monitoring at the kernel level, recently with some people from the k6 team, Artem Charlie, Kevin, Danielle, Lopez, shout out to those guys. We did this hackathon project actually for EBPF monitoring. And the whole reason that I got into it was because the promise was you install this binary, you drop it into your cluster on your local machine. And then it just kind of exposes magically all of these things that I normally would have had to set up like node exporters for, you know, it was we&amp;rsquo;re living in a golden age of monitoring and observability I think. The things that are possible, like I can&amp;rsquo;t even keep up anymore, be talking about ergonomics. I mean, what is more ergonomic than not having to do much of anything.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You are talking about the day one, the fact that it is so easy to set up apart from monitoring system is exactly what you need to be able to monitor at scale. It removes the thought. EBPF is a fantastic technology. We are fundamentally given a virtual machine to run inside the kernel to execute logic, that allows us to do in a centralized place. Things that in the past were almost impossible. For example, the first thing I ever did with a team of vinyl in Stanhope with EBPF was actually to detect how a process that, that was impossible in user land. But with EBPF, it was actually pretty simple. We literally spent more time making sure that the techniques would work across all the operating systems that we need to support and to figure out how to find out that. EBPF the, I see two big potentials for that, for things that are not possible already today with sufficient tips. The first one is to give us a distributed tracing tool that largely independent from their own time. Now there are technology limitations there. It&amp;rsquo;s hard to find out how to trace context. I&amp;rsquo;m sure that someone somewhere out there is figuring it out as we speak, probably, that we reduce to some extent the toil that is necessary to support the federal fire hose of new technologies, libraries, and stuff like that is put in production every day. But the second one that excites me even more because the shoot the tracing is largely already possible is actually to have cheap enough in terms of overhead and consistent enough across run times production profiling. People look at distributed tracing as a way of figuring out what is slow. And it works remarkably well as long as the bottleneck is in between processes, the moment you want to drill down, why this requests into the insight, this process was taking too long. You see what you&amp;rsquo;re tracing is not so suited anymore. You end up looking at the leaf instead of the forest, because there is so many more requests going on through the system, that unless you have a lot of spans that are very, very detailed and fundamentally to trace threat level profiling, you are not going to which costs a huge amount of overhead. You are not going to have the information needed to find out, okay, good stock in the Dow library again. However, the moment that you have things, basically you have to find out where the CPU, memory or location, memory usage and wait time hotspots are in your application. You actually have the first places to work at to improve the overall system. It&amp;rsquo;s not gonna tell you why that request was going badly, but the moment you saw the hotspot, you are virtually guaranteed that many requests are going to get better. And then you can measure them again in terms of input output, observability tracing. Now people out there are going to say, Michele, what the hell are we talking about? Today we have a lot of amazing technologies to the production profile and they are true because for example, they are right because for example, if you look at the Java virtual machine with, for example, the Java flight recorder, you have excellent facilities with super low overhead to figure out what is your Java or cuddling or cradle program doing true. But they&amp;rsquo;re very specific to the particular run time and to a particular programming language. And when you start comparing what wait time, for example, looks like in Golang as respected over to machine with code routines, instead of, I dunno, loom threads, project loom, and all the rest of the stuff, you end up actually having telemetry that seems to say the same things, but in reality has a different semantic. And that is a challenge in our systems that have more and more grown polyglot. When we had the, our happy little monolith fault, it was one language. Now this year the systems are implementation of many different languages that behaves differently, and yet they are operated in some cases by roughly the same people, for example, necessarily teams, right? Having fluency in terms of performance across several languages is a significant challenge. Now, if we actually get through EBPF production profiling, for example, the folks behind parka and also the folks we have big pixie, there&amp;rsquo;s an amazing job there. If we manage to have something that will give us close enough, precise enough production, profiling information across whatever we may wanna throw into a container that is going to be a generational change in terms of making complex systems run better at scale.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s something that we&amp;rsquo;re interested in at k6 as well. I mean, I&amp;rsquo;m a performance Sesser so the first thing I think of as the network side of it, there are a lot of network metrics that could be gathered at that level. And the reality now is that without EBPF, you&amp;rsquo;re in this position where each new service has needs some other exporter that you need to install. And like there&amp;rsquo;s so many plugins to plugins and many different combinations of things, when really they might all be using HTTP. Like, why don&amp;rsquo;t we have something that just detects, maybe not, it won&amp;rsquo;t be everything right. It&amp;rsquo;s never EBPF has never going to completely be able to, or, well, I shouldn&amp;rsquo;t say never because you know, that could change very quickly, but I don&amp;rsquo;t see it as being the end all be all solution. But if it can provide some of the more common metrics, that&amp;rsquo;s already a step in the right direction. Talk about usability and ergonomics right?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And also provide a safe assessable baseline across a lot of different technologies working together.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yeah. For sure. What other things do you think would you have in your ideal observability stack?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You asked me?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Either of you?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Go ahead Michele, I don&amp;rsquo;t have a lot of ideas on that.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, actually, if you go on the, okay, can I make us most shield for a link? If you go on google, WWW.ubuntu.com/whatisobservability/whatisobservability. There you see a kind of overview of the things that I find most meaningful, monitoring different types of systems. Second, I&amp;rsquo;m gonna give here that your own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;They can share my screen record.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I assume you want this one?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Awesome.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes. So this page is fundamentally a work of love of Simme and I, about the way we see observe a PVT. And the diagram that you see on screen is a, of course, simplified and very generic can your manage me if I lie, but it is a thirst overview of the kind of telemetry that you use at different levels in your infrastructure in order to monitor things. This is important for filamentary two reasons. One, is to provide guidance for people that may be new to observability in terms of which things to focus first, when you look at the telemetry types that are used on the right hand side, you will see that metrics and logs are of course universal. That&amp;rsquo;s what we started with. They are very good. Every software that deserves to run somewhere is capable of emitting clogs. Most of them can emit metrics and more and more, thanks to primitives that is really proud. There are the metrics sometimes serious thing to the forefront of enterprise systems. It didn&amp;rsquo;t used to be that. Then you start seeing that profiling gets, for example, the moment you move above the virtualization hardware, and you start talking about processes and applications, profiling them makes perfect sense.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sorry Michele for cutting you off. But I think you might need to need to explain the icons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That is correct.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s really. We don&amp;rsquo;t have that context.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Ah, they don&amp;rsquo;t explain themselves. Maybe then you use amino the icons.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Yes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;So the chart that you see on the left hand side is metrics, mentors, time series fundamental. That&amp;rsquo;s what we use to monitor things. There&amp;rsquo;s a lot. Then the table with the reds and greens and yellows followed by text that locks, the old, that bar chart is actually supposed to be flamed charts and that&amp;rsquo;s profiling showing hotspots. The strange thing with all those horizontal bars that is distributed tracing, that is the best way I can come up with to visualize spans. Spans is the basic data structure in distributed tracing. It describes an action taken by system to process a request. For example, you would have a span for the receiver of an HTTP request. The span is opened is created when your HTTP server is receiving the request, it&amp;rsquo;s going to be closed, but it simply is doing amazing things to get to the image in a screen&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Most of this you&amp;rsquo;ve probably seen in your browser, was what I was about to say, like something similar when you browse on webpage, you&amp;rsquo;d get this span alike view of how the different correlate.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;It&amp;rsquo;s similar, but there is a key difference. One of the key concepts of distributed tracing as coming from dapper, which is fundamentally the progenitor of all modern distributed systems is the parent-child relation between spans, which is the closest you can get to cow&amp;rsquo;s reality. We are, for example, when your application is receiving an HTTP request and is issuing your query to Mongo to retrieve some data, you will have a parent&amp;rsquo;s span for the receiver of the HP request. And the child&amp;rsquo;s span that says, I spoke to Mongo, took me this longer. And this query, I got so many data back that is the parent-child relation. And it fundamentally, you would not have spoken to Mongo if not for the incoming request. Now things get Merck here when we talk about a synchronous messaging, because the beauty and simplicity of the trees of spans that you have in synchronous systems, kind of get lost with a messaging the moment that you have batch consumers. You&amp;rsquo;ll have many requests that result in a whole bunch of messaging being queued up in your messaging queue. And one application consuming messages originated in different traces all at once, fundamentally creating a merge, but I digress. I&amp;rsquo;m sorry. So we were talking about&amp;hellip; I just get so excited about this future tree.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;No, it&amp;rsquo;s great. I know that you said that you have a hard stop and I&amp;rsquo;d like to get you off a little bit early for your meeting Michele, but why don&amp;rsquo;t you talk about what Canonical has to do with observability at all?&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Well, can I call does a lot of things, including a very beloved operating system together with an amazing community of volunteers, Ubuntu, we are responsible for a huge amount of software. We have offerings for Kubernetes, for OpenStack, for SAF, for a lot of systems that people use to run their applications and data centers. And it is the mission of Simme and I to make sure that those systems come with excellent monitoring capabilities, that you can monitor them with open source software, whether or not you want to use the monitoring system that Canonical provides you. At the end of the day, what we&amp;rsquo;re doing is in variable source fashion. We want to make sure that all the appliances that you can get from Canonical, the SAF, the OpenStack, the Kubernetes is, there are the cube flows and all the machine learning. They are, you can monitor them with best-in-class open source monitoring tools like videos, like getting logs out of SIS log, the security traces with open telemetry, where it makes sense. And that is the part of the work of Simme and I, that is about stepping up the game in terms of making software provided by Canonical observable in a way that you can use, for example, with your existing monitoring system, we really believe every single word we say, when we say the metric, once France, it&amp;rsquo;s all about having radio systems be monitored together. Now, if you do not happen to have a radio monitoring system, wherever monitoring the rest, we can give you one, but if you have a monitoring system and you&amp;rsquo;re comfortable with it, you by all rights should be able to monitor whatever piece of software you get from Canonical with it. And this is what to do.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;That&amp;rsquo;s awesome. I wish we had more time to talk about this, but maybe we can have you both in some future episode, I feel like there&amp;rsquo;s so many things that I wanted to dig deeper into, but thank you both for coming.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you so much.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I am so happy. Simme I&amp;rsquo;m so happy to have you back on again. I&amp;rsquo;ve always enjoyed doing these with you, so it&amp;rsquo;s a little bit weird that you&amp;rsquo;re now on as a guest, but I&amp;rsquo;m happy that you&amp;rsquo;re also bringing things that you&amp;rsquo;ve learned at Canonical back to us. And Michele welcome. I&amp;rsquo;d love to have you&amp;ndash;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Back again for sure with or without Simme.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Anytime. But Simme is finer yeah.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;All right. Thank you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Sure. Sure. Thank you everybody for watching and I guess we&amp;rsquo;ll see you next week. Bye everyone.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bye, have a wonderful day.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>First Look at Estonia | Getting to Tallinn (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20220120-first-look-at-estonia/</link><pubDate>Thu, 20 Jan 2022 20:36:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220120-first-look-at-estonia/</guid><description>&lt;p&gt;In December 2018, my husband and I met up with some friends and went from Valkenburg and Maastricht in the Netherlands to Riga, Latvia; and then to Tallinn, Estonia. Three countries in one day!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/xMh_yLOAIKI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>An Overview of Software Testing</title><link>https://nicolevanderhoeven.com/blog/20220119-an-overview-of-software-testing/</link><pubDate>Wed, 19 Jan 2022 17:10:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220119-an-overview-of-software-testing/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/huiptd8Y2I0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;NICOLE: What is the difference between good software and bad software? Is it features or user interface or marketing? In my totally biased opinion, what actually makes a difference is how well the software was tested. But software testing encompasses a lot of different areas and it doesn&amp;rsquo;t even always have to be someone with a word tester in their job title that does the testing. So whether you&amp;rsquo;re looking to get started in the industry, or just trying to cross skill, here&amp;rsquo;s an overview of the main types of software testing.&lt;/p&gt;
&lt;p&gt;Is it just me, or does your desk get that clutter too after a week of work?&lt;/p&gt;
&lt;p&gt;Anyway, software testing is the process of validating whether an application works as intended, but there&amp;rsquo;s a lot of vagueness in that statement. One of the broadest ways to categorize testing types though, is whether it&amp;rsquo;s functional or operational.&lt;/p&gt;
&lt;p&gt;Functional testing is more about application features. Is there a form to capture user email addresses? Is there a button next to it that submits those addresses? Once the button is clicked, where do the user details go? Do they go to the database? Are they stored correctly? Those are the sort of ways in which functional testers think. Operational testing traditionally called non-functional testing, is a way of verifying software quality and aspects that extend beyond the features of the application.&lt;/p&gt;
&lt;p&gt;Operational testing sometimes involves concerns that are more subjective or qualitative. So it can be a little bit more difficult to test, because those things only arise in certain conditions. I&amp;rsquo;m saying operational testing here, instead of non-functional testing, because I was talking to Paul Bruce who made an excellent video just on this topic. He talks about why the term nonfunctional requirement is really a bit of a misnomer.&lt;/p&gt;
&lt;p&gt;PAUL: It relegates all these other things, security, performance, installation, deployment, accessibility. It relegates them to a nice to have, so it should be functional versus operational.&lt;/p&gt;
&lt;p&gt;NICOLE: So I&amp;rsquo;m using his term operational testing instead.&lt;/p&gt;
&lt;p&gt;Here are the different forms of operational or non-functional testing.&lt;/p&gt;
&lt;p&gt;First there&amp;rsquo;s accessibility testing. It is involved with verifying that end users can consume or navigate content. Usually through assistive devices like screen readers. While most forms of testing begin with a statistically normal user in mind, accessibility testing seeks out outliers in terms of location, linguistic background and disability.&lt;/p&gt;
&lt;p&gt;Usability testing is designing with user experience in mind, specifically concerning the placement of on-screen elements and the intuitiveness of the process flow of an application.&lt;/p&gt;
&lt;p&gt;Localization testing is a way of making sure that applications are usable in the local context, in the sense of being colloquially appropriate for users in different countries and from different cultures.&lt;/p&gt;
&lt;p&gt;Security testing verifies that a system has no flaws that could be exploited, to gain access to confidential information or features that would not otherwise be accessed by expected means.&lt;/p&gt;
&lt;p&gt;So that was me talking from my home in the Netherlands, but this week I am in Portugal. The remote working life, am I right?&lt;/p&gt;
&lt;p&gt;But anyway, performance testing is my favorite topic and my favorite type of testing because that&amp;rsquo;s the one that I&amp;rsquo;ve had the most experience with. Performance testing is more qualitative. So it&amp;rsquo;s more about how well the application works. And there are two main types of performance testing and that&amp;rsquo;s front-end performance, and back-end performance testing.&lt;/p&gt;
&lt;p&gt;Front-end performance testing seeks to verify the user experience at the interface level. So that&amp;rsquo;s everything that the end user sees on their local machine.&lt;/p&gt;
&lt;p&gt;There are different approaches to front-end performance testing, and the first of them is performance profiling. Performance profiling involves running your application through a series of automated checks. And there are a lot of sites for this, where you just put in your URL, if it&amp;rsquo;s a web app, and you get a score in the end. That tells you how performance your application is, the most popular example for this and also the easiest to get started with, is DevTools because that&amp;rsquo;s already in Chrome and Firefox based browsers. But you can also go to sites like Webpagetest, or GTMetrix, YSlow, which is a plugin, or you can use Google Lighthouse, which is now included with Chrome Dev Tools.&lt;/p&gt;
&lt;p&gt;The next approach to front-end performance testing is called RUM or Real User Monitoring. So the difference is that with performance profiling, that&amp;rsquo;s often done manually, and as a one-off thing, like maybe at the beginning of a test or during, but Real User Monitoring is not usually done within testing environments. As the name suggests, these tools measure the experience of real users. So they have to be run in production. Examples of tools in this space are; New Relic&amp;rsquo;s RUM, Elastic has a RUM as well, there&amp;rsquo;s Catchpoint, SpeedCurve Uptrends and many more.&lt;/p&gt;
&lt;p&gt;And the third approach to measuring front-end performance is by using some sort of browser-based automation tool. So typically this has been something like Selenium, but that&amp;rsquo;s falling out of favor in terms of more modern solutions like Playwright, Puppeteer, Cypress and so on.&lt;/p&gt;
&lt;p&gt;So front-end performance is about everything that the user sees on their end, but back-end performance testing is about everything that they don&amp;rsquo;t see. It&amp;rsquo;s about the network. It&amp;rsquo;s about latency, the application servers, the way the infrastructure is set up and all of those things that are a little bit more difficult to look into, but can also have severe bottlenecks. Back-end performance testing seeks to verify aspects of an application such as scalability, elasticity, availability, reliability and responsiveness.&lt;/p&gt;
&lt;p&gt;Scalability is the application&amp;rsquo;s ability to respond to changes in demand. This could mean scaling up, which means increasing the resources available to a server, but it could also mean scaling out, meaning increasing the number of servers that are available to handle the application load.&lt;/p&gt;
&lt;p&gt;Elasticity is a related topic to scalability, except where scalability is all about scaling up or out. Elasticity also emphasize a scaling down or in, and that&amp;rsquo;s because having these services or servers available on the Cloud that are dynamically adjusting can also be quite expensive. So elasticity makes sure that the infrastructure that&amp;rsquo;s available or the resources available are always appropriate for the size of the demand. So when demand increases, elasticity also checks whether the application decreases it servers or resources in response to that.&lt;/p&gt;
&lt;p&gt;Availability is how long the application stays up, despite changing circumstances in production. So this is typically measured by uptime. Availability can also be tested using disaster recovery procedures, and you&amp;rsquo;re not just testing the application itself, but also the processes around it. So are there enough people that are on call so that they would be able to come in and troubleshoot when there&amp;rsquo;s a production incident? All of those things are included in application availability.&lt;/p&gt;
&lt;p&gt;Reliability checks to see how your application behaves in response to unexpected errors. Reliability basically takes it as a given that your application is going to fail somehow, sometime, maybe you don&amp;rsquo;t know exactly when that will be or how it will fail, but it&amp;rsquo;s going to happen. So a big part of reliability and site reliability engineering is trying to expose your application to those failures beforehand so that you can build confidence about how it will behave when those things actually happen in production.&lt;/p&gt;
&lt;p&gt;And the last aspect to back-end performance testing is responsiveness. And this is usually equated with load testing. Load testing is more of a technique for testing though. And really load tests can be used to test not just responsiveness, but also reliability or availability or scalability, basically any of the &amp;ldquo;ilities&amp;rdquo; in this part of back-end performance testing.&lt;/p&gt;
&lt;p&gt;Protocol-based load testing verifies the backend performance of an application, not by simulating real users accessing the application, but by simulating the underlying requests that go back and forth between the client or the user and the application servers. One of the benefits of protocol-based load testing is that it takes up fewer resources on the side of the load generator, and therefore is less expensive to run. Some popular protocol-based load testing tools are k6, JMeter, Gatling LoadRunner, NeoLoad, and Silk Performer.&lt;/p&gt;
&lt;p&gt;Browser-based load testing verifies the application by simulating real users accessing it. So it also has the benefit of including these front-end performance metrics. Browser-based testing can also be called browser-driven or UI-based testing. Some popular tools for browser-based load testing are Playwright, Puppeteer, Flood Element and as of a few weeks ago, k6.&lt;/p&gt;
&lt;p&gt;Then there&amp;rsquo;s hybrid load testing, which takes the best of protocol and browser-based load testing tools by combining them in one test. Now this can present some challenges, especially if you&amp;rsquo;re using different tools for the browser-based script, than you&amp;rsquo;re using for the protocol-based script. The ideal is to use your protocol based load testing tool, to simulate majority of the load to cut down on costs for the execution and scaling out of your load test. And then you run a handful of users using your browser based load testing tool. So you still get some metrics for front-end performance while that load is being applied by the protocol based tool.&lt;/p&gt;
&lt;p&gt;Testing software can be really daunting because there are many aspects of an application that you can test. But that&amp;rsquo;s because there&amp;rsquo;s also many aspects of an application that can fail. And that&amp;rsquo;s why all roads lead to testing and why the success of an app hinges on how well it&amp;rsquo;s been tested.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to zero in, on load testing in particular, check out this video that I made on what load testing is. Thanks for watching. And like they say, here in Portugal, Obrigada!&lt;/p&gt;</description></item><item><title>How to Use Executors in k6: Adapting Load Test Workload Models to Production</title><link>https://nicolevanderhoeven.com/blog/20220118-how-to-use-executors-in-k6-adapting-load-test-workload-models-to-production/</link><pubDate>Tue, 18 Jan 2022 22:45:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220118-how-to-use-executors-in-k6-adapting-load-test-workload-models-to-production/</guid><description>&lt;p&gt;Executors in k6 are like traffic cops.&lt;/p&gt;
&lt;p&gt;They define the shape and volume of traffic that your k6 load testing script follows during test execution. Executors can also drastically affect your results if you don&amp;rsquo;t get them right.&lt;/p&gt;
&lt;p&gt;Here are all the executor options in k6 and when you should use each one:&lt;/p&gt;
&lt;h2 id="k6-executors"&gt;k6 executors&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;shared-iterations&lt;/em&gt;&lt;/strong&gt;: Fix the number of total iterations for the entire test. Use when you want to create precisely X rows of test data during a prep run.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;per-vu-iterations&lt;/em&gt;&lt;/strong&gt;: Fix the number of iterations each virtual user (VU) does. Use when you want each VU to use exactly X rows of test data.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;constant-vus&lt;/em&gt;&lt;/strong&gt;: Fix the number of VUs and duration, but allow the number of iterations to vary. Use for straightforward tests or shakeout tests.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ramping-vus&lt;/em&gt;&lt;/strong&gt;: Set stages, each with a number of VUs and a duration, and let the number of iterations vary. Use for easiest comparison with other load testing tools and for custom load profiles.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;constant-arrival-rate&lt;/em&gt;&lt;/strong&gt;: Fix the number of requests per second (rps) and duration, and allow the number of VUs and iterations to vary. Use when you have a simple load profile with a request throughput requirement (rps).&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;ramping-arrival rate&lt;/em&gt;&lt;/strong&gt;: Like &lt;strong&gt;&lt;em&gt;constant-arrival-rate&lt;/em&gt;&lt;/strong&gt;, but with stages. For each stage, fix the number of rps and duration. Use for spike tests, multiphase load profiles with distinct requirements, and Game Day simulations.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;externally-controlled&lt;/em&gt;&lt;/strong&gt;: Fix max VUs and time, and allow everything else to be changed at runtime. Use for disaster recovery, breakpoint, or stress tests where you want ultimate flexibility in adapting your test to real-time results.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="still-unsure"&gt;Still unsure?&lt;/h2&gt;
&lt;p&gt;Use &lt;strong&gt;&lt;em&gt;ramping-vus&lt;/em&gt;&lt;/strong&gt;. It&amp;rsquo;s probably what you&amp;rsquo;re used to from other tools.&lt;/p&gt;
&lt;p&gt;Ready to move up? Use &lt;strong&gt;&lt;em&gt;ramping-arrival-rate&lt;/em&gt;&lt;/strong&gt;. Rps is a better (but still not perfect) measure of throughput for comparison than just the number of VUs.&lt;/p&gt;
&lt;h2 id="when-in-doubt-look-at-production"&gt;When in doubt, look at production.&lt;/h2&gt;
&lt;p&gt;Making sure your test looks and acts like real traffic yields the best results!&lt;/p&gt;
&lt;p&gt;For more details, check out &lt;a href="https://k6.io/docs/using-k6/scenarios/#executors"&gt;the k6 documentation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Testing tool cheat sheet for load testers who don't just care about numbers</title><link>https://nicolevanderhoeven.com/blog/20220117-testing-tool-cheat-sheet-for-load-testers-who-dont-just-care-about-numbers/</link><pubDate>Mon, 17 Jan 2022 16:30:07 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220117-testing-tool-cheat-sheet-for-load-testers-who-dont-just-care-about-numbers/</guid><description>&lt;p&gt;It&amp;rsquo;s not enough to decide &lt;em&gt;how much&lt;/em&gt; load you want to generate. You also have to know &lt;em&gt;how&lt;/em&gt; you&amp;rsquo;re generating it.&lt;/p&gt;
&lt;p&gt;Your approach affects what part of your application is tested, the results returned, and the budget you&amp;rsquo;ll need to run your test.&lt;/p&gt;
&lt;p&gt;Here are three main categories of load testing tools:&lt;/p&gt;
&lt;h2 id="protocol-based-load-testing-tools"&gt;Protocol-based load testing tools:&lt;/h2&gt;
&lt;p&gt;These tools simulate the underlying messages sent back and forth between an application and a client.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Choose a protocol-based tool if&lt;/em&gt;: you want to generate massive load, you want to load test before components are integrated, you want to test APIs, or you are budget-conscious.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Best in class tools&lt;/em&gt;: Gatling, JMeter, k6, Locust, Neoload&lt;/p&gt;
&lt;h2 id="browser-based-load-testing-tools"&gt;Browser-based load testing tools:&lt;/h2&gt;
&lt;p&gt;These tools automate real user interactions with an interface.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Choose a browser-based tool if:&lt;/em&gt; you want to measure end-to-end performance, you want to reuse your browser automation scripts, you want front-end performance metrics, or you have a higher budget.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Best in class tools:&lt;/em&gt; Cypress, Flood Element, k6, Playwright, Puppeteer&lt;/p&gt;
&lt;h2 id="hybrid-load-testing-tools"&gt;Hybrid load testing tools:&lt;/h2&gt;
&lt;p&gt;This approach is a mixture of the previous two. You can do this in a few ways:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Use a protocol tool to generate the majority of the load, and a browser tool for a handful of virtual users &lt;em&gt;(best functionality, highest effort/cost)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Use a browser-based tool for all load &lt;em&gt;(expensive, simplest)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Find a tool that can do both &lt;em&gt;(ideal solution, few options)&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="whatever-you-choose-compare-like-with-like"&gt;Whatever you choose, compare like with like.&lt;/h2&gt;
&lt;p&gt;Happy testing!&lt;/p&gt;</description></item><item><title>How to use Dataview and Templater to run JavaScript in Obsidian for automating task management</title><link>https://nicolevanderhoeven.com/blog/20220116-how-to-use-dataview-and-templater-to-run-javascript-in-obsidian/</link><pubDate>Sun, 16 Jan 2022 16:30:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220116-how-to-use-dataview-and-templater-to-run-javascript-in-obsidian/</guid><description>&lt;p&gt;TIL how to run JavaScript in @obsdmd. A friend of mine had an interesting use case: He had a long reading list from his studies, and wanted to use Obsidian to decide what he could read given a certain amount of time.&lt;/p&gt;
&lt;p&gt;TL;DR: &lt;a href="https://gist.github.com/nicolevanderhoeven/eccc6f910cdc48a5b7934b53a5a0f244"&gt;Here&amp;rsquo;s the script&lt;/a&gt;.
And here&amp;rsquo;s the end result:
&lt;img src="https://nicolevanderhoeven.com/assets/templater-demo.gif" alt="Gif of the full setup working" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Requires: Obsidian. The Dataview and Templater plugins. Also requires a separate markdown page for every chapter or bite-sized section of the book or course, with the metadata &lt;code&gt;time_required&lt;/code&gt; in the YAML frontmatter.&lt;/p&gt;
&lt;p&gt;Why Dataview? Dataview can parse that frontmatter, grab the value for &lt;code&gt;time_required&lt;/code&gt;, and return a list of pages and links. There is a Dataview Query Language, but dataviewjs is more extensible.&lt;/p&gt;
&lt;p&gt;Why Templater? I initially wanted to write a script within a dataviewjs block, but:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Dataview results are only rendered in Preview mode (which I don&amp;rsquo;t spend much time in)&lt;/li&gt;
&lt;li&gt;I hate testing JavaScript within Obsidian.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Instead, I created a folder &lt;code&gt;scripts&lt;/code&gt; within my vault and selected it as the &amp;ldquo;user scripts folder&amp;rdquo; in Templater settings. Then, I created a script, &lt;code&gt;returnStudyOptions.js&lt;/code&gt;. &lt;a href="https://gist.github.com/nicolevanderhoeven/eccc6f910cdc48a5b7934b53a5a0f244"&gt;Here&amp;rsquo;s the gist for that&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In a new note, I typed &lt;code&gt;&amp;lt;% tp.user.returnStudyOptions(tp, 60) %&amp;gt;&lt;/code&gt;. This line calls the script I created and also passes 60 minutes as the time available.&lt;/p&gt;
&lt;p&gt;I selected &amp;ldquo;Templater: Replace templates in the active file&amp;rdquo; from the Command Pane, which runs the script and replaces the line with the script&amp;rsquo;s returned value, which looks something like this:
&lt;img src="https://nicolevanderhoeven.com/assets/templater-result.png" alt="Screenshot of the notes returned by the script" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I also assigned a hotkey to for replacing the template, for ease of use. That&amp;rsquo;s it! I thought this was a fun way to learn how to use JavaScript in Obsidian. Thanks to &lt;a href="https://twitter.com/ealameda"&gt;@ealameda&lt;/a&gt; for the use case!&lt;/p&gt;</description></item><item><title>Building a DM's Brain Attic</title><link>https://nicolevanderhoeven.com/blog/20220115-building-a-dms-brain-attic/</link><pubDate>Sat, 15 Jan 2022 16:45:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220115-building-a-dms-brain-attic/</guid><description>&lt;p&gt;Anyone other DMs have this problem? My TRPGs folder, containing paid third-party assets for D&amp;amp;D and other RPGs, is made up of 37,884 items (287 GB).&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how I make sure I actually get value out of this embarrassment of riches: 👇&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/trpgs.png" alt="Screenshot of my TRPGs folder with all my third-party items" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Mike from &lt;a href="https://twitter.com/SlyFlourish"&gt;@SlyFlourish&lt;/a&gt; wrote an article applying Sherlock Holmes&amp;rsquo;s brain attic for lazy dungeon masters, and he called it the &amp;ldquo;[DM Brain Attic](&lt;a href="https://slyflourish.com/brain_attic.html%22"&gt;https://slyflourish.com/brain_attic.html&amp;quot;&lt;/a&gt;. The idea is to collect interesting techniques or ideas and file them away for later.&lt;/p&gt;
&lt;p&gt;Sounds like a good idea, but for most of us, this attic is theoretical. We read books, we watch videos, and we read blog posts on monsters and settings and plots, and we trust that they&amp;rsquo;ll all be saved somewhere in our heads.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s not how it works. Our minds are good at making connections, not remembering CRs from monster statblocks. So how do we make this DM Brain Attic less theoretical and more practical?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Read and take notes. If you haven&amp;rsquo;t read everything you&amp;rsquo;ve bought, you&amp;rsquo;re buying too much. Read what you&amp;rsquo;ve got and write down the parts that are actually relevant to you and your game. Here&amp;rsquo;s what mine looks like for the first Arcadia (@helloMCDM) issue.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/arcadia.png" alt="Screenshot of my notes on Arcadia issue 1" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ol start="2"&gt;
&lt;li&gt;Combine like with like. This is the hard part, because it involves creating a central place for monsters, items, spells, etc. &lt;a href="https://github.com/nicolevanderhoeven/xios-guide-to-monsters"&gt;This&lt;/a&gt; is my attempt to do this for monsters. It creates one page per monster that includes its source. Here&amp;rsquo;s a monster example.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/zombie.png" alt="Screenshot of a monster page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example for items that includes SRD items and Vault of Magic Items (by &lt;a href="https://twitter.com/KoboldPress"&gt;@KoboldPress&lt;/a&gt;). Each one links to a page for the item with full details.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/vault-of-magic.png" alt="Screenshot of my page of items" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ol start="3"&gt;
&lt;li&gt;Resurface via search: You may have noticed the metadata in the previous page. The metadata gives me criteria to search monsters by. Here&amp;rsquo;s how I can query my monster database using the &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview plugin&lt;/a&gt; for &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dataview-query.png" alt="Screenshot of a monster query using Dataview" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the result of that query, returning monsters that fit my criteria and, importantly, which of my PDFs they come from.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dataview-result.png" alt="Screenshot of the results from the Dataview query shown earlier" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ol start="4"&gt;
&lt;li&gt;Resurface via random table generators. Another way that I resurface content is by using random table generators using the &lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Dice Roller plugin&lt;/a&gt; for Obsidian by Jeremy Valentine. Here&amp;rsquo;s my NPC page, compiled from multiple sources.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/npc-rolls.png" alt="My NPC creation page with randomized traits" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Each die icon can be clicked to generate a new &amp;ldquo;roll&amp;rdquo;. Here&amp;rsquo;s a gif for how that works, using stuff from Sly Flourish&amp;rsquo;s Uncovered Secrets, accessible to &lt;a href="https://www.patreon.com/slyflourish"&gt;his Patreons&lt;/a&gt;. Each click &amp;ldquo;rolls&amp;rdquo; on a table I&amp;rsquo;ve defined in a separate note.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/uncoveredsecrets_02.gif" alt="Gif of how my random tables created from Sly Flourish’s Uncovered Secrets" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Is building a DM Brain Attic a lot of work? Yes.&lt;/p&gt;
&lt;p&gt;But how likely is it that I&amp;rsquo;d use my 287 GB of third-party stuff while preparing for my game if I didn&amp;rsquo;t have this system? Not very.&lt;/p&gt;
&lt;p&gt;At least this way, I&amp;rsquo;m using what I&amp;rsquo;ve actually bought and putting good content into a very real DM&amp;rsquo;s Brain Attic that I can actually scrounge around for good ideas in, before or during a game.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d like to know more, check out this video I made about how I use Obsidian to run and play D&amp;amp;D online:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3pt6_srUZ7U?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Six Performance Testing Hats</title><link>https://nicolevanderhoeven.com/blog/20220114-six-performance-testing-hats/</link><pubDate>Fri, 14 Jan 2022 16:30:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220114-six-performance-testing-hats/</guid><description>&lt;p&gt;I was reading &lt;a href="https://amzn.to/3tvLYM9"&gt;Six Thinking Hats&lt;/a&gt; by Edward de Bono when I realized that the premise could be applied to performance testing:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/six-performance-testing-hats.png" alt="The Six Performance Testing Hats" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Each hat represents a different way of thinking, which can be useful when working through issues. Sometimes, wearing only one hat can cause us to fixate on incorrect assumptions, and &amp;ldquo;putting on another hat&amp;rdquo; can help shake things up and get to actually fixing what went wrong.&lt;/p&gt;</description></item><item><title>Financial Independence Isn't Just for Old People</title><link>https://nicolevanderhoeven.com/blog/20220113-financial-independence-isnt-just-for-old-people/</link><pubDate>Thu, 13 Jan 2022 16:43:46 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220113-financial-independence-isnt-just-for-old-people/</guid><description>&lt;p&gt;5 years ago, at age 31, I became financially independent.&lt;/p&gt;
&lt;p&gt;Financial independence (FI) means that if I wanted to retire tomorrow, I could. I&amp;rsquo;d have to make significant changes to my life to do it, but I&amp;rsquo;d have a plan, and enough resources at hand to get by.&lt;/p&gt;
&lt;p&gt;Unfortunately, just talking about FI is uncommon at best and taboo at worst, even in an industry with higher-than-average salaries like tech.&lt;/p&gt;
&lt;p&gt;You might be thinking that I received some sort of inheritance or unexpected windfall. The truth is that 10 years ago, my husband and I were in credit card debt and had no major assets. Now he&amp;rsquo;s retired, and I have a job I love.&lt;/p&gt;
&lt;p&gt;The funny thing is, there&amp;rsquo;s really nothing magical about how we got here.&lt;/p&gt;
&lt;h2 id="heres-how-you-can-do-it-too"&gt;Here&amp;rsquo;s how you can do it too.&lt;/h2&gt;
&lt;h3 id="step-1-track-your-money"&gt;&lt;strong&gt;Step 1: Track your money.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;You can&amp;rsquo;t fix something you aren&amp;rsquo;t monitoring.&lt;/p&gt;
&lt;p&gt;To this day, my husband and I use (&lt;a href="http://youneedabudget.com"&gt;YNAB&lt;/a&gt;) to track every cent of our money, whether we&amp;rsquo;re saving it or spending it. When your financial situation is right there in black and white, it&amp;rsquo;s hard to ignore.&lt;/p&gt;
&lt;h3 id="step-2-reduce-your-expenses"&gt;&lt;strong&gt;Step 2: Reduce your expenses.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Too many people focus on earning more, when the reality is that it&amp;rsquo;s far easier to adjust what you&amp;rsquo;re &lt;em&gt;spending&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;You can afford (almost) anything, but you can&amp;rsquo;t afford everything&amp;ndash; so figure out what matters. Reducing your expenses is even better than getting a raise. Do regular audits of fixed expenses. If you have a partner, consider living on less than one income and banking the other entirely.&lt;/p&gt;
&lt;h3 id="step-3-automate-investments"&gt;&lt;strong&gt;Step 3: Automate investments.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Set up a recurring monthly payment for a painful amount of money. Invest in low-cost ETFs like Vanguard&amp;rsquo;s &lt;em&gt;and then forget about them&lt;/em&gt;. Resign yourself to living at your current lifestyle level (or lower), and don&amp;rsquo;t live it up when you get a raise.&lt;/p&gt;
&lt;p&gt;And for those who want a goal post, as I did: &lt;strong&gt;Actually calculate the minimum amount you&amp;rsquo;d need to retire&lt;/strong&gt;. It may be less than you think.&lt;/p&gt;
&lt;p&gt;Money isn&amp;rsquo;t everything, but it can be. To someone who doesn&amp;rsquo;t have it, money can buy freedom.&lt;/p&gt;</description></item><item><title>How to Set Goals in Obsidian for 2022</title><link>https://nicolevanderhoeven.com/blog/20220112-how-to-set-goals-in-obsidian-for-2022/</link><pubDate>Wed, 12 Jan 2022 16:58:39 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220112-how-to-set-goals-in-obsidian-for-2022/</guid><description>&lt;p&gt;How do you set goals in Obsidian?&lt;/p&gt;
&lt;p&gt;New Year&amp;rsquo;s Resolutions are infamously left undone. So what should you do instead? OKRs.&lt;/p&gt;
&lt;p&gt;Setting OKRs (Objective Key Results) instead of resolutions increases your chances of succeeding. Tracking your progress throughout the year also make sure you&amp;rsquo;re getting things done. In this video, I talk about what OKRs are and how I&amp;rsquo;ve set them up in Obsidian for the year ahead.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/T2Aeaq4sk7M?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>What Tabletop Games Teach Us About Application Perfomance</title><link>https://nicolevanderhoeven.com/blog/20220112-what-tabletop-games-teach-us-about-application-perfomance/</link><pubDate>Wed, 12 Jan 2022 16:30:29 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220112-what-tabletop-games-teach-us-about-application-perfomance/</guid><description>&lt;p&gt;Tabletop games and application performance have more in common than you might think.&lt;/p&gt;
&lt;p&gt;See, it&amp;rsquo;s all about optimization. Both involve juggling several variables: some that you can control, and some that you can&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I&amp;rsquo;ve learned about application performance from playing tabletop games.&lt;/p&gt;
&lt;h2 id="1-get-more-workers"&gt;#1: Get more workers&lt;/h2&gt;
&lt;p&gt;In worker placement games, you should always spend your first worker to train more workers.&lt;/p&gt;
&lt;p&gt;Similarly, one of the most basic ways to increase concurrency is multithreading: using more than one thread at a time. (See: Golang) This applies to testing tools as much as to systems. The 1 Thread: 1 Virtual User paradigm is flawed.&lt;/p&gt;
&lt;h2 id="2-spend-time-on-getting-your-engine-going"&gt;#2: Spend time on getting your engine going&lt;/h2&gt;
&lt;p&gt;Get your big combos in place before you tap to attack.&lt;/p&gt;
&lt;p&gt;Things like setting up automation frameworks or CI/CD pipelines DO set you back in the beginning, but they are worth their mana cost in the long run.&lt;/p&gt;
&lt;h2 id="3draft-with-others-in-mind"&gt;#3: Draft with others in mind&lt;/h2&gt;
&lt;p&gt;The trick to drafting is knowing what you&amp;rsquo;re leaving for others as much as what you&amp;rsquo;re taking for yourself.&lt;/p&gt;
&lt;p&gt;The short game is getting your team to do the testing. The long game is getting everyone in the company involved in testing.&lt;/p&gt;
&lt;h2 id="4-hope-for-a-nat-20-plan-for-a-nat-1"&gt;#4: Hope for a nat 20, plan for a nat 1&lt;/h2&gt;
&lt;p&gt;Sometimes proficiency, expertise, and a luckstone just aren&amp;rsquo;t enough.&lt;/p&gt;
&lt;p&gt;Instead of wondering &lt;em&gt;whether&lt;/em&gt; an app will fail, take for granted that it will, and start planning for it. Keep that Action Surge in your back pocket.&lt;/p&gt;
&lt;h2 id="5-sometimes-you-just-have-to-trade-for-sheep"&gt;#5: Sometimes, you just have to trade for sheep&lt;/h2&gt;
&lt;p&gt;The 2:1 port is valuable, but not always the best option.&lt;/p&gt;
&lt;p&gt;Learn what you can, but accept that you can&amp;rsquo;t learn it all. Reach out to others with compatible skillsets and ask the &amp;ldquo;stupid&amp;rdquo; questions that nobody else wants to ask.&lt;/p&gt;
&lt;h2 id="testing-is-a-team-sport-and-everyone-gets-a-chance-to-play"&gt;Testing is a team sport, and everyone gets a chance to play.&lt;/h2&gt;
&lt;p&gt;Happy gaming!&lt;/p&gt;</description></item><item><title>The Tester's Toolbox Is Flawed</title><link>https://nicolevanderhoeven.com/blog/20220111-the-testers-toolbox-is-flawed/</link><pubDate>Tue, 11 Jan 2022 16:30:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220111-the-testers-toolbox-is-flawed/</guid><description>&lt;p&gt;Every tester has a toolbox.&lt;/p&gt;
&lt;p&gt;In the toolbox rests a variety of tools for every conceivable purpose. Part of our job, as testers, is to choose the right one for the job. Sounds reasonable, right?&lt;/p&gt;
&lt;p&gt;That kind of thinking could be dangerous.&lt;/p&gt;
&lt;h2 id="the-right-tool-for-every-job-fails-for-multiple-jobs"&gt;&amp;ldquo;The right tool for every job&amp;rdquo; fails for multiple jobs.&lt;/h2&gt;
&lt;p&gt;You end up with multiple tools. One for accessibility testing. Another for API testing. Another for browser testing. Another for load testing. &lt;em&gt;This is the modern tester&amp;rsquo;s dilemma&lt;/em&gt;: we spend more time working with our tools than with the application under test.&lt;/p&gt;
&lt;p&gt;In the real world, including a new tool in your testing stack means a new framework, usually a new programming language, and sometimes even new colleagues with experience in those tools. And what about continuous testing? All those tools have to talk to each other at some point.&lt;/p&gt;
&lt;p&gt;More tools = more time, effort, and money.&lt;/p&gt;
&lt;h3 id="when-choosing-tools-prioritize-multitools"&gt;&lt;strong&gt;When choosing tools, prioritize multitools.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;A multitool can be used for different purposes and prioritizes flexibility.&lt;/p&gt;
&lt;p&gt;Here are a few ways to spot a multitool:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#1: It is a polymath.&lt;/strong&gt; A multitool is good at many things and is limited in use case only by the imagination of those that use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#2: It uses what you know.&lt;/strong&gt; A multitool is built on languages and frameworks you and your team already know, reducing ramp-up time.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;#3 It plays well with others.&lt;/strong&gt; A multitool doesn&amp;rsquo;t force you to use it to the exclusion of everything else. It integrates well with best-in-class tools.&lt;/p&gt;
&lt;p&gt;When you optimize for individual jobs, you&amp;rsquo;re missing the big picture. You&amp;rsquo;re ultimately left holding the ends of multiple tools and creating a kraken of a test suite with all these tools cobbled together.&lt;/p&gt;
&lt;p&gt;Instead, prioritize multitools.&lt;/p&gt;</description></item><item><title>Obsidian for the Uninitiated</title><link>https://nicolevanderhoeven.com/blog/20220110-obsidian-for-the-uninitiated/</link><pubDate>Mon, 10 Jan 2022 23:07:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220110-obsidian-for-the-uninitiated/</guid><description>&lt;h1 id="obsidian-for-the-uninitiated"&gt;Obsidian for the Uninitiated&lt;/h1&gt;
&lt;p&gt;You&amp;rsquo;ve installed Obsidian and created a new vault. Now what?&lt;/p&gt;
&lt;p&gt;Unfortunately, it can be more than a little daunting to get started with. It doesn&amp;rsquo;t help that there are terms like &lt;em&gt;Zettelkasten&lt;/em&gt; and &lt;em&gt;Maps of Content&lt;/em&gt; and &lt;em&gt;fleeting notes&lt;/em&gt; and &lt;em&gt;digital garden&lt;/em&gt; that are all just trying to structure what we all learned to do in primary school.&lt;/p&gt;
&lt;h2 id="start-by-logging-what-youre-doing"&gt;Start by logging what you&amp;rsquo;re doing.&lt;/h2&gt;
&lt;p&gt;Having a rigid structure does wonders for curtailing creativity and plain fun. Instead, I recommend starting small.&lt;/p&gt;
&lt;p&gt;Here are some small steps to take after installing Obsidian:&lt;/p&gt;
&lt;h3 id="step-1-enable-the-daily-notes-plugin"&gt;&lt;strong&gt;Step 1: Enable the Daily Notes plugin&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;The most game-changing feature of Obsidian is plugins.&lt;/p&gt;
&lt;p&gt;Go into Settings &amp;gt; Core Plugins, and enable the &lt;em&gt;Daily notes&lt;/em&gt; plugin.&lt;/p&gt;
&lt;p&gt;Then, exit out of the dialog boxes and hit CMD P (Mac) or CTRL P (Windows) to bring up the command pane. Search for and select &lt;em&gt;Daily notes: Open today&amp;rsquo;s daily note&lt;/em&gt;. That creates a new note in your vault with today&amp;rsquo;s date.&lt;/p&gt;
&lt;p&gt;From now on, do this every day and log things you do during the day: things to do, appointments to keep, videos you watched.&lt;/p&gt;
&lt;h3 id="step-2-the-next-time-you-consume-content-take-notes"&gt;&lt;strong&gt;Step 2: The next time you consume content, take notes.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Now, the next time you read or watch something interesting, type its title into Obsidian with brackets:&lt;code&gt;[[Cool video I watched]]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s now a link. CMD+click on that link, or click the glasses icon on the top right to switch to Preview mode, and then click on the link. You should now have a new note. Write about what you thought of the video.&lt;/p&gt;
&lt;h3 id="step-3-start-identifying-and-fleshing-out-ideas"&gt;&lt;strong&gt;Step 3: Start identifying and fleshing out ideas.&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;Keep going with these steps and every now and then, start to identify cool ideas you come across. Create new notes from them just like you did in Step 2. Don&amp;rsquo;t worry about getting it all; just do it when and until you feel like it.&lt;/p&gt;
&lt;p&gt;These three simple steps, over time, will be the foundations of your own Personal Knowlege Management system with Obsidian.&lt;/p&gt;</description></item><item><title>5 Ways to Use Obsidian as a Software Engineer</title><link>https://nicolevanderhoeven.com/blog/20220109-5-ways-to-use-obsidian-as-a-software-engineer/</link><pubDate>Sun, 09 Jan 2022 19:20:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220109-5-ways-to-use-obsidian-as-a-software-engineer/</guid><description>&lt;p&gt;Yesterday, I wrote about why I think taking notes is the surprising foundation of a tester&amp;rsquo;s career.&lt;/p&gt;
&lt;p&gt;But it&amp;rsquo;s not just testers. Every software engineer is a knowledge worker, and that means we get paid for what we know. Using a Personal Knowledge Management (PKM) system such as &lt;a href="http://Obsidian.md"&gt;Obsidian.md&lt;/a&gt; helps us keep up with the constant barrage of new ideas in tech.&lt;/p&gt;
&lt;p&gt;Here are 5 things I use Obsidian for.&lt;/p&gt;
&lt;h2 id="1-my-very-own-stack-overflow"&gt;#1: My very own Stack Overflow&lt;/h2&gt;
&lt;p&gt;If you code, you&amp;rsquo;ve used Stack Overflow.&lt;/p&gt;
&lt;p&gt;What if you had your &lt;strong&gt;own&lt;/strong&gt; Stack Overflow, one that contained cheat sheets of every language you&amp;rsquo;ve ever tried to hack something up in, including only commands relevant to your job? This is exactly &lt;a href="https://notes.nicolevanderhoeven.com/Python"&gt;what I&amp;rsquo;ve done for Python&lt;/a&gt; recently, and it&amp;rsquo;s helping me solidify my knowledge.&lt;/p&gt;
&lt;h2 id="2-tools-database"&gt;#2: Tools database&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a tool for everything.&lt;/p&gt;
&lt;p&gt;To keep them straight, I have a page for every load testing tool I try, with tutorials for how to get started, an assessment of its features, and observations I had while attempting to learn it. &lt;a href="https://notes.nicolevanderhoeven.com/k6+(tool)"&gt;Here&amp;rsquo;s what I have for the load testing tool k6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Bonus: I also use &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;the Dataview plugin&lt;/a&gt; to query tools that fit my criteria.&lt;/p&gt;
&lt;h2 id="3-an-agile-workspace"&gt;#3: An Agile workspace&lt;/h2&gt;
&lt;p&gt;If Agile is good enough for my professional work, it&amp;rsquo;s good enough for my personal work.&lt;/p&gt;
&lt;p&gt;I use the &lt;a href="https://github.com/mgmeyers/obsidian-kanban"&gt;Kanban plugin&lt;/a&gt; to keep track of projects, create weekly and monthly review/retro templates, and work iteratively using &lt;a href="https://github.com/bjsi/incremental-writing"&gt;the Incremental Writing plugin&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="4-a-public-learning-log"&gt;#4: A public learning log&lt;/h2&gt;
&lt;p&gt;Learning in public is the fastest way to improve.&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m trying to figure something out, I document my attempts. With Obsidian Publish, I can quickly push this log out to my domain and share them with colleagues to get a quick review so that they can easily follow my train of thought and tell me where I went wrong.&lt;/p&gt;
&lt;h2 id="5-a-digital-garden-of-software-ideas"&gt;#5: A digital garden of software ideas&lt;/h2&gt;
&lt;p&gt;Build libraries, not feeds.&lt;/p&gt;
&lt;p&gt;I use Obsidian to save things I read/watch/listen to but also to save space for ideas I&amp;rsquo;ve learned to germinate. I publish notes before they&amp;rsquo;re fully fleshed out, with the goal of growing everything over time.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com"&gt;Today, I have 4,567 notes&lt;/a&gt;, all about things that matter to me.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Every engineer should have a PKM system.&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>Take Notes, Not Tools</title><link>https://nicolevanderhoeven.com/blog/20220108-take-notes-not-tools/</link><pubDate>Sat, 08 Jan 2022 17:00:44 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20220108-take-notes-not-tools/</guid><description>&lt;p&gt;When I first got into testing, I thought that testing was about learning different tools and frameworks.&lt;/p&gt;
&lt;p&gt;I learned how to use Neoload, then LoadRunner, then JMeter, and then SeleniumSilkPerformerVisualStudioGatlingPuppeteerPlaywrightk6 in short succession. I took courses on JavaScript, on C, on Java. I ticked off tools like a grocery list.&lt;/p&gt;
&lt;p&gt;It didn&amp;rsquo;t take me long to realize that I still wasn&amp;rsquo;t a good tester.&lt;/p&gt;
&lt;h2 id="taking-notes-not-tools-is-what-makes-a-good-tester"&gt;Taking notes, not tools, is what makes a good tester.&lt;/h2&gt;
&lt;p&gt;When you think about it, a lot of things a tester does revolves around taking good notes.&lt;/p&gt;
&lt;p&gt;Requirements are just notes on what the business wants to achieve. Test scenarios are notes on situations that the team wants to simulate. Test cases are notes on how a user would use an application. Defects are notes on issues.&lt;/p&gt;
&lt;p&gt;The quality of a tester&amp;rsquo;s notes dictates the quality of their work.&lt;/p&gt;
&lt;h3 id="listen-to-people-not-tool-tutorials"&gt;&lt;strong&gt;Listen to people, not tool tutorials&lt;/strong&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Take notes on what users do.&lt;/strong&gt; Talk to the business. Pore through Google Analytics logs. Piece together a story of the kind of people who use your application, and how they use it.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take notes on problem areas.&lt;/strong&gt; Talk to customer support about the most common questions they get&amp;ndash; they know more about pain points than anyone else in the company. Talk to the ops engineers who were on call during the last production incident. These problems are what you&amp;rsquo;ll need to test later.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Take notes on what you&amp;rsquo;ve learned.&lt;/strong&gt; If you don&amp;rsquo;t like learning, you&amp;rsquo;re in the wrong field. Document everything, even things you think you&amp;rsquo;ll never forget, because one day, you WILL forget.&lt;/p&gt;
&lt;p&gt;Taking notes, not tools, is the foundation every testing career is built on.&lt;/p&gt;</description></item><item><title>Top 10 Last Minute Tech Gifts (2021)</title><link>https://nicolevanderhoeven.com/blog/20211220-top-10-last-minute-tech-gifts/</link><pubDate>Mon, 20 Dec 2021 17:20:19 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211220-top-10-last-minute-tech-gifts/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/nkj3qYvb--Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this super last-minute video, I talked about 10 awesome bits of tech I&amp;rsquo;ve loved throughout this year, and why I think each of them would make great gifts for the techie in your life (or maybe even yourself).&lt;/p&gt;
&lt;p&gt;Below are all the items I mentioned. I include affiliate links where possible, so I will get a miniscule commission if you buy something through my link. However, I wouldn&amp;rsquo;t be recommending these if I didn&amp;rsquo;t genuinely use and love them all!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Røde PodMic: &lt;a href="https://amzn.to/3dKhflp"&gt;https://amzn.to/3dKhflp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Røde PSA1 boom arm: &lt;a href="https://amzn.to/3sdVSkK"&gt;https://amzn.to/3sdVSkK&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Rødecaster Pro: &lt;a href="https://amzn.to/3rYZnv9"&gt;https://amzn.to/3rYZnv9&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elgato Wave 3 USB condenser microphone and digital mixer: &lt;a href="https://amzn.to/3GDo5oV"&gt;https://amzn.to/3GDo5oV&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keychron K6 mechanical keyboard: &lt;a href="https://amzn.to/3s6cScz"&gt;https://amzn.to/3s6cScz&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Keychron K3 mechanical keyboard: &lt;a href="https://amzn.to/3DL35Ln"&gt;https://amzn.to/3DL35Ln&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Omnicharge 20c: &lt;a href="https://amzn.to/31RP3KU"&gt;https://amzn.to/31RP3KU&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Elgato Keylight Air: &lt;a href="https://amzn.to/3ynpjSp"&gt;https://amzn.to/3ynpjSp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Aputure Amaran MC bundle: &lt;a href="https://amzn.to/3oOf2vh"&gt;https://amzn.to/3oOf2vh&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;You Need a Budget app (YNAB): &lt;a href="https://app.youneedabudget.com/gifts"&gt;https://app.youneedabudget.com/gifts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;0Kindle Oasis: &lt;a href="https://amzn.to/3IODEMr"&gt;https://amzn.to/3IODEMr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Yubikey: &lt;a href="https://amzn.to/3ETRvyH"&gt;https://amzn.to/3ETRvyH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Trezor Model T: &lt;a href="https://shop.trezor.io/product/trezor-model-t"&gt;https://shop.trezor.io/product/trezor-model-t&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Kindle Oasis: &lt;a href="https://amzn.to/3GIXas7"&gt;https://amzn.to/3GIXas7&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Leatherman Skeletool RX: &lt;a href="https://amzn.to/3m0drks"&gt;https://amzn.to/3m0drks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bose NC 700 headphones: &lt;a href="https://amzn.to/3q3xD5W"&gt;https://amzn.to/3q3xD5W&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How Eurofunk uses k6 for load testing emergency services (k6 Office Hours #37)</title><link>https://nicolevanderhoeven.com/blog/20211217-koh37-daniel-knittl-frank/</link><pubDate>Fri, 17 Dec 2021 17:17:07 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211217-koh37-daniel-knittl-frank/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/PHJQuYDdNps?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this k6 Office Hours, k6 CEO Robin Gustafsson joined me to talk to Daniel Knittl-Frank, a software engineer at Eurofunk, about how k6 is used in the emergency services industry. Daniel has an interesting use case for k6: he uses it to load test calls in Austria received from the 112 emergency services hotline!&lt;/p&gt;</description></item><item><title>Load Tester Reacts to Pokemon Go Scales for 166m Users</title><link>https://nicolevanderhoeven.com/blog/20211209-load-tester-reacts-to-pokemon-go-scales-for-166m-users/</link><pubDate>Thu, 09 Dec 2021 16:13:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211209-load-tester-reacts-to-pokemon-go-scales-for-166m-users/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MtsEFebioWI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;NICOLE: Last year, Pokemon GO, a mobile app developed by Niantic Labs, made $1.23 billion in revenue with 166 million players from all over the world. This level of success is unprecedented, especially for an app that was encouraging people to go outside at a time when many governments were encouraging them to stay inside. In tech, though, success comes at a cost. Here&amp;rsquo;s what Niantic has to do under the hood to keep this massively popular game running.&lt;/p&gt;
&lt;p&gt;Hey everyone, I&amp;rsquo;m Nicole van der Hoeven. I&amp;rsquo;ve been helping companies
through their load testing for over 10 years, and I like to talk about tech travel and taking notes. I&amp;rsquo;m also a Pokemon GO player. I&amp;rsquo;ve been playing it since
the day it was released in July 2016.&lt;/p&gt;
&lt;p&gt;In this video, I&amp;rsquo;m going to be reacting to a conversation between Priyanka Vergadia from Google and James Prompanya from Niantic Labs. Thank you to Joe Colantonio&amp;rsquo;s TestGuild News Show last month, for bringing it to my attention.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get started.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Yep.
NICOLE: Okay. Everybody knows that you should be doing a curve ball to catch Pokemon the fastest way.&lt;/p&gt;
&lt;p&gt;PRIYANKA: I am catching some Pokemons. Did you know that it was
built on Google Cloud? Well, let&amp;rsquo;s talk&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: GCP, okay.&lt;/p&gt;
&lt;p&gt;PRIYANKA: At Niantic Labs to take a behind the scenes look at Pokemon Go&amp;rsquo;s architecture, and how it scales for large number of players. Hi James, welcome to the show.&lt;/p&gt;
&lt;p&gt;JAMES: Pokemon Go is not your typical mobile game.&lt;/p&gt;
&lt;p&gt;NICOLE: I love that he&amp;rsquo;s got Pokemon paraphernalia everywhere.&lt;/p&gt;
&lt;p&gt;JAMES: Catching these little creatures around you called Pokemon that are
appearing in a real world. Encourage you to go outside, explore and discover things using augmented reality. A big part of that, which wasn&amp;rsquo;t in&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: See this is one of the things that make me really impressed with their implementation. They have majority of their users using mobile networks. That&amp;rsquo;s a really hard thing to account for, especially when you&amp;rsquo;re talking about a global audience that is playing in different parts of the world. So it&amp;rsquo;s really important that everything is front-loaded, and that they&amp;rsquo;re minimizing the amount of traffic, the amount of resources that each player has to download on their mobile network.&lt;/p&gt;
&lt;p&gt;JAMES: Wasn&amp;rsquo;t included in the game when it first came out, was this big community aspect of it. We really liked this part of the game. So we made it a major part by hosting regular live events, such as Community Days, Raid Hours,Team GO Rocket Takeovers, all culminates in this big summer event that we call GO Fest.&lt;/p&gt;
&lt;p&gt;PRIYANKA: So it&amp;rsquo;s&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So this is a really brave move as well because they have events that are timed. So they happen at the same time for people in that time zone. And earlier on in Pokemon Go&amp;rsquo;s history, I did experience some slowness and some congestion in the mobile networks. But I mean, that&amp;rsquo;s a really difficult thing for them to plan for. I&amp;rsquo;m interested to see how they solve that.&lt;/p&gt;
&lt;p&gt;PRIYANKA: How does Pokemon Go back and actually scale to handle these peaks in traffic?&lt;/p&gt;
&lt;p&gt;JAMES: So we use Google Cloud. (chuckles) We have lots of services that need scaling such as the Google Kubernetes Engine and Spanner. Our front-end service is hosted on GKE, and it&amp;rsquo;s pretty easy to scale the nodes there. Google Cloud provides us with all the tools we need to manage the Kubernetes cluster.&lt;/p&gt;
&lt;p&gt;NICOLE: So it&amp;rsquo;s really cool to hear him talking about their stacks. So they&amp;rsquo;re using GCP, Google Cloud Platform. They&amp;rsquo;re on Kubernetes, so they&amp;rsquo;re using GKE, the Google Kubernetes Engine. And they use Google Cloud Spanner, which is a very highly available relational database.&lt;/p&gt;
&lt;p&gt;JAMES: To give an idea of scale, we have about 5,000 spanner nodes handling the traffic and thousands of Kubernetes nodes running just for the Pokemon&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: That is so interesting. 5,000 Spanner nodes. That&amp;rsquo;s just for the data. That makes sense because Niantic&amp;rsquo;s main reason for creating this game, or the way that they&amp;rsquo;re making money, I guess, is by getting the data from users about walking paths and &amp;hellip;Basically, geo location or spatial data. So it&amp;rsquo;s super important for them to be able to store the data that they&amp;rsquo;re getting from their application usage.&lt;/p&gt;
&lt;p&gt;JAMES: We also have the various microservices that host other parts of the&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So another thing that they&amp;rsquo;re doing to keep it scalable is
by using microservices. See the traditional way is to use a monolith, so one large application with many sub-components. The problem with that though, is you can&amp;rsquo;t independently scale those components, you&amp;rsquo;d have to scale the entire application. And when that application is already really big and complex, that&amp;rsquo;s really inefficient because you&amp;rsquo;re scaling everything, even services that you
may not need to scale. So it&amp;rsquo;s really smart that they&amp;rsquo;ve chosen for a microservices based architecture, so that each of those components can be scaled separately of each other.&lt;/p&gt;
&lt;p&gt;JAMES: And if you compare ourselves to maybe World of Warcraft, you&amp;rsquo;ll see that other massively multiplayer online games, they split players into multiple realms, but for us, all of our players, they reside on a single realm. It was important for us that players can always interact with each other and share the same game, the experience, no matter where or when they&amp;rsquo;re playing.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Yeah&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Okay. So I happen to have also played WoW, World of Warcraft. My main &amp;rsquo;toon was a disciplined priest. So when you sign up to WoW, you have to choose a realm, that&amp;rsquo;s basically a server or group of servers so that they don&amp;rsquo;t have to shoulder the entire load from all users. So that was WoW&amp;rsquo;s way to reduce the load. And he&amp;rsquo;s making the point that Pokemon Go can&amp;rsquo;t really do that to a certain extent. It&amp;rsquo;s not entirely correct to say that they don&amp;rsquo;t have
that sort of splintering, because they do still splinter based on the time zone. You&amp;rsquo;re only seeing people in that location in your time zone.&lt;/p&gt;
&lt;p&gt;Even events, they sometimes say 10:00 AM in your local time. So you&amp;rsquo;re not necessarily playing at the same time that people in Australia are playing. So there is some splintering, but it is less than what there would be for a game like WoW.&lt;/p&gt;
&lt;p&gt;JAMES: When we&amp;rsquo;re looking at different providers, we saw that Spanner
has consistent indexing that allows us to do more complex database schemas with these primary and secondary keys. Data Store was also non-relational with atomic and durable transactions. So we needed a relational database with full consistency, and made the choice to go to Spanner, which gave us these global ACID transactions.&lt;/p&gt;
&lt;p&gt;NICOLE: So he&amp;rsquo;s talking about consistency, global consistency, being a big deal and a big factor for why they chose to go and use Google Cloud Spanner instead of Google Data Store. And the reason is that normally, when you have a bunch of different instances of database, it doesn&amp;rsquo;t matter so much that those requests are processed in exactly the order that they came in. Because usually those
requests are being made by different people, and they&amp;rsquo;re trying to change different accounts. But with Pokemon Go, there&amp;rsquo;s the added complexity of wanting to keep the integrity of the chronological order. So if I go and attack a gym before you do, my, the process, the request that I created by attacking the gym, should be processed before yours is because it matters who gets to the gym first. So that&amp;rsquo;s an interesting twist.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Now let&amp;rsquo;s say I&amp;rsquo;m a player and I&amp;rsquo;m playing the game right now. I open my app to catch a Pokemon. What is happening behind the scenes? How does the request flow work?&lt;/p&gt;
&lt;p&gt;JAMES: When the user catches a Pokemon, we receive that request through the Google Cloud Load Balancer. All of the static media is also stored on Google Cloud storage buckets. And it&amp;rsquo;s downloaded to the phone when you first start the app. We also have caching enabled at the load balancers. So it&amp;rsquo;s&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Already, they&amp;rsquo;ve mentioned they have a load balancer, so that that&amp;rsquo;s like a traffic controller that&amp;rsquo;s sitting above the servers and saying, &amp;ldquo;Okay, this request goes to this server.&amp;rdquo; And then maybe when that server is processing too many requests, that load balancer should be able to say, &amp;ldquo;All right, now let&amp;rsquo;s
divert some of the traffic to another server that maybe isn&amp;rsquo;t as heavily utilized.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;He also mentioned that they employ caching. This is what I was saying earlier that because you want to minimize the amount of traffic and the bytes that are flowing on the network, you want to employ caching for maybe things that
aren&amp;rsquo;t going to change so more static assets. Maybe you might want to change the Pokemon that&amp;rsquo;s in a gym, but the location of that gym is something that should and can be cached. He&amp;rsquo;s right now talking about caching on the server side, on
the application side, and not on the mobile phone. But I wonder if they&amp;rsquo;re going to talk about that later as well.&lt;/p&gt;
&lt;p&gt;JAMES: It&amp;rsquo;s all cached and served through Google Cloud CDN. So when the Poke&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: So he also mentions using a CDN, so a Content Delivery Network, which is really good because that means that if I&amp;rsquo;m in the Netherlands and I make a request to their servers, my request isn&amp;rsquo;t then going to be sent to a server in the US, because it&amp;rsquo;s going to be sent to one of the servers in my country or nearby. That means that the latency between my request being sent, and that request getting to the server, and retrieving that resource and back, is going to be a lot lower. So it&amp;rsquo;s &amp;hellip; This is a way to improve performance.&lt;/p&gt;
&lt;p&gt;JAMES: The player catches the Pokemon, the GCLB sends the request to our GKE cluster. And we have a front-end service that sits behind Nginx reverse proxy. The request goes from the user&amp;rsquo;s phone through the reverse proxy, to one of these player, front-end services. We also have this thing called a Spatial Query Backend. It&amp;rsquo;s a cache by location.&lt;/p&gt;
&lt;p&gt;So that is where we store the information that determines where a Pokemon is shown on the map, what gyms and Poke stops are around you, what time zone you&amp;rsquo;re in, or any other feature that is location-based.&lt;/p&gt;
&lt;p&gt;PRIYANKA: Now, what happens when I hunt a Pokemon down and catch it?&lt;/p&gt;
&lt;p&gt;JAMES: When you catch a Pokemon, it sends the request to the front end, to the Spanner database, where your player entity is stored and it store it there. For catching Pokemon, that actually doesn&amp;rsquo;t go to the Spatial Query Backend. If you were, instead, if you were battling in a gym or adding lures to the Poke stop, that information is stored on the Spatial Query Backend, and&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Okay. So it sounds like the Spatial Query Backend is only storing data about the world, the Pokemon Go world that everybody can see. So people don&amp;rsquo;t need to know whether another person has caught a particular Pokemon. They just need to know whether there&amp;rsquo;s a lure on a Poke stop, or whether the gym is Team Mystic and things like that that everybody else can see. So there&amp;rsquo;s this segmentation of some data that is specific to the user, and other data that all users need to see.&lt;/p&gt;
&lt;p&gt;JAMES: We also use Pub/Sub to send the message to a Pub/Sub topic, which is then used for analytics pipeline.&lt;/p&gt;
&lt;p&gt;NICOLE: He talks about a Pub/Sub model, which means that their architecture is event driven. So the traditional way that this is handled is by polling. So normally when an service is waiting for something to happen, it goes, and it sends a message and it checks. Basically like, &amp;ldquo;Hey, are we there yet? Are we there yet? Are we there yet?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;And then when it finally gets a response that &amp;ldquo;Yes, we are,&amp;rdquo; then it can do something with that data. Instead what they&amp;rsquo;re doing as a Pub/Sub. So instead it waits for events. There is no constant polling, again, reducing the amount of traffic that&amp;rsquo;s going back and forth. And it just specifies criteria for what it is actually waiting for. And when that happens, after the services that require that event are subscribed, then that event is published to all of them. And then they can then do whatever they want with that event.&lt;/p&gt;
&lt;p&gt;PRIYANKA: So, how do you ensure that when two people who are in the same geographic regions, see the same Pokemon data, and keep that relatively in sync, especially during the events?&lt;/p&gt;
&lt;p&gt;JAMES: So it&amp;rsquo;s actually pretty interesting. Everything in our servers are deterministic. So even if players are on different machines, they&amp;rsquo;re sensitive to
different front-end services, if they&amp;rsquo;re in the same physical location, all the inputs would be the same and the same Pokemon would get returned to both users. There&amp;rsquo;s a lot of caching involved and as well as precise timing, especially when the settings are changed and they need to be in sync across all the servers.&lt;/p&gt;
&lt;p&gt;So it&amp;rsquo;s very tricky, but it was very important for us that all the players feel like they&amp;rsquo;re part of this one shared world.&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m not entirely sure what he means when he says that it&amp;rsquo;s deterministic.I&amp;rsquo;m going to guess, and I have no relationship with Google or with Niantic, but I&amp;rsquo;m thinking that what he means is that when you&amp;rsquo;re catching a Pokemon, there is no request that&amp;rsquo;s being sent to the servers to say, &amp;ldquo;Hey, did I catch this?&amp;rdquo; Instead, there&amp;rsquo;s probably some sort of algorithm. This Psyduck is caught 80% of the time and appears 2% of the time. So 2% of the Pokemons that you&amp;rsquo;re gonna see appear in this area, are going to be Psyducks. And that&amp;rsquo;s also reducing the load going back and forth, right? Because it&amp;rsquo;s just the equation or the algorithm that determines whether you catch a Pokemon or not.&lt;/p&gt;
&lt;p&gt;JAMES: This game data is of interest to our data science team. They use this for marketing purposes, for verifications. For example, we might want to say that this player, or players caught x millions amount of Pokemon during our Saturday Community Day events. So, it&amp;rsquo;s important that we have that information in an easily accessible manner.&lt;/p&gt;
&lt;p&gt;NICOLE: So there&amp;rsquo;s a lot of data here that they track. So I&amp;rsquo;ve got my distance walked, Pokemon caught, I&amp;rsquo;m at 18,878. Poke stops visited, total XP, start date. And then there are these medals as well. So, they look at things like, how far have you walked in total? So all of these things are data points that they store for every single user. No wonder they have such a focus on databases, right?&lt;/p&gt;
&lt;p&gt;PRIYANKA: As the events grow, like you mentioned, in some of these events, the traffic grows to millions of users per second. You also said&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Per second!&lt;/p&gt;
&lt;p&gt;PRIYANKA: &amp;hellip;of data is generated. How does the system scale when it comes to data pipeline?&lt;/p&gt;
&lt;p&gt;JAMES: Yeah. So when there&amp;rsquo;s increase of transactions, there is increase of load
throughout the system with a lot of our data pipelines for things like BigQuery, one of that&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: I&amp;rsquo;m not actually sure she was saying millions of users per second, but that&amp;rsquo;s a little bit ambiguous. Maybe she meant millions of requests per second. And the way that they&amp;rsquo;re trying to do that is they&amp;rsquo;re reducing the size of those requests. If she means there are millions of concurrent users at any given time, that doesn&amp;rsquo;t necessarily mean that those users are all doing something at the exact same time. So I would have wanted to see exactly how many requests, to hear
how many requests per second they&amp;rsquo;re needing to deal with, or how many bytes per second are being sent over the wire. That would&amp;rsquo;ve been cool.&lt;/p&gt;
&lt;p&gt;JAMES: &amp;hellip;Just works. Google Cloud will handle the increase in traffic without any intervention.&lt;/p&gt;
&lt;p&gt;PRIYANKA: With that much traffic, obviously health of the system is critical as well. How do you monitor the health of the system during these massive events?&lt;/p&gt;
&lt;p&gt;JAMES: So we use multiple monitoring systems, including Prometheus, Grafana, and Google Cloud monitoring. On a personal level, I actually prefer it to Google Cloud monitoring because it&amp;rsquo;s very simple to use&amp;ndash;&lt;/p&gt;
&lt;p&gt;NICOLE: Whoo whoo! And they&amp;rsquo;re using Prometheus and Grafana &amp;hellip; Oh, this is entirely unexpected, but I&amp;rsquo;m actually wearing a Grafana shirt. So it&amp;rsquo;s really cool that they&amp;rsquo;re using Prometheus and it really, it makes sense, because they&amp;rsquo;re on a Kubernetes cluster and Prometheus and Kubernetes just go really well together. By the way, I work for Grafana, for context.&lt;/p&gt;
&lt;p&gt;PRIYANKA: What are some of the expansions and improvements you&amp;rsquo;re looking to do in the future?&lt;/p&gt;
&lt;p&gt;JAMES: On the Google Cloud side of things, we are looking into things such as Agones and Google Game servers, and using that to see how we can make our game even better.&lt;/p&gt;
&lt;p&gt;PRIYANKA: We wish you and the Niantic team best of luck for these enhancements. And this has obviously been super insightful for us, James. Thanks for joining me today and sharing your architecture with us.&lt;/p&gt;
&lt;p&gt;JAMES: Yeah, thanks for having me. This was fun.&lt;/p&gt;
&lt;p&gt;NICOLE: That was really good. So there were a few things that were mentioned there for how they&amp;rsquo;re scaling Pokemon Go, that I wrote down here.&lt;/p&gt;
&lt;p&gt;One, they use an event driven architecture and also a microservices based architecture, both of which are way more performant than the traditional methods.And the microservices based architecture will also let them scale up independently as demand increases as well. And they&amp;rsquo;re also using Cloud Spanner instead of Google Data Store, prioritizing global consistency, as well as high availability.&lt;/p&gt;
&lt;p&gt;They front-load a lot of the static assets that are used by the application. And they&amp;rsquo;re being downloaded when the app is initially downloaded or installed onto users&amp;rsquo; mobile phones. That way they don&amp;rsquo;t have to keep serving the same data if it&amp;rsquo;s going to be used consistently. And when something changes, like a different lot of Pokemon, they release these patches that let you download a lot of those images so that when you catch those Pokemons, then you already have all that information on your phone. And on a related note, they&amp;rsquo;re employing a lot of caching. They talked about caching on the mobile app side, and on their server side.&lt;/p&gt;
&lt;p&gt;Events are also staggered. So splintered realms sort of, because they&amp;rsquo;re happening
on different time zones, depending on where you live. And not completely simultaneously, regardless of the time in the part of the world where you&amp;rsquo;re from.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re also using things like Prometheus, Grafana and Google Cloud Monitoring. They didn&amp;rsquo;t mention how they&amp;rsquo;re actually using multi-tenant versions of Prometheus like, maybe, I don&amp;rsquo;t know if they&amp;rsquo;re using Cortex or something like that, but that&amp;rsquo;s something that they should look into.&lt;/p&gt;
&lt;p&gt;And they also mentioned potentially increasing the number of Google Game Servers.&lt;/p&gt;
&lt;p&gt;I really appreciated that behind the scenes look. I wish more companies would do this, especially for apps that I personally love and use. One thing that I&amp;rsquo;m really curious about though, is the testing side of it. Because testing an application of this scale and complexity, is another thing entirely from observability. And I would have wanted to know how they&amp;rsquo;re doing their performance and load testing. And whether they&amp;rsquo;re doing things like chaos engineering maybe, or reliability testing to improve the availability and reliability of their application.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re still watching this, then chances are high that you like Pokemon and load testing as much as I do, which is a bit of an odd combination. And in that case, check out this video, on how I run chaos experiments using k6, Prometheus and Grafana. Thank you for joining me as I watched this awesome video.&lt;/p&gt;
&lt;p&gt;And as they say in the Netherlands, (Dutch) Until next time! Bye!&lt;/p&gt;</description></item><item><title>What's new with k6 Cloud, with front-end lead Simon Legander (k6 Office Hours #36)</title><link>https://nicolevanderhoeven.com/blog/20211203-koh36-whats-new-with-k6-cloud/</link><pubDate>Fri, 03 Dec 2021 17:09:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211203-koh36-whats-new-with-k6-cloud/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oyl9HNMC-ug?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In this week&amp;rsquo;s k6 Office Hours, I was joined by my colleagues &lt;a href="https://twitter.com/markjmeier"&gt;Mark Meier&lt;/a&gt; and Simon Legander, front-end lead at k6, to talk about the new features that have come to k6 Cloud this year so far. Simon also gives us a sneak peek of all the cool features coming on the horizon&amp;hellip;&lt;/p&gt;</description></item><item><title>Creating a Content Calendar in Obsidian</title><link>https://nicolevanderhoeven.com/blog/20211125-creating-a-content-calendar-in-obsidian/</link><pubDate>Thu, 25 Nov 2021 17:01:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211125-creating-a-content-calendar-in-obsidian/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/iU60ItemuDo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Despite the fact that I&amp;rsquo;ve long given up using &lt;a href="https://notion.so"&gt;Notion&lt;/a&gt; as my main note-taking tool, I&amp;rsquo;ve still continued to use it as a content calendar. &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; just hadn&amp;rsquo;t caught up with it in terms of functionality&amp;hellip; until now.&lt;/p&gt;
&lt;p&gt;In this video, I show my current Obsidian workflow for creating and maintaining a content calendar.&lt;/p&gt;</description></item><item><title>Performance Objective: Intro to Load Testing With k6 and Grafana</title><link>https://nicolevanderhoeven.com/blog/20211123-intro-to-load-testing-with-k6-and-grafana/</link><pubDate>Tue, 23 Nov 2021 17:05:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211123-intro-to-load-testing-with-k6-and-grafana/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fjq-JmrLjPc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I spoke at the Performance Objective meetup to talk about how to use k6 and Grafana for beginners. I always enjoy talking to like-minded engineers, and I think sharing ideas in a meetup context is probably the best way to do it.&lt;/p&gt;</description></item><item><title>Everyone Can Contribute: Load Performance Testing With k6</title><link>https://nicolevanderhoeven.com/blog/20211123-load-performance-testing-with-k6/</link><pubDate>Tue, 23 Nov 2021 16:57:26 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211123-load-performance-testing-with-k6/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_ty40gSaaw8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;This is a recording of a live meetup I spoke at, the Everybody Can Contribute Café hosted by Michael Friedrich, Senior Developer Evangelist at GitLab. This was a more casual conversation and show-and-tell about k6&amp;rsquo;s capabilities, and I really enjoyed it!&lt;/p&gt;</description></item><item><title>How I Use Obsidian for Work as a Software Developer Advocate</title><link>https://nicolevanderhoeven.com/blog/20211117-how-i-use-obsidian-for-work-as-a-software-developer-advocate/</link><pubDate>Wed, 17 Nov 2021 16:48:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20211117-how-i-use-obsidian-for-work-as-a-software-developer-advocate/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D7e1ud_Dk24?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve previously written about &lt;a href="https://nicolevanderhoeven.com/blog/20210518-how-i-use-obsidian-at-work/"&gt;how I use Obsidian at work&lt;/a&gt;, but this video shows exactly how I do it, and all the plugins I use to make Obsidian as useful at work as it is for play.&lt;/p&gt;</description></item><item><title>How I use Obsidian to run and play D&amp;D online</title><link>https://nicolevanderhoeven.com/blog/20211113-how-i-use-obsidian-to-run-and-play-dnd-online/</link><pubDate>Sat, 13 Nov 2021 00:38:11 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211113-how-i-use-obsidian-to-run-and-play-dnd-online/</guid><description>&lt;p&gt;I&amp;rsquo;ve previously talked about how &lt;a href="https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/"&gt;non-lazy DMs use Obsidian for D&amp;amp;D&lt;/a&gt;, and a few weeks ago, I participated in a &lt;a href="https://nicolevanderhoeven.com/blog/20211009-ttrpg-obsidian-showcase"&gt;TTRPG Obsidian Showcase&lt;/a&gt; with a few other Obsidian DMs and players. Here&amp;rsquo;s my part of that presentation:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3pt6_srUZ7U?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;This talk was part of the TTRPG Obsidian Showcase (video): &lt;a href="https://www.youtube.com/watch?v=Ovqu_1aW3Sw"&gt;https://www.youtube.com/watch?v=Ovqu_1aW3Sw&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Non-lazy DMs use Obsidian for D&amp;amp;D (blog post): &lt;a href="https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/"&gt;https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How I Use Obsidian for D&amp;amp;D - Player&amp;rsquo;s Edition (blog post): &lt;a href="https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/"&gt;https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dice Roller: &lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;https://github.com/valentine195/obsidian-dice-roller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Initiative Tracker: &lt;a href="https://github.com/valentine195/obsidian-initiative-tracker"&gt;https://github.com/valentine195/obsidian-initiative-tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Fantasy Calendar: &lt;a href="https://github.com/valentine195/obsidian-fantasy-calendar"&gt;https://github.com/valentine195/obsidian-fantasy-calendar&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Gallery: &lt;a href="https://github.com/Darakah/obsidian-gallery"&gt;https://github.com/Darakah/obsidian-gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Dataview: &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;https://github.com/blacksmithgu/obsidian-dataview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Leaflet: &lt;a href="https://github.com/valentine195/obsidian-leaflet-plugin"&gt;https://github.com/valentine195/obsidian-leaflet-plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Admonition: &lt;a href="https://github.com/valentine195/obsidian-admonition"&gt;https://github.com/valentine195/obsidian-admonition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Advanced Tables: &lt;a href="https://github.com/tgrosinger/advanced-tables-obsidian"&gt;https://github.com/tgrosinger/advanced-tables-obsidian&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;5e statblocks: &lt;a href="https://github.com/valentine195/obsidian-5e-statblocks"&gt;https://github.com/valentine195/obsidian-5e-statblocks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;How I use Obsidian for work as a software developer advocate (video): &lt;a href="https://youtube.com/watch?v=D7e1ud_Dk24"&gt;https://youtube.com/watch?v=D7e1ud_Dk24&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Browser testing and API load testing in the same script with k6 (k6 Office Hours #35)</title><link>https://nicolevanderhoeven.com/blog/20211112-koh35-browser-testing-and-api-load-testing-with-k6/</link><pubDate>Fri, 12 Nov 2021 00:28:02 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211112-koh35-browser-testing-and-api-load-testing-with-k6/</guid><description>&lt;p&gt;Earlier this week, at &lt;a href="https://grafana.com/go/observabilitycon/2021/k6-load-testing/"&gt;ObservabilityCON 2021&lt;/a&gt;, we announced something new: k6 now supports browser-based testing with xk6-browser. Here&amp;rsquo;s a few of us from the k6 team talking about the announcement!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Y4qDAaJgxV0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://grafana.com/go/observabilitycon/2021/k6-load-testing/"&gt;Catch the announcement here&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/blog/extending-k6-with-xk6/"&gt;Learn more about the xk6 extension system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/xk6-browser"&gt;Try the xk6-browser extension&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>k6 load testing on Kubernetes using the k6 Operator, with Hans Knecht (k6 Office Hours #34)</title><link>https://nicolevanderhoeven.com/blog/20211105-koh34-k6-load-testing-on-kubernetes-using-k6-operator/</link><pubDate>Fri, 05 Nov 2021 00:23:15 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211105-koh34-k6-load-testing-on-kubernetes-using-k6-operator/</guid><description>&lt;p&gt;I was really excited to have Hans Knecht on this week&amp;rsquo;s Office Hours. Hans works at Mission Lane, and is one of the biggest contributors to a k6 extension called k6 operator. k6 Operator lets you create a k6 custom resource object in Kubernetes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/IJ0uQgn7gI8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/grafana/k6-operator"&gt;k6 operator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/blog/running-distributed-tests-on-k8s/"&gt;Running distributed k6 tests on Kubernetes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=KPyI8rM3LvE"&gt;Previous k6 Office Hours on the Operator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Work week in the life of a Developer Advocate</title><link>https://nicolevanderhoeven.com/blog/20211103-work-week-in-the-life-of-a-developer-advocate/</link><pubDate>Wed, 03 Nov 2021 00:31:46 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211103-work-week-in-the-life-of-a-developer-advocate/</guid><description>&lt;p&gt;Before I became a Developer Advocate, I didn&amp;rsquo;t really know what developer advocates did - so here&amp;rsquo;s my attempt at explaining what it is I do for a living!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/71q0JmEli0k?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="weekly-breakdown"&gt;Weekly breakdown&lt;/h2&gt;
&lt;p&gt;Here&amp;rsquo;s a list of my activities during this week:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Friday
&lt;ul&gt;
&lt;li&gt;Filmed new ending for video #1&lt;/li&gt;
&lt;li&gt;Figured out integration options&lt;/li&gt;
&lt;li&gt;Did k6 Office Hours&lt;/li&gt;
&lt;li&gt;Prepared for Clubhouse talk&lt;/li&gt;
&lt;li&gt;Participated in customer demo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Saturday
&lt;ul&gt;
&lt;li&gt;Did post-production for k6 Office Hours&lt;/li&gt;
&lt;li&gt;Talked at a Clubhouse meetup&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Sunday
&lt;ul&gt;
&lt;li&gt;Wrote (team profile) blog post #1&lt;/li&gt;
&lt;li&gt;Wrote talking points for Racket&lt;/li&gt;
&lt;li&gt;Started writing blog post #2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Monday
&lt;ul&gt;
&lt;li&gt;Edited video #1&lt;/li&gt;
&lt;li&gt;Created thumbnail, description&lt;/li&gt;
&lt;li&gt;Scheduled video #1&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tuesday
&lt;ul&gt;
&lt;li&gt;Created slides for presentation&lt;/li&gt;
&lt;li&gt;Played with Prometheus and Grafana for webinar&lt;/li&gt;
&lt;li&gt;Had a virtual coffee with colleagues&lt;/li&gt;
&lt;li&gt;Finished writing blog post #2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Wednesday
&lt;ul&gt;
&lt;li&gt;Went to four meetings&lt;/li&gt;
&lt;li&gt;Caught up on emails, Slack, and social media (last night)&lt;/li&gt;
&lt;li&gt;Wrote blog post #3&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thursday
&lt;ul&gt;
&lt;li&gt;Scripted and filmed videos #2 and #3&lt;/li&gt;
&lt;li&gt;Started editing video #2&lt;/li&gt;
&lt;li&gt;Talked to a potential guest on livestream&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Common performance testing problems and fears (k6 Office Hours #33)</title><link>https://nicolevanderhoeven.com/blog/20211029-koh33-common-performance-testing-fears-and-issues/</link><pubDate>Fri, 29 Oct 2021 00:20:27 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211029-koh33-common-performance-testing-fears-and-issues/</guid><description>&lt;p&gt;For this week&amp;rsquo;s k6 Office Hours, we attempted to steer into Halloween by talking about some of the most common performance testing issues we&amp;rsquo;ve faced in our careers as performance testing consultants. For this one, I had Tom Miseur join me to commiserate and swap stories.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jVa3noSOyg8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Site Reliability Engineering and performance testing with Stephen Townshend (k6 Office Hours #32)</title><link>https://nicolevanderhoeven.com/blog/20211022-koh32-sre-and-performance-testing/</link><pubDate>Tue, 19 Oct 2021 00:09:50 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211022-koh32-sre-and-performance-testing/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, I wanted to talk about the intersection of Site Reliability Engineering and performance testing, so I decided to invite two people with different backgrounds from me to discuss it. Stephen Townshend is a performance engineer who recently changed jobs to become an SRE, and Daniel González Lopes is an SRE who had not had experience in performance testing before he joined k6. It turned out to be a great talk!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2U6nP8ajx1Q?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://open.spotify.com/show/7wOCHzZBCzOi071QuDPodI"&gt;Stephen&amp;rsquo;s Performance Time podcast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.katacoda.com/"&gt;Katacoda&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pluralsight.com/"&gt;Pluralsight&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://12factor.net/"&gt;The Twelve-Factor App&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fs.blog/2021/05/slack/"&gt;The blog post that Stephen mentioned, about slack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>How to install and use the k6 Cloud Grafana data source plugin</title><link>https://nicolevanderhoeven.com/blog/20211019-how-to-install-and-use-k6-cloud-grafana-datasource-plugin/</link><pubDate>Tue, 19 Oct 2021 00:02:05 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211019-how-to-install-and-use-k6-cloud-grafana-datasource-plugin/</guid><description>&lt;p&gt;In this video, I talk about the k6 Cloud Grafana data source plugin, which lets you use k6 Cloud as a data source for your Grafana visualizations.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q2oihIg9Zjg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/grafana-plugin/"&gt;Installing and using the k6 Cloud Grafana data source plugin&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://grafana.com/plugins/grafana-k6cloud-datasource/?tab=installation"&gt;Installing the plugin for Grafana Cloud&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://k6.io/docs/cloud/integrations/token"&gt;Get your k6 Cloud API token on this page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/grafana/helm-charts/blob/main/charts/grafana/values.yaml"&gt;Grafana Helm Charts repository&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Load testing with k6 for beginners, with İnanç Gümüş and Viktor Mihajlović (k6 Office Hours #31)</title><link>https://nicolevanderhoeven.com/blog/20211015-koh31-load-testing-with-k6-for-beginners/</link><pubDate>Fri, 15 Oct 2021 01:52:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211015-koh31-load-testing-with-k6-for-beginners/</guid><description>&lt;p&gt;Did you know that every new person to k6 does a Week of Testing? It&amp;rsquo;s a k6 tradition for new hires to spend their first week seeing firsthand what the experience of a new user of k6 is like. How quickly do they find the documentation? What issues do they get stuck on? Then, at the end of the week, the new employees do a presentation for the rest of the team to show their first impressions and findings.&lt;/p&gt;
&lt;p&gt;In today&amp;rsquo;s Office Hours, &lt;a href="https://twitter.com/inancgumus"&gt;İnanç Gümüş&lt;/a&gt;, one of the newest k6 team members, shares his presentation and his experience as a k6 beginner. Another colleague, Viktor Mihajlović, a Technical Customer Success Engineer, also shares some of the most commonly asked questions he&amp;rsquo;s heard on the job.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MeN3H1Ml8OU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Conf42 podcast: in the k6 Universe</title><link>https://nicolevanderhoeven.com/blog/20211014-conf42-in-the-k6-universe/</link><pubDate>Thu, 14 Oct 2021 01:27:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211014-conf42-in-the-k6-universe/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/mikopawlikowski"&gt;Miko Pawlikowski&lt;/a&gt; interviewed &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt; and I for the &lt;a href="https://www.conf42.com/podcast"&gt;Conf42 podcast&lt;/a&gt;, and we talked about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why I love to learn human languages, and what Esperanto sounds like&lt;/li&gt;
&lt;li&gt;the Grafana acquisition of k6&lt;/li&gt;
&lt;li&gt;what performance testing is, anyway&lt;/li&gt;
&lt;li&gt;whether everyone needs to do performance testing, and my personal setup for this blog&lt;/li&gt;
&lt;li&gt;chaos engineering and Schrödinger&amp;rsquo;s Pokémon&lt;/li&gt;
&lt;li&gt;an overview of the Grafana Labs projects landscape&lt;/li&gt;
&lt;li&gt;what k6 is, and how we would get started for free (k6 OSS)&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3Ja3RVi53YM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to make load testing scripts realistic</title><link>https://nicolevanderhoeven.com/blog/20211014-realistic-load-testing/</link><pubDate>Wed, 13 Oct 2021 15:17:45 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211014-realistic-load-testing/</guid><description>&lt;p&gt;A good load testing script exercises the functions and components as specified in the requirements gathering phase while simulating real users as closely as possible. Here are a few ways to make scripts more realistic.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Xz6drbGuUdI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Timestamps so you can skip around!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI"&gt;0:00&lt;/a&gt; Intro&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=82s"&gt;1:22&lt;/a&gt; Static resources&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=151s"&gt;2:31&lt;/a&gt; Cache and cookies&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=182s"&gt;3:02&lt;/a&gt; Dynamic think time&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=307s"&gt;5:07&lt;/a&gt; Concurrent requests&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=345s"&gt;5:45&lt;/a&gt; Load profile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=379s"&gt;6:19&lt;/a&gt; Test data&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=421s"&gt;7:01&lt;/a&gt; Different user paths&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=Xz6drbGuUdI&amp;amp;t=475s"&gt;7:55&lt;/a&gt; Other forms of testing&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Basics of load testing with k6 and Grafana in 20 minutes</title><link>https://nicolevanderhoeven.com/blog/20211012-basics-of-load-testing-with-k6-and-grafana/</link><pubDate>Tue, 12 Oct 2021 01:04:02 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211012-basics-of-load-testing-with-k6-and-grafana/</guid><description>&lt;p&gt;This was a video I pre-recorded in preparation for &lt;a href="https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/"&gt;the first Grafana EMEA virtual meetup&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gvounvDSDGg?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;In mid-June (just three months ago), k6 joined the Grafana Labs family. Many people didn&amp;rsquo;t quite understand what the connection was between k6 and Grafana, but I thought it made a lot of sense.&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s Site Reliability Engineering book talks about 4 golden signals that we should measure in a system: latency, traffic, errors, and saturation. Load testing provides 3 of those (latency, traffic, and errors), but it doesn&amp;rsquo;t show saturation, and it doesn&amp;rsquo;t give us visibility into the system.&lt;/p&gt;
&lt;p&gt;Grafana brings observability. k6 brings data. They work really well together, which is why we&amp;rsquo;ve been using each other&amp;rsquo;s products for a few years now, before there was ever any talk of an acquisition.&lt;/p&gt;
&lt;p&gt;In this video, I talk about why k6 and Grafana are better together and also demonstrate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;how to run a simple script in k6 OSS&lt;/li&gt;
&lt;li&gt;how to make sense of the results of a load test&lt;/li&gt;
&lt;li&gt;test execution options: running locally, sending results to k6 Cloud, and running a test from k6 Cloud&amp;ndash; all triggered using the CLI&lt;/li&gt;
&lt;li&gt;two different integration options to bring k6 and Grafana together: the k6 Cloud Grafana data source plugin and Prometheus Remote Write&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>TTRPG Obsidian Showcase</title><link>https://nicolevanderhoeven.com/blog/20211009-ttrpg-obsidian-showcase/</link><pubDate>Sat, 09 Oct 2021 00:43:25 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20211009-ttrpg-obsidian-showcase/</guid><description>&lt;p&gt;Here&amp;rsquo;s a presentation I participated in about a bunch of nerds who like both &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; and D&amp;amp;D. My part begins around &lt;a href="https://www.youtube.com/watch?v=Ovqu_1aW3Sw&amp;amp;t=2720"&gt;0:45:20&lt;/a&gt;, but I thought the other speakers&amp;rsquo; parts were really fascinating as well!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Ovqu_1aW3Sw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>SLOs in performance testing, with Leandro Melendez aka Señor Performo (k6 Office Hours #30)</title><link>https://nicolevanderhoeven.com/blog/20211008-koh30-slos-in-performance-with-leandro-melendez/</link><pubDate>Fri, 08 Oct 2021 22:05:22 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211008-koh30-slos-in-performance-with-leandro-melendez/</guid><description>&lt;p&gt;In this Office Hours, I invited my colleague Tom Miseur and friend Leandro Melendez, aka Señor Performo, to talk all about different criteria in performance testing, including non-functional requirements, SLAs, SLOs, SLIs, thresholds, and checks. Criteria at different levels is how we determine whether testing, including performance testing, has been successful, so it&amp;rsquo;s important to understand what they are and incorporate them into testing scripts and processes.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GyueCZi5qBI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing in Public: How to plan a load test (practical example) - Wyrmwood Gaming</title><link>https://nicolevanderhoeven.com/blog/20211006-testing-in-public-planning-a-load-test/</link><pubDate>Wed, 06 Oct 2021 11:21:41 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211006-testing-in-public-planning-a-load-test/</guid><description>&lt;p&gt;When you&amp;rsquo;re learning a new skill, there&amp;rsquo;s only so much that studying can do. The problem is that there&amp;rsquo;s still a big gulf between studying something and doing it yourself. The solution is having a mentor to bridge the gap&amp;ndash; someone who will let you shadow them while they&amp;rsquo;re executing tests.&lt;/p&gt;
&lt;p&gt;I made this video thinking about the me from over a decade ago who would have wanted to get the chance to look over a more experienced tester&amp;rsquo;s shoulder. In this video, I talk about how considerations for planning load testing, using a hypothetical use case for a real company: &lt;a href="https://wyrmwoodgaming.com"&gt;Wyrmwood Gaming&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EFqBWqo3IzY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing With k6 + Grafana: Better Together (Grafana virtual meetup EMEA)</title><link>https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/</link><pubDate>Tue, 05 Oct 2021 21:49:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211005-testing-with-k6-and-grafana-better-together/</guid><description>&lt;p&gt;In this first EMEA session of the Grafana Labs virtual meetups, I talked about how to use k6 and Grafana together to get the full performance picture for a software application. Observability, using tools like Prometheus and Grafana, lets us see what&amp;rsquo;s going on inside the application, and load testing, using k6, helps us get those insights earlier on in software cycles, such as during pre-production.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MUd5xuuxt0A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to use k6 Cloud - a k6 load testing tutorial with Bill Rainaud (k6 Office Hours #29)</title><link>https://nicolevanderhoeven.com/blog/20211001-koh29-bill/</link><pubDate>Fri, 01 Oct 2021 13:58:03 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20211001-koh29-bill/</guid><description>&lt;p&gt;Bill Rainaud is an inside account executive at k6, which means he talks to users and potential users of k6 every day. In this Office Hours, he explains how to get started with load testing using k6 Cloud, which is a SaaS platform for running and scaling up load tests on the cloud. We also answered a few frequently asked questions about k6&amp;rsquo;s capabilities and how to do correlation in k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eCv1XshEpDI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Non-Lazy DMs use Obsidian for D&amp;D</title><link>https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/</link><pubDate>Thu, 30 Sep 2021 16:29:54 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210930-non-lazy-dms-use-obsidian-for-dnd/</guid><description>
&lt;meta property="og:image" content="/assets/non-lazy-dms.PNG" /&gt;
&lt;meta property="og:image:width" content="1200" /&gt;
&lt;meta property="og:image:height" content="630" /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/non-lazy-dms.PNG" alt="Graph view in Obsidian of my three D&amp;amp;D campaigns" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Last month, I wrote about how I use &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; for &lt;a href="https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/"&gt;D&amp;amp;D as a player&lt;/a&gt; in a 4e campaign (I play a half-elf hybrid wizard/cleric). This is about my second weekly game, in which I am the Dungeon Master for a 5e campaign. I&amp;rsquo;m a relatively new DM (I&amp;rsquo;ve got &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;39 games&lt;/a&gt; under my belt at the time this writing, and Obsidian is at the center of my workflow for improving my DMing skills, getting inspiration, preparing for a game, running the game, and making sure my players are having fun.&lt;/p&gt;
&lt;p&gt;In many ways, my setup is the Non-Lazy DM&amp;rsquo;s approach to preparing for D&amp;amp;D games: high-effort, high-touch, and high-return. But I only do it because I enjoy it!&lt;/p&gt;
&lt;h2 id="plugins-i-use"&gt;Plugins I use&lt;/h2&gt;
&lt;p&gt;This is going to be a long article, so if you&amp;rsquo;re just after the plugins I use, here they are up front!&lt;/p&gt;
&lt;p&gt;I go into detail for some, but not all of these, in the article below.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Jeremy Valentine&amp;rsquo;s stuff
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-5e-statblocks"&gt;5e statblocks plugin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-initiative-tracker"&gt;Initiative tracker&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Obsidian Dice Roller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-admonition"&gt;Obsidian Admonition&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/valentine195/obsidian-leaflet-plugin"&gt;Obsidian Leaflet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/tgrosinger/advanced-tables-obsidian"&gt;Advanced Tables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Darakah/obsidian-gallery"&gt;Gallery&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/vslinko/obsidian-outliner"&gt;Outliner&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Darakah/obsidian-timelines"&gt;Obsidian Timelines&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Additionally, feel free to skip around to different sections by clicking on the hamburger menu on the upper right-hand corner and selecting the session that interests you.&lt;/p&gt;
&lt;h2 id="outside-the-game"&gt;Outside the game&lt;/h2&gt;
&lt;p&gt;Although I use Obsidian &lt;em&gt;while&lt;/em&gt; playing D&amp;amp;D, I use it most for D&amp;amp;D between games: fleshing out the world, getting inspiration for new adventures, or preparing for specific sessions.&lt;/p&gt;
&lt;h3 id="world-building"&gt;World-building&lt;/h3&gt;
&lt;p&gt;Many DMs run published campaigns, but I&amp;rsquo;m not one of them. I don&amp;rsquo;t think there&amp;rsquo;s anything wrong with running published campaigns; I just personally enjoy world-building and being able to tailor the environment to what I know my specific players will like. However, I still do read campaign books, for D&amp;amp;D as well as for other systems, for inspiration. I am also a voracious fantasy reader, and consider everything fair game for &amp;ldquo;stealing&amp;rdquo; for my games.&lt;/p&gt;
&lt;p&gt;One thing I&amp;rsquo;ve begun experimenting with is processing my fiction reads the way I do my nonfiction reads. What better place to look for inspiration about creating a fantasy world than other fantasy worlds? How could I use a &lt;em&gt;Bene Gesserit&lt;/em&gt;-like faction in my campaign?&lt;/p&gt;
&lt;p&gt;I recently reread the first &lt;em&gt;Dune&lt;/em&gt; book in preparation for the movie coming out later this year, but while I was reading it, I remembered how much I love the world it&amp;rsquo;s set in. I read books on Kindle, either on my actual physical Kindle ereader or on the Kindle app on my mobile, and I took highlights while I was reading &lt;em&gt;Dune&lt;/em&gt;. You can see my full highlights &lt;a href="https://notes.nicolevanderhoeven.com/Readwise/Books/Dune"&gt;here&lt;/a&gt;, synced &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;via Readwise&lt;/a&gt;. I highlight turns of phrases I like, character descriptions that sounded cool, or passages that are particularly revealing of the type of world the story of Dune is set in. Below is an example of a quote I highlighted:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Schools were started to train human talents.” “Bene Gesserit schools?” She nodded. “We have two chief survivors of those ancient schools: the Bene Gesserit and the Spacing Guild. The Guild, so we think, emphasizes almost pure mathematics. Bene Gesserit performs another function.” “Politics,” he said. (&lt;a href="https://readwise.io/to_kindle?action=open&amp;amp;asin=B001F0WXY0&amp;amp;location=248"&gt;Location 248&lt;/a&gt;)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It really resonated with me as a good characterization of two important factions in the Dune universe.&lt;/p&gt;
&lt;p&gt;Then, just as I do with nonfiction books, I create a separate note about the book itself, attempting to summarize the parts of it that might be interesting or useful to me in the future. Below is a screenshot of my page on the first book of Dune. I identify &amp;ldquo;Key truths&amp;rdquo; about the world, because I also like to use that terminology when creating secrets or themes for a fantasy world or city I&amp;rsquo;ve created.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dune-processed.png" alt="My notes on the book Dune" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Book/Dune"&gt;Here are my full notes on Dune&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Then, I also think about tropes or patterns of character, plot, or setting present in the book. I&amp;rsquo;ve started collecting these in a a page called &lt;a href="https://notes.nicolevanderhoeven.com/Forms"&gt;Forms&lt;/a&gt; in my vault. I think it&amp;rsquo;s useful to spot things that occur again and again in fantasy fiction, whether they&amp;rsquo;re overused or not. If they&amp;rsquo;re tropes that I&amp;rsquo;d rather not repeat, having a &amp;ldquo;formula&amp;rdquo; of the trope helps me either avoid it or consciously subvert it in my games. Sometimes, I just take a form wholesale and incorporate it as is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notes.nicolevanderhoeven.com/Form/Nuns+who+think+and+fight"&gt;Here&amp;rsquo;s an example of a page&lt;/a&gt; I created that was inspired by the Bene Gesserit&amp;ndash; a short note about &amp;ldquo;Nuns who think and fight&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t been doing it for very long, but it&amp;rsquo;s already come in useful when thinking of major events and players in my world.&lt;/p&gt;
&lt;h3 id="adventure-creation"&gt;Adventure creation&lt;/h3&gt;
&lt;p&gt;Adventures are smaller-scale and higher-resolution than campaigns or worlds, so I often need more specific notes than forms.&lt;/p&gt;
&lt;p&gt;I read and highlight adventure blog posts and articles using &lt;a href="https://blog.readwise.io/readwise-reading-app/"&gt;Readwise&amp;rsquo;s recently announced Reader app&lt;/a&gt;, and then they, along with tweets, books, and PDFs, get sent to Readwise and then Obsidian using the &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;Official Readwise plugin for Obsidian&lt;/a&gt;. I&amp;rsquo;ve &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;written about this process in depth&lt;/a&gt;, but here&amp;rsquo;s what that looks like for Mike Shea&amp;rsquo;s &lt;em&gt;Return of the Lazy Dungeon Master&lt;/em&gt; - &lt;a href="https://amzn.to/2X93rvX"&gt;affiliate link&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/return_of_the_lazy_dm.png" alt="My notes on Return of the Lazy Dungeon Master" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;An advantage of using Reader (which is currently in a private beta, so I&amp;rsquo;m not allowed to share screenshots of it) is that I can even highlight text locked behind a paywall. For example, I have a D&amp;amp;D Beyond subscription and I&amp;rsquo;ve bought all the books available on their store, but most reading apps don&amp;rsquo;t know that, so it&amp;rsquo;s been hard to find one that will let me highlight text from one of the WotC sourcebooks. Not so with Reader. Here&amp;rsquo;s what my highlights from the first chapter of &lt;em&gt;Volo&amp;rsquo;s Guide to Monsters&lt;/em&gt; looks like in my Obsidian vault after it&amp;rsquo;s synced from Reader:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/volos_guide-chapter1.png" alt="My highlights from Volo’s Guide to Monsters" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise is great because I can highlight something on my Kindle and worry about processing it later in Obsidian. I process incoming Obsidian notes daily from 9-10pm&amp;ndash; that doesn&amp;rsquo;t mean I get through them all, just that I have a scheduled time to go through highlights and notes every day.&lt;/p&gt;
&lt;p&gt;For D&amp;amp;D-specific notes, that also involves summarizing what I&amp;rsquo;ve learned into the notes I already have on how to be a dungeon master:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/dm_session_prep.png" alt="My notes on session prep as a DM" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The referencing feature on Obsidian lets me confidently paraphrase without stealing. All I need to do is put a &lt;code&gt;[^lazydm]&lt;/code&gt; where I want the superscript to be within the text, and then at the end of the note, I put something like:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;[^lazydm]: Shea, M. (2018). _Return of the lazy dungeon master_. [[Return of the Lazy Dungeon Master|My highlights]].&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;That gets parsed as a footnote by Obsidian and lets me properly credit authors.&lt;/p&gt;
&lt;p&gt;When I find good tools that help me flesh out adventures, I try to update &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/DM+Tools+and+Inspiration"&gt;my page on DM tools and inspiration&lt;/a&gt;, so they&amp;rsquo;re all in one place.&lt;/p&gt;
&lt;p&gt;While creating adventures, I like to use &lt;a href="https://github.com/valentine195/obsidian-admonition"&gt;Obsidian Admonition&lt;/a&gt; to call out specific parts of the text for me as I&amp;rsquo;m running the adventure, like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-admonition-example.png" alt="Sample of how I use Obsidian Admonition" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="random-tables"&gt;Random tables&lt;/h4&gt;
&lt;p&gt;I definitely have overarching plans about the wider plot in the world at large, but I also like to be surprised. Throwing random elements into games is one of the ways that I can keep myself on my toes and remind myself that I&amp;rsquo;m not the only one making the story.&lt;/p&gt;
&lt;p&gt;There are many random tables in both official and unofficial D&amp;amp;D sourcebooks, but I only use those as starting points. For me, creating random tables that are tailored to my characters and to the things they care about is where it&amp;rsquo;s at!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve experimented with &lt;a href="https://nicolevanderhoeven.com/dndgen/characters.html"&gt;creating my own random generators&lt;/a&gt; for various things, as well as using existing ones like &lt;a href="https://donjon.bin.sh/"&gt;Donjon&lt;/a&gt;, but it&amp;rsquo;s an Obsidian plugin, Jeremy Valentine&amp;rsquo;s &lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Dice Roller&lt;/a&gt;, that I have settled on.&lt;/p&gt;
&lt;p&gt;The name &amp;ldquo;Dice Roller&amp;rdquo; makes you think it&amp;rsquo;s only for rolling dice, but it&amp;rsquo;s much more than that. Its REAL value, in my opinion, is in how it lets me create tables for ANYTHING, and then randomly pull one row out of it. Here&amp;rsquo;s how it works.&lt;/p&gt;
&lt;p&gt;First, you create a table. I had a session where my players discovered a place I called &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Shipwreck+Beach"&gt;Shipwreck Beach&lt;/a&gt;, and had a lot of fun going through several of the ships that were there. Here&amp;rsquo;s a table of &amp;ldquo;encounters&amp;rdquo; I put together for that session.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;### Ship encounters
| Roll | Encounter |
| ---- | --------------------------------------------------------------------- |
| 1 | Carnivorous Ship, ToB II p. 56 |
| 2 | Map Mimic: https://www.dndbeyond.com/monsters/1624929-map-mimic |
| 3 | Random curse: p.249 of GM&amp;#39;s Book of Random Encounters - d100 |
| 4 | Clockwork weaving spider (1, ToB p. 66) |
| 5 | 1d6 Cobbleswarm (2, ToB p. 68) |
| 6 | a feral little girl wearing a periapt of proof against poison |
| 7 | A large gold coin bearing the crest of the Kryn Dynasty and the queen |
| 8 | Book about the Arms of the Betrayer Gods |
^ship
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note the &lt;code&gt;^ship&lt;/code&gt; identifier at the bottom there&amp;ndash; it can be called whatever you want, but you&amp;rsquo;ll use that identifier when rolling on that table. I also included the &lt;code&gt;Roll&lt;/code&gt; column, in case I decided on the spot to let players roll instead of doing it myself.&lt;/p&gt;
&lt;p&gt;Next, in another note (or the same one, if you want), include this line:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Shipwreck encounter: `dice: [[Shipwreck Beach#^ship]]`
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When you flip to Preview mode, you&amp;rsquo;ll see this in the place of the line above:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/shipwreck_encounter-example.png" alt="Random Shipwreck encounter using Obsidian Dice Roller" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s it!! This has made a HUGE impact on my games, because it&amp;rsquo;s so easy to create or modify tables. I use random encounter tables sparingly &lt;em&gt;during&lt;/em&gt; the game, but often use it &lt;em&gt;before&lt;/em&gt; a game, to introduce something fresh that I hadn&amp;rsquo;t thought of.&lt;/p&gt;
&lt;h3 id="session-prep"&gt;Session prep&lt;/h3&gt;
&lt;p&gt;As you might have guessed, I mostly use Sly Flourish&amp;rsquo;s Lazy DM steps for encounter creation, saved as an Obsidian template:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
type: session
world: Exandria
campaign: &amp;#34;The Slayers Five&amp;#34;
date: {{date}}
game_date: 836-03-
location: Rumblecusp
characters: [Boris, Lira, Ora, Jamedi, Flint]
tags: [TVZ]
---
## [[Session Summary]]:
^summary
---
## Housekeeping
## Recap
![[^summary]]
## Strong start
&amp;gt;
## Scenes
- [ ]
- [ ]
- [ ]
- [ ]
## Secrets and Clues
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
- [ ]
## [[Loot]]
- [ ]
---
## Log
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Before each session, I&amp;rsquo;ll go through each of these sections.&lt;/p&gt;
&lt;p&gt;I add &lt;em&gt;metadata&lt;/em&gt; to every session for use with the &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview&lt;/a&gt; plugin later, in case I want to do a search for all sessions that involved a particular NPC or that took place in a certain location, for example.&lt;/p&gt;
&lt;p&gt;I fill out the &lt;em&gt;Session Summary&lt;/em&gt; section &lt;em&gt;after&lt;/em&gt; the game, but I put it at the top so I can immediately see what happened in the session in case I need to refresh my memory on it in the future. I also identify this section with a &lt;code&gt;^summary&lt;/code&gt; so that I can embed it in the next session, as a recap - more on that below.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;Housekeeping&lt;/em&gt; section, I write down things I want to mention before we dive into the narrative of the session. Usually, these topics are scheduling- or rules-related. For example, if my players have just levelled up and I see that one of them has chosen a feat, I might make a note of it here to make sure that they know what it means. My players are pretty new, so I think it&amp;rsquo;s better to err on the side of more communication rather than less.&lt;/p&gt;
&lt;p&gt;In the &lt;em&gt;Recap&lt;/em&gt; section, I call the sumary from the previous session and embed it into the current session using something like &lt;code&gt;![[38_8360310-8360311 Seduction at the Moonlight Chateau#^summary]]&lt;/code&gt;. When in preview mode, Obsidian shows just that section labelled with &lt;code&gt;^summary&lt;/code&gt; from the previous game. I like to start the game by either reading out the summary myself, or asking one of the players to recount what they remember. That way we&amp;rsquo;re all on the same page when we begin.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Strong start&lt;/em&gt;, I write a paragraph or two of prepared text that I use to kick off the story. This is usually the only text I&amp;rsquo;ll read out word for word during the game.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Scenes&lt;/em&gt; are a list of events that I THINK will happen. My players frequently surprise me, which I welcome, so I also list these with checkboxes so that I can keep track of where the story deviated from the plan.&lt;/p&gt;
&lt;p&gt;Sly Flourish does recommend a separate section for Fantastic Locations, but I tend to prepare these as separate pages. For example, here are my notes on a possible location, &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/The+Charred+Circus"&gt;The Charred Circus&lt;/a&gt;. I don&amp;rsquo;t include them within the session note itself, but I do make sure I have a few that characters could go to. Then, I link to all of them from the note I have for the city they&amp;rsquo;re in, &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Port+Damali#Geography+and+Map"&gt;like this one for Port Damali&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Secrets and Clues&lt;/em&gt; is where I put a list of 10 things that players MIGHT find out somehow. This is where I look when a player rolls a natural 20 on a Perception check. The idea is to describe &lt;em&gt;what&lt;/em&gt; the secrets are, but not get too caught up in trying to plan &lt;em&gt;when&lt;/em&gt; or &lt;em&gt;how&lt;/em&gt; the players will find out those secrets. I try to include things that might be interesting for the players, as well as a few potential adventure hooks. &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/38_8360310-8360311+Seduction+at+the+Moonlight+Chateau#Secrets+and+Clues"&gt;Here&amp;rsquo;s a list that I made for a previous game&lt;/a&gt;. I have never used all 10 up in one game, but I like having more than I need.&lt;/p&gt;
&lt;p&gt;In &lt;em&gt;Loot&lt;/em&gt;, I put in any items I know the party will likely get to. If they&amp;rsquo;re in a boss fight, I usually save in this section all the things I&amp;rsquo;ve decided beforehand they&amp;rsquo;ll get. If I don&amp;rsquo;t have something specific like that in mind, I sometimes randomize a bunch of non-magical trinkets. The &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Loot"&gt;Loot page&lt;/a&gt; contains items I&amp;rsquo;ve picked out for specific characters.&lt;/p&gt;
&lt;h3 id="post-session-processing"&gt;Post-session processing&lt;/h3&gt;
&lt;p&gt;If your players are anything like mine, you&amp;rsquo;ll often find yourself with a bunch of unused material and a lot of stuff you still had to improvise on the spot, despite adequate preparation. That&amp;rsquo;s okay! I actually enjoy when my players do something unexpected. I encourage and reward creative play&amp;hellip; but it does mean that I have to do a bit of a debrief after each session.&lt;/p&gt;
&lt;p&gt;I try not to prepare things that may really be &amp;ldquo;wasted&amp;rdquo;. Things like locations, NPCs, or general plot hooks can usually be recycled. After games, I spend some time tying off loose ends, noting down decisions the party made and the reasoning behind those decisions, and tweaking connections between NPCs or places based on how the party reacted.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Fleshing out bits of the world, with each city or NPC getting a page&lt;/li&gt;
&lt;li&gt;Tagging cities and NPCs with Location or NPC, and then within the city, doing a query for NPC and &lt;code&gt;city name&lt;/code&gt; to get everyone living in that city.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I use metadata for every page in my campaign so that I can use the excellent &lt;a href="https://github.com/blacksmithgu/obsidian-dataview/"&gt;Dataview plugin&lt;/a&gt; later to find whatever I want. You already saw my session template, but here&amp;rsquo;s an NPC template that I use:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;type&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;NPC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;faction&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;location&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;world&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Exandria&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;campaign&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;The Slayers Five&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;date&lt;/span&gt;: [{{&lt;span style="color:#ae81ff"&gt;date}}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;description&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;race&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;gender&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;class&lt;/span&gt;: []
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I insert this template for every single NPC in my world, whether my players get to it or not. Because I use it so often, I&amp;rsquo;ve set up a hotkey for inserting templates in the Obsidian settings:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-inserting_template.png" alt="Setting a hotkey for template insertion" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That way, all I have to do is hit &lt;code&gt;CMD + ;&lt;/code&gt; and select the right template from the list, and the text above is inserted at the beginning of the note as frontmatter, with all the fields I need to fill out. The date is also automatically generated.&lt;/p&gt;
&lt;p&gt;Using the Dataview plugin, I can then embed queries on location pages so that I can see NPCs in that place at a glance. For example, here&amp;rsquo;s the snippet I put under the &lt;code&gt;People&lt;/code&gt; section in my Port Damali page:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sql" data-lang="sql"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;```&lt;/span&gt;dataview
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;table&lt;/span&gt; shop &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Shop, faction &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Faction, description &lt;span style="color:#66d9ef"&gt;as&lt;/span&gt; Description &lt;span style="color:#66d9ef"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Exandria&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WHERE&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;contains&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;NPC&amp;#34;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;and&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;contains&lt;/span&gt;(&lt;span style="color:#66d9ef"&gt;location&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#34;Port Damali&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;SORT file.name &lt;span style="color:#66d9ef"&gt;ASC&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;\&lt;/span&gt;&lt;span style="color:#f92672"&gt;```&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(If you try this, remove the backticks &lt;code&gt;\&lt;/code&gt; in the snippet above&amp;ndash; those are just to show you the syntax for a dataview query.)&lt;/p&gt;
&lt;p&gt;That query, when rendered in Preview mode in Obsidian, looks like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-dataview-port_damali.png" alt="Rendered Dataview query in Obsidian Preview mode" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Having the metadata for every NPC, monster, item, and place in my world is essential for creating queries like this. I&amp;rsquo;ve also found it useful to maintain a model of the metadata I use:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- `type`
- `NPC`
- `PC`
- `shop`
- `place`
- `item`
- `session` for D&amp;amp;D play sessions
- `quest`
- `race`
- `faction`
- `family`
- `monster`
- `condition`
- `deity`
- `other` for anything else
- `characters` (for sessions): characters involved in this session
- `deceased`
- `true`
- `false`
- `family`
- `faction`
- `race`
- `gender`
- `class`
- `description`
- `date`
- `game_date`
- `world`
- `Exandria`
- `Forgotten Realms`
- `Exandya`
- `campaign`
- `Order of the Wandering Mind`
- `The Slayers Five`
- `Die vergessene Schwester`
- `Temporary White Circle`
- `shop` (for proprietors)
- `shop_type` (for shops)
- `general` : general goods store
- `alchemy`: potions
- `magical items`: sells magical items
- `services`: magical spells, messaging, brothel
- `tavern`: food and drink
- `inn`: lodging
- `herbalism`
- `smithy`
- `location`: city of residence
- `origin`: city of origin
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="during-the-game"&gt;During the game&lt;/h2&gt;
&lt;p&gt;I keep a &amp;ldquo;World&amp;rdquo; page for each of my D&amp;amp;D campaigns, including a list of sessions:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/campaign-page.png" alt="Campaign Page with list of sessions" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;During the game, I use the session page that I mentioned above, and start filling in the &lt;em&gt;Log&lt;/em&gt; section. I tend to take way fewer notes as a DM than as a player, just because I&amp;rsquo;m busy doing other things, but I do always write down things that the players do that I might need to remember later.&lt;/p&gt;
&lt;p&gt;One thing that comes up frequently in my games is the need to improvise encounters, NPCs, or locations. I&amp;rsquo;ve had great success in creating a &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Random+Rolls"&gt;Random Rolls&lt;/a&gt; page that collates many of these random tables in one note. If you click on that link, you unfortunately won&amp;rsquo;t be able to see the results rendered, because the Dice Roller plugin isn&amp;rsquo;t available for Obsidian Publish, but maybe you&amp;rsquo;ll get an idea of things I&amp;rsquo;m rolling on. Most of the tables referred to are from &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/Random+Tables"&gt;this Random Tables note&lt;/a&gt;, but every now and then I&amp;rsquo;ll include tables in location notes instead.&lt;/p&gt;
&lt;p&gt;I always have this Random Rolls page up as part of my DM workspace, in case I need to quickly improvise something. Here&amp;rsquo;s what the NPC section looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/npc_dice_roller-example.png" alt="Random rolls on the NPC random tables" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I can use any or all of those things that I want, or use them as inspiration for something else I make up on the spot. Either way, it means I&amp;rsquo;ll never be completely at a loss for the name of an NPC. ;)&lt;/p&gt;
&lt;h3 id="initiative-tracker"&gt;Initiative Tracker&lt;/h3&gt;
&lt;p&gt;I use D&amp;amp;D Beyond for character sheets, but I use &lt;a href="https://github.com/valentine195/obsidian-initiative-tracker"&gt;Jeremy Valentine&amp;rsquo;s initiative tracker&lt;/a&gt; to handle combat because there are a few critical features that D&amp;amp;D Beyond&amp;rsquo;s Encounter Tracker doesn&amp;rsquo;t yet support:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Status conditions&lt;/li&gt;
&lt;li&gt;(Easy to tweak) homebrew monsters&lt;/li&gt;
&lt;li&gt;Hiding monsters&amp;rsquo; names from the players&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The Initiative Tracker plugin supports all of these. When activated, it appears as a side panel in Obsidian:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/initiative_tracker_plugin.png" alt="Jeremy Valentine’s initiative tracker for Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I can easily see everyone&amp;rsquo;s HP and AC at a glance, and also apply special status conditions when necessary. My players don&amp;rsquo;t have to know whose turn it is&amp;ndash; they just have to know when their turn is. I warn them verbally when they&amp;rsquo;re &amp;ldquo;on deck&amp;rdquo;, and they haven&amp;rsquo;t had an issue with that.&lt;/p&gt;
&lt;p&gt;D&amp;amp;D Beyond does allow you to create homebrew monsters, but the only real benefit to doing so is to be able to use it in their Combat Tracker, so I&amp;rsquo;ve been using another plugin by Jeremy Valentine, the author of this one, to create monster statblocks&lt;/p&gt;
&lt;h3 id="statblocks"&gt;Statblocks&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://github.com/valentine195/obsidian-5e-statblocks"&gt;The 5e statblocks plugin&lt;/a&gt; lets me easily create homebrew creatures just by using this format:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;\```statblock
name: string
size: string
type: string
subtype: string
alignment: string
ac: number
hp: number
hit_dice: string
speed: string
stats: [number, number, number, number, number, number]
fage_stats: [number, number, number, number, number, number, number, number, number]
saves:
- &amp;lt;ability-score&amp;gt;: number
skillsaves:
- &amp;lt;skill-name&amp;gt;: number
damage_vulnerabilities: string
damage_resistances: string
damage_immunities: string
condition_immunities: string
senses: string
languages: string
cr: number
spells:
- &amp;lt;description&amp;gt;
- &amp;lt;spell level&amp;gt;: &amp;lt;spell-list&amp;gt;
traits:
- [&amp;lt;trait-name&amp;gt;, &amp;lt;trait-description&amp;gt;]
- ...
actions:
- [&amp;lt;trait-name&amp;gt;, &amp;lt;trait-description&amp;gt;]
- ...
legendary_actions:
- [&amp;lt;legendary_actions-name&amp;gt;, &amp;lt;legendary_actions-description&amp;gt;]
- ...
reactions:
- [&amp;lt;reaction-name&amp;gt;, &amp;lt;reaction-description&amp;gt;]
- ...
\```
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;em&gt;(Again, remove the backticks &lt;code&gt;\&lt;/code&gt; at the starting and ending lines of the snippet above if you copy and paste this into your vault.)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I usually start with a &amp;ldquo;real&amp;rdquo; monster from official or unofficial sourcebooks, then tweak it from there. For example, here&amp;rsquo;s a sample one that I tweaked from &lt;a href="https://koboldpress.com/tome-of-beasts/"&gt;Tome of Beasts&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-statblocks-example.png" alt="Sample of 5e statblock plugin in action" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The best part about this plugin is that it integrates with the Initiative Tracker. When you create a statblock and save it, that monster then becomes available for use within the Initiative Tracker, as you can see from the screenshot above.&lt;/p&gt;
&lt;h2 id="publishing"&gt;Publishing&lt;/h2&gt;
&lt;p&gt;I subscribe to &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;Obsidian Publish&lt;/a&gt;, partly to give back to the fine Obsidian developers who&amp;rsquo;ve made a tool I use daily and partly because I&amp;rsquo;ve found that it&amp;rsquo;s reduced friction in publishing. I use it primarily for non-D&amp;amp;D-related things, but D&amp;amp;D is part of my life, so it&amp;rsquo;s there as well. &lt;a href="https://notes.nicolevanderhoeven.com/Exandria/World"&gt;You can find my notes on the D&amp;amp;D campaign I DM here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some of the plugins that I use unfortunately don&amp;rsquo;t render correctly when Published, but the developers are working on that.&lt;/p&gt;
&lt;p&gt;I publish my campaign notes mainly because I love seeing other DM&amp;rsquo;s thought processes and systems, so I thought I&amp;rsquo;d return the favour by sharing mine as well. In case you were wondering, my players don&amp;rsquo;t know I publish these notes&amp;ndash; or, at least, I hope they don&amp;rsquo;t!&lt;/p&gt;
&lt;h2 id="player-facing-campaign-vault"&gt;Player-facing campaign vault&lt;/h2&gt;
&lt;p&gt;I used to drop handouts into a WhatsApp group with my players, but it became increasingly unwieldy to look for something. We switched to Slack, but that had the same problem of needing to scroll back through lots of photos before finding the right one. Photos aren&amp;rsquo;t very searchable in those apps.&lt;/p&gt;
&lt;p&gt;A few months ago, I switched to Obsidian for handouts. I created a separate vault for the campaign and shared it with my players via Dropbox. I did have to talk them through the setup, but it&amp;rsquo;s worked out very well for us as a free alternative.&lt;/p&gt;
&lt;p&gt;In the vault, I put things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pictures and other handouts&lt;/li&gt;
&lt;li&gt;Session videos and summaries&lt;/li&gt;
&lt;li&gt;Links for everything we use as a group&lt;/li&gt;
&lt;li&gt;House rules&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="session-page"&gt;Session page&lt;/h3&gt;
&lt;p&gt;I create a page for every session we have, which has a section for the video recording of that session (unlisted and just for us, sorry), a player-friendly summary, and a log. The log is where I dump photos I give them during the session. Here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player-vault-session.png" alt="Session page for my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t put any other notes in the log; that&amp;rsquo;s the players&amp;rsquo; jobs (if they want to).&lt;/p&gt;
&lt;p&gt;I like to have a &amp;ldquo;Story Thus Far&amp;rdquo; page that embeds the video and summary sections of all the sessions, so any of us can read through it to remember what&amp;rsquo;s happened. It&amp;rsquo;s fun to see how far we&amp;rsquo;ve come as a group.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-story-thus-far.png" alt="Story Thus Far page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="about-our-game"&gt;About our game&lt;/h3&gt;
&lt;p&gt;The About our game page has a list of links to all the tools we use, our schedule, and a few things about the campaign and the world.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-about_our_game.png" alt="About our game page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="rules"&gt;Rules&lt;/h3&gt;
&lt;p&gt;I keep a house rules page that shows all the extra rules I&amp;rsquo;ve put into the game. I mostly play with all the WoTC-produced sourcebooks, but I&amp;rsquo;ve added some extra rules about things that my players are interested in, such as strongholds (for which I use &lt;a href="https://shop.mcdmproductions.com/collections/strongholds-followers-books"&gt;Matt Colville&amp;rsquo;s Strongholds &amp;amp; Followers book&lt;/a&gt;) and smith&amp;rsquo;s tools.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-player_vault-rules.png" alt="Rules page in my player-facing vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I also have some other pages on rules that come up often, such as Ship statblocks (since the campaign is set on a coast) and suggested downtime activities.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I call my approach to game preparation the Non-Lazy DM&amp;rsquo;s approach as a tongue-in-cheek nod to &lt;a href="https://slyflourish.com"&gt;Mike Shea&amp;rsquo;s&lt;/a&gt; content, but there&amp;rsquo;s truth to the moniker, too. My setup is extremely detail-oriented, time-consuming, and &lt;em&gt;fun&lt;/em&gt;&amp;hellip; at least for me! And that&amp;rsquo;s the key: I wouldn&amp;rsquo;t be doing any of this if I didn&amp;rsquo;t find it truly enjoyable to world-build to this level of detail.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re a non-lazy DM too, thanks for sticking around! I hope this has given you some ideas for how you could use Obsidian to run your games and stimulate your imagination, too.&lt;/p&gt;</description></item><item><title>How to load test a GraphQL API built with Hasura using k6 (k6 Office Hours #28)</title><link>https://nicolevanderhoeven.com/blog/20210917-koh28-load-testing-graphql-with-hasura-and-k6/</link><pubDate>Fri, 17 Sep 2021 13:58:42 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210917-koh28-load-testing-graphql-with-hasura-and-k6/</guid><description>&lt;p&gt;My co-host &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I had invited Adron Hall from &lt;a href="https://hasura.io"&gt;Hasura&lt;/a&gt; to come talk to us about how to load test a GraphQL API, but he was unable to come due to unforeseen circumstances. Luckily, Tom Miseur, who is part of the Professional Services branch of k6, was able to step in on very little notice!&lt;/p&gt;
&lt;p&gt;Tom has done a load testing engagement using k6 that involved Hasura, so he was able to tell us what it is and how it can be tested with k6. It turned out really well, thankfully!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sAPHPvmfdPQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Intro to Load Testing With k6 and Grafana (webinar)</title><link>https://nicolevanderhoeven.com/blog/20210916-intro-to-load-testing-with-k6-and-grafana/</link><pubDate>Thu, 16 Sep 2021 22:11:16 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210916-intro-to-load-testing-with-k6-and-grafana/</guid><description>&lt;p&gt;Tonight I did a webinar with Grafana Labs&amp;ndash; the first k6-related webinar since the acquisition. I was more than a little nervous to give it, because I knew I was introducing k6 to a lot of new users, but also to Grafana for the first time. I think it went pretty well! I was still quite relieved when it was over, however. :)&lt;/p&gt;
&lt;p&gt;In the webinar, I talk about:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;why it&amp;rsquo;s still a good idea to do load testing in pre-production&lt;/li&gt;
&lt;li&gt;what k6 is&lt;/li&gt;
&lt;li&gt;why k6 and Grafana together make sense&lt;/li&gt;
&lt;li&gt;and how to integrate k6 and Grafana&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There&amp;rsquo;s quite a bit of demo in it, and I also had the k6 CEO, Robin Gustafsson, join me for Q&amp;amp;A as a nice treat.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/tFsIgbqXbxM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Check out the full webinar &lt;a href="https://grafana.com/go/webinar/intro-to-load-testing-with-grafana-and-k6/"&gt;here&lt;/a&gt;&amp;ndash; it&amp;rsquo;s already up on the Grafana site. You can also go through my slides &lt;a href="https://docs.google.com/presentation/d/1WOA50nqIv1NoiHBxGIH_JM02rZqSjX81gHTlwPJ5i1U/edit?usp=sharing"&gt;here&lt;/a&gt;, if you&amp;rsquo;d like.&lt;/p&gt;</description></item><item><title>Schrödinger's Pokémon: k6 and Grafana edition</title><link>https://nicolevanderhoeven.com/blog/20210908-schrodingers-pokemon-k6-and-grafana/</link><pubDate>Wed, 15 Sep 2021 18:22:31 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210908-schrodingers-pokemon-k6-and-grafana/</guid><description>&lt;p&gt;Earlier this year, I gave a presentation at New Relic&amp;rsquo;s FutureStack conference about &lt;a href="https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/"&gt;chaos engineering with k6 and New Relic&lt;/a&gt;. A few months ago, k6 got acquired by &lt;a href="https://grafana.com"&gt;Grafana Labs&lt;/a&gt;, and so I wanted to redo it, but with the Grafana stack this time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the result, and I think I like this iteration even better:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/2QHs_HEX7r0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I presented this talk at &lt;a href="https://www.youtube.com/watch?v=jSgH3I8_ldk"&gt;TestCon Europe 2021&lt;/a&gt; today, although the audio sync issues were not great, so I recommend you watch the video above instead.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://docs.google.com/presentation/d/11HakdG0w2RsOunVnD6qPkTfTPpBxtXFECK_ynSOBraE/edit"&gt;Slides are here.&lt;/a&gt;&lt;/p&gt;</description></item><item><title>How Gitlab uses k6 for load testing, with Grant Young (k6 Office Hours #27)</title><link>https://nicolevanderhoeven.com/blog/20210910-koh27-how-gitlab-uses-k6-for-load-testing/</link><pubDate>Fri, 10 Sep 2021 18:13:26 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210910-koh27-how-gitlab-uses-k6-for-load-testing/</guid><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/grantyoung86/"&gt;Grant Young&lt;/a&gt;, Software Engineer in Test at GitLab, joined &lt;a href="https://grafana.com/k6"&gt;k6 OSS&lt;/a&gt; maintainer &lt;a href="https://twitter.com/MStoykov"&gt;Mihail Stoykov&lt;/a&gt; and me to talk about how GitLab uses k6. Apparently, they began using k6 internally some time ago, and because they like to eat their own dogfood and use GitLab to test GitLab, they also incorporated k6 into GitLab so that their users could reap the benefits, too.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/YTGkq0m1bYk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://docs.gitlab.com/ee/user/project/merge_requests/load_performance_testing.html"&gt;Here&amp;rsquo;s the GitLab documentation&lt;/a&gt; about how to do load testing in GitLab, and &lt;a href="https://k6.io/blog/integrating-load-testing-with-gitlab/"&gt;here&amp;rsquo;s a k6 blog post&lt;/a&gt; on how to set it up!&lt;/p&gt;</description></item><item><title>How to do continuous performance testing, with Lee Barnes (k6 Office Hours #26)</title><link>https://nicolevanderhoeven.com/blog/20210827-koh26-continuous-performance-testing-with-k6/</link><pubDate>Fri, 27 Aug 2021 09:34:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210827-koh26-continuous-performance-testing-with-k6/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/USI_LeeBarnes"&gt;Lee Barnes&lt;/a&gt; and I got connected because we are both speaking at &lt;a href="https://testcon.lt/"&gt;TestCon Europe 2021&lt;/a&gt; this year, and I thought it would be nice to have a chat with him before the conference to get a sneak peek at what he&amp;rsquo;s presenting about: continuous performance testing. Lee is the CEO of &lt;a href="https://utopiasolutions.com/"&gt;Utopia Solutions&lt;/a&gt;, and he&amp;rsquo;s been in the testing industry for decades, so I really appreciated his insights on where the industry is going.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/5pd0G-jBOTo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Catch Lee&amp;rsquo;s talk &lt;a href="https://testcon.lt/Lee-Barnes/"&gt;here&lt;/a&gt; and mine &lt;a href="https://testcon.lt/Nicole-van-der-Hoeven/"&gt;here&lt;/a&gt;!&lt;/p&gt;</description></item><item><title>How to debug k6 load testing scripts with Tom Miseur (k6 Office Hours #25)</title><link>https://nicolevanderhoeven.com/blog/20210820-koh25-k6_load_testing_scripts/</link><pubDate>Fri, 20 Aug 2021 14:38:11 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210820-koh25-k6_load_testing_scripts/</guid><description>&lt;p&gt;&lt;a href="https://www.linkedin.com/in/tommiseur/"&gt;Tom Miseur&lt;/a&gt; joined k6 at about the same time I did late last year, and we immediately hit it off because we both come from a performance testing consulting background AND we both had worked for different competing testing tool vendors before moving to k6. I was excited to have him on k6 Office Hours to talk about a topic we both had a lot to say about: how to debug load testing scripts, and specifically k6 scripts. We got a chance to do a bit of a show-and-tell of tools that we use that we use, and they are all independent of k6.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wireshark.org"&gt;Wireshark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.charlesproxy.com"&gt;Charles Proxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://mitmproxy.org"&gt;mitmproxy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.telerik.com/fiddler"&gt;Fiddler&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://proxyman.io"&gt;Proxyman&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I also got to demo &lt;a href="https://github.com/benc-uk/k6-reporter"&gt;a cool HTML reporting dashboard&lt;/a&gt; that Ben Coleman, a k6 user, created. While it&amp;rsquo;s not baked into the tool itself, it&amp;rsquo;s fairly straightforward to add it, requiring only two snippets of code that can be pasted onto any script.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Zln_TWOuoho?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to import Shortform highlights to Obsidian via Readwise</title><link>https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/</link><pubDate>Mon, 16 Aug 2021 21:40:16 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210815-shortform-to-readwise/</guid><description>
&lt;meta property=“og:image” content="/assets/20210816-shortform-to-readwise-title.png.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-to-readwise-title.png" alt="Shortform to Readwise hero photo" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always been dubious of those book summary apps. You know the ones&amp;ndash; they tend to have obnoxious ads that promise to help you &amp;ldquo;read 5 books a day&amp;rdquo; or learn the world&amp;rsquo;s secrets in 15 minutes. Having tried a few of them, I&amp;rsquo;ve been disappointed with the quality of their summaries (or lack thereof). They attempt to distill the message of a 300+ page book into a handful of bullet points, which I&amp;rsquo;ve found neither accurate nor useful. Recently, though, I found myself happily subscribing to one, and here&amp;rsquo;s why.&lt;/p&gt;
&lt;h2 id="whats-shortform-and-why-is-it-awesome"&gt;What&amp;rsquo;s Shortform and why is it awesome?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; really took me aback because it isn&amp;rsquo;t just a book summary. I should mention here that I&amp;rsquo;m not affiliated with Shortform and gain nothing by recommending them. I&amp;rsquo;m just a happy subscriber.&lt;/p&gt;
&lt;p&gt;When I read their guide for the book &lt;em&gt;Why We Sleep&lt;/em&gt;, I was pleasantly surprised to find that Shortform not only summarized it succinctly, but they also added intelligent counterarguments to the author&amp;rsquo;s points. In some cases, when the author made a false claim, there were Shortform notes that linked to studies that showed &lt;em&gt;why&lt;/em&gt; the claim was false. In other cases, Shortform mentioned related concepts proposed in other books that strengthened the author&amp;rsquo;s viewpoint. I found myself looking up their guides of books I&amp;rsquo;d already read, just because I was curious to see if I had missed anything. And I had!&lt;/p&gt;
&lt;p&gt;In short, Shortform is the only book summary reader I&amp;rsquo;ve found that goes beyond summarizing and actually &lt;em&gt;adds value&lt;/em&gt; to the reading experience, &lt;em&gt;even if you&amp;rsquo;ve read the book.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;They also have a one-page summary of the book AND a summary per chapter, so information is presented at different levels of detail. In my time with it, my most frequent workflow with it has involved reading the one-page summary of a book, buying it if it was interestering enough, reading the book, and then going back to Shortform to go read the chapter summaries. And both the one-page and detailed chapter summaries, including Shortform notes, can be highlighted!&lt;/p&gt;
&lt;p&gt;Naturally I wanted to take it further than that. I already &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux"&gt;sync my Kindle highlights to Obsidian&lt;/a&gt; automatically and incrementally process them in Obsidian, so I wrote a script to have my Shortform highlights going to &lt;a href="https://readwise.io"&gt;Readwise&lt;/a&gt; as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-01.png" alt="Shortform highlights in my Obsidian vault" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My Shortform highlights for the book Mindset, in my Obsidian vault.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The screenshot above shows the final result: highlights I made in the Shortform web or mobile app that have been synced to a page in my Obsidian vault. Here&amp;rsquo;s how I did that.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Since this article was published, Shortform and Readwise have created an integration, so the script I mention here is no longer necessary. Click &lt;a href="https://nicolevanderhoeven.com/blog/20221021-obsidian-for-non-coders"&gt;here&lt;/a&gt; to see what I&amp;rsquo;d recommend doing today.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-you-need"&gt;What you need&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A &lt;a href="https://shortform.com/nicole"&gt;Shortform&lt;/a&gt; account. &lt;em&gt;(affiliate link)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; account. &lt;em&gt;(This is an affiliate link. If you sign up with this link, you&amp;rsquo;ll get a two-month free trial instead of one, and I get a small percentage if you sign up for a plan.)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;A tool that Readwise can export to, such as &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt;, &lt;a href="https://notion.so"&gt;Notion&lt;/a&gt;, or &lt;a href="https://evernote.com"&gt;Evernote&lt;/a&gt;. You can also use their CSV and Markdown exports.&lt;/li&gt;
&lt;li&gt;A local installation of Python 3, which you can &lt;a href="https://www.python.org/downloads/"&gt;download here&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Obsidian is my Personal Knowledge Management tool of choice, and I use the &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;Readwise Official community plugin&lt;/a&gt; to get Readwise to send highlights to Obsidian. However, using Obsidian is not necessary as my script connects only Shortform to Readwise.&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;
&lt;p&gt;Clone &lt;a href="https://github.com/nicolevanderhoeven/shortform-to-readwise"&gt;my Shortform-to-Readwise repository on GitHub&lt;/a&gt; or download it to your computer.&lt;/p&gt;
&lt;h3 id="enter-your-tokens"&gt;Enter your tokens&lt;/h3&gt;
&lt;p&gt;The file &lt;code&gt;variables.py&lt;/code&gt; requires two tokens: one from your Shortform account and another from your Readwise account:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your authorization token for Shortform&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;authToken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Your Readwise API token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Retrieve this token from https://readwise.io/access_token&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;readwiseToken &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="getting-your-shortform-token"&gt;Getting your Shortform token&lt;/h4&gt;
&lt;p&gt;This is a little hacky, because Shortform doesn&amp;rsquo;t expose an API token in their web app. So you&amp;rsquo;ll need to log in to your Shortform account and open up DevTools in your browser. In Chrome, go to Options &amp;gt; More Tools &amp;gt; Developer Tools (or, on Mac, hit CMD+OPTION+I). Click on the Network panel.&lt;/p&gt;
&lt;p&gt;You should now see Shortform on one side, and DevTools on another in the same browser window.&lt;/p&gt;
&lt;p&gt;Then, go to &lt;a href="https://www.shortform.com/app/highlights"&gt;your Highlights page&lt;/a&gt;. Doing so will populate the Network panel with a bunch of requests that look like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-02.png" alt="DevTools open in Chrome, showing requests from Shortform" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;DevTools open in Chrome, showing requests from Shortform.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Click on the request with the name &lt;code&gt;?sort=date&lt;/code&gt;, highlighted above. That&amp;rsquo;ll open another side panel that will show Headers. Scroll down to the section marked &amp;ldquo;Request Headers&amp;rdquo;, and look for where it says &lt;code&gt;Authorization: Basic &lt;/code&gt; followed by a bunch of characters.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-03.png" alt="Authorization headers for Shortform, in DevTools" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Authorization headers for Shortform, in DevTools.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve removed my personal authorization token from the screenshot above, but it&amp;rsquo;s a long series of characters that comes after &lt;code&gt;Authorization: Basic &lt;/code&gt;. Go ahead and right click on it and click Copy Value. Paste it into &lt;code&gt;variables.py&lt;/code&gt; as the value for &lt;code&gt;authToken&lt;/code&gt;, and then _remove &lt;code&gt;Basic &lt;/code&gt; (including the space after it) so that you&amp;rsquo;re saving only everything that comes afterwards.&lt;/p&gt;
&lt;h4 id="getting-your-readwise-token"&gt;Getting your Readwise token&lt;/h4&gt;
&lt;p&gt;Thankfully, this one&amp;rsquo;s a little easier. Go to &lt;a href="https://readwise.io/access_token"&gt;this page on Readwise&lt;/a&gt; after logging in. Click &amp;ldquo;Get Token&amp;rdquo;, click &amp;ldquo;Copy to clipboard&amp;rdquo;, and then paste it into &lt;code&gt;variables.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Save &lt;code&gt;variables.py&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Note: Don&amp;rsquo;t share either of these tokens with anyone else, as they will then be able to access your Shortform or Readwise accounts.&lt;/p&gt;
&lt;h3 id="run-the-script"&gt;Run the script&lt;/h3&gt;
&lt;p&gt;Open up your terminal, and &lt;code&gt;cd&lt;/code&gt; into the &lt;code&gt;/shortform-to-readwise&lt;/code&gt; repository. Then, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;python3 getHighlights.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It should finish in a few seconds (depending on how many Shortform highlights you have), and then you can verify that it worked by going to &lt;a href="https://readwise.io/books"&gt;your Readwise library&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210816-shortform-04.png" alt="Shortform exports showing up in your Readwise library" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Shortform exports showing up in your Readwise library.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You should see books that have the &lt;code&gt;Shortform-&lt;/code&gt; prefix. If you do, then you&amp;rsquo;re done! If you&amp;rsquo;ve got your Readwise account set up to push your highlights elsewhere (such as Obsidian), then you&amp;rsquo;re all set!&lt;/p&gt;
&lt;p&gt;In case you&amp;rsquo;re wondering why I added the &lt;code&gt;Shortform-&lt;/code&gt; prefix, it&amp;rsquo;s because I often read the Shortform guide, and then read the book itself. Rather than end up in a sticky situation where the Shortform guide highlights might override the actual book highlights, I titled it differently so that I get two pages for the two sets of highlights.&lt;/p&gt;
&lt;h2 id="what-about-running-the-script-regularly"&gt;What about running the script regularly?&lt;/h2&gt;
&lt;p&gt;The whole point of this, at least for me, was to set it up so that I&amp;rsquo;ve got highlights going to Obsidian &lt;em&gt;automatically&lt;/em&gt;, without needing my intervention. What I did was to use &lt;code&gt;crontab&lt;/code&gt; on macOS to run the script every 30 minutes, but you can set up your own schedule.&lt;/p&gt;
&lt;h3 id="give-cron-full-system-access"&gt;Give cron full system access&lt;/h3&gt;
&lt;p&gt;Cron needs to have the right permissions to run scripts on your behalf, so you may have to go to System Preferences &amp;gt; Security &amp;amp; Privacy &amp;gt; Privacy &amp;gt; Full Disk Access on your laptop and add &lt;code&gt;/usr/bin/cron&lt;/code&gt; to the &amp;ldquo;allowed&amp;rdquo; list.&lt;/p&gt;
&lt;h3 id="find-the-path-for-your-python3-installation"&gt;Find the path for your python3 installation&lt;/h3&gt;
&lt;p&gt;In your terminal, run:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;which python3
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will give you a path. For me, it was &lt;code&gt;/Library/Frameworks/Python.framework/Versions/3.9/bin/python3&lt;/code&gt;. Copy this.&lt;/p&gt;
&lt;h3 id="open-crontab"&gt;Open crontab&lt;/h3&gt;
&lt;p&gt;Then, from your terminal, run the command &lt;code&gt;env EDITOR=nano crontab -e&lt;/code&gt; to open up a list of cronjobs. If you don&amp;rsquo;t have any other jobs, this will be blank.&lt;/p&gt;
&lt;h3 id="set-a-schedule"&gt;Set a schedule&lt;/h3&gt;
&lt;p&gt;Add a line to crontab for the schedule you want to create. This line has to be in the format&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* * * * * command
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where the five asterisks correspond to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minute&lt;/li&gt;
&lt;li&gt;hour&lt;/li&gt;
&lt;li&gt;day of the month&lt;/li&gt;
&lt;li&gt;month&lt;/li&gt;
&lt;li&gt;day of the week&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my case, I wanted it to run every 30 minutes, so here&amp;rsquo;s what my schedule looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;*/30 * * * * /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/nic/python/shortform-to-readwise/gethighlights.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Make sure you change &lt;code&gt;/Users/nic/python/&lt;/code&gt; to the path where you put the repository and your python3 path instead of &lt;code&gt;/Library/Frameworks/Python.framework/Versions/3.9/bin/python3&lt;/code&gt;. Now exit out of it and save it (CTRL+X, and yes). The Python script should automatically run every 30 minutes.&lt;/p&gt;
&lt;h2 id="thats-it"&gt;That&amp;rsquo;s it!&lt;/h2&gt;
&lt;p&gt;I consume a lot of content daily, but without systems in place to capture insights from that content and process it, it all just gets forgotten eventually. That&amp;rsquo;s why I love services like Shortform and Readwise&amp;ndash; they let me get what I&amp;rsquo;ve read/watched/heard out of my head and into Obsidian, where I can review them more critically and truly learn the important parts.&lt;/p&gt;
&lt;p&gt;Both are paid services (which I paid for out of my own money), but I really think they&amp;rsquo;re worth it.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains affiliate links. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Kubedim: Microservices testing using k6 for reliability, with Kelvin Zhang (k6 Office Hours #24)</title><link>https://nicolevanderhoeven.com/blog/20210813-kubedim-microservices-testing/</link><pubDate>Fri, 13 Aug 2021 15:50:46 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210813-kubedim-microservices-testing/</guid><description>&lt;p&gt;Today, my colleague &lt;a href="https://www.gonzalezlopes.com/"&gt;Daniel González Lopes&lt;/a&gt; joined me as a co-host on k6 Office Hours, and we interviewed &lt;a href="https://twitter.com/kelvzhan"&gt;Kelvin Zhang&lt;/a&gt; about his thesis at Imperial College London, using k6 to test microservices-based architectures. He created something called Kubedim, an application that intelligently applies non-uniform brownout theory to intentionally dim application requests for the purpose of improving overall availability.&lt;/p&gt;
&lt;p&gt;This was a dense Office Hours to digest, but Kelvin really impressed us with his experiments and findings! It&amp;rsquo;s definitely an awesome use case for k6 and just a great one to watch for any site reliability engineer.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/O1Evg9_EEmU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Meet the Grafana Labs team: Nicole Van Der Hoeven, Developer Advocate at k6</title><link>https://nicolevanderhoeven.com/blog/20210813-grafana-profile-nicole-van-der-hoeven/</link><pubDate>Fri, 13 Aug 2021 15:29:37 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210813-grafana-profile-nicole-van-der-hoeven/</guid><description>&lt;p&gt;&lt;a href="https://grafana.com/blog/2021/08/13/meet-the-grafana-labs-team-nicole-van-der-hoeven-a-developer-advocate-who-does-performance-testing-at-k6/"&gt;Originally posted here.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
&lt;link rel="canonical" href="https://grafana.com/blog/2021/08/13/meet-the-grafana-labs-team-nicole-van-der-hoeven-a-developer-advocate-who-does-performance-testing-at-k6/"&gt;
As Grafana Labs continues to grow, we’d like you to get to know the team members who are working on the cool stuff you’re using. Check out the latest of our Friday team profiles.&lt;/p&gt;
&lt;h2 id="meet-nicole"&gt;Meet Nicole!&lt;/h2&gt;
&lt;p&gt;Name: Nicole van der Hoeven&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/profilepic-1MB.png" alt="photo of Nicole" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="current-locationtime-zone"&gt;Current location/time zone&lt;/h3&gt;
&lt;p&gt;I currently live in Maastricht, in the Netherlands. I moved here with my husband four years ago from Melbourne, Australia.&lt;/p&gt;
&lt;h3 id="what-do-you-do-at-grafana-labs"&gt;What do you do at Grafana Labs?&lt;/h3&gt;
&lt;p&gt;I’m a Developer Advocate at &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, but I’m not actually a developer — I’m a performance tester! I guess there’s no such thing as a Performance Tester Advocate? My job is part engineering, part content creation: I write load testing scripts and code, but I also write blog posts, produce videos, and give presentations. I found out I was joining Grafana Labs a few months ago &lt;a href="https://grafana.com/about/press/2021-06-17-grafana-labs-brings-modern-open-source-load-testing-to-observability-with-acquisition-of-k6/"&gt;when k6 was acquired&lt;/a&gt;, but I was happy to join the team! I’ve met some fun and motivated people at Grafana Labs that I’m eager to collaborate with.&lt;/p&gt;
&lt;h3 id="what-open-source-projects-do-you-contribute-to"&gt;What open source projects do you contribute to?&lt;/h3&gt;
&lt;p&gt;I’m a budding developer and still learning the ins and outs of social coding, but some things I’ve contributed to recently are &lt;a href="https://github.com/nicolevanderhoeven/xk6-chaos"&gt;a chaos engineering extension for k6&lt;/a&gt; (created by my colleague, the talented &lt;a href="https://simme.dev"&gt;Simon Aronsson&lt;/a&gt;), an application called &lt;a href="https://github.com/nicolevanderhoeven/pokeapi"&gt;Poké API&lt;/a&gt; that I’ve added chaos experiments to, and &lt;a href="https://github.com/nicolevanderhoeven/readwise2directory"&gt;a Python script&lt;/a&gt; for pushing my Kindle highlights to my note-taking app of choice, &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="what-are-your-github-and-twitter-handles"&gt;What are your GitHub and Twitter handles?&lt;/h3&gt;
&lt;p&gt;GitHub: &lt;a href="https://github.com/nicolevanderhoeven"&gt;nicolevanderhoeven&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Twitter: &lt;a href="https://twitter.com/n_vanderhoeven"&gt;n_vanderhoeven&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="what-do-you-like-to-do-in-your-free-time"&gt;What do you like to do in your free time?&lt;/h3&gt;
&lt;p&gt;I play Dungeons &amp;amp; Dragons eight hours a week, &lt;a href="https://notes.nicolevanderhoeven.com/Fork+My+Brain"&gt;take a ridiculous amount of notes on everything&lt;/a&gt;, and vlog about &lt;a href="https://www.youtube.com/c/luckydippers"&gt;my (pre-COVID) travels&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/battlemap.jpg" alt="Battle map on a TV lying on a table, from a Dungeons &amp;amp; Dragons game" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;A battle map in one of my Dungeons &amp;amp; Dragons games.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="whats-your-favorite-new-gadget-or-tech-toy"&gt;What’s your favorite new gadget or tech toy?&lt;/h3&gt;
&lt;p&gt;My new Rødecaster Pro, an audio mixer that has quickly become an essential part of my audio and video production process. It takes up a huge amount of precious real estate on my desk, but it is absolutely worth it!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/desksetup.jpg" alt="Bird’s eye view of Nicole’s current desk" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;My current desk setup, including the Rødecaster Pro peeking out from underneath the laptop in the upper right.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="whats-the-best-part-of-your-job"&gt;What’s the best part of your job?&lt;/h3&gt;
&lt;p&gt;I got into Developer Relations and advocacy in general because I realized that, as a performance testing consultant, I was being asked the same questions and solving the same problems. So I started to share my experience online, and I’ve found that significantly more efficient. Why explain something repeatedly to one person at a time, on the spot, when you could post a more considered explanation online and potentially help an unlimited amount of people? A large part of my job is simplifying technical concepts and making it accessible to beginners, and I love being able to help others by creating the content I looked for when I was a beginner, too.&lt;/p&gt;
&lt;p&gt;Here’s one of my YouTube videos:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_DB-lNZW7LQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h3 id="whats-the-last-thing-you-binge-watched"&gt;What’s the last thing you binge-watched?&lt;/h3&gt;
&lt;p&gt;I have binge-watched the entire two campaigns of &lt;a href="https://www.youtube.com/c/criticalrole"&gt;Critical Role&lt;/a&gt;, a livestream of a Dungeons &amp;amp; Dragons game with a bunch of voice actors, which is over 1000 hours of watch time. Totally worth it!&lt;/p&gt;
&lt;h3 id="what-superpowers-do-you-have"&gt;What superpowers do you have?&lt;/h3&gt;
&lt;p&gt;I speak several languages: Tagalog (my native language), English, Dutch, Spanish, Esperanto, German, and French — in that order and to varying degrees. I am learning and have learned more, but don’t yet feel confident enough to claim to “speak” them! I choose travel destinations based on how interested I am in learning the local language.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/esperanto-superpower.jpg" alt="Nicole wearing a shirt that says “I speak Esperanto. What’s your superpower?”" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="whats-your-zoom-virtual-background-and-why"&gt;What’s your Zoom virtual background and why?&lt;/h3&gt;
&lt;p&gt;I don’t use virtual backgrounds. The thing I like most about video is that it’s the most honest form of expression: writing, podcasting, and photography can all be edited far more easily. I like that my home office gives clues about who I am and what I like, and I would never want to hide that — mess and all!&lt;/p&gt;</description></item><item><title>Grotten Sint Pietersberg Maastricht (LuckyDippers)</title><link>https://nicolevanderhoeven.com/blog/20210812-ld109-grotten-sint-pietersberg/</link><pubDate>Thu, 12 Aug 2021 12:21:09 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210812-ld109-grotten-sint-pietersberg/</guid><description>&lt;p&gt;Another travel vlog from safer times: in September 2018, my husband and I took a friend out to Grotten Sint Pietersberg, a fortress and cave system in Maastricht, the Netherlands. They had been used in the times before that area was not yet part of the city of Maastricht; they were in a small village called Sint Pietersberg that had gotten caught between several invading foreign armies and the people of Maastricht. We enjoyed the day out!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/l7BHMbr-ltM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Monitoring your k6 load test: how to install Grafana and Prometheus on a Kubernetes cluster</title><link>https://nicolevanderhoeven.com/blog/20210811-how-to-install-grafana-prometheus-in-kubernetes/</link><pubDate>Wed, 11 Aug 2021 18:55:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210811-how-to-install-grafana-prometheus-in-kubernetes/</guid><description>&lt;p&gt;Running a load test is half of the equation, and not having the right observability tools to see how your application responds to the load can sometimes flat-out invalidate a test.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s how to install open-source tools Grafana and Prometheus on a Kubernetes cluster in DigitalOcean and how a performance user could use them for increased visibility during a load test.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GL2v81xYuAQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The easiest way to sync Kindle highlights to Obsidian: Readwise to Obsidian Redux</title><link>https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/</link><pubDate>Tue, 10 Aug 2021 19:50:40 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/</guid><description>
&lt;meta property=“og:image” content="/assets/readwise-official-plugin.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-plugin.png" alt="Readwise to Obsidian workflow" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Almost exactly six months ago, I &lt;a href="https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/"&gt;wrote a blog post&lt;/a&gt; detailing my workflow for processing content. Specifically, I wrote about how I used a python script to take my highlights from Instapaper, Kindle, Twitter, and Airr and automatically put them into Obsidian.&lt;/p&gt;
&lt;p&gt;That method worked, and you can read the original article in the link above. However, today, &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; announced that they now have &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;an official Obsidian community plugin&lt;/a&gt;, and I disabled my trusty old python script for good.&lt;/p&gt;
&lt;p&gt;You see, although my old script worked, there were quirks&amp;ndash; not the least of which was that making changes to it meant programming in Python. I&amp;rsquo;m not a developer, so while I made do, it was never a painless experience. I also ran into issues with time zones and invalid characters being used in titles. So I&amp;rsquo;m thrilled to have something significantly better from Readwise itself! Here&amp;rsquo;s a video from the Readwise team, or read on for instructions on how to get started.&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DOYwwdDC9LQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;em&gt;From &lt;a href="https://www.youtube.com/watch?v=DOYwwdDC9LQ"&gt;Readwise on YouTube&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="install-the-obsidian-plugin"&gt;Install the Obsidian plugin.&lt;/h2&gt;
&lt;p&gt;In your Obsidian vault, go to Settings &amp;gt; Community plugins. You&amp;rsquo;ll need to turn Safe mode off for community plugins if you haven&amp;rsquo;t already.&lt;/p&gt;
&lt;p&gt;Then, click Browse and search for Readwise Official.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official.png" alt="Screenshot of the Readwise Official plugin within Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Install it, and then enable it.&lt;/p&gt;
&lt;h2 id="connect-your-readwise-account-to-the-obsidian-plugin"&gt;Connect your Readwise account to the Obsidian plugin&lt;/h2&gt;
&lt;p&gt;Head back to the Settings menu and scroll down to the &amp;ldquo;Plugin Options&amp;rdquo; section, and then click Readwise Official.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-connect.png" alt="Screenshot of the initial screen of the Readwise Official plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Click connect as highlighted in orange above, and a browser window will open, showing the &lt;a href="https://readwise.io/export/obsidian/preferences"&gt;Obsidian Export&lt;/a&gt; options. You&amp;rsquo;ll need to sign into your Readwise account if you haven&amp;rsquo;t already.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-export.png" alt="Obsidian export page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;At this point, your Readwise account will have been connected to the Readwise Official plugin, but you won&amp;rsquo;t have triggered any syncs yet. If you don&amp;rsquo;t want to change any of the configuration settings, you can then skip ahead to triggering the sync on Obsidian, but let&amp;rsquo;s run through the options anyway.&lt;/p&gt;
&lt;h2 id="modifying-configuration-settings"&gt;Modifying configuration settings&lt;/h2&gt;
&lt;p&gt;On the Obsidian Exports page, you&amp;rsquo;ll be presented with a few options.&lt;/p&gt;
&lt;h3 id="group-files-in-category-folders"&gt;Group Files in Category Folders&lt;/h3&gt;
&lt;p&gt;By default, this will be enabled. When enabled, Readwise will put your highlights in different folders depending on its source. For example, Kindle highlights will appear in the folder &lt;code&gt;Books&lt;/code&gt;. Disabling this option means all new notes will be created in the directory specified in the Obsidian plugin settings, which we&amp;rsquo;ll cover later. I left this enabled in case I read a book that has the same name as a blog post about the book, for example.&lt;/p&gt;
&lt;h3 id="use-custom-formatting"&gt;Use Custom Formatting&lt;/h3&gt;
&lt;p&gt;Custom formatting is disabled by default, and lets you choose how the final note looks. Here are the things you can change in this section&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Page title&lt;/li&gt;
&lt;li&gt;Page metadata&lt;/li&gt;
&lt;li&gt;Highlights header&lt;/li&gt;
&lt;li&gt;Highlight&lt;/li&gt;
&lt;li&gt;YAML front matter&lt;/li&gt;
&lt;li&gt;Sync notification&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I did make some changes in this section just to tweak how I want information to be displayed.&lt;/p&gt;
&lt;h4 id="page-metadata"&gt;Page metadata&lt;/h4&gt;
&lt;p&gt;I don&amp;rsquo;t see the need for Page metadata since this is what I use YAML front matter for, so I removed the matadata section and the document tags (I never use those either). So my Page metadata section looks like this:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;{% if image_url -%}
![rw-book-cover]({{image_url}})
{% endif -%}
{% if url -%}
URL: {{url}}
{% endif -%}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="highlight"&gt;Highlight&lt;/h4&gt;
&lt;p&gt;By default, highlights are entered in bullet-point form. That&amp;rsquo;s fine when &lt;em&gt;I&amp;rsquo;m&lt;/em&gt; taking notes, but when I&amp;rsquo;m highlighting someone else&amp;rsquo;s words, I like to be very careful to use blockquotes. I frequently do block searches in Obsidian, and I do NOT want to accidentally pass off a quote as something I said.&lt;/p&gt;
&lt;p&gt;To this end, I added a &lt;code&gt;&amp;gt;&lt;/code&gt; before each highlight and two newlines (carriage returns) at the end to delineate each highlight. That way, I can quote just one highlight at a time.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;&amp;gt; {{ highlight_text }}{% if highlight_location and highlight_location_url %} ([{{highlight_location}}]({{highlight_location_url}})){% elif highlight_location %} ({{highlight_location}}){% endif %}{% if highlight_note %}
- Note: {{ highlight_note }}{% endif %}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;As you can see above, I also removed highlight tags, which I never use.&lt;/p&gt;
&lt;h4 id="yaml-front-matter"&gt;YAML front matter&lt;/h4&gt;
&lt;p&gt;Metadata has to be quite specific, so I added parameters I already use for other notes in this section. The &lt;code&gt;TVZ&lt;/code&gt; is a tag I use that means &amp;ldquo;To Verzettelen&amp;rdquo;, meaning pages that I need to process further.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Title: {{full_title}}
Author: {{author}}
Tags: TVZ, readwise, {{category}}
date: {{date}}
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="sync-notification"&gt;Sync notification&lt;/h4&gt;
&lt;p&gt;As someone who has worked on a syncing plugin for Readwise to Obsidian, I know that things go wrong sometimes. Enabling this outputs a synchronization log to a note, which has come in handy MANY times in the past. &lt;em&gt;Has that book been synced, or did something go wrong?&lt;/em&gt; So I copied what the Readwise team suggested:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- [[{{date|date(&amp;#39;Y-m-d&amp;#39;)}}]] {{time}} — Synced {{num_highlights}} highlight{{num_highlights|pluralize}} from {{num_books}} document{{num_books|pluralize}}.
{% for book in books %} - {{ book.num_highlights_added}} highlights from {{ book.title }}
{%endfor %}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="select-items-to-be-exported"&gt;Select Items to be Exported&lt;/h3&gt;
&lt;p&gt;In this section, you can choose which books/podcasts/other content in Readwise you want to export. It is disabled by default. If you haven&amp;rsquo;t synced Readwise to Obsidian before, and you just want to pull in everything, leave it disabled.&lt;/p&gt;
&lt;p&gt;In my case, I have already synchronized everything using the plugin I mentioned, and didn&amp;rsquo;t want to create another few hundred duplicate notes in my vault. So I enabled it and selected a few more recent books.&lt;/p&gt;
&lt;p&gt;A weird thing about this Export settings page is that there is no saving&amp;ndash; it just automatically saves it. Just a note, because I was scrolling up and down that page looking for an indication that it had been saved before I realized it is done automatically.&lt;/p&gt;
&lt;h2 id="initiate-sync-from-obsidian"&gt;Initiate Sync from Obsidian&lt;/h2&gt;
&lt;p&gt;Head back to Obsidian and to the Readwise Official plugin options page. You should see a &amp;ldquo;Initiate Sync&amp;rdquo; button where the &amp;ldquo;Connect&amp;rdquo; one was before.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-initiate.png" alt="Screenshot of Initiate Sync button" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s a good sign - that means your Readwise account has been connected, and your configuration settings from the previous step will be fetched.&lt;/p&gt;
&lt;p&gt;Before you click the button, note that the &lt;em&gt;Customize base folder&lt;/em&gt; option is set to &lt;code&gt;Readwise&lt;/code&gt;. This is the directory that all your Readwise notes will be created. So if you enabled &lt;em&gt;Group Files in Category Folders&lt;/em&gt; earlier, your Kindle highlights will be saved in &lt;code&gt;Readwise/Books/booktitle.md&lt;/code&gt;. You can change the base folder if you prefer, but I just kept the default.&lt;/p&gt;
&lt;p&gt;Time to click the button!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-synced.png" alt="Screenshot of synced status from Readwise plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll see a few messages popping up on the upper right corner of your screen, and you&amp;rsquo;ll also see a &lt;em&gt;Synced!&lt;/em&gt; message appear next to the button you just clicked.&lt;/p&gt;
&lt;h2 id="verifying-results"&gt;Verifying results&lt;/h2&gt;
&lt;p&gt;In your Obsidian vault, search for one of the items you synced. Here&amp;rsquo;s what my note for Pat Flynn&amp;rsquo;s &lt;em&gt;Superfans&lt;/em&gt; looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-obsidian-kindle.png" alt="An example of Kindle highlights imported to Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Great! It looks exactly how I want it to look.&lt;/p&gt;
&lt;h2 id="set-up-automatic-sync"&gt;Set up automatic sync&lt;/h2&gt;
&lt;p&gt;If you leave it there, the plugin will only sync when you tell it to, so you&amp;rsquo;d need to go into the plugin options each time. That&amp;rsquo;s not particularly useful for me, because I want it to just happen.&lt;/p&gt;
&lt;p&gt;If you feel similarly, head back into Plugin Options one more time and select your desired frequency in the &lt;em&gt;Configure resync frequency&lt;/em&gt; dropdown menu. I chose 1 hour, the minimum. I also enabled the automatic sync when Obsidian opens.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/readwise-official-auto-sync.png" alt="Screenshot of auto sync options for Readwise Official plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I love this new plugin! It was very much needed, because existing options for accomplishing the same thing were flawed in some way, mainly because they were community-driven&amp;ndash; meaning the people who created these workarounds (myself included) were &amp;ldquo;just&amp;rdquo; users who had other jobs. I&amp;rsquo;m grateful that the Readwise team has acknowledged the popularity of Obsidian and taken on the maintenance burden. I&amp;rsquo;ve experimented with the plugin quite a bit and haven&amp;rsquo;t found any major issues so far. It is a seamless way to get the best of the content I&amp;rsquo;ve consumed from various sources into one single source of truth: Obsidian. I highly recommend it to anyone looking to streamline content processing and creation processes.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>How I use Obsidian for D&amp;D - Player's Edition</title><link>https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/</link><pubDate>Mon, 09 Aug 2021 17:46:51 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210809-dnd-obsidian-player/</guid><description>
&lt;meta property=“og:image” content="/assets/Forgotten-Realms-workspace-in-Obsidian.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;I&amp;rsquo;ve previously written about &lt;a href="https://nicolevanderhoeven.com/blog/20210518-how-i-use-obsidian-at-work/"&gt;how I use Obsidian for work&lt;/a&gt;, and I&amp;rsquo;ve also talked about &lt;a href="https://nicolevanderhoeven.com/blog/20201214-roam-for-dnd/"&gt;how I use Roam Research for D&amp;amp;D&lt;/a&gt;. Shortly after the latter post, however, I moved to Obsidian. That was six months ago, so I thought it was time for an update.&lt;/p&gt;
&lt;h2 id="before-the-game"&gt;Before the game&lt;/h2&gt;
&lt;h3 id="world"&gt;World&lt;/h3&gt;
&lt;p&gt;My World page is the main jumping-off point for all my notes for a specific campaign, and each campaign gets one. It contains:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The main locations in the world&lt;/li&gt;
&lt;li&gt;The player characters, and links to their individual pages with information about what my character knows or thinks of them&lt;/li&gt;
&lt;li&gt;A link to Open Loops (Quests and Questions and Agenda, as discussed below)&lt;/li&gt;
&lt;li&gt;The list of all the sessions I&amp;rsquo;ve played for the campaign&lt;/li&gt;
&lt;li&gt;Campaign-specific house rules that the DM has introduced&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/world-page.png" alt="The World page for my Forgotten Realms campaign" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="quests-and-questions"&gt;Quests and Questions&lt;/h3&gt;
&lt;p&gt;I like to play high-intelligence characters, so I like to keep track of unanswered questions and other adventure hooks my DM has dropped that the party hasn&amp;rsquo;t quite gotten around to resolving yet. Some of them are critical quest or story arcs, and others are random tidbits of information that NPCs have mentioned. I organize them by location, and then by quest, so that it&amp;rsquo;s easy to follow a thread depending on where the party is or how much downtime we have. Here&amp;rsquo;s an example of that page:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/quests-and-questions.png" alt="Quests and Questions page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="agenda"&gt;Agenda&lt;/h3&gt;
&lt;p&gt;While the Quests and Questions page records unfinished business that my character is actively thinking about but may not quite know how to explore yet, my Agenda page is where I write down specific tasks. I loosely follow the &lt;a href="https://gettingthingsdone.com/"&gt;Getting Things Done&lt;/a&gt; methodology and divide this page into Next Actions and Waiting For. I group tasks by person and/or by location.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Agenda-sample.png" alt="Agenda page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I use the Obsidian &lt;a href="https://github.com/DahaWong/obsidian-completed-area"&gt;Completed Area plugin&lt;/a&gt; so that hitting a CTRL + ENTER on a task automatically checks it and then moves that task to a separate Completed section at the bottom of the note. This helps me keep the agenda clean and relevant.&lt;/p&gt;
&lt;h2 id="during-a-game"&gt;During a game&lt;/h2&gt;
&lt;h3 id="workspace"&gt;Workspace&lt;/h3&gt;
&lt;p&gt;One of the best parts about Obsidian is that it allows me to save and load custom workspaces. This is useful because I use Obsidian for work as well as play, so I can set up the two workspaces differently. I also DM one campaign and play in another, and I have a workspace for each of them because I need different information available to me. The workspace features lets me customize my dashboard. Here&amp;rsquo;s what my workspace looks like for the 4e game that I play in:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Forgotten-Realms-workspace-in-Obsidian.png" alt="My Forgotten Realms campaign workspace in Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;At the beginning of a game, I&amp;rsquo;ll create a new session page in the last pane, enter into it, and then stay in the workspace for the rest of the game. I have my character&amp;rsquo;s stats sheet handy (which I need to do manually since I haven&amp;rsquo;t found a D&amp;amp;D Beyond-like service for 4e) and all the powers and abilities I need to refer to.&lt;/p&gt;
&lt;h3 id="session-template"&gt;Session template&lt;/h3&gt;
&lt;p&gt;I love Obsidian templates! I use templates for things like inserting an HP tracker with all my party&amp;rsquo;s names, their max HP, healing surges (4e); a defense table to keep track of a creature&amp;rsquo;s defenses (again, 4e); and campaign-specific session log formats.&lt;/p&gt;
&lt;p&gt;At the beginning of the game, I&amp;rsquo;ll create a new page in the Session List, click into it, and insert a session log template (I have this hotkeyed to CMD+&lt;code&gt;;&lt;/code&gt;). Here&amp;rsquo;s what a fresh one looks like, in Edit mode:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/session-template-fresh.png" alt="My session template, newly inserted" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I add metadata to every session so that I can query it later using the excellent &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Obsidian Dataview plugin&lt;/a&gt;, though I do this more often for the campaign I DM rather than the one I play in.&lt;/p&gt;
&lt;p&gt;We usually do a recap at the beginning of the game, so I jump into the &lt;code&gt;Recap of the last session&lt;/code&gt; section and embed the summary from the previous session using &lt;code&gt; ![](/assets/86_20210717 Day 16 Hunting the Ice Phase Spider#^summary)&lt;/code&gt;, which pulls in the section marked with &lt;code&gt;^summary&lt;/code&gt; from the last session. That embeds just that portion of the last session in the current session, like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Recap.png" alt="Session recap using block embed" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This helps me get back up to speed quickly instead of doing the usual &amp;ldquo;Where were we again?&amp;rdquo; that takes up time.&lt;/p&gt;
&lt;h3 id="hp-table"&gt;HP table&lt;/h3&gt;
&lt;p&gt;My character is a multiclassed healer, so it&amp;rsquo;s important for me to know who needs heals or other buffs. I keep track of this separately, and it helps out my DM as well because it&amp;rsquo;s easy to miss something in the excitement of a battle. I do include the HP table in my workspace, in Preview mode, but here&amp;rsquo;s what it looks like in Edit mode:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/HP-table.png" alt="A table of the party’s HP, surges, and conditions" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Tables in Markdown can be a pain, but the &lt;a href="https://github.com/tgrosinger/advanced-tables-obsidian"&gt;Advanced Tables plugin&lt;/a&gt; goes a long way towards making this easier by adding some nice features like tabbing to the next cell, adding commands for inserting and deleting a column or row, and just automatically formatting a table so that it&amp;rsquo;s not a jumble of lines. I also heavily use this plugin for my characters stats and skills, both of which I keep in tables.&lt;/p&gt;
&lt;h3 id="keeping-track-of-fights"&gt;Keeping track of fights&lt;/h3&gt;
&lt;p&gt;When a fight breaks out, I insert an intiative template, which is just a list of all the characters in the party:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Initiative!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Ka&amp;#39;ira
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Maestro
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Xio
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Eraithe
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; Keren
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This makes it easier to add the initiative value rolled, as well as that of any other baddies we&amp;rsquo;re fighting. I use the &lt;a href="https://github.com/vslinko/obsidian-outliner"&gt;Outliner plugin&lt;/a&gt; to be able to easily move people on the list up or down as needed without having to copy or paste. I have the shortcuts set to CMD+SHIFT+UP and CMD+SHIFT+DOWN so I don&amp;rsquo;t even need to use my mouse.&lt;/p&gt;
&lt;p&gt;I also have a template for Defenses. D&amp;amp;D 4th Edition has four different kinds of defenses, and since my character&amp;rsquo;s powers target a few of them, I keep track of the defenses of each monster. Here&amp;rsquo;s what that template looks like, in Edit mode:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| Defense | Value |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| --------------------- | ----- |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| [[Reflex Defense]] | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| [[Fortitude Defense]] | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| [[Will Defense]] | |
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;| [[Armor Class]] | |
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;ll notice that I also link to the pages I have for each defense type, in case I need to remind myself which stat a defense is comprised of.&lt;/p&gt;
&lt;h3 id="character-powers"&gt;Character powers&lt;/h3&gt;
&lt;p&gt;Like many, I have migrated from playing games on a literal tabletop to doing it virtually. These days, I play 100% online, using a bunch of different tools. For the most part, though, I still prefer to roll actual dice. There&amp;rsquo;s just something satisfying about the feel of a die in my hand. Since I switched to Obsidian, though, I have looked into virtual dice. On the off chance I don&amp;rsquo;t have any dice (ha) or all my dice have betrayed me (much more likely), I use the &lt;a href="https://github.com/valentine195/obsidian-dice-roller"&gt;Dice Roller plugin&lt;/a&gt;. It turns&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;`dice: 1d20+7`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;into a random die roll. Here it is when incorporated into my character&amp;rsquo;s list of powers:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/powers-sample.png" alt="My character’s powers page" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Sometimes, when I&amp;rsquo;m feeling superstitious about my dice, I&amp;rsquo;ll switch to using this dice roller &amp;ldquo;just to be safe&amp;rdquo;. It has other cool features too, which I&amp;rsquo;ll cover more in detail in the Dungeon Master&amp;rsquo;s edition of this article.&lt;/p&gt;
&lt;h3 id="search-linked-unlinked-mentions"&gt;Search, linked, unlinked mentions&lt;/h3&gt;
&lt;p&gt;Frequently, something comes up in a game that I&amp;rsquo;m &lt;em&gt;sure&lt;/em&gt; we&amp;rsquo;ve heard of before, but I can&amp;rsquo;t quite remember where or when. Actually, sometimes something comes up that I&amp;rsquo;m quite sure we&amp;rsquo;ve &lt;em&gt;never&lt;/em&gt; heard of before, but it turns out we have. Luckily, Obsidian is quick to tell me that using the linked/unlinked mentions and the search features.&lt;/p&gt;
&lt;p&gt;Here are the mentions in my note for the word &amp;ldquo;Netheril&amp;rdquo;:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/Netheril-mentions.png" alt="Linked mentioned for the word Netheril" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Unlinked mentions show up too, in case the word came up somewhere and I didn&amp;rsquo;t think to specifically create a page on it.&lt;/p&gt;
&lt;p&gt;On monster pages, mentions remind me when we fought them last, and any tips for fighting them. It can be handy when one of the other players has forgotten something that happened to them, too. If I want to remember how Ka&amp;rsquo;ira got her festering wound, I can type it into the Obsidian search bar:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/festering-wound.png" alt="A search in Obsidian for “festering wound”" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;and be able to confidently say that Ka&amp;rsquo;ira got her last festering wound on session 68, in the Blue Crystal Fortress that we now know to be the Twisted Fane, while fighting aberrations.&lt;/p&gt;
&lt;h2 id="after-a-game"&gt;After a game&lt;/h2&gt;
&lt;p&gt;I think I might use Obsidian even more between games than during the game, because after the game is when I process everything my character learned.&lt;/p&gt;
&lt;h3 id="session-summary"&gt;Session summary&lt;/h3&gt;
&lt;p&gt;Immediately after the game is when I create a short session summary. I like to do this when the session is still fresh in my mind. Then, I add &lt;code&gt;^summary&lt;/code&gt; at the end of the paragraph to identify it and to be able to pull it into the next session&amp;rsquo;s recap. Block references and block embeds are some of my most frequently used Obsidian features.&lt;/p&gt;
&lt;h3 id="creating-new-pages"&gt;Creating new pages&lt;/h3&gt;
&lt;p&gt;I then create new pages for any people, places, magical items, or events that we encountered. I like to use a standard frontmatter:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
type:
location: [Neverwinter]
world: &amp;#34;Forgotten Realms&amp;#34;
campaign: &amp;#34;Order of the Wandering Mind&amp;#34;
date: 2021-06-23
---
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here&amp;rsquo;s an example of the page for an NPC:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/npc-sample.png" alt="An NPC page in my campaign" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;If my DM has given us character art, I include it in the page.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s an example of a page for a location:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/twisted-fane-location-example.png" alt="Location page: Twisted Fane" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;For this page, I used a plugin called &lt;a href="https://github.com/valentine195/obsidian-leaflet-plugin"&gt;Obsidian Leaflet&lt;/a&gt;, which lets me add maps to my notes! In this case, my DM gave us this map of the structure as a guide, but during combats we didn&amp;rsquo;t use a map. To keep myself oriented between games, I added red pawprint pins where we had spotted or fought monsters, green thumbtacks to mark where we&amp;rsquo;d ended sessions, and green markers where we had spotted allies. I also like to add links to monsters or sessions on the pins/markers so that I can jump to those pages quickly if I need to.&lt;/p&gt;
&lt;h3 id="history"&gt;History&lt;/h3&gt;
&lt;p&gt;To keep historical events straight in my head, especially since we tend to discover them out of sequence, I use the &lt;a href="https://github.com/Darakah/obsidian-timelines"&gt;Obsidian Timelines plugin&lt;/a&gt;, which lets me create pages like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-timeline-for-dnd.png" alt="Obsidian Timeline in my game" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;by using this code in the timeline page:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;``&lt;span style="color:#e6db74"&gt;`timeline
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;fr
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt;\`&lt;/span&gt;``
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(without the backtick) and this for every event that I want to include:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;date&lt;/span&gt;: [&lt;span style="color:#e6db74"&gt;2021-06-23&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;tags&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;timeline, fr]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;---
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;span
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; class=&amp;#39;ob-timelines&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-date=&amp;#39;1443-00&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-title=&amp;#39;Xionerys is born&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-class=&amp;#39;orange&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-img = &amp;#39;assets/xionerys.jpg&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-type=&amp;#39;range&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; data-end=&amp;#39;1443-00&amp;#39;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Xionerys is born in Calimshan.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;/span&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using this method, I&amp;rsquo;ve been able to call out discrepancies in what two different NPCs told us and figure out that one was lying&amp;ndash; or at least misinformed.&lt;/p&gt;
&lt;h3 id="replace-all"&gt;Replace all&lt;/h3&gt;
&lt;p&gt;When I inevitably get a fantasy name wrong, having pages as flat .md files is great because I can do a find and replace on ALL mentions of a certain NPC name/place I&amp;rsquo;ve misspelled (those fantasy names!). I do this with my usual code/text editor, VSCode, just because I usually already have it up, but you can do it using terminal commands. If it&amp;rsquo;s just the name of a page, updating the spelling in Obsidian changes it everywhere else it&amp;rsquo;s linked to as well, which is useful.&lt;/p&gt;
&lt;h3 id="updating-open-loops"&gt;Updating open loops&lt;/h3&gt;
&lt;p&gt;To finish processing the last session, I update Open Loops: I add new points or update existing points in Quests and Questions, and then add tasks to Agenda that I want to do in the next session. I find that it&amp;rsquo;s best to do it after a game because it&amp;rsquo;s a week, sometimes more, between games and there&amp;rsquo;s a high likelihood I&amp;rsquo;ll have forgotten what I want to do by then!&lt;/p&gt;
&lt;h3 id="publish"&gt;Publish&lt;/h3&gt;
&lt;p&gt;I also publish my D&amp;amp;D notes, just for transparency. My DM has joked that he looks in there sometimes when he&amp;rsquo;s forgotten something. Even if he doesn&amp;rsquo;t, I enjoy having my notes so easily accessible. I often navigate there myself when I have a spare moment, remembering old sessions and thinking about some loose threads. If you&amp;rsquo;re interested, &lt;a href="https://notes.nicolevanderhoeven.com/TTRPGs/Order+of+the+Wandering+Mind/World"&gt;here they are&lt;/a&gt;! Just be warned that the plugins won&amp;rsquo;t work in the web version, so sometimes you&amp;rsquo;ll come across bits of code that didn&amp;rsquo;t render. I also migrated these notes from Roam Research, and haven&amp;rsquo;t gone back and updated all the older notes.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Since I&amp;rsquo;ve switched to Obsidian, it&amp;rsquo;s been an indispensable part of my workflow for D&amp;amp;D. Without it, I&amp;rsquo;d be just another murder hobo with no notes. And no DM wants that!&lt;/p&gt;</description></item><item><title>Realistic load testing</title><link>https://nicolevanderhoeven.com/blog/20210807-clubhouse-realistic-load-tests/</link><pubDate>Sat, 07 Aug 2021 22:15:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210807-clubhouse-realistic-load-tests/</guid><description>&lt;p&gt;This is a conversation I recorded from Clubhouse in the Performance Engineers group created by NaveenKumar Namachivayam today, August 7th, 2021. I started by introducing myself and then let everyone know that I would be recording the conversation. Enjoy!&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed/episode/5MJaz2PAhYfy5FShrIaXUK" width="100%" height="232" frameBorder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/-hBVZqNJ4_A?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How we work at k6 - building software &amp; working remotely with CTO Pawel Suwala (k6 Office Hours #23)</title><link>https://nicolevanderhoeven.com/blog/20210806-koh23-pawel/</link><pubDate>Fri, 06 Aug 2021 18:09:05 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210806-koh23-pawel/</guid><description>&lt;p&gt;For this episode of k6 Office Hours, I got the k6 Chief Technical Officer, Pawel Suwala, to give a bit of a behind-the-scenes of how we work at k6 and what we&amp;rsquo;re working on next. We talked about the methodology we use for building k6, the different teams we have, and exciting new features that are coming soon!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/95PP2zwMlc0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Balkan Bites free food tour with Bulgarian food | Sofia, Bulgaria (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20210806-ld108-balkan-bites/</link><pubDate>Fri, 06 Aug 2021 13:01:44 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210806-ld108-balkan-bites/</guid><description>&lt;p&gt;In September 2018, while my husband and I were in Sofia, Bulgaria, we decided to try some delicious Bulgarian cuisine by going on the Balkan Bites free food tour, which let us try Bulgarian relish, yoghurt, doughnuts, cheese, and desserts. Afterwards we went back to one of the restaurants we had gone to on the food tour to have a full meal, which ended up being very delicious. Along the way, I talked about how ilearned the Cyrillic alphabet, and why I thinks it&amp;rsquo;s worth learning even for a short trip like this one.&lt;/p&gt;
&lt;p&gt;We really enjoyed the &lt;a href="https://balkanbitesfoodtours.com/"&gt;Balkan Bites food tour&lt;/a&gt;, so if you want to join as well, check them out.&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the website for the restaurant we ate at, &amp;ldquo;&lt;a href="https://www.kashtite.com/en/"&gt;Hadjidraganov&amp;rsquo;s House&lt;/a&gt;&amp;rdquo;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vFYAuu16Pg0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Schrödinger's Pokémon: Observability for chaotic load testing (New Relic FutureStack)</title><link>https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/</link><pubDate>Sun, 01 Aug 2021 18:54:27 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210730-schrodingers-pokemon/</guid><description>&lt;p&gt;This is a presentation I gave at &lt;a href="https://newrelic.com/futurestack/speakers/nicole-van-der-hoeven"&gt;New Relic FutureStack 2021&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Deploying an application to production is often like putting a pokémon in a box and hoping it manages to stay alive despite real-world chaos and potential outages. What can we, as testers, do to prepare applications for these situations before they go live? In this talk, I discuss chaos engineering concepts and demonstrates how to apply them by incorporating load tests with chaos experiments and setting up observability tools to watch it all happen. Because without observability, how can we tell whether Schrödinger&amp;rsquo;s pokémon is alive or dead?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/356yC-DOSmo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Free walking tour in Sofia, Bulgaria (LuckyDippers)</title><link>https://nicolevanderhoeven.com/blog/20210730-ld-sofia/</link><pubDate>Fri, 30 Jul 2021 16:00:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210730-ld-sofia/</guid><description>&lt;p&gt;We haven&amp;rsquo;t travelled since January 2020 for obvious reasons, but fortunately (?) I have a whole lot of footage taken from trips pre-pandemic that I haven&amp;rsquo;t yet turned into travel vlogs. In case you weren&amp;rsquo;t aware, I learned a lot of what I know now about creating videos from making travel vlogs for friends and family as my husband and I travelled around the world for months at a time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a trip we took in September 2018. We had just finished off a trip to Greece with some friends from Australia, and on the way home, I decided to book a three-day stopover in Sofia, Bulgaria&amp;ndash; a city I really knew next to nothing about. Here&amp;rsquo;s that first day!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/36u9HeLwZ78?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>A tester's overview of Grafana Labs open-source projects</title><link>https://nicolevanderhoeven.com/blog/20210719-grafana-labs-overview/</link><pubDate>Mon, 19 Jul 2021 18:23:33 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210719-grafana-labs-overview/</guid><description>&lt;p&gt;Since the acquisition of k6 by Grafana Labs, the entire k6 team has been absorbed into the new, larger team that we&amp;rsquo;re suddenly a part of. Grafana Labs maintains a lot of projects, so I was very quickly overwhelmed with things to learn about all of them. Here&amp;rsquo;s my attempt to make sense of the Grafana Labs landscape, and perhaps it can help some of you as well:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_DB-lNZW7LQ?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Shopping at Bicester Village and welcome my niece to her new home | London, England (Lucky Dippers)</title><link>https://nicolevanderhoeven.com/blog/20210716-bicester-village/</link><pubDate>Fri, 16 Jul 2021 18:38:17 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210716-bicester-village/</guid><description>&lt;p&gt;Here&amp;rsquo;s a fun little vlog that I&amp;rsquo;ve been meaning to make of the last trip my husband Rob and I took before the pandemic. In January 2020, we went to see my cousin and her daughter (my &amp;ldquo;niece&amp;rdquo;, whom I grew up with) in London. My niece, Steffi, had just arrived in London for some studies abroad (she normally lives in the Philippines), so Rob and I popped over to meet up with her and help her settle in.&lt;/p&gt;
&lt;p&gt;Poor thing&amp;ndash; not a month after Steffi got to London, news of the pandemic began to spread. Rob and I had intended to visit her again, but of course that didn&amp;rsquo;t happen.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fQf7niizW_Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to run distributed load tests with k6 Operator (k6 Office Hours #21)</title><link>https://nicolevanderhoeven.com/blog/20210716-koh-k6-operator/</link><pubDate>Fri, 16 Jul 2021 18:17:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210716-koh-k6-operator/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I talked about the &lt;a href="https://github.com/grafana/k6-operator"&gt;k6 Operator&lt;/a&gt;, which is a open-source project that Simme created for distributed load testing with k6.&lt;/p&gt;
&lt;p&gt;k6 Cloud already offers a no-hassle distributed load testing experience, but for those who prefer to use their own infrastructure, k6 Operator allows the setup of a k6 test as a custom resource object that can be deployed along with a Kubernetes cluster.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/KPyI8rM3LvE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to add performance testing to CI/CD pipelines using k6 and GitHub Actions</title><link>https://nicolevanderhoeven.com/blog/20210712-github-actions/</link><pubDate>Mon, 12 Jul 2021 22:26:20 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210712-github-actions/</guid><description>&lt;p&gt;Continuous testing means verifying and improving software quality at all stages, including development. It can sound like something only large companies do, but it&amp;rsquo;s an approach I use even for this personal blog that you&amp;rsquo;re reading this on.&lt;/p&gt;
&lt;p&gt;Every new blog post or change I make to this site automatically triggers the execution of a small test. This test, when run over time, lets me see whether changes I&amp;rsquo;ve made have been detrimental to site performance. Here&amp;rsquo;s a video on my setup:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GzR2Z25-Yqo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Gear I Use</title><link>https://nicolevanderhoeven.com/gear/</link><pubDate>Mon, 12 Jul 2021 21:18:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/gear/</guid><description>&lt;h1 id="gear-i-use"&gt;Gear I Use&lt;/h1&gt;
&lt;p&gt;One of my favorite obsessions is watching or reading about the gear other people use. I&amp;rsquo;ve watched almost every &amp;ldquo;What&amp;rsquo;s in my tech bag&amp;rdquo; video on YouTube, it feels like, and I&amp;rsquo;m always prowling blog posts that detail what someone is using. In case there&amp;rsquo;s anybody out there that is as interested in these things as I am, here&amp;rsquo;s an overview of the gear that I use to make videos, write both blog posts and code, and generally mess around on the internet.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: After a reader suggested I provide links to these items, I&amp;rsquo;ve included them below, and some are affiliate links. You are under no obligation to click these links, but if you do, I get a tiny percentage of the sale. Thanks!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="sections"&gt;Sections&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s a lot here! I&amp;rsquo;ve broken it down into sections, so you can skip to the section you&amp;rsquo;re interested in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#daily-hardware"&gt;Daily hardware&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#home-office-1-the-netherlands"&gt;Home Office 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#home-office-2-portugal"&gt;Home Office 2&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#my-everyday-carry"&gt;Everyday Carry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#my-remote-working-tech-bag"&gt;Remote Working Tech Bag&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#my-remote-work-setup-for-a-month"&gt;Remote Work Setup for a month&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="daily-hardware"&gt;Daily hardware&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Here are the main devices I use every day.&lt;/p&gt;
&lt;h3 id="computers"&gt;Computers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3uOnkJ0"&gt;Macbook Air 15&amp;quot; (2023)&lt;/a&gt;: 24 GB RAM, 2TB SSD, M2 chip - this is my main workhorse&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZggnG"&gt;Macbook Pro 13&amp;quot; (2020)&lt;/a&gt;: 2,3 GHz Quad-Core Intel Core i7, 32 GB RAM - secondary laptop&lt;/li&gt;
&lt;li&gt;Mac Mini (&lt;a href="https://amzn.to/3t3B968"&gt;later version here&lt;/a&gt;): M1 chip, 16GB RAM, 1 TB SSD - desktop, always on&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="mobiles"&gt;Mobiles&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/47FaefX"&gt;Samsung Galaxy Z Fold 5&lt;/a&gt;: 512GB - my main mobile, always with me&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.apple.com/iphone-15-pro/"&gt;Apple iPhone 15&lt;/a&gt;: Pro Max - secondary mobile, always with me&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CfKxmH"&gt;Samsung Galaxy Note 10+&lt;/a&gt;: extra mobile&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tablets"&gt;Tablets&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CgzR7E"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt; (2020) tablet - still works great!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="readers"&gt;Readers&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3GrSbOc"&gt;Amazon Kindle Scribe&lt;/a&gt;: my couch reader, for nonfiction and PDFs&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xsRwFy"&gt;Amazon Kindle Oasis&lt;/a&gt;: my bed reader, for fiction&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/46LEZ1k"&gt;Kobo Sage&lt;/a&gt;: for non-Amazon ebooks&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="wearables"&gt;Wearables&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://ouraring.com/product/heritage-silver/step1"&gt;Oura&lt;/a&gt;: health and sleep tracking ring&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/417Szev"&gt;Samsung Galaxy Watch 6&lt;/a&gt;: smartwatch&lt;/li&gt;
&lt;li&gt;American Express Prada wearable (not available for purchase separately): for contactless payments&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="audio"&gt;Audio&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/47RdhBo"&gt;Apple AirPods Pro&lt;/a&gt;: second generation, for Apple products&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3p6OHLJ"&gt;Bose QuietComfort Earbuds II&lt;/a&gt;: for non-Apple products&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="home-office-1-the-netherlands"&gt;Home Office 1 (the Netherlands)&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/gear-study.JPG" alt="A photo of my home office on any given day" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="video-production-gear"&gt;Video production gear&lt;/h3&gt;
&lt;h4 id="not-on-desk"&gt;Not on desk&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jcSNva"&gt;Elgato green screen&lt;/a&gt; (long, black metal object on the left side of the photo, on the floor)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ltqOdy"&gt;Canon 6D Mark II&lt;/a&gt; with a &lt;a href="https://amzn.to/3rTm6XK"&gt;Canon 16-35mm f/2.8L&lt;/a&gt; (upper left, on tripod with teleprompter)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rQ1kIl"&gt;Manfrotto 290 tripod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2TQA3sD"&gt;TeleprompterPAD iLight Pro 10&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jiNpH1"&gt;Neewer 5-in-1 reflective reflector set&lt;/a&gt; (gold, silver, white, black, and transparent)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fpnkVC"&gt;Neewer two-way rotating aluminum light stand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jen4K2"&gt;Manfrotto universal smartphone clamp&lt;/a&gt; (mounted on light stand above desk)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2WSA3tt"&gt;Neewer Camera Monopod&lt;/a&gt; with rotating column for panoramic shooting&lt;/li&gt;
&lt;li&gt;2 x &lt;a href="http://en.nanlite.com/products/detail-174"&gt;Nanlite PavoTube 6C II&lt;/a&gt; tubes on the shelves in the background&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="on-desk"&gt;On desk&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fub99P"&gt;Aputure AL-MC&lt;/a&gt; portable light (attached magnetically to the back of my external monitor)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3foIliT"&gt;Blue Yeti&lt;/a&gt; microphone - (&lt;em&gt;pictured, but retired for the next item&lt;/em&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3EryDHu"&gt;Røde PodMic&lt;/a&gt; microphone - &lt;em&gt;my new main mic&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3s46hxv"&gt;Elgato Key Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3yi8VSp"&gt;Canon M50&lt;/a&gt; (between my laptop and monitor screens, used as my main webcam)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3A7HKdv"&gt;Elgato multi-mount&lt;/a&gt; (holding up the M50)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fv26FA"&gt;Blackmagic Atem Mini&lt;/a&gt; video switcher&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZfVRW"&gt;Røde Wireless Go&lt;/a&gt; wireless microphone (secondary microphone when I need to move around)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3m3JeSa"&gt;Rødecaster Pro&lt;/a&gt; for crispy audio on calls and videos&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2Vcj84H"&gt;Samsung Portable SSD T5, 1TB&lt;/a&gt; (always connected to my laptop) the drive I edit off&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZggnG"&gt;Macbook Pro 13&amp;quot; (2020)&lt;/a&gt;, 2,3 GHz Quad-Core Intel Core i7, 32 GB RAM - main laptop&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="not-pictured-but-in-frequent-use"&gt;Not pictured but in frequent use&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CmuLH1"&gt;Sony A6600&lt;/a&gt; with &lt;a href="https://amzn.to/3xn3ZKD"&gt;Sigma 16mm f1.4&lt;/a&gt; lens (main shooter, used to take this shot)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2Vc1A8R"&gt;Røde Wireless Go II&lt;/a&gt; two-person microphones (used as on-board camera mics)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fowSA0"&gt;SwitchPod tripod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.peakdesign.com/pages/travel-tripod"&gt;Peak Design Travel tripod&lt;/a&gt;: Pricy, but the only full tripod I use these days. Excellent for travel!&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="other-tech"&gt;Other tech&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3AbSrff"&gt;Synology DS920+&lt;/a&gt; 4 Bay NAS with 4 x &lt;a href="https://amzn.to/2VesKfg"&gt;WD RED 4TB&lt;/a&gt; drives (just outside the photo)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3iki732"&gt;Amazon Echo Dot&lt;/a&gt; (on the bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZh0Ju"&gt;Google Wifi&lt;/a&gt; wireless extender (just outside photo)&lt;/li&gt;
&lt;li&gt;2 x &lt;a href="https://amzn.to/3jcWy3K"&gt;Nintendo Switch&lt;/a&gt; (on bookshelf; one &lt;a href="https://amzn.to/3jgXK6h"&gt;Animal Crossing edition&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3A8PBr8"&gt;Nintendo Lite&lt;/a&gt; Zacien and Zamazenta edition (on bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xsRwFy"&gt;Amazon Kindle Oasis&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/37fVvur"&gt;Amazon Kindle Paperwhite&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://us.kobobooks.com/products/kobo-aura-one/"&gt;Kobo Aura One&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thomannmusic.com/risa_uke_solid_tenor.htm"&gt;Risa Electric Solid Tenor Ukulele&lt;/a&gt;, black (bookshelf)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="non-tech-gear"&gt;Non-tech gear&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wyrmwoodgaming.com/products/cherry-magnetic-dice-tower/"&gt;Wyrmwood Gaming Cherry magnetic dice tower bundle&lt;/a&gt; including dice tower, personal dice tray, and dice vault&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jioG5p"&gt;Kimi Rainbow Acrylic kalimba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CeHdIw"&gt;Visconti Homo Sapiens Lava&lt;/a&gt; Midi, steel age fountain pen (the only fountain pen of many that I use regularly)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/desksetup.jpg" alt="A photo of my the things on my desk" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="non-video-gear-on-my-desk"&gt;Non-video gear on my desk&lt;/h3&gt;
&lt;p&gt;I already listed the video-related gear on my desk in the first section above, but here&amp;rsquo;s everything else.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fst7JV"&gt;Samsung Galaxy S10&lt;/a&gt; (secondary phone, primarily for timelapses and overhead videos)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lrYgkl"&gt;Samsung Galaxy Wireless Buds&lt;/a&gt;, rose&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CfKxmH"&gt;Samsung Galaxy Note 10+&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lotmtj"&gt;Apple Macbook Air 11&amp;quot;&lt;/a&gt; (2011, used as my presentation laptop)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3inWn6g"&gt;Apple Magic Trackpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CgzR7E"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt; (2020) tablet&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nizkeyboard.com/collections/peripherals/products/niz-2019-new-atom-68-ec-bluetooth-keyboard-rgb-or-non-rgb?variant=30346364059719"&gt;Niz Plum Atom 68&lt;/a&gt; electro-capacitive keyboard with &lt;a href="https://www.etsy.com/listing/902250753"&gt;Pikachu keycap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xpYeMe"&gt;Logitech MX Master 3&lt;/a&gt; the best mouse I&amp;rsquo;ve used!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lt8rFi"&gt;Bose NC700&lt;/a&gt; wireless noise-cancelling headphones&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ouraring.com/product/heritage-silver/step1"&gt;Oura&lt;/a&gt; health and sleep tracking ring&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="home-office-2-portugal"&gt;Home Office 2 (Portugal)&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;I live between two countries: the Netherlands and Portugal. Since I spend a few months in each place, that also means I need a place to work in each apartment! My home office in Portugal is larger but definitely less well-equipped. It&amp;rsquo;s a little embarrassing, but I thought it would be interesting to show a more realistic, in-progress setup.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/portugal-home-office.jpeg" alt="A photo of my home office in Portugal" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Why yes, I do indeed have clothes hanging on a rack behind my desk to try and soak up sound.&lt;/p&gt;
&lt;h3 id="desk"&gt;Desk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Elgato Key Light Air x 2: I bought two of the smaller key lights than what I have in the Netherlands, because this room is larger and requires more light&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3M9LXot"&gt;Hidrate Spark Pro&lt;/a&gt;: bluetooth water bottle&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SK42vf"&gt;Samsung 32&amp;quot; 4K UHD monitor&lt;/a&gt;: a bit overkill on the size front, but nice&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fxf9cs"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt;: This is from 2020, but still going strong&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dRY3pi"&gt;Elgato Stream Deck MK.2&lt;/a&gt;: 15 programmable keys for shortcuts and macros&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rp6fAo"&gt;Keychron K6&lt;/a&gt;: hotswappable, RGB mechanical keyboard&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3UQdkaU"&gt;Logitech MX Anywhere 3&lt;/a&gt;: my travel mouse&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SHehAv"&gt;Blackmagic Atem Mini&lt;/a&gt;: my video switcher&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3E7gSzA"&gt;Røde Rodecaster Pro II&lt;/a&gt;: my audio mixer&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Sm6LLw"&gt;Røde PSA1&lt;/a&gt;: the best mic arm&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ftGRqD"&gt;Røde Podmic&lt;/a&gt;: great XLR microphone&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SoyTxK"&gt;Samsung Galaxy Note 10+&lt;/a&gt;: my secondary phone&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LU6g8Z"&gt;Baseus 17-in-1 USB-C Docking Station&lt;/a&gt;: for connecting my laptop to all the peripherals&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CmGNCc"&gt;Nintendo Switch Lite&lt;/a&gt; in coral: my travel gaming console&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.fully.com/accessories/jax-dual-monitor-arm.html"&gt;Fully monitor and laptop arm&lt;/a&gt;: arms to hold my monitor and laptop&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZggnG"&gt;Macbook Pro 13&amp;quot; (2020)&lt;/a&gt;: same laptop that I bring around with me&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CmuLH1"&gt;Sony A6600&lt;/a&gt; with &lt;a href="https://amzn.to/3xn3ZKD"&gt;Sigma 16mm f1.4&lt;/a&gt; lens (main camera that I take with me from the Netherlands)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CipwtH"&gt;SwitchPod DSLR Tripod&lt;/a&gt;: best travel tabletop tripod&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="free-standing"&gt;Free-standing&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.fully.com/standing-desks/jarvis.html?msclkid=9636778336e7157a372314b5f00325e1"&gt;Fully Jarvis standing desk&lt;/a&gt;: bamboo-topped motorized desk&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3BPFQR6"&gt;Neewer 77 inch tripod&lt;/a&gt;: basic tripod&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3C09bIC"&gt;Neewer Photo Studio Backdrop Support System&lt;/a&gt;: I hung an acoustic curtain and some clothes on this to help with echo for now&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="not-pictured"&gt;Not pictured&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fls6Gu"&gt;Samsung Galaxy Z Fold 3&lt;/a&gt;: used to take this photo&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="my-everyday-carry"&gt;My everyday carry&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;What about what I carry every day?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dddHAwrCpog?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xX8y1A"&gt;Samsung Galaxy Active 2&lt;/a&gt;: my smartwatch&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.etsy.com/listing/1108272100/critsuccess-d20-dice-ring-in-black"&gt;d20 spinner ring&lt;/a&gt;: a ring that acts like a 20-sided die for roleplaying games on the go&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fls6Gu"&gt;Samsung Galaxy Z Fold 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aersf.com/day-sling-3-xpac-black"&gt;Aer Day Sling 3 X-Pac&lt;/a&gt;: my sling bag of choice&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fnkTp6"&gt;Nitecore Tini 2 USB C flashlight&lt;/a&gt;: tiny USB-C rechargeable flashlight&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SuWBru"&gt;Nite-Ize locking S-biners&lt;/a&gt;: for a little extra security for zippers&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SyDpJI"&gt;Orbitkey holder&lt;/a&gt;: to hold my keys&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nanobag.net/"&gt;Nano bag 2.0&lt;/a&gt;: compactable bag&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3r7zGXK"&gt;Kable Card&lt;/a&gt;: all essential cables and adapters, a light, a mobile stand, and a memory card reader all in one card&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SfNP11"&gt;Aurtech bluetooth keyboard&lt;/a&gt;: portable bluetooth keyboard&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DWI6ZQ"&gt;Samsung Galaxy S Pen Fold Edition&lt;/a&gt;: stylus for my mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3RhiFoL"&gt;Sony WF 1000 XM3&lt;/a&gt;: wireless noise-cancelling earbuds&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3RgZrj4"&gt;Spigen Arc Powerstation 20W&lt;/a&gt;: small GaN charger&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LOwYA6"&gt;Secrid mini-wallet&lt;/a&gt;: my minimalist wallet&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dispeldice.com/collections/legacy/products/lavender-dreams-7-piece-polyhedral-set"&gt;Dispel Dice Lilac Song&lt;/a&gt;: a full-sized d20 I carry around&lt;/li&gt;
&lt;li&gt;&lt;a href="https://buttonshygames.com/collections/current-collection/products/sprawlopolis"&gt;Sprawlopolis&lt;/a&gt;: small cooperative card game&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SibAW9"&gt;LIE&lt;/a&gt;: fun party game for 2-6 players and is the size of a pack of gum&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.victorinox.com/us/en/Products/Swiss-Army-Knives/Small-Pocket-Knives/Jetsetter/p/0.6263"&gt;Victorinox Jetsetter&lt;/a&gt;: small, travel-friendly multitool&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.mightyhanks.com/index.php?route=product/category&amp;amp;path=29"&gt;Mighty Hanks&lt;/a&gt;: microfiber on one side, cotton on the other&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3DW1RRa"&gt;Burts Bees&lt;/a&gt;: lip balm&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3SDfc4H"&gt;Small red Sharpie&lt;/a&gt;: mini marker&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ClU7Xz"&gt;Joby Gorillapod GripTight Smartphone Micro Tripod&lt;/a&gt;: tripod for my mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3dIL4pR"&gt;Samsung Galaxy Note 10+&lt;/a&gt;: secondary mobile&lt;/li&gt;
&lt;li&gt;&lt;a href="https://topodesigns.com/products/accessory-bags?variant=39887314157621"&gt;Topo designs micro pouch&lt;/a&gt;: small pouch&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LOOeoD"&gt;Tile Mate Pro&lt;/a&gt;: bluetooth tracker&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shop.trezor.io/product/trezor-model-t"&gt;Trezor Model T&lt;/a&gt;: hardware wallet and security key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="my-remote-working-tech-bag"&gt;My Remote Working Tech Bag&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;If I need to go somewhere to work, my EDC bag won&amp;rsquo;t cut it! Here&amp;rsquo;s what I bring with me to work and play remotely:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/fBEJM-31cjs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.aersf.com/special-projects"&gt;Aer x Ministry of Supply Lunar Pack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Platypus soft bottle. &lt;a href="https://amzn.to/3TWaEH1"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3gupCGD"&gt;PacSafe Retractasafe 250&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.amazon.nl/-/en/dp/B08C4WCJNP"&gt;iWalk 10,000 mAH USB C power bank&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shop.critrole.com/products/nott-the-brave-adult-face-masks-two-pack"&gt;Critical Role Nott the Brave face mask (2 pack)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3TVWNAn"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3GD7V2m"&gt;Apple Pencil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3EmoRqQ"&gt;The Crew: Mission Deep Sea (card game)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3VmnijP"&gt;Kindle 2022&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3OtmVBx"&gt;Popsockets PopGrip&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3EQy3FE"&gt;Nintendo Switch Lite&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.aersf.com/day-sling-3-xpac-black"&gt;Aer Day Sling 3 X-Pac&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3VjNsU6"&gt;SwitchPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.peakdesign.com/products/tech-pouch/"&gt;Peak Design Tech Pouch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.keychron.com/products/keychron-travel-pouch?variant=32264197701721"&gt;Keychron K3 travel pouch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tMKFax"&gt;Nuphy Air 60 keyboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ElQfW8"&gt;Roost laptop stand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nedrelow.com/en-nl/products/magic-sleeve?variant=31842687189057"&gt;Nedrelow Magic Sleeve&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.etsy.com/listing/691535271/soft-wool-felt-dice-tray-soft-tray"&gt;URWizards soft wool felt dice tray&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ErrRm1"&gt;Shure Aonic 215 wired sound isolating earbuds&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Ers4pj"&gt;Logitech MX Anywhere 3&lt;/a&gt;: travel mouse&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3GxVHId"&gt;2 x Lexon Mino X bluetooth speakers&lt;/a&gt;: awesome USB C-rechargeable bluetooth speakers that can be paired together&lt;/li&gt;
&lt;li&gt;Logitech Spotlight Wireless Presentation Remote. &lt;a href="https://amzn.to/3Exru9H"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;2.5mm to 3.5mm audio adapter. &lt;a href="https://amzn.to/3VlynBJ"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3VgRYmh"&gt;Yubico Yubikey 5C security key&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3TWQr42"&gt;Yubico Yubikey 5C nano security key&lt;/a&gt; (always plugged in to laptop)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3EOkTb5"&gt;8Bitdo Zero 2 bluetooth Switch mini controller&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3UWDBEf"&gt;Anker USB C cables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;USB C adapters. &lt;a href="https://amzn.to/3i5MMU0"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Vk8VMG"&gt;Røde Wireless Go wireless microphone system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3AySnsE"&gt;UGreen GaN 100W USB C charger&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Hyper Drive USB hub. &lt;a href="https://amzn.to/3UUtboq"&gt;Updated version&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="my-remote-work-setup-for-a-month"&gt;My Remote Work Setup for a month&lt;/h2&gt;
&lt;p&gt;(&lt;a href="#sections"&gt;back to top&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what I bring with me when I need to be able to work while travelling continuously for a month. This setup lets me create videos, run livestreams, do programming work, and do presentations at conferences with minimal bulk and maximal functionality.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bV6mR6UwE90?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Platypus soft bottle. &lt;a href="https://amzn.to/3TWaEH1"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xX8y1A"&gt;Samsung Galaxy Active 2&lt;/a&gt;: my smartwatch&lt;/li&gt;
&lt;li&gt;Le Chivée USB C portable wireless charger for Samsung Galaxy Active 2 watch. &lt;a href="https://amzn.to/3AQWEaw"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3p6OHLJ"&gt;Bose QuietComfort Earbuds II&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3TVWNAn"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3GD7V2m"&gt;Apple Pencil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nedrelow.com/en-nl/products/magic-sleeve?variant=31842687189057"&gt;Nedrelow Magic Sleeve&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;3 x &lt;a href="https://dispeldice.com"&gt;Dispel Dice&lt;/a&gt; d20s.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3tMKFax"&gt;Nuphy Air 60 keyboard&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Logitech Spotlight Wireless Presentation Remote. &lt;a href="https://amzn.to/3Exru9H"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3LSN2T4"&gt;Apple Magic Trackpad&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3GxVHId"&gt;2 x Lexon Mino X bluetooth speakers&lt;/a&gt;: awesome USB C-rechargeable bluetooth speakers that can be paired together&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3Vk8VMG"&gt;Røde Wireless Go wireless microphone system&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ElQfW8"&gt;Roost laptop stand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZggnG"&gt;Macbook Pro 13&amp;quot; (2020)&lt;/a&gt;, 2,3 GHz Quad-Core Intel Core i7, 32 GB RAM - main laptop&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3TWQr42"&gt;Yubico Yubikey 5C nano security key&lt;/a&gt; (always plugged in to laptop)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CmuLH1"&gt;Sony A6600&lt;/a&gt; with &lt;a href="https://amzn.to/3xn3ZKD"&gt;Sigma 16mm f1.4&lt;/a&gt; lens (main shooter)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.peakdesign.com/pages/travel-tripod"&gt;Peak Design Travel tripod&lt;/a&gt;: Pricy, but the only full tripod I use these days. Excellent for travel!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3AWv0Zv"&gt;Elgato Cam Link 4K&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;USB C adapters. &lt;a href="https://amzn.to/3i5MMU0"&gt;Similar here&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.peakdesign.com/products/tech-pouch/"&gt;Peak Design Tech Pouch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3UWDBEf"&gt;Anker USB C cables&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/41Zm7KV"&gt;Lume Cube Panel Mini&lt;/a&gt; LED light.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ClU7Xz"&gt;Joby Gorillapod GripTight Smartphone Micro Tripod&lt;/a&gt;: tripod for Lume Cube&lt;/li&gt;
&lt;li&gt;Samsung X5 2TB SSD. &lt;a href="https://amzn.to/3VqqlIY"&gt;Better here - T7&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fls6Gu"&gt;Samsung Galaxy Z Fold 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;(not pictured, but since added) &lt;a href="https://amzn.to/3VL52Cc"&gt;Logitech POP Mouse&lt;/a&gt;: travel mouse, even though I hate that it requires an AA battery.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/travel-setup-20230430_220231.jpg" alt="Snapshot of my actual setup at a hotel in Frankfurt" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>My WFH desk and office setup</title><link>https://nicolevanderhoeven.com/blog/20210712-my-wfh-desk-and-office-setup/</link><pubDate>Mon, 12 Jul 2021 21:18:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210712-my-wfh-desk-and-office-setup/</guid><description>&lt;p&gt;One of my favorite obsessions is watching or reading about the gear other people use. I&amp;rsquo;ve watched almost every &amp;ldquo;What&amp;rsquo;s in my tech bag&amp;rdquo; video on YouTube, it feels like, and I&amp;rsquo;m always prowling blog posts that detail what someone is using. In case there&amp;rsquo;s anybody out there that is as interested in these things as I am, here&amp;rsquo;s an overview of what my home office looks like and the gear that I use to make videos, write both blog posts and code, and generally mess around on the internet.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m only mentioning larger items of note that I use frequently.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/gear-study.JPG" alt="A photo of my home office on any given day" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Edit: After a reader suggested I provide links to these items, I&amp;rsquo;ve included them below, and some are affiliate links. You are under no obligation to click these links, but if you do, I get a tiny percentage of the sale. Thanks!&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="video-production-gear"&gt;Video production gear&lt;/h2&gt;
&lt;h3 id="not-on-desk"&gt;Not on desk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jcSNva"&gt;Elgato green screen&lt;/a&gt; (long, black metal object on the left side of the photo, on the floor)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3ltqOdy"&gt;Canon 6D Mark II&lt;/a&gt; with a &lt;a href="https://amzn.to/3rTm6XK"&gt;Canon 16-35mm f/2.8L&lt;/a&gt; (upper left, on tripod with teleprompter)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rQ1kIl"&gt;Manfrotto 290 tripod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2TQA3sD"&gt;TeleprompterPAD iLight Pro 10&amp;quot;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jiNpH1"&gt;Neewer 5-in-1 reflective reflector set&lt;/a&gt; (gold, silver, white, black, and transparent)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fpnkVC"&gt;Neewer two-way rotating aluminum light stand&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jen4K2"&gt;Manfrotto universal smartphone clamp&lt;/a&gt; (mounted on light stand above desk)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2WSA3tt"&gt;Neewer Camera Monopod&lt;/a&gt; with rotating column for panoramic shooting&lt;/li&gt;
&lt;li&gt;2 x &lt;a href="http://en.nanlite.com/products/detail-174"&gt;Nanlite PavoTube 6C II&lt;/a&gt; tubes on the shelves in the background&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="on-desk"&gt;On desk&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fub99P"&gt;Aputure AL-MC&lt;/a&gt; portable light (attached magnetically to the back of my external monitor)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3foIliT"&gt;Blue Yeti&lt;/a&gt; microphone&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3s46hxv"&gt;Elgato Key Light&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3yi8VSp"&gt;Canon M50&lt;/a&gt; (between my laptop and monitor screens, used as my main webcam)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3A7HKdv"&gt;Elgato multi-mount&lt;/a&gt; (holding up the M50)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fv26FA"&gt;Blackmagic Atem Mini&lt;/a&gt; video switcher&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZfVRW"&gt;Røde Wireless Go&lt;/a&gt; wireless microphone (main microphone, even for voice calls)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2Vcj84H"&gt;Samsung Portable SSD T5, 1TB&lt;/a&gt; (always connected to my laptop) the drive I edit off&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZggnG"&gt;Macbook Pro 13&amp;quot; (2020)&lt;/a&gt;, 2,3 GHz Quad-Core Intel Core i7, 32 GB RAM - main laptop&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="not-pictured-but-in-frequent-use"&gt;Not pictured but in frequent use&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CmuLH1"&gt;Sony A6600&lt;/a&gt; with &lt;a href="https://amzn.to/3xn3ZKD"&gt;Sigma 16mm f1.4&lt;/a&gt; lens (main shooter, used to take this shot)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/2Vc1A8R"&gt;Røde Wireless Go II&lt;/a&gt; two-person microphones (used as on-board camera mics)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3fowSA0"&gt;SwitchPod tripod&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="other-tech"&gt;Other tech&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3AbSrff"&gt;Synology DS920+&lt;/a&gt; 4 Bay NAS with 4 x &lt;a href="https://amzn.to/2VesKfg"&gt;WD RED 4TB&lt;/a&gt; drives (just outside the photo)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3iki732"&gt;Amazon Echo Dot&lt;/a&gt; (on the bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rZh0Ju"&gt;Google Wifi&lt;/a&gt; wireless extender (just outside photo)&lt;/li&gt;
&lt;li&gt;2 x &lt;a href="https://amzn.to/3jcWy3K"&gt;Nintendo Switch&lt;/a&gt; (on bookshelf; one &lt;a href="https://amzn.to/3jgXK6h"&gt;Animal Crossing edition&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3A8PBr8"&gt;Nintendo Lite&lt;/a&gt; Zacien and Zamazenta edition (on bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xsRwFy"&gt;Amazon Kindle Oasis&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/37fVvur"&gt;Amazon Kindle Paperwhite&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://us.kobobooks.com/products/kobo-aura-one/"&gt;Kobo Aura One&lt;/a&gt; (bookshelf)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.thomannmusic.com/risa_uke_solid_tenor.htm"&gt;Risa Electric Solid Tenor Ukulele&lt;/a&gt;, black (bookshelf)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="non-tech-gear"&gt;Non-tech gear&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://wyrmwoodgaming.com/products/cherry-magnetic-dice-tower/"&gt;Wyrmwood Gaming Cherry magnetic dice tower bundle&lt;/a&gt; including dice tower, personal dice tray, and dice vault&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3jioG5p"&gt;Kimi Rainbow Acrylic kalimba&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CeHdIw"&gt;Visconti Homo Sapiens Lava&lt;/a&gt; Midi, steel age fountain pen (the only fountain pen of many that I use regularly)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/gear-desk.JPG" alt="A photo of my the things on my desk" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="non-video-gear-on-my-desk"&gt;Non-video gear on my desk&lt;/h2&gt;
&lt;p&gt;I already listed the video-related gear on my desk in the first section above, but here&amp;rsquo;s everything else.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3rOo8Iw"&gt;Samsung Galaxy Note 8&lt;/a&gt; (secondary phone, primarily for timelapses and overhead videos)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lrYgkl"&gt;Samsung Galaxy Wireless Buds&lt;/a&gt;, rose&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CfKxmH"&gt;Samsung Galaxy Note 10+&lt;/a&gt; (primary phone)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lotmtj"&gt;Apple Macbook Air 11&amp;quot;&lt;/a&gt; (2011, used as my presentation laptop)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3inWn6g"&gt;Apple Magic Trackpad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3CgzR7E"&gt;Apple iPad Pro 11&amp;quot;&lt;/a&gt; (2020) tablet&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nizkeyboard.com/collections/peripherals/products/niz-2019-new-atom-68-ec-bluetooth-keyboard-rgb-or-non-rgb?variant=30346364059719"&gt;Niz Plum Atom 68&lt;/a&gt; electro-capacitive keyboard with &lt;a href="https://www.etsy.com/listing/902250753"&gt;Pikachu keycap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3xpYeMe"&gt;Logitech MX Master 3&lt;/a&gt; the best mouse I&amp;rsquo;ve used!&lt;/li&gt;
&lt;li&gt;&lt;a href="https://amzn.to/3lt8rFi"&gt;Bose NC700&lt;/a&gt; wireless noise-cancelling headphones&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ouraring.com/product/heritage-silver/step1"&gt;Oura&lt;/a&gt; health and sleep tracking ring&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Load testing and Azure DevOps with José Luis Latorre Millas (k6 Office Hours #20)</title><link>https://nicolevanderhoeven.com/blog/20210709-koh-jose/</link><pubDate>Fri, 09 Jul 2021 21:08:36 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210709-koh-jose/</guid><description>&lt;p&gt;José Luis Latorre Millas, Developer Community Lead and Software Architect at Swiss Life AG, joined &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and me on k6 Office Hours to talk about how he personally uses k6 with Azure DevOps to add load testing to his team&amp;rsquo;s CI/CD pipeline.&lt;/p&gt;
&lt;p&gt;I got to know José from the k6 Community Slack workspace when he mentioned that he would be presenting on k6 in a few meetups. I went to &lt;a href="https://www.youtube.com/watch?v=HITJg03AQFo&amp;amp;t=112s"&gt;his livestream with CrossDvlUp&lt;/a&gt; (Spanish) and enjoyed his approach, so I knew I wanted to have him on. It&amp;rsquo;s always great to have real users of k6 (both of the OSS and the commercial Cloud option) talk about how they personally use k6 and even what they found lacking in the tool.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/vC2pKgVFxt8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;José&amp;rsquo;s multi-scenario template repo: &lt;a href="https://github.com/SwissLife-OSS/K6-MultiScenario-template"&gt;https://github.com/SwissLife-OSS/K6-MultiScenario-template&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Register to watch José&amp;rsquo;s talk at Azure Summit 2021, later this year: &lt;a href="https://azuresummit.live/speaker/jose-luis-latorre-millas/"&gt;https://azuresummit.live/speaker/jose-luis-latorre-millas/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Acquisition talk with CEOs Raj Dutt (Grafana) and Robin Gustafsson (k6) (k6 Office Hours #19)</title><link>https://nicolevanderhoeven.com/blog/20210702-koh-raj-robin/</link><pubDate>Fri, 02 Jul 2021 21:04:13 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210702-koh-raj-robin/</guid><description>&lt;p&gt;This week on k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by two CEOs: k6 CEO &lt;a href="https://www.linkedin.com/in/robinegustafsson/"&gt;Robin Gustafsson&lt;/a&gt; and Grafana Labs CEO &lt;a href="https://twitter.com/nopzor"&gt;Raj Dutt&lt;/a&gt;. It was a little nerve-wracking to have two CEOs on the stream, but it did give us the opportunity to ask both of them pointed questions on Grafana Labs&amp;rsquo;s acquisition of k6, including any plans they have for how both companies could integrate better in the future.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sfWIB-myito?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to use k6 to benchmark hosting providers with Kevin Ohashi (k6 Office Hours #18)</title><link>https://nicolevanderhoeven.com/blog/20210625-koh-kevin/</link><pubDate>Fri, 25 Jun 2021 20:57:42 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210625-koh-kevin/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/kevinohashi"&gt;Kevin Ohashi&lt;/a&gt; joined me and &lt;a href="https://twitter.com/FloorDrees/"&gt;Floor Drees&lt;/a&gt; on k6 Office Hours to talk about how he used k6 to &lt;a href="https://wphostingbenchmarks.com/"&gt;benchmark the performance of WordPress hosting providers&lt;/a&gt;. He talks about the difficulties he ran into while trying to keep tests repeatable and consistent, and I also make some suggestions for how he could improve his load testing script for future comparisons.&lt;/p&gt;
&lt;p&gt;Of particular note for me in his results was how clearly the performance of the hosting providers varied depending on the location Kevin had selected for his load generators. One in particular showed a significant delay when a site was fetched from Sydney, indicating the possibility of a lack of a CDN server in that region. It made a great argument for load testing in the cloud, from different geographical regions.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/NSOOYiBsPII?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;WordPress Hosting Performance Benchmarks: &lt;a href="https://wphostingbenchmarks.com/"&gt;https://wphostingbenchmarks.com/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Benchmarks methodology: &lt;a href="https://wphostingbenchmarks.com/methodology/"&gt;https://wphostingbenchmarks.com/methodology/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>k6 is part of Grafana Labs! AMA with CEO Robin Gustafsson (k6 Office Hours #17)</title><link>https://nicolevanderhoeven.com/blog/20210618-koh-with-robin-grafana/</link><pubDate>Fri, 18 Jun 2021 22:26:49 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210618-koh-with-robin-grafana/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://www.linkedin.com/in/robinegustafsson/"&gt;Robin Gustafsson&lt;/a&gt;, the CEO of k6, to make a big announcement: k6 has been acquired by Grafana Labs.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/RrDo2wMeV80?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;The folks at Grafana Labs have been fans of k6 for a while, and we&amp;rsquo;ve been fans (and users) of their work since almost the beginning of k6. While a surprise to many, Grafana and k6 together is a combination that makes sense.&lt;/p&gt;
&lt;p&gt;Read &lt;a href="https://grafana.com/about/press/2021-06-17-grafana-labs-brings-modern-open-source-load-testing-to-observability-with-acquisition-of-k6/"&gt;Grafana&amp;rsquo;s press release here&lt;/a&gt; to hear more about this milestone.&lt;/p&gt;</description></item><item><title>Accessibility and open source support program with Floor Drees (k6 Office Hours #16)</title><link>https://nicolevanderhoeven.com/blog/20210611-koh-with-floor/</link><pubDate>Fri, 11 Jun 2021 22:38:52 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210611-koh-with-floor/</guid><description>&lt;p&gt;On this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://twitter.com/FloorDrees/"&gt;Floor Drees&lt;/a&gt;, the newest member to join the k6 team. Every new person at k6 goes through a week of testing, and Floor decided to spend her week of testing doing an accessibility review on the k6 Cloud web app and documentation. We talk about how accessibiltiy is an often-overlooked form of operational testing, and Floor shares specific tools that testers can use to make applications more accessible.&lt;/p&gt;
&lt;p&gt;We also discuss the k6 open source support program, which makes k6 free for open-source maintainers and regular contributors.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3jvM9JB1YZY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="resources-mentioned"&gt;Resources mentioned&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://k6.io/oss-program/"&gt;k6 Open Source Support Program&lt;/a&gt;
&lt;a href="https://www.boia.org"&gt;Boia.org&lt;/a&gt;, a good tool for accessibility reviews
&lt;a href="https://alexjs.com"&gt;AlexJS&lt;/a&gt;, for identifying inconsiderate language
&lt;a href="https://www.youtube.com/watch?v=7ASFUzRDeMg"&gt;Paul Bruce&amp;rsquo;s rant&lt;/a&gt; on operational requirements instead of &amp;ldquo;non-functional&amp;rdquo; requirements
Marie Drake on &lt;a href="https://www.youtube.com/watch?v=ve7Rg0MUZ0g"&gt;accessibility using Cypress&lt;/a&gt;
&lt;a href="https://chrome.google.com/webstore/detail/dark-reader/eimadpbcbfnmbkopoojfekhnkhdbieeh"&gt;Chrome extension&lt;/a&gt; to get dark mode everywhere
Contributing Today - &lt;a href="https://www.contributing.today/april-7-oss-funding-sponsorship/oss-funding-and-sponsorship-panel-discussion/"&gt;open source funding and sponsorship&lt;/a&gt;
Contributing Today - &lt;a href="https://www.contributing.today/past-sessions/open-source-licensing/"&gt;on open source licensing&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Convergence of Code and Speech</title><link>https://nicolevanderhoeven.com/blog/20210609-convergence-of-code-and-speech/</link><pubDate>Wed, 09 Jun 2021 22:23:19 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210609-convergence-of-code-and-speech/</guid><description>&lt;p&gt;As part of the &lt;a href="https://www.womentech.net/en-us/women-tech-conference"&gt;Women Tech Global 2021&lt;/a&gt; conference, I presented a short talk called &amp;ldquo;&lt;a href="https://www.womentech.net/speaker/Nicole/van%20der%20Hoeven/50129"&gt;Convergence of Code and Speech&lt;/a&gt;&amp;rdquo;, under the theme of &amp;ldquo;Future of Work&amp;rdquo;. In hindsight, the title was a little pretentious, but what are you going to do?&lt;/p&gt;
&lt;p&gt;I haven&amp;rsquo;t gotten the recording of the live version yet, but I always like to do a recorded test run by myself, and here&amp;rsquo;s what that was like:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/sbZ3A8GrDk0?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Programming code and human speech are often seen as being positioned at different ends of the spectrum. At one end, code is terse, strictly logical, and limited. On the other end, speech is unbounded and often verbose. However, the gap between the two is narrowing.&lt;/p&gt;
&lt;p&gt;Code is moving towards speech. Good code these days is code that exceeds simply being functional; good code is concise, but expressive; good code is easily comprehensible; good code refers to human concepts rather than technical components.&lt;/p&gt;
&lt;p&gt;Shrinking global borders and the internet are making collaborating on code easier than ever before, but contributors may come from different cultures and languages. Remote work has significantly increased the likelihood of a multilingual devleopment team, so code style guides have emerged that are similar to writing style guides. Artificial intelligence is learning to interpret intention, and many apps now employ fuzzy search algorithms. Our expectations for code have increased such that we now expect code to understand us even when we&amp;rsquo;re being imprecise or inaccurate. Modern programming languages like React and Python use hierarchical abstraction to hide complexity, moving towards code that prioritizes being understood over being thorough.&lt;/p&gt;
&lt;p&gt;On the other side of the spectrum, speech is also moving towards coding. Multilingual teams also encourage simplicity in written communication, removing colloquialisms and cultural references so that a more global audience can understand us. Tools like Grammarly correct for simplicity and conciseness. Verbal speech, too, is becoming increasingly programmatic with the rise of &amp;ldquo;smart&amp;rdquo; speakers and personal assistants that enforce a syntax for voice commands. Advances in artificial intelligence and machine learning have enabled us to interact with machines in natural language, and machines to interact with us back. OpenAI&amp;rsquo;s GPT-3 can produce convincingly human text about a variety of topics with little prompting. Writing tools like Notion, Roam Research, and Obsidian are growing ecosystems that mix human language with programming keywords to enable backlinks or access other features.&lt;/p&gt;
&lt;p&gt;What are the implications of this convergence of code and speech? Writers will need to learn to code, and coders will need to learn to write. The two will become synonymous, and equally essential especially for knowledge workers. Tools that enable both coding and writing will become more valuable, so it&amp;rsquo;s worth investing the time to learn them. Both code and speech have inherent linguistic or cultural biases, so using inclusive language will become even more important.&lt;/p&gt;
&lt;p&gt;What are coding and speech converging into? Their intersection is simply expressing thought. She who is able to express thought, both programmatically and naturally, will be best poised to take advantage of this convergence.&lt;/p&gt;</description></item><item><title>Making k6 extensions using xk6, with Iván Szkiba and Mihail Stoykov (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210604-koh-ivan/</link><pubDate>Sat, 05 Jun 2021 22:28:29 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210604-koh-ivan/</guid><description>&lt;p&gt;This week on k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I were joined by &lt;a href="https://twitter.com/szkiba"&gt;Iván Szkiba&lt;/a&gt; and &lt;a href="https://twitter.com/MStoykov"&gt;Mihail Stoykov&lt;/a&gt; to talk all about extensions. Iván, who is a System Architect at NNG LLC, is the most active k6 extension creator outside of the k6 team. Mihail is a software engineer at k6, and one third of the k6 OSS team.&lt;/p&gt;
&lt;p&gt;We talked about the many extensions Iván has created for k6 so that he can incorporate k6 into his team&amp;rsquo;s daily testing activities, his considerations for creating extensions, and how he got started. Mihail also shares some inside information on why certain decisions were made about the way k6 is structured, and common mistakes he sees people make in their custom extensions.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/I-NtzkxdzyA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Downloading files uploaded to Roam Research for use with Obsidian</title><link>https://nicolevanderhoeven.com/blog/20210602-downloading-files-from-roam/</link><pubDate>Wed, 02 Jun 2021 00:27:59 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210602-downloading-files-from-roam/</guid><description>&lt;p&gt;If you&amp;rsquo;ve recently transitioned from &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt; to &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, you might run into a few issues, even after you&amp;rsquo;ve run the &amp;ldquo;Markdown format importer&amp;rdquo; core plugin. One of the most annoying ones that I ran into was that files uploaded to Roam (images, pdfs, etc.) are automatically uploaded to &lt;a href="https://firebase.google.com/"&gt;Google Firebase&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Roam assets are linked to in the Markdown files like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![](https://firebasestorage.googleapis.com/v0/b/firescript-471a1.appspot.com/o/imgs%2Fapp%2FMyNotes%2FxRFXx7l-ZK.png?alt=media&amp;amp;token=1e03b680-5472-33dc-9b06-a127301af37f)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, since Roam relies on security by obscurity on this front, the links to your assets will still be accessible in your Obsidian vault, and they&amp;rsquo;ll still render correctly. However, I still think it&amp;rsquo;s worth downloading the files for three reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you don&amp;rsquo;t intend to use Roam anymore and cancel your subscription, they will likely delete those assets at some point, leaving you with a lot of broken links in Obsidian.&lt;/li&gt;
&lt;li&gt;Part of Obsidian&amp;rsquo;s appeal is that you own your assets. Not so if they&amp;rsquo;re on someone else&amp;rsquo;s server.&lt;/li&gt;
&lt;li&gt;You can&amp;rsquo;t access Firebase files without an internet connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, instead, you want to download the contents of that link and replace it in your notes with something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![](assets/newfile.png)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That way, you&amp;rsquo;ll have full control over all your assets, and you won&amp;rsquo;t be dependent on those assets being stored on Firebase by Roam.&lt;/p&gt;
&lt;p&gt;To fix this, I wrote a Python script that will:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go through every file and every folder within a specified root vault directory&lt;/li&gt;
&lt;li&gt;Look for links to Google Firebase&lt;/li&gt;
&lt;li&gt;Download all assets from Firebase to a local folder (&lt;code&gt;/assets&lt;/code&gt; by default), using the timestamp and index number as a filename&lt;/li&gt;
&lt;li&gt;Replace the Firebase links in your vault with links to the newly downloaded files, accounting for PDFs, whose links are formatted differently in Roam as &lt;code&gt;{{ pdf: ... }}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before you run this script, I highly recommend backing up your vault or trying this out on a dummy vault.&lt;/p&gt;
&lt;script src="https://gist.github.com/nicolevanderhoeven/b25c97a8a68ea97e7bdf5ee674fdaec4.js"&gt;&lt;/script&gt;
&lt;p&gt;After downloading and saving the script, run &lt;code&gt;python3 downloadfirebase.py&lt;/code&gt; on your terminal.&lt;/p&gt;
&lt;p&gt;This worked really well for me, and I can breathe a little more easily now that my vault is self-contained.&lt;/p&gt;</description></item><item><title>What Is Load Testing? - A real-world explanation</title><link>https://nicolevanderhoeven.com/blog/20210601-what-is-load-testing/</link><pubDate>Tue, 01 Jun 2021 20:23:17 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210601-what-is-load-testing/</guid><description>&lt;p&gt;I&amp;rsquo;ve made about 60 videos on load testing and application performance to date, but I realized that I&amp;rsquo;ve never made one defining load testing, which seemed like a glaring mistake. So, here&amp;rsquo;s my attempt!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/cCFwqlcHkX8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;em&gt;Rough transcript below - though I went off script a few times:&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Load testing is a key part of making sure that an application performs well and reliably. But what IS load testing, anyway? In this video, I break it down for you in simple terms. And if you&amp;rsquo;re a family member or friend of mine trying to understand what it is I do for a living, thank you! This is for you too.&lt;/p&gt;
&lt;h3 id="software-testing"&gt;Software testing&lt;/h3&gt;
&lt;p&gt;It takes a whole team to build software, but some roles are more visible than others. For example, pretend you want to build a bridge. Who do you need to build it?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An architect to design the specifications of the bridge&lt;/li&gt;
&lt;li&gt;A liaison or representative to the gemeente or local council to clarify what the specifications ARE&lt;/li&gt;
&lt;li&gt;Builders who will physically build the bridge, who might need to hire subcontractors for various materials and services&lt;/li&gt;
&lt;li&gt;Someone to double-check that what you&amp;rsquo;re building is up to code (testers)&lt;/li&gt;
&lt;li&gt;Someone to manage it all, and maybe a few more levels of team leads&lt;/li&gt;
&lt;li&gt;Traffic enforcers to detour traffic away from the bridge while it&amp;rsquo;s being built&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So who is responsible for &amp;ldquo;building&amp;rdquo; the bridge? The answer is, everybody. Everybody has a part to play. Every part is important.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s the same thing with software. When we think about building software, we often think about developers, but that&amp;rsquo;s not the full picture. Just like building a bridge, it&amp;rsquo;s a team effort. But I want to zoom in on one role in particular, because it&amp;rsquo;s the role I&amp;rsquo;ve had most often: load tester.&lt;/p&gt;
&lt;p&gt;But first, let&amp;rsquo;s go on a field trip.&lt;/p&gt;
&lt;h3 id="load-testing-on-the-field"&gt;Load testing on the field&lt;/h3&gt;
&lt;p&gt;Does this bridge look familar? This is the Sint Servaasbrug, and they SAY that it&amp;rsquo;s the bridge on the €10 note. It might be true, too, because it&amp;rsquo;s here in my current hometown of Maastricht, the Netherlands, where the European Union was founded in the Treaty of Maastricht. The name Maastricht means the crossing of the Maas, which is the name of this river here.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s pretend the bridge hasn&amp;rsquo;t been built yet, and that we&amp;rsquo;re helping build it. Let&amp;rsquo;s put on our load tester hats. As a load tester, it&amp;rsquo;s our job to make sure that the bridge can support the weight it is intended to support.&lt;/p&gt;
&lt;p&gt;How do we know how much weight it&amp;rsquo;s intended to support? Well, the council or the rest of the team helping us build the bridge might have some ideas on that, or some building standards that we can use. That&amp;rsquo;s a good place to start, and we should definitely discuss that with them, but as a load tester, it&amp;rsquo;s also our job to question those requirements. Let&amp;rsquo;s do some research.&lt;/p&gt;
&lt;p&gt;This is the street leading up to the bridge. Remember, the bridge isn&amp;rsquo;t built yet, but maybe we can get an idea of the kind of traffic that the area gets.&lt;/p&gt;
&lt;p&gt;Some things to watch out for or questions to answer:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many people are walking?&lt;/li&gt;
&lt;li&gt;How many are on bikes?&lt;/li&gt;
&lt;li&gt;How many are on bakfiets bikes?&lt;/li&gt;
&lt;li&gt;Are vehicles allowed on this street, and if so, how many of them drive through?&lt;/li&gt;
&lt;li&gt;Do people tend to pass by in groups, or on their own?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Another thing we can do is check other bridges. This is the Hoogbrug, another bridge across the Maas river. It&amp;rsquo;s not going to be an exact match for the kind of traffic we might expect on OUR bridge, but it might give us some ideas. So we can scout this out the way we did the street near our bridge.&lt;/p&gt;
&lt;p&gt;One difference we can see right away is that this bridge has stairs on both ends. Our bridge isn&amp;rsquo;t going to have that. The stairs do have the lip to make pushing a bike up it easier, but it&amp;rsquo;s not as easy as riding through, and any heavier vehicles are out. And people are probably less likely to go up stairs than they are to walk up an incline. So we already know that this bridge will probably experience less traffic than our bridge, but it&amp;rsquo;s still good to take notes on.&lt;/p&gt;
&lt;p&gt;Okay, let&amp;rsquo;s head back home, write down our findings, and think about what we&amp;rsquo;ve learned.&lt;/p&gt;
&lt;h3 id="tying-it-back-to-software-testing"&gt;Tying it back to software testing&lt;/h3&gt;
&lt;p&gt;What we learned was useful, but there are still a few things we don&amp;rsquo;t know:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It is 10 AM right now. But is that really the highest point of traffic during the day? To be really sure, we should really try to go back at different times. Maybe there&amp;rsquo;s an increased amount of traffic during lunch as people go to restaurants or back to their homes to eat. Maybe a horde of kids would go across our bridge after school to go home.&lt;/li&gt;
&lt;li&gt;And we should think beyond that, too. Are weekends busier because more people are out? Or are weekdays busier because people are going to and from work?&lt;/li&gt;
&lt;li&gt;Then there are some things that are seasonal. Maastricht happens to be in the part of the Netherlands that celebrates Carnaval, so sometimes that area looks like &lt;em&gt;this&lt;/em&gt;. Carnaval involves a slow parade of people, bikes, and trucks through the bridge to the central town square, called the Vrijthof. That&amp;rsquo;s absolutely something we&amp;rsquo;ll have to plan for when testing our bridge.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ve been talking about the bridge this whole time, but as load testers, we go through the same process for software, too. What we&amp;rsquo;ve just done on our field trip is called a workload model. A workload model is describes the load profile for a given test scenario, and it involves determining &lt;em&gt;what&lt;/em&gt; (the key transactions), &lt;em&gt;how much&lt;/em&gt; (the load distribution among the transactions) and &lt;em&gt;when&lt;/em&gt; (timing of the load) to test.&lt;/p&gt;
&lt;p&gt;For a web application, for example, like a web site, we might try to look through analytics and monitoring tools to try to determine things like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How many users access our site?&lt;/li&gt;
&lt;li&gt;Which pages do they visit? Some pages are like pedestrians - they don&amp;rsquo;t have much comparative weight and aren&amp;rsquo;t complex to process. But other pages are like big old trucks, that involve many components of our application and are comparatively very intensive.&lt;/li&gt;
&lt;li&gt;When do they visit the site? Is our site the sort of site people go to to work, or to avoid work? at weekends, or during the week?&lt;/li&gt;
&lt;li&gt;Are there any seasonal events, like sales or holidays, that might drive MORE people to our site?&lt;/li&gt;
&lt;li&gt;Where are the users from? Are they in the same country that our application servers are located in, or are they quite far away? What sort of internet speeds do they have? What percentage of them use computers to access our site, and what percentage of them use tablets or mobiles?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;That was just a taste of the kinds of questions a load tester has to answer during the course of testing. There&amp;rsquo;s still a lot more to cover - for starters, we haven&amp;rsquo;t even talked about how to actually RUN the tests yet! I plan to make more videos going through typical activites in load testing in more detail, but for now, I hope that gave you a good idea of what load testing is. And Mom, I hope you know what I do for a living now. :D&lt;/p&gt;
&lt;p&gt;Thanks for watching!&lt;/p&gt;</description></item><item><title>Interview on Performance Time Podcast</title><link>https://nicolevanderhoeven.com/blog/20210531-performance-time/</link><pubDate>Mon, 31 May 2021 11:28:18 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210531-performance-time/</guid><description>&lt;p&gt;I first heard of &lt;a href="https://twitter.com/perftestnz"&gt;Stephen Townshend&lt;/a&gt; because he happens to have gotten the same introduction to performance testing that I did&amp;ndash; our shared mentor, &lt;a href="https://www.linkedin.com/in/stijnschepers/"&gt;Stijn Schephers&lt;/a&gt;. He has started a podcast called Performance Time, where he interviews performance engineers about a variety of topics. This week, it was me!&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed/episode/3pp3ZFFB8DyfUEtLRuLxGe" width="100%" height="232" frameBorder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;We talked about how I got started, one of my biggest failures as a performance tester, chaos engineering, what we can do to improve diversity in tech, and why I think note-taking is a key skill for any performance tester.&lt;/p&gt;</description></item><item><title>Application Performance Monitoring using Netdata and k6, with Odysseas Lamtzidis (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210528-koh-odysseas/</link><pubDate>Fri, 28 May 2021 23:24:48 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210528-koh-odysseas/</guid><description>&lt;p&gt;This week, we had &lt;a href="https://twitter.com/odysseas_lam"&gt;Odysseas Lamtzidis&lt;/a&gt; on the show to talk about &lt;a href="https://netdata.cloud"&gt;Netdata&lt;/a&gt;, which is an application performance monitoring tool that prides itself on having the easiest setup ever. Odysseas admitted that it might not have all the bells and whistles of other monitoring platforms, it Just Works. I see this as being very interesting especially for testers like me, who just want to have something set up but might not want to be bothered by the implementation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Y2dVJssTemI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>End-to-End Guide for Load Testing</title><link>https://nicolevanderhoeven.com/blog/20210524-end-to-end-guide-for-load-testing/</link><pubDate>Mon, 24 May 2021 10:48:55 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210524-end-to-end-guide-for-load-testing/</guid><description>&lt;p&gt;&lt;em&gt;Originally published on the &lt;a href="https://abstracta.us/blog/performance-testing/load-testing-guide/"&gt;Abstracta blog&lt;/a&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;link rel="canonical" href="https://abstracta.us/blog/performance-testing/load-testing-guide/"&gt;
&lt;p&gt;If you have a public-facing web application, the odds are you should probably be thinking about load testing. Any tester can (and should) add load testing to their repertoire.&lt;/p&gt;
&lt;p&gt;Functional tests are often carried out with a single user&amp;rsquo;s experience of your application in mind, but what happens when hundreds or thousands of users are on your site at the same time? Load testing helps prepare an application for this eventuality by simulating that situation before the application goes live. That way, you have time to fix any issues you find, and there are no nasty surprises in production.&lt;/p&gt;
&lt;p&gt;In this guide, I&amp;rsquo;m going to walk you through the basics of the load testing process, which fits in closely with traditional functional testing phases as well:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Planning: &lt;em&gt;Why are we testing? What are we testing?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Writing test scripts: &lt;em&gt;How are we testing?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Execution: &lt;em&gt;Running test scripts against the application.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Analysis and reporting: &lt;em&gt;What happened, and what do we need to fix?&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="planning-for-load-testing"&gt;Planning for load testing&lt;/h2&gt;
&lt;p&gt;During the planning phase, the team gets together and determines what load testing will involve, including the objectives, scope, resources needed, and test scenarios. The deliverable for this phase is a test plan, but that can be as formal or informal as the team requires.&lt;/p&gt;
&lt;p&gt;Planning for any testing is a team activity, and you&amp;rsquo;ll want to get input from all the stakeholders &amp;ndash; that&amp;rsquo;s anyone who is involved in or might be affected by the testing. The first thing you need to clarify is the reason for load testing.&lt;/p&gt;
&lt;h3 id="requirements"&gt;Requirements&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Why are we doing load testing?&lt;/em&gt; seems like a very simple question, but you may be surprised by the varying answers from your stakeholders. Their reasons may require different test scenarios, so it&amp;rsquo;s a good idea to agree on the collective objectives of this load testing cycle so that expectations are set accordingly. A requirement is a concise statement of how an application should behave in a given situation.&lt;/p&gt;
&lt;p&gt;Phrasing objectives as nonfunctional requirements (NFRs) is a good way to formalize them. An NFR defines the desired state of the application and can includes performance thresholds that the team decides on. For example: &lt;em&gt;Logging in as a registered user must take no more than 3 seconds (90th percentile response time)&lt;/em&gt; is a requirement based on response time. Good requirements are SMART (Specific, Measurable, Agreed Upon, Realistic, and Timely).&lt;/p&gt;
&lt;p&gt;Here are some other things that should be decided on during this phase:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Scope&lt;/strong&gt;. &lt;em&gt;What are we testing?&lt;/em&gt; Deciding on a shared objective for load testing lets you narrow down what areas of the application need to be targeted. Make sure everyone is clear on what &lt;em&gt;won&amp;rsquo;t&lt;/em&gt; be tested.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/daria-nepriakhina-zoCDWPuiRuA-unsplash.jpg" alt="Post-its on a board for planning" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@epicantus?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Daria Nepriakhina&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/post-it?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Entry Criteria&lt;/strong&gt;. What do you need to begin? This is the time to start thinking about resources that are required for testing, including the number of people who need to be involved, the time it takes to carry out the testing, and environment requirements (including test data). You don&amp;rsquo;t always need a separate testing environment to do load testing, but if you do, that should be discussed up front so that the DevOps team knows you can&amp;rsquo;t begin without an environment.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Workload Modeling&lt;/strong&gt;. A workload model is a set of characteristics that describe the load you&amp;rsquo;re attempting to simulate. If you want your load testing to simulate registered users accessing your site, what does that entail? This might require you to look through your site analytics to determine which pages are visited most often and which application features are most commonly used, or arrive at an estimate if analytics are not available. Are most users visiting from their laptops at lunch on work days, or do they use your site from mobile devices after work? Are most of them located in the US or in Europe? You&amp;rsquo;ll want your scripts to match real load as much as possible, so take note of key characteristics that might have an effect on the traffic your application experiences.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Server monitoring&lt;/strong&gt;. Which application components will be involved? You want to have a plan in place to have monitoring, alerts, and logs set up on every server that will be tested by your scripts. If your load testing tool shows performance degradation, you want to be able to have information to look through on the relevant servers to troubleshoot that issue. Keep in mind that any sort of monitoring adds some resource overhead, so decide as a team what information you absolutely need to track.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test Scenarios&lt;/strong&gt;. Which situations do you want to recreate? A test scenario objectively describes the situation to be simulated. Do you want to recreate the load profile of a typical day, or one from a very high-traffic period, such as during a sale? Do you want to recreate a production outage? You can use analytics data to come up with parameters for your each test scenario such as duration, number of concurrent users or requests, ramp up period (how quickly the application went from 0 users to your highest number of users), or how &amp;ldquo;spiky&amp;rdquo; the load needs to be (how the number of requests per second fluctuates throughout the test).&lt;/p&gt;
&lt;p&gt;Everything discussed in this phase should be written in some sort of a load testing plan, which could be a formal, multi-page document, an epic with many user stories, or a bunch of Trello cards. Use the tools your team already uses. The format isn&amp;rsquo;t important; formalizing the outcome of the discussions is what counts. The test plan makes sure everyone has the same intent with regard to the testing.&lt;/p&gt;
&lt;h2 id="writing-load-testing-scripts"&gt;Writing load testing scripts&lt;/h2&gt;
&lt;p&gt;Now it&amp;rsquo;s time to start writing scripts! You&amp;rsquo;ve already front-loaded a lot of the important decisions to the planning phase, so all that&amp;rsquo;s left to do in this step is to implement the plan in the form of load testing scripts.&lt;/p&gt;
&lt;h3 id="tool-selection"&gt;Tool selection&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/tools_on_market.png" alt="Different load testing tools on the market" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;There are many load testing tools available on the market, and the reality is that you don&amp;rsquo;t always get to be the one to choose what you use. Often, companies have already made agreements with tool vendors for licenses before you begin your load testing, and it would be financially infeasible to switch to another tool. However, if you&amp;rsquo;re lucky enough that you can choose the load testing tool, here are a few considerations for assessing different tools:&lt;/p&gt;
&lt;h4 id="resources-and-costs"&gt;Resources and costs&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;How much does it cost? Does the pricing model allow for scaling usage up and down as necessary?&lt;/li&gt;
&lt;li&gt;Should you &lt;a href="https://k6.io/what-to-consider-when-building-or-buying-a-load-testing-solution/"&gt;build or buy&lt;/a&gt; an end-to-end load testing solution?&lt;/li&gt;
&lt;li&gt;What technical skills or experience with tools does your team have? Who will be doing the testing?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="features"&gt;Features&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Does the load testing tool support the protocols and technologies used by the application?&lt;/li&gt;
&lt;li&gt;How easy would it be for the team to learn this tool and/or scripting language?&lt;/li&gt;
&lt;li&gt;Does the tool make it easy for multiple people to collaborate on the same script?&lt;/li&gt;
&lt;li&gt;Does it integrate with other tools in the testing stack (for test management, test result analysis, server monitoring, team communication)?&lt;/li&gt;
&lt;li&gt;Could you add this tool to your CI/CD pipeline?&lt;/li&gt;
&lt;li&gt;Does the tool have an easy way of setting thresholds or SLOs for performance?&lt;/li&gt;
&lt;li&gt;Are the test results displayed in usable reports, or does the tool integrate with existing data visualization tools you are using?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="support"&gt;Support&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;If something goes wrong, does customer support cost extra?&lt;/li&gt;
&lt;li&gt;Is there ample documentation available online for getting started without help?&lt;/li&gt;
&lt;li&gt;Is there a community of users of the tool whose experiences you could learn from?&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="scaling-up-load-testing"&gt;Scaling up load testing&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;How many virtual users or requests per second can a single load generator simulate using the tool?&lt;/li&gt;
&lt;li&gt;How many load generators would you need if you used this tool?&lt;/li&gt;
&lt;li&gt;Can the tool handle the amount of test data required by your tests?&lt;/li&gt;
&lt;li&gt;Can you execute tests from different geographical locations, depending on your the location of your users?&lt;/li&gt;
&lt;li&gt;Does the tool allow you to generate load from the cloud?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These questions are not exhaustive, but you can use them as a starting point for your comparisons of load testing tools.&lt;/p&gt;
&lt;p&gt;For this guide, I&amp;rsquo;m going to outline a basic script in &lt;a href="https://k6.io"&gt;k6&lt;/a&gt; for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;rsquo;s open-source, so anyone reading this can download the tool and the script and try it out for themselves;&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s written in JavaScript, which makes it easy to learn for front-end developers or testers who have used tools like Cypress, Puppeteer, or Playwright.&lt;/li&gt;
&lt;li&gt;It&amp;rsquo;s capable of generating &lt;a href="https://k6.io/docs/testing-guides/running-large-tests/"&gt;tens of thousands of users&lt;/a&gt; on a single machine, so it&amp;rsquo;s cost-effective even with load ramped up.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, the principles I discuss will be applicable to other tools. I highly recommend you conduct your own proof of concepts with several tools to come up with a tool that fits your particular situation, test scenarios, and company.&lt;/p&gt;
&lt;h3 id="installation-and-setup"&gt;Installation and setup&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;re on a Mac, the easiest way to install k6 is to use Brew. Run &lt;code&gt;brew install k6&lt;/code&gt; from your terminal, and you&amp;rsquo;ll be ready to go in a few seconds.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re on a different operating system, &lt;a href="https://k6.io/docs/getting-started/installation/"&gt;check here for installation instructions&lt;/a&gt; that apply to you.&lt;/p&gt;
&lt;h3 id="a-basic-k6-test-script"&gt;A basic k6 test script&lt;/h3&gt;
&lt;p&gt;A barebones k6 test script looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;response&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test.k6.io&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This script sends an HTTP GET request for the URL &lt;code&gt;https://test.k6.io&lt;/code&gt;, which is a simple test site. If you copy that code to your favorite text editor and save it as &lt;code&gt;test.js&lt;/code&gt;, you can then run it with the command &lt;code&gt;k6 run test.js&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll get something like this in response:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-supersimple-run.png" alt="A sample run of a simple local test in k6" loading="lazy" decoding="async"&gt;
&lt;em&gt;A sample run of a simple local test in k6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;The output above means that you&amp;rsquo;ve executed 1 iteration of your script with 1 virtual user from your local machine. The test run consisted of 1 HTTP request, which had a response time of 128.2 ms (&lt;code&gt;http_req_duration&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;It might be tempting to start scaling up the test at this point, increasing the number of virtual users and the duration of the script. But there&amp;rsquo;s one problem with the script as it is: it&amp;rsquo;s not realistic.&lt;/p&gt;
&lt;h3 id="making-a-test-script-realistic"&gt;Making a test script realistic&lt;/h3&gt;
&lt;p&gt;The purpose of a load testing script is to simulate a real user who accesses your site. In most cases, that involves more than the simple GET request from the script above. Load testing scripts don&amp;rsquo;t have to mimic a real user &lt;em&gt;exactly&lt;/em&gt;, but they do have to be close enough so as to apply the same amount, shape, and distribution of the load on your application server. If your load testing scripts aren&amp;rsquo;t realistic enough, you may get false positives during testing and discover too late that there is a performance issue in an application component that your scripts didn&amp;rsquo;t test.&lt;/p&gt;
&lt;p&gt;Here are some ways to make your scripts more realistic:&lt;/p&gt;
&lt;h4 id="add-static-resources"&gt;Add static resources&lt;/h4&gt;
&lt;p&gt;If a page has static resources like images and scripts that are retrieved by a browser automatically, make sure your script retrieves those too, as they will have an impact on the response times you get. Consider excluding static resources fetched from third-party providers unless you&amp;rsquo;ve gotten their permission to run a load test on their servers.&lt;/p&gt;
&lt;h4 id="set-cache-and-cookie-behavior"&gt;Set cache and cookie behavior&lt;/h4&gt;
&lt;p&gt;Review your load testing tool&amp;rsquo;s default cache and cookie management settings and change them, if necessary, to match the scenario you want to test. First-time visitors to a site won&amp;rsquo;t have resources cached locally, but repeat visitors may be retrieving resources from the cache.&lt;/p&gt;
&lt;h4 id="add-think-time"&gt;Add think time&lt;/h4&gt;
&lt;p&gt;Real users don&amp;rsquo;t usually fetch the same URL over and over again without stopping. They navigate to your site, then spend some time reading the contents of the homepage before they interact with the page again. Think time is the amount of time that a user spends “thinking”— that is, the delay between requests. Adding a think time that varies between 1 and 5 seconds, for example, prevents the application server from getting artificially bombarded by requests in a way that wouldn&amp;rsquo;t occur in production.&lt;/p&gt;
&lt;h4 id="using-different-user-paths"&gt;Using different user paths&lt;/h4&gt;
&lt;p&gt;A user path is the flow of how a user interacts with the application. What pages do they visit? What information do they type in? So far, you&amp;rsquo;re only testing one request, but perhaps your users may be performing other actions. The workload model that you put together in the Planning phase will come into play here. Other actions like logging in or paying for items in a cart exercise different parts of an application than browsing does, so the load testing script should reflect the most common user flows through your system. In k6, this is done by adding scenarios, but other tools may call them thread groups or execution groups.&lt;/p&gt;
&lt;h4 id="adding-test-data"&gt;Adding test data&lt;/h4&gt;
&lt;p&gt;In the same way that users don&amp;rsquo;t (typically) search for the same keyword over and over again and don&amp;rsquo;t all log into the same test account, a script shouldn&amp;rsquo;t use the same data repeatedly. This behavior could cause responses to be cached, leading to misleadingly quick response times, or increased error rates, in the case of multiple virtual users attempting to log into the same account. To prevent that, modify your script to take data from a CSV file instead, letting you add some natural variation.&lt;/p&gt;
&lt;h4 id="setting-test-parameters"&gt;Setting test parameters&lt;/h4&gt;
&lt;p&gt;Test parameters are the main characteristics of the test and include the number of users, ramp up, duration, and ramp down. They control the shape of the user load, which you can see when you plot the number of virtual users over time during the test:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-vusonly.png" alt="The number of virtual users over time during a load test, as graphed in k6" loading="lazy" decoding="async"&gt;
&lt;em&gt;The number of virtual users over time during a load test, as graphed in k6&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Ramp up is a period of time during which virtual users are gradually added, usually at the start of the test, and ramp down is when they are gradually stopped. For most applications, ramps are more realistic than all users clicking a link at exactly the same time.&lt;/p&gt;
&lt;h4 id="setting-failure-criteria"&gt;Setting failure criteria&lt;/h4&gt;
&lt;p&gt;Part of simulating real users is determining what constitutes failures in user experience. You can incorporate failure criteria into scripts by adding response verifications, checks, and thresholds (such as those for response time or error rate). Building these into the script is a good practice to get into, because it defines the limits of acceptable performance from the beginning.&lt;/p&gt;
&lt;p&gt;The suggestions in this section are for general use, but there are many situations where taking the opposite approach would be more realistic. Spend some time thinking about what is &amp;ldquo;realistic&amp;rdquo; for your application and test scenario.&lt;/p&gt;
&lt;p&gt;For your reference, &lt;a href="https://gist.github.com/nicolevanderhoeven/fb74cd9769c8abf95eeb8765a49398cb"&gt;here&amp;rsquo;s a k6 script&lt;/a&gt; that started from the basic script I showed earlier, but has been modified to be more realistic. That link includes a CSV file with login credentials.&lt;/p&gt;
&lt;h2 id="executing-load-tests"&gt;Executing load tests&lt;/h2&gt;
&lt;p&gt;In the course of writing the test script, you probably would have already executed small verification tests, called shakeout tests. It&amp;rsquo;s a good idea to start with these shakeout tests on a new environment to make sure that both your test artifacts (your script and any other data files) and the environment are ready for full testing.&lt;/p&gt;
&lt;h3 id="running-the-test"&gt;Running the test&lt;/h3&gt;
&lt;p&gt;If you&amp;rsquo;ve been following along with the k6 script so far, all you need to do to run a load test is to execute the following command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 run test.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This command will run the k6 script according to the test parameters set within it. The test will be executed locally. This is best used for shakeout tests, or if you prefer to run your load test on your own infrastructure.&lt;/p&gt;
&lt;h3 id="realism-in-test-execution"&gt;Realism in test execution&lt;/h3&gt;
&lt;p&gt;One way can make executing load tests realistic is by matching the location of load generators to the physical location of your users. When you run a load test on machines in your data center, in the same network as your application servers, you will likely see response times that are significantly faster than your users would see. These false positives can look good on the report, but they don&amp;rsquo;t help you measure real user experience.&lt;/p&gt;
&lt;p&gt;Running on the cloud is an easy way to make tests more realistic, especially if most of your end users are external to your organization.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re following along with the k6 script, you can &lt;a href="https://app.k6.io/account/register"&gt;sign up for an account&lt;/a&gt; with k6 Cloud (the first 50 tests are free). Since k6 itself is open source, you can also run it on your own cloud infrastructure, but using k6 Cloud is the most convenient way to get started.&lt;/p&gt;
&lt;p&gt;Once you have an account, &lt;a href="https://app.k6.io/account/api-token"&gt;copy your API token from here&lt;/a&gt;. Then, run this command in your terminal to give your local k6 installation permission to run on your account:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 login cloud --token &amp;lt;YOUR_K6_CLOUD_API_TOKEN&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Once you are successfully authenticated, you can continue to run tests locally using &lt;code&gt;k6 run&lt;/code&gt;, but you now have the option of running on the cloud as well:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;k6 cloud test.js&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;k6 will then begin to execute your load test, and you&amp;rsquo;ll see a screen like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/k6-cloud-run-output.png" alt="Running a k6 test on the cloud" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Note that the &lt;code&gt;execution&lt;/code&gt; mode is now &lt;code&gt;cloud&lt;/code&gt;, to remind you where you&amp;rsquo;re running the test.&lt;/p&gt;
&lt;p&gt;By default, your test will run on the k6 AWS account, in the Ashburn region. However, you can override this and specify other regions, including percentages of your virtual user to run on each, using &lt;a href="https://k6.io/docs/cloud/creating-and-running-a-test/cloud-tests-from-the-cli#cloud-execution-options"&gt;cloud execution options&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="analyzing-load-testing-results-and-reporting"&gt;Analyzing load testing results and reporting&lt;/h2&gt;
&lt;p&gt;Although I&amp;rsquo;m listing analysis as a different step in the process from execution, the two often (and should) overlap. The output from k6 in the screenshot above contains a link to the dashboard on k6 Cloud, so that you can see the results of the test in real time, as the test is running. Monitoring the test in real time lets you immediately spot issues as they arise, and, if necessary, stop the test to fix them. If the test is being executed by multiple load generators, having a consolidated dashboard is helpful in giving you an overview of the entire test.&lt;/p&gt;
&lt;p&gt;![An example of the results after a load test in k6 Cloud](/assets/Finished k6 run.png)
&lt;em&gt;An example of the results after a load test in k6 Cloud&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is also a good time to monitor the health of the application servers and the load generator servers, which you set up monitoring tools for during the planning phase.&lt;/p&gt;
&lt;p&gt;A load test is only useful when it&amp;rsquo;s providing information about the application. If errors occur in large quantities, or if the response time makes it clear that a certain component has failed to handle the load, don&amp;rsquo;t be afraid to stop the test. Your objective is to get the information you need to suggest performance improvements and solutions for any bottlenecks you find.&lt;/p&gt;
&lt;p&gt;Often, you&amp;rsquo;ll run into issues you can&amp;rsquo;t solve or even identify during a test. That&amp;rsquo;s why it&amp;rsquo;s useful to explore the data that you have after a test. k6 lets you create shareable links to dashboards so that you can involve relevant engineering teams who may be able to help you understand what happened and why. &lt;a href="https://app.k6.io/runs/public/f6ad87cec7a24a8c82e46c816e67c4b3"&gt;Here&amp;rsquo;s an example of what that dashboard looks like&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Some projects require formal documentation of test execution by way of a Test Summary Report, but in more agile teams, it may be enough to share the test results dashboard and some supplementary information about what type of tests were run and what problems were encountered.&lt;/p&gt;
&lt;p&gt;The most important part of load testing isn&amp;rsquo;t the execution itself; it&amp;rsquo;s what you do with the results. Communicating results clearly to stakeholders will make it more likely that performance issues are fixed.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next&lt;/h2&gt;
&lt;p&gt;The phases I&amp;rsquo;ve outlined here are a good guide for anyone starting with load testing, but I always recommend that you take what works for your situation and leave the rest. In reality, the phases overlap with each other considerably, especially in more modern engineering cycles.&lt;/p&gt;
&lt;p&gt;Another activity I&amp;rsquo;ve not covered here, but one that I recommend, is adding load testing to your CI/CD pipeline. This continuous testing approach involves &lt;a href="https://k6.io/docs/testing-guides/automated-performance-testing/"&gt;automating load testing&lt;/a&gt; so that it occurs in regularly, in parallel with other development and testing activities. Continuous testing is a great way to get more value out of load testing, and it ensures that performance is front-of-mind for everyone on the application team.&lt;/p&gt;
&lt;p&gt;Happy testing!&lt;/p&gt;</description></item><item><title>How I Use Obsidian at Work</title><link>https://nicolevanderhoeven.com/blog/20210518-how-i-use-obsidian-at-work/</link><pubDate>Tue, 18 May 2021 22:33:18 +0200</pubDate><guid>https://nicolevanderhoeven.com/blog/20210518-how-i-use-obsidian-at-work/</guid><description>&lt;p&gt;Note-taking and personal knowledge management get talked about in academic circles, by both students and teachers. But there&amp;rsquo;s not much said about its use outside of the academe.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/graphview-transparent.png" alt="Obsidian for work" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ll admit, due to my job description, I may be in a better position than most to take advantage of note-taking in a professional context. My background is in software performance testing. My job for several years has been to make sure that applications are prepared to withstand traffic from many users accessing it, usually by writing code to simulate that traffic before it&amp;rsquo;s released to real users. Currently, though, I&amp;rsquo;m a Developer Advocate at &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;, which means a significant part of my job now is sharing with people what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;I consider myself a knowledge worker: a significant part of my job depends on how quickly I learn new technologies &lt;em&gt;and&lt;/em&gt; how clearly I can impart what I&amp;rsquo;ve learned to others. I&amp;rsquo;d argue, though, that most people who work in a field as fast-moving as tech are knowledge workers too. It&amp;rsquo;s naive to think we won&amp;rsquo;t one day forget some skills we&amp;rsquo;ve learned, even if we were using them daily at one point. Yet nobody talks about note-taking.&lt;/p&gt;
&lt;p&gt;Recently, my note-taking and personal knowledge management tool of choice has been &lt;a href="https://obsidian.md"&gt;Obsidian.md&lt;/a&gt;. I have no affiliation with the Obsidian team, and in fact I&amp;rsquo;m an investor of &lt;a href="https://roamresearch.com"&gt;a competing product&lt;/a&gt;. Here are some ways I use Obsidian at work that might help you understand why Obsidian is my daily driver.&lt;/p&gt;
&lt;h2 id="my-setup"&gt;My setup&lt;/h2&gt;
&lt;p&gt;I have multiple Obsidian vaults, and each of them is a version-controlled &lt;a href="https://git-scm.com/"&gt;Git&lt;/a&gt; repository, hosted on &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;. I keep my main Obsidian vault in a &lt;a href="https://dropbox.com"&gt;Dropbox&lt;/a&gt; for extra version control and as a backup. Just for overkill, I also use &lt;a href="https://obsidian.md/sync"&gt;Obsidian Sync&lt;/a&gt; as another backup and as the easiest way to get access to my Obsidian vault on my iPad Pro and my Android mobile.&lt;/p&gt;
&lt;p&gt;I use &lt;a href="https://obsidian.md/publish"&gt;Obsidian Publish&lt;/a&gt; to make some of my notes &lt;a href="https://notes.nicolevanderhoeven.com"&gt;publicly available&lt;/a&gt; on a custom domain directly from my vault, as an experiment in learning in public that&amp;rsquo;s gone pretty well so far.&lt;/p&gt;
&lt;p&gt;This setup isn&amp;rsquo;t free. All up, I&amp;rsquo;m giving Obsidian about US $16 a month. However, I want to point out that Obsidian itself is free for personal use, and if mobile access, cloud sync, and publishing your notes online aren&amp;rsquo;t important to you, you can really go a long way with using it for free.&lt;/p&gt;
&lt;h2 id="processing-information"&gt;Processing information&lt;/h2&gt;
&lt;p&gt;Remaining relevant in tech pretty much requires that you learn a lot, learn quickly, and enjoy the hell out of it. Luckily, Obsidian is pretty great at this.&lt;/p&gt;
&lt;h3 id="consume-and-collect"&gt;Consume and collect&lt;/h3&gt;
&lt;p&gt;I consume a lot of content, and in different formats: articles, books, videos, presentations, podcasts are all great sources of free education. I initially capture my notes on them in different ways, but they all lead back to using &lt;a href="https://readwise.io/"&gt;Readwise&lt;/a&gt;, which I use as a collector and sorter of all these notes. Then, I import data from Readwise to Obsidian using a process I describe in more detail &lt;a href="https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For now, suffice it to say that all these notes and highlights end up in Obsidian for processing. &lt;a href="https://notes.nicolevanderhoeven.com/Presentation/In+the+kitchen+-+a+sprinkle+of+fire+and+chaos"&gt;Here&amp;rsquo;s an example of my notes during a presentation&lt;/a&gt; (called &lt;em&gt;In the kitchen - a sprinkle of fire and chaos&lt;/em&gt; by &lt;a href="https://www.anammedina.com/"&gt;Ana Medina&lt;/a&gt;, about chaos engineering).&lt;/p&gt;
&lt;p&gt;When trying to learn something, many people stop at this phase. They&amp;rsquo;ve read the thing, they&amp;rsquo;ve highlighted passages from the thing, and now they think they&amp;rsquo;ve learned the thing. That hasn&amp;rsquo;t been my experience, because I forget many things I consume shallowly.&lt;/p&gt;
&lt;h3 id="process-iteratively"&gt;Process iteratively&lt;/h3&gt;
&lt;p&gt;Then, I process notes iteratively, first restating things into my own words and then creating my own notes about concepts I&amp;rsquo;ve learned. Each time I do that, I try to identify key concepts and create backlinks for them, which in Obsidian just means typing &lt;code&gt;[[Chaos engineering]]&lt;/code&gt;, with a topic between double brackets. If I click on that new link, it creates a page for it. Over time, I end up with a page &lt;a href="https://notes.nicolevanderhoeven.com/Chaos+Engineering"&gt;like this one on Chaos Engineering&lt;/a&gt; that is a consolidation of what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;Interestingly, if I go to the Chaos Engineering page, I can also see all the instances I&amp;rsquo;ve linked to it from other notes:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/linked-mentions.png" alt="Linked mentions in Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;What if I didn&amp;rsquo;t have the foresight to link to Chaos Engineering from an article I read? Obsidian also tracks &lt;em&gt;unlinked&lt;/em&gt; mentions as well. I can see all the times I&amp;rsquo;ve used the words &amp;ldquo;chaos engineering&amp;rdquo; in other notes, even if I haven&amp;rsquo;t created formal links using &lt;code&gt;[[Chaos engineering]]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Over time, things I&amp;rsquo;m interested in start to emerge this way, and topics grow deeper and more detailed, with branches of pages spinning off from it.&lt;/p&gt;
&lt;h3 id="situate-and-solidify"&gt;Situate and solidify&lt;/h3&gt;
&lt;p&gt;Then, I try to think about where this new piece of knowledge fits into the hierarchy of things I&amp;rsquo;m interested in. This is less about trying to classify the world and more about putting it somewhere on &lt;em&gt;my personal&lt;/em&gt; map of interests so that I&amp;rsquo;m more likely to use that knowledge later. For me, chaos engineering fit into my page on &lt;a href="https://notes.nicolevanderhoeven.com/Nonfunctional+testing"&gt;Nonfunctional testing&lt;/a&gt;. Doing so helps me pit it against other things I&amp;rsquo;ve classified as forms of nonfunctional testing and think critically about whether it belongs there, or whether other things I already know contradict it in some way. Sometimes I&amp;rsquo;ll make notes about my reasoning for classification, such as &lt;a href="https://notes.nicolevanderhoeven.com/Chaos+engineering+is+a+testing+discipline"&gt;this note on why I think chaos engineering is a testing discipline&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;None of this is set in stone. I&amp;rsquo;m always changing notes around as I learn more things that change my mind. For example, I&amp;rsquo;m considering merging my nonfunctional testing and functional testing pages after a conversation where someone questioned whether it wasn&amp;rsquo;t a misnomer to call application performance &amp;ldquo;nonfunctional&amp;rdquo;. The point is to create a living, breathing second brain that helps me make connections between concepts and remember what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;Obsidian&amp;rsquo;s built-in graph view illustrates this point nicely:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/graph_view-20210518.png" alt="Built-in graph view" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This is my main Obsidian vault as of the time of this writing - all 5443 notes of it. The graph view plots every note and the connections between notes, so I&amp;rsquo;ve ended up with a slick visual representation of what I&amp;rsquo;ve been thinking and writing about. The graph view is actually &lt;em&gt;functional&lt;/em&gt;, too&amp;ndash; I can assign colors to nodes based on the directory they&amp;rsquo;re in, their tags, words they can contain, and a lot of other criteria. Because each node is sized according to how many links lead to it, this view makes it easy to see clusters in things I&amp;rsquo;ve thought or written about.&lt;/p&gt;
&lt;h3 id="publish"&gt;Publish&lt;/h3&gt;
&lt;p&gt;One of the advantages of Obsidian over something like Notion or Roam Research is how easy it is to publish notes from it.&lt;/p&gt;
&lt;h4 id="obsidian-publish-paid"&gt;Obsidian Publish (paid)&lt;/h4&gt;
&lt;p&gt;There&amp;rsquo;s the paid Publish service, which I&amp;rsquo;ve subscribed to for US $8 a month. After &lt;a href="https://notes.nicolevanderhoeven.com/Using+a+custom+domain+with+Obsidian+Publish"&gt;setting it up to publish on my own domain&lt;/a&gt; rather than the default at &lt;code&gt;publish.obsidian.md&lt;/code&gt;, going from a note to a published post is as easy as clicking the Publish icon, selecting the notes to add, delete, or modify, and then selecting Publish.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/publish-dialog.png" alt="Dialog for Obsidian Publish" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="open-folder-as-vault"&gt;Open folder as vault&lt;/h4&gt;
&lt;p&gt;If you don&amp;rsquo;t want to pay for Publish, Obsidian still saves all files locally in Markdown (&lt;code&gt;.md&lt;/code&gt;) format. This is the same format that many static site generators take for content. This site that you&amp;rsquo;re reading this on is generated using &lt;a href="https://gohugo.io/"&gt;Hugo&lt;/a&gt;, so everything written here is kept as a Markdown file before it&amp;rsquo;s turned into HTML. Since an &amp;ldquo;Obsidian vault&amp;rdquo; is just a folder with Markdown files, I can just open the directory containing the files for my site and write blog posts in Obsidian with no noticeable difference.&lt;/p&gt;
&lt;p&gt;At work, we happen to store our main &lt;a href="https://k6.io/docs/"&gt;product documentation&lt;/a&gt; as Markdown files in a &lt;a href="https://github.com/k6io/docs"&gt;GitHub repo&lt;/a&gt;, which make it perfect for opening in Obsidian as well. I prefer to write documentation in Obsidian over VSCode for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I can install plugins, like &lt;a href="https://github.com/tgrosinger/advanced-tables-obsidian"&gt;Advanced Tables&lt;/a&gt; to make Markdown tables easier to deal with, create templates to standardize the format of notes you make often, see an outline of what you&amp;rsquo;re writing based on Markdown headings.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/outlines-obsidian.png" alt="See an outline of your current note" loading="lazy" decoding="async"&gt;
&lt;em&gt;Outline core plugin for Obsidian&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;When I want to link to another page, it&amp;rsquo;s easier to just hit CMD + O to search through existing notes instead of finding it on GitHub.&lt;/li&gt;
&lt;li&gt;I can choose an Obsidian theme that matches the theme of the published site. &lt;a href="https://github.com/ishgunacar/gitsidian"&gt;This &amp;ldquo;Gitsidian&amp;rdquo; theme&lt;/a&gt; has an Edit view in dark mode (my preference) but a rendered Preview mode that looks more like GitHub&amp;rsquo;s Markdown format, so I can see what it will actually look like for users.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://github.com/ishgunacar/gitsidian/raw/master/showcase.png" alt="Gitsidian theme preview for Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;When I&amp;rsquo;m done, I can still jump to my terminal and push my change to GitHub as normal.&lt;/p&gt;
&lt;h4 id="obsidian-uris"&gt;Obsidian URIs&lt;/h4&gt;
&lt;p&gt;Another cool feature is the fact that every note in Obsidian has what&amp;rsquo;s called an Obsidian URI - it&amp;rsquo;s a link that opens up a note within a specified vault. The URI looks like this:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;obsidian://open?vault=docs&amp;amp;file=src%2Fdata%2Fmarkdown%2Fdocs%2F03%20cloud%2F02%20Analyzing%20Results%2F02%20Performance%20Insights&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Adding it and publishing that to internal documentation means I can switch easily from browsing on GitHub to modifying the same page in Obsidian on my local machine, which is a great little bonus.&lt;/p&gt;
&lt;h4 id="embedding-published-work"&gt;Embedding published work&lt;/h4&gt;
&lt;p&gt;After publishing, I use iframes in Obsidian to update my notes with the final result. Here&amp;rsquo;s a video on YouTube about chaos engineering that my colleague &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I planned out collaboratively on Obsidian, embedded into Obsidian:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/embedded-youtube-iframe.png" alt="Embedding a video in an iframe" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The video plays in Obsidian with all the same controls. The Obsidian desktop app is an Electron app, so it behaves just like a normal browser for playing back the video. To embed the video, I just used the Share &amp;gt; Embed code on YouTube and pasted it straight into Obsidian:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;width&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;560&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;height&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;315&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;src&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;https://www.youtube.com/embed/gVwJZPo30rk&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;title&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;YouTube video player&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;frameborder&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allow&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;allowfullscreen&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style="color:#f92672"&gt;iframe&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="meetings"&gt;Meetings&lt;/h2&gt;
&lt;p&gt;I take meeting notes to help me focus on the meeting, and I create templates for recurring meetings. Templates let you define the format of a note. Once created, you can insert templates into notes with a keyboard shortcut (I set mine to &lt;code&gt;CMD + ;&lt;/code&gt;). Here&amp;rsquo;s an example of what that looks like, with the template on the left and the inserted template on the right:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-meeting-templates.png" alt="Template (left) and inserted template in a new note (right) in Obsidian" loading="lazy" decoding="async"&gt;
&lt;em&gt;Template (left) and inserted template in a new note (right) in Obsidian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You may notice that the frontmatter includes &lt;code&gt;{{date}}&lt;/code&gt; in the template, which gets automatically converted to today&amp;rsquo;s date when the template is used.&lt;/p&gt;
&lt;p&gt;If anyone asks for a copy of my meeting notes, that&amp;rsquo;s no problem&amp;ndash; any note can be exported to Obsidian by clicking on Options &amp;gt; Export to PDF.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-pdf-export.png" alt="Options for exporting a note to a PDF in Obsidian" loading="lazy" decoding="async"&gt;
&lt;em&gt;Options for exporting a note to a PDF in Obsidian&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t want to actually publish any real meeting notes, so here&amp;rsquo;s what my note on the chaos engineering process looks like &lt;a href="https://nicolevanderhoeven.com/assets/The%20process%20of%20chaos%20engineering.pdf"&gt;as a PDF&lt;/a&gt;, straight from Obsidian. And here&amp;rsquo;s what it looks like &lt;a href="https://notes.nicolevanderhoeven.com/The+process+of+chaos+engineering"&gt;as a note&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="presentations"&gt;Presentations&lt;/h2&gt;
&lt;h3 id="the-easier-way"&gt;The easier way&lt;/h3&gt;
&lt;p&gt;Obsidian has a presentation mode! It&amp;rsquo;s basic, but it&amp;rsquo;s functional. You can create a presentation really easily by adding &lt;code&gt;---&lt;/code&gt; between paragraphs of text to delineate slides, right within a note. Here&amp;rsquo;s what that looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-slides-markdown.png" alt="Creating a presentation from Markdown notes" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Then you can click Options &amp;gt; Start presentation, and you get something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-slides.png" alt="An Obsidian presentation" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A little plain, but given the minimal amount of effort to &amp;ldquo;convert&amp;rdquo; a note into a presentation, it&amp;rsquo;s pretty awesome.&lt;/p&gt;
&lt;h3 id="the-harder-way"&gt;The harder way&lt;/h3&gt;
&lt;p&gt;Sometimes the basic slides just don&amp;rsquo;t cut it, and it can be handy to be able to publish the slides in presentation format (since publishing them straight from Obsidian Publish would only publish the Markdown version). For those cases, I&amp;rsquo;ve figured out a way to do just that while still keeping my slides as Markdown files in my vault. &lt;a href="https://nicolevanderhoeven.com/blog/20210302-presentation-slides-as-code/"&gt;Here&amp;rsquo;s a whole post on how to do that&lt;/a&gt;. This is definitely more complicated, but at the end of it, you get a nice page &lt;a href="https://slides.nicolevanderhoeven.com/2021-load-tests-as-code/#/"&gt;like this&lt;/a&gt; to send to attendees after a presentation. (&lt;em&gt;Tip: Hit &lt;code&gt;s&lt;/code&gt; to see the speaker notes while on those slides.&lt;/em&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210302-reveal-hugo-sample.png" alt="A sample custom slide using revealJS with Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="task-management"&gt;Task management&lt;/h2&gt;
&lt;p&gt;I use a few community plugins to keep track of things I want to.&lt;/p&gt;
&lt;h3 id="kanban"&gt;Kanban&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://github.com/mgmeyers/obsidian-kanban"&gt;Kanban plugin&lt;/a&gt; turns Markdown task lists into full-on Kanban boards.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-kanban.png" alt="Kanban plugin in action" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;On the left is the markdown note, and the on the right is the rendered Kanban board. You can customize the titles of the lists that are there, and you can add due dates to each task.&lt;/p&gt;
&lt;h3 id="calendar"&gt;Calendar&lt;/h3&gt;
&lt;p&gt;The &lt;a href="https://github.com/liamcain/obsidian-calendar-plugin"&gt;Calendar plugin&lt;/a&gt; is &lt;a href="https://www.youtube.com/watch?v=fo6BKY2xR2w"&gt;Obsidian&amp;rsquo;s most popular plugin&lt;/a&gt;, and with good reason.&lt;/p&gt;
&lt;p&gt;It lets me add a calendar on the sidebar:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-calendar.png" alt="Obsidian calendar" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I have the weekly notes option enabled, so clicking on the &lt;code&gt;W&lt;/code&gt; column in the calendar takes me to a note that is automatically created for that week. I use it to keep track of weekly goals and to do a review at the end of the week.&lt;/p&gt;
&lt;p&gt;Clicking on a date in the calendar takes me to the&amp;hellip;&lt;/p&gt;
&lt;h3 id="daily-note"&gt;Daily Note&lt;/h3&gt;
&lt;p&gt;The Daily Notes core plugin comes with Obsidian, but you have to enable it. Once enabled, clicking on a day in the calendar creates/takes you to that day&amp;rsquo;s corresponding note. I use daily notes like a log or workbench for that day, with timestamped headings to help me remember later on what I did at what time. It&amp;rsquo;s a loose way to do time management as well.&lt;/p&gt;
&lt;h2 id="dataview"&gt;Dataview&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/blacksmithgu/obsidian-dataview"&gt;Dataview plugin&lt;/a&gt; is my favorite recent discovery, and it&amp;rsquo;s changing the way I do frontmatter. This plugin brings something akin to SQL (albeit not as powerful) to Obsidian. It lets you query your notes based on some file-related metadata &lt;strong&gt;as well as parameters you set in your frontmatter&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;For example, this query:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-dataview" data-lang="dataview"&gt;table file.ctime as Date
from &amp;#34;Meeting&amp;#34;
where file.ctime &amp;gt;= date(today) -dur(1 month)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;when rendered (i.e., viewed in Preview mode in Obsidian), returns a list of all my notes under the subfolder &lt;code&gt;Meeting&lt;/code&gt; in the last month:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/obsidian-dataview-meetings.png" alt="Obsidian Dataview results as a table" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This is huge! I&amp;rsquo;m still updating my notes with the appropriate frontmatter to make more use of this feature, but here are some use cases I can think of that would be handy at work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Find all customers with tag &lt;code&gt;annual&lt;/code&gt; that I haven&amp;rsquo;t spoken to in the last year.&lt;/li&gt;
&lt;li&gt;Find a load testing tool with feature &lt;code&gt;Slack_integration = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Find that woman I met at the Automation Test Guild conference by searching for &lt;code&gt;job = tester&lt;/code&gt; and &lt;code&gt;tag = AutomationTestGuild&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Return all notes tagged &lt;code&gt;#plugin_ideas&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And that&amp;rsquo;s just the beginning!&lt;/p&gt;
&lt;h2 id="collaboration"&gt;Collaboration&lt;/h2&gt;
&lt;p&gt;Obsidian itself does not (yet) have collaboration features. This is a bummer, but given how quickly they&amp;rsquo;ve delivered on features that the community has clamored for (block references and mobile apps come immediately to mind), I&amp;rsquo;m hopeful that they&amp;rsquo;ll eventually improve in this area.&lt;/p&gt;
&lt;p&gt;In the meantime, I&amp;rsquo;ve still found ways to work on the same vault with other people.&lt;/p&gt;
&lt;p&gt;Remember how any folder of .md files can be opened as an Obsidian vault? Well, I&amp;rsquo;m technically collaborating with other people on that repo for work documentation, even if most people don&amp;rsquo;t use Obsidian. All I had to do was add the &lt;code&gt;.obsidian&lt;/code&gt; directory to the &lt;code&gt;.gitignore&lt;/code&gt; file, and now, nobody really even needs to know I&amp;rsquo;m using Obsidian to view/edit the documentation. They just see me pushing to the repository as if I had used a text editor like VSCode.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also had the experience of collaborating with someone who also used Obsidian. Since we were working closely together on the same document, we opted to put our shared vault on Dropbox. Dropbox&amp;rsquo;s main advantage over the Git solution is that Dropbox let us edit notes and see each other&amp;rsquo;s edits in real time. If you&amp;rsquo;re looking for an experience similar to Google Docs, this way got the closest to that. We did run into some quirks: if the Dropbox vault is also a Git repository, be aware that checking out a different branch will also change the contents of the directory for the other person.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Note-taking and personal management aren&amp;rsquo;t just for students and teachers; I think they&amp;rsquo;re particularly useful in tech, where knowledge work is highly prized. I&amp;rsquo;m talking about Obsidian because that&amp;rsquo;s my current tool of choice, but I think the tool you use is less important than the systems you put in place to help yourself learn and create.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;d prefer the video version, here&amp;rsquo;s a video I made showing this process:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/D7e1ud_Dk24?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Learning how to use k6 live with Nočnica Fee from New Relic (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210515-koh-nica/</link><pubDate>Fri, 14 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210515-koh-nica/</guid><description>&lt;p&gt;We were happy to welcome &lt;a href="https://www.twitch.tv/serverlessmom"&gt;Nočnica Fee&lt;/a&gt; from &lt;a href="https://www.twitch.tv/new_relic"&gt;New Relic&lt;/a&gt; to k6 Office Hours. She very bravely volunteered to learn how to use k6&amp;ndash; live! Talk about pressure. But she handled it like a champ!&lt;/p&gt;
&lt;p&gt;We also talked about why observability is both particularly important and particularly difficult in serverless architecture. There will definitely be a part two at some point!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6oMmRiXzvFc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Analyzing load testing results in k6 Cloud</title><link>https://nicolevanderhoeven.com/blog/20210511-k6-analysis/</link><pubDate>Tue, 11 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210511-k6-analysis/</guid><description>&lt;p&gt;Have you ever run a load test but been unable to decipher what it all means? In this video, I break it all down using k6 Cloud.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Eia2l3bY5jU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance testing tool feature requests (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210507-koh-robin-mark/</link><pubDate>Fri, 07 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210507-koh-robin-mark/</guid><description>&lt;p&gt;We managed to get two other folks from k6 to join our Office Hours: our CEO, Robin Gustafsson, and our Head of Customer Success, Mark Meier. We took advantage of the opportunity to discuss wishlist features for k6 and bug Robin about how likely each feature was to see the light of day!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/d8WaMOmwI3Y?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using the k6 Cloud interface</title><link>https://nicolevanderhoeven.com/blog/20210504-k6-cloud-interface/</link><pubDate>Tue, 04 May 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210504-k6-cloud-interface/</guid><description>&lt;p&gt;I&amp;rsquo;ve gotten the feedback that people would like to see more videos of the basics of using k6 and k6 Cloud, so here&amp;rsquo;s a video on getting situated with the k6 Cloud interface and navigation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gwO7k5RTE54?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>How to get started with chaos engineering (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210430-koh-pokemon/</link><pubDate>Fri, 30 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210430-koh-pokemon/</guid><description>&lt;p&gt;Recently, I&amp;rsquo;ve been learning more about chaos engineering. In this week&amp;rsquo;s k6 Office Hours, I shared my experience as a tester getting started with Kubernetes, chaos engineering with &lt;a href="https://github.com/simskij/xk6-chaos"&gt;xk6-chaos&lt;/a&gt; and k6, and observability with &lt;a href="https://newrelic.com"&gt;New Relic&lt;/a&gt;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/gVwJZPo30rk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Shift-left testing and creating a culture of quality with Simon Prior (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210423-koh-simonprior/</link><pubDate>Fri, 23 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210423-koh-simonprior/</guid><description>&lt;p&gt;&lt;a href="https://twitter.com/siprior"&gt;Simon Prior&lt;/a&gt; from the &lt;a href="https://testingpeers.com/"&gt;Testing Peers podcast&lt;/a&gt; joined us on k6 Office Hours to talk to us about how he&amp;rsquo;s managed to foster a culture of quality at his job with EasyJet.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/w4pqfr5cu_4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The future of load testing with k6, with k6 CEO Robin Gustafsson (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210416-koh-robin/</link><pubDate>Fri, 16 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210416-koh-robin/</guid><description>&lt;p&gt;This week, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I convinced k6 CEO, Robin Gustafsson, to come onto k6 Office Hours to talk about the origins of k6 (spoiler: it began with a company called Gatorhole), things we&amp;rsquo;re working on right now, and what he sees as the future of the company.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pX6AALeD5SA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Testing Kubernetes and infrastructure as code with Sid Palas (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210409-koh-sid/</link><pubDate>Fri, 09 Apr 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210409-koh-sid/</guid><description>&lt;p&gt;For this week&amp;rsquo;s k6 Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I had &lt;a href="https://twitter.com/sidpalas"&gt;Sid Palas&lt;/a&gt; from &lt;a href="https://www.youtube.com/channel/UC4MdpjzjPuop_qWNAvR23JA"&gt;DevOps Directive&lt;/a&gt; come on board to talk about what Kubernetes is, how it relates to Infrastructure as Code, and why either of those should matter to testers.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bYdDRZqRSHA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Using CircleCI and environment variables with k6 (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210326-koh-circleci/</link><pubDate>Fri, 26 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210326-koh-circleci/</guid><description>&lt;p&gt;&lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I decided to take this week to answer questions on k6 Office Hours, and we ended up talking about &lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt;, environment variables, and how to use them with k6.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/3FyV1j3TRBk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance Testing with k6 and Cypress (Ministry of Testing)</title><link>https://nicolevanderhoeven.com/blog/20210323-performance-testing-with-k6-and-cypress/</link><pubDate>Tue, 23 Mar 2021 19:52:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210323-performance-testing-with-k6-and-cypress/</guid><description>&lt;p&gt;My friend &lt;a href="https://mariedrake.com"&gt;Marie Drake&lt;/a&gt; and I teamed up to give a presentation about performance testing at a &lt;a href="https://www.meetup.com/Ministry-of-Testing-Manila/events/276622895/"&gt;Ministry of Testing (Philippines) meetup&lt;/a&gt;, and we talked about using &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt; for front-end performance testing and &lt;a href="https://k6.io"&gt;k6&lt;/a&gt; for back-end performance testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/yPmbZl2Qtus?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Performance testing vs. load testing with Señor Performo and Pepe Cano (k6 Office Hours)</title><link>https://nicolevanderhoeven.com/blog/20210319-koh-sr-perf/</link><pubDate>Fri, 19 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210319-koh-sr-perf/</guid><description>&lt;p&gt;What&amp;rsquo;s the difference between performance testing vs. load testing? This week, Simme and I were joined by &lt;a href="https://www.srperf.com/"&gt;Señor Performo&lt;/a&gt;, aka Leandro Melendez, and Pepe Cano, the Head of Marketing at k6, to talk about this common question.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ZR8zgIs3he4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load Tests as Code: An introduction to k6</title><link>https://nicolevanderhoeven.com/blog/20210318-load-tests-as-code/</link><pubDate>Thu, 18 Mar 2021 20:36:41 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210318-load-tests-as-code/</guid><description>&lt;p&gt;Today, I attended the &lt;a href="https://www.cambridge.org/"&gt;Cambridge University Press&lt;/a&gt; QA Week 2021 to talk about load testing with k6. Here&amp;rsquo;s a recording of the presentation.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/kz3Mt97L9CY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And &lt;a href="https://slides.nicolevanderhoeven.com/2021-load-tests-as-code/"&gt;here are the slides&lt;/a&gt; I used!&lt;/p&gt;
&lt;p&gt;I had fun discussing the advantages of the load test as code approach and why k6 is a great way to implement it.&lt;/p&gt;</description></item><item><title>Testing Our Performance Test Tools</title><link>https://nicolevanderhoeven.com/blog/20210316-testing-our-performance-test-tools/</link><pubDate>Tue, 16 Mar 2021 21:29:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210316-testing-our-performance-test-tools/</guid><description>&lt;p&gt;On this episode of the &lt;a href="https://testguild.com/"&gt;TestGuild performance podcast&lt;/a&gt;, I had a chat with Joe Colantonio about languages, board games, nontraditional backgrounds in tech, and why we should all test our performance test tools.&lt;/p&gt;
&lt;iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/18351014/height/90/theme/custom/thumbnail/yes/direction/forward/render-playlist/no/custom-color/000000/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen&gt;&lt;/iframe&gt;</description></item><item><title>Lucky Dippers 103: Sleeping in the Isle of Skye | Portree, Scotland</title><link>https://nicolevanderhoeven.com/blog/20210312-lde103/</link><pubDate>Fri, 12 Mar 2021 21:57:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210312-lde103/</guid><description>&lt;p&gt;This is a travel video from January 2020, when my husband Rob and I did a roadtrip in Scotland with our good friends, Nikki and Basti Filler. This is towards the tail end of that trip, and it involved some of the best scenery I&amp;rsquo;ve ever seen. Scotland is a gorgeous country that we thoroughly enjoyed exploring, despite its awful weather. As a bonus, this was also our first trip with our new niece, Cassie.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q5ON39s3EfI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 05: Observability with Daniel González Lopes</title><link>https://nicolevanderhoeven.com/blog/20210312-k6-office-hours05/</link><pubDate>Fri, 12 Mar 2021 21:53:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210312-k6-office-hours05/</guid><description>&lt;p&gt;Our first repeat guest, Daniel González Lopes, also from &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, joined us today to talk about how to use observability in conjunction with load testing. We talked about the differences between metrics, logs, and traces, and how to implemented distributed tracing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ADkd18AdaEA?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 04: Using Cypress with Marie Drake</title><link>https://nicolevanderhoeven.com/blog/20210305-k6-office-hours04/</link><pubDate>Fri, 05 Mar 2021 21:46:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210305-k6-office-hours04/</guid><description>&lt;p&gt;&lt;a href="https://mariedrake.com"&gt;Marie Drake&lt;/a&gt; joined us today on k6 Office Hours to talk about front-end performance testing using a test tool called &lt;a href="https://cypress.io"&gt;Cypress&lt;/a&gt; and how it can compliment a back-end performance testing strategy.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/ve7Rg0MUZ0g?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Presentation Slides as Code</title><link>https://nicolevanderhoeven.com/blog/20210302-presentation-slides-as-code/</link><pubDate>Tue, 02 Mar 2021 19:07:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210302-presentation-slides-as-code/</guid><description>&lt;p&gt;I was working on a presentation for later this month when &lt;a href="https://mariedrake.com"&gt;Marie Drake&lt;/a&gt; told me about &lt;a href="https://slides.com"&gt;slides.com&lt;/a&gt;. It&amp;rsquo;s basically a Powerpoint replacement (which, let&amp;rsquo;s be honest, needs replacing) in that it lets you create slides &lt;em&gt;and&lt;/em&gt; it lets you present from it. It even goes beyond Powerpoint in that it also saves your slides publicly for people to view later.&lt;/p&gt;
&lt;p&gt;Before she&amp;rsquo;d mentioned slides.com, I had been planning on creating a presentation on &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;, my note-taking tool of choice. The advantage of this approach is that presentations in Obsidian are just Markdown files with &lt;code&gt;---&lt;/code&gt; between lines of text to delineate slides.&lt;/p&gt;
&lt;p&gt;The problem with using Obsidian on its own is that it&amp;rsquo;s severely lacking in features, and it&amp;rsquo;s also not shareable. You can, of course, publish the Markdown file, but people won&amp;rsquo;t be able to view them in slide format. After playing with slides.com, however, I also discovered it had its own weaknesses. It is completely UI-driven, so there&amp;rsquo;s no way to create slides just from a Markdown file. It&amp;rsquo;s also hosted by them, so there are limitations imposed, depending on which pricing tier you pay for.&lt;/p&gt;
&lt;p&gt;So I got to Googling. And I think I found a pretty good setup for my needs.&lt;/p&gt;
&lt;h2 id="the-end-result"&gt;The end result&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I write the presentation in Obsidian, in Markdown. &lt;a href="https://gist.github.com/nicolevanderhoeven/752017196efc1ee861c6d3baa5dfca31"&gt;Here&amp;rsquo;s&lt;/a&gt; what that looks like in a sample presentation where I&amp;rsquo;m trying out a bunch of features.&lt;/li&gt;
&lt;li&gt;I use &lt;a href="https://gohugo.io"&gt;Hugo&lt;/a&gt; to generate a static website and convert the Markdown files into javascript and html, using &lt;a href="https://github.com/hakimel/reveal.js"&gt;reveal.js&lt;/a&gt; and the &lt;a href="https://github.com/dzello/reveal-hugo"&gt;reveal-hugo&lt;/a&gt; theme.&lt;/li&gt;
&lt;li&gt;I push the static website to a remote repository on &lt;a href="https://github.com"&gt;GitHub&lt;/a&gt;. &lt;a href="https://pages.github.com/"&gt;GitHub Pages&lt;/a&gt; serves that site (for free!) on my custom subdomain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Check out the final product here:
&lt;a href="https://slides.nicolevanderhoeven.com/sample"&gt;https://slides.nicolevanderhoeven.com/sample&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210302-reveal-hugo-sample.png" alt="A screenshot of the title presentation slide" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="the-setup"&gt;The setup&lt;/h2&gt;
&lt;h3 id="prerequisites"&gt;Prerequisites&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;An Obsidian vault (or you can actually just use any text editor)&lt;/li&gt;
&lt;li&gt;Git installed and set up with credentials&lt;/li&gt;
&lt;li&gt;A GitHub account&lt;/li&gt;
&lt;li&gt;Hugo installation (&lt;code&gt;brew install hugo&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="create-a-new-hugo-site"&gt;Create a new Hugo site&lt;/h3&gt;
&lt;p&gt;Open up a terminal window and &lt;code&gt;cd&lt;/code&gt; to a folder in your Obsidian vault. Then, create a new Hugo-generated site:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo new site slides
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replace &lt;code&gt;slides&lt;/code&gt; with the name of your new site.&lt;/p&gt;
&lt;p&gt;You should have a new directory, &lt;code&gt;slides&lt;/code&gt;, in your Obsidian vault.&lt;/p&gt;
&lt;h3 id="add-the-reveal-hugo-theme"&gt;Add the reveal-hugo theme&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into &lt;code&gt;slides&lt;/code&gt; and clone the reveal-hugo repo. The documentation suggests using a submodule:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git submodule add git@github.com:dzello/reveal-hugo.git themes/reveal-hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Personally, I just cloned it because I know I&amp;rsquo;m probably going to be messing around with it substantially:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone git@github.com:dzello/reveal-hugo.git themes/reveal-hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should have a &lt;code&gt;/themes/reveal-hugo&lt;/code&gt; folder that contains the theme.&lt;/p&gt;
&lt;h3 id="configure-reveal-hugo-theme"&gt;Configure reveal-hugo theme&lt;/h3&gt;
&lt;p&gt;Set up your new Hugo site to use the reveal-hugo theme by adding the following to &lt;code&gt;/config.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;theme = &amp;#34;reveal-hugo&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#ae81ff"&gt;markup.goldmark.renderer]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;unsafe = true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#ae81ff"&gt;outputFormats.Reveal]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;baseName = &amp;#34;index&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;mediaType = &amp;#34;text/html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;isHTML = true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;Reveal&lt;/code&gt; part is what lets you output text in slide format.&lt;/p&gt;
&lt;h3 id="create-your-slides"&gt;Create your slides&lt;/h3&gt;
&lt;p&gt;Go to &lt;code&gt;/content&lt;/code&gt; and create a file there, called &lt;code&gt;_index.md&lt;/code&gt;. The filename is important, as is its location (I learned that the hard way). This file is going to be the first page people see, so it should probably be a list of your presentation slides. For now, put in something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;title = &amp;#34;My presentations&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;outputs = [&amp;#34;Reveal&amp;#34;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;+++
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Here are my presentation slides!
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[&lt;span style="color:#f92672"&gt;sample presentation&lt;/span&gt;](&lt;span style="color:#a6e22e"&gt;/sample&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, create a new folder for your presentation, such as &lt;code&gt;sample&lt;/code&gt;. In &lt;code&gt;/content/sample&lt;/code&gt;, create a file called &lt;code&gt;_index.md&lt;/code&gt;. Again , the filename is also important here (guess how I learned that).&lt;/p&gt;
&lt;p&gt;This index file is going to be where you actually create your slides. Here&amp;rsquo;s the context of my &lt;code&gt;/content/sample/_index.md&lt;/code&gt;:&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;Each slide is separated by &lt;code&gt;---&lt;/code&gt;, just like in Obsidian, which apparently uses the same converter that reveal-hugo does, &lt;a href="https://github.com/hakimel/reveal.js"&gt;reveal.js&lt;/a&gt;. Note that if you want to try out having an image as a background to one of the slides, you&amp;rsquo;ll need to add that to your &lt;code&gt;/sample&lt;/code&gt; folder and change the filename in the slide in this part:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;slide background-image&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;lucrezia-carnelos-AsM4T46tqcU-unsplash.jpg&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="generate-your-site"&gt;Generate your site&lt;/h3&gt;
&lt;p&gt;Now it&amp;rsquo;s time to generate your site! Wait - didn&amp;rsquo;t we already do that? Sort of that. That was creating the framework for the site, but now you need to get Hugo to convert those Markdown files you&amp;rsquo;ve just created into something publishable. So cd to the root directory &lt;code&gt;slides&lt;/code&gt; and run this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That command should generate a &lt;code&gt;slides/public&lt;/code&gt; folder, where all the publishable code will go.&lt;/p&gt;
&lt;p&gt;At this point, you can also check your work by starting a local server with &lt;code&gt;hugo server&lt;/code&gt; and navigating to &lt;code&gt;http://localhost:1313&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="push-your-site-to-a-remote-github-repo"&gt;Push your site to a remote GitHub repo&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cd&lt;/code&gt; into your public folder. This is important, as I initially started the repo in &lt;code&gt;slides&lt;/code&gt; and it took me ages to realize that GitHub Pages requires an &lt;code&gt;index.html&lt;/code&gt; in the root directory to function.&lt;/p&gt;
&lt;p&gt;Initialize a Git repo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Stage and commit your changes:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#39;Initial commit&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a repository on your GitHub account called &lt;code&gt;username.github.io&lt;/code&gt; where &lt;code&gt;username&lt;/code&gt; is your GitHub username. (If you already have a repo called that, you can alternatively push the contents of &lt;code&gt;public&lt;/code&gt; to a branch called &lt;code&gt;gh-pages&lt;/code&gt;). The repo name matters.&lt;/p&gt;
&lt;p&gt;Push your changes to your repo.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin master
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You should now have a repository on GitHub called &lt;code&gt;username.github.io&lt;/code&gt;, containing everything in &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="set-up-github-pages"&gt;Set up GitHub Pages&lt;/h3&gt;
&lt;p&gt;On GitHub, go to the repository settings and scroll down to the GitHub Pages section. Select the right branch (&lt;code&gt;master&lt;/code&gt; in most cases) and click Save.&lt;/p&gt;
&lt;h3 id="optional-using-a-custom-domain"&gt;(Optional) Using a custom domain&lt;/h3&gt;
&lt;p&gt;If you want to use a custom domain, enter it in the repository settings from the previous step.&lt;/p&gt;
&lt;p&gt;Then, go to your domain registrar and add a CNAME record pointing &lt;code&gt;www&lt;/code&gt; to &lt;code&gt;username.github.io&lt;/code&gt;. &lt;a href="https://docs.github.com/en/github/working-with-github-pages/about-custom-domains-and-github-pages"&gt;Here&amp;rsquo;s more information on that&lt;/a&gt; from GitHub.&lt;/p&gt;
&lt;p&gt;It can take a few hours for DNS records to propagate, so after you set this up, take a break before you convince yourself you&amp;rsquo;ve set something up wrong. ;)&lt;/p&gt;
&lt;h3 id="check-out-your-new-site"&gt;Check out your new site!&lt;/h3&gt;
&lt;p&gt;When you navigate to your new site, you should first see the contents of &lt;code&gt;slides/content/_index.md&lt;/code&gt;, which has a link to your sample presentation. Clicking on that should &lt;em&gt;reveal&lt;/em&gt; (ha) the slides one by one. You can navigate through them with the arrow keys, and you can also see speaker notes (if you put any in, which I did on the third slide if you copied my sample slides).&lt;/p&gt;
&lt;h3 id="other-issues-i-faced"&gt;Other issues I faced&lt;/h3&gt;
&lt;p&gt;I ran into a few issues during this setup because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I was already tracking changes in my Obsidian vault with Git&lt;/li&gt;
&lt;li&gt;I already had a repo called &lt;code&gt;nicolevanderhoeven.github.io&lt;/code&gt;, and I needed to create a branch called &lt;code&gt;gh-pages&lt;/code&gt; to still use GitHub Pages.&lt;/li&gt;
&lt;li&gt;My Obsidian repo on GitHub is a private one, but I wanted the slides to be public.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you have a similar setup, maybe the following instructions will help.&lt;/p&gt;
&lt;h4 id="use-worktrees-not-subtrees-or-submodules"&gt;Use worktrees, not subtrees or submodules&lt;/h4&gt;
&lt;p&gt;After attempts to make this setup work with submodules and subtrees, both of which were way too complicated for what I needed, I settled on using worktrees.&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;public&lt;/code&gt; to &lt;code&gt;.gitignore&lt;/code&gt;. From &lt;code&gt;slides&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;public/&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; .gitignore
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Create a worktree for &lt;code&gt;public&lt;/code&gt;, to be tracked on the branch &lt;code&gt;gh-pages&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git worktree add public gh-pages
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After you generate the static code via &lt;code&gt;hugo&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd public
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#39;Commit message&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push origin gh-pages
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Your &lt;code&gt;gh-pages&lt;/code&gt; branch should contain only the files in &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;
&lt;h4 id="github-pages-with-a-private-repo"&gt;GitHub Pages with a private repo&lt;/h4&gt;
&lt;p&gt;GitHub Pages is free, but if you want to be able to use it with a private repo, &lt;a href="https://docs.github.com/en/github/working-with-github-pages/troubleshooting-custom-domains-and-github-pages"&gt;you can&amp;rsquo;t&lt;/a&gt;. Sorry!&lt;/p&gt;
&lt;p&gt;You can look into using GitHub Actions to copy &lt;code&gt;public&lt;/code&gt; from your private repo to a public one, or you could just &lt;a href="https://github.com/pricing"&gt;spend the $4/month&lt;/a&gt; to remove the restriction. I opted to pay, because I love GitHub anyway.&lt;/p&gt;
&lt;h2 id="presentation-as-code"&gt;Presentation as code&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;s it! I ran into a few snags while I was attempting to implement this, so I thought I&amp;rsquo;d document it here in case it helps anyone else. Despite the setbacks, I think it&amp;rsquo;s worth it&amp;ndash; I can now whip up presentations in Markdown within Obsidian and have that published to a site I control for people to look through at their own leisure. This should speed up my presentation creation process considerably.&lt;/p&gt;
&lt;p&gt;Theoretically.&lt;/p&gt;
&lt;p&gt;If only I could stop procrastinating on creating this presentation by setting up a framework for creating presentations&amp;hellip;&lt;/p&gt;</description></item><item><title>k6 Office Hours 03: Chaos Engineering with Daniel González Lopes</title><link>https://nicolevanderhoeven.com/blog/20210226-k6-office-hours03/</link><pubDate>Fri, 26 Feb 2021 21:40:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210226-k6-office-hours03/</guid><description>&lt;p&gt;In this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I invited Daniel González Lopes, a DevOps engineer from &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, to join us to talk about chaos engineering and what it has to do with load testing. Simme also demonstrated how to use k6 to run simple chaos experiments.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/WrDV8iIdCy8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>k6 Office Hours 02: Observability with New Relic</title><link>https://nicolevanderhoeven.com/blog/20210219-office-hours-02/</link><pubDate>Fri, 19 Feb 2021 23:24:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210219-office-hours-02/</guid><description>&lt;p&gt;For this week&amp;rsquo;s Office Hours, &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; and I invited &lt;a href="https://twitter.com/gspncr"&gt;Gary Spencer&lt;/a&gt; from &lt;a href="https://newrelic.com"&gt;New Relic&lt;/a&gt; to talk to us about why he&amp;rsquo;s recently started using k6, and why an observability platform like New Relic is the perfect companion for performance testing and observability.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/TbRVFTXGUPU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>The 503 Podcast</title><link>https://nicolevanderhoeven.com/blog/20210211-503-podcast/</link><pubDate>Thu, 11 Feb 2021 21:46:35 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210211-503-podcast/</guid><description>&lt;p&gt;This must be the month for trying new things, because I jumped into livestreaming with the first ever &lt;a href="https://nicolevanderhoeven.com/blog/20210205-k6-office-hours"&gt;k6 Office Hours&lt;/a&gt; just a week ago, and this week I&amp;rsquo;m jumping into podcasting with &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt;, who&amp;rsquo;s also doing the Office Hours with me. There&amp;rsquo;s definitely safety (at least psychological safety) in numbers, because doing it with someone else makes me feel a little more brave.&lt;/p&gt;
&lt;p&gt;While the podcast is presented by &lt;a href="https://k6.io"&gt;k6&lt;/a&gt;, that&amp;rsquo;s really just a fancy term for saying that we&amp;rsquo;re both employed by k6 and we&amp;rsquo;re recording and producing the podcast on company time. Unlike the Office Hours, which is heavily k6-focused, the podcast will be about software performance and reliability in general. Simme and I happen to have different and complementary skillsets (he comes from a developer background, and I come from a testing background, and I think that makes for an interesting combination of perspectives.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the first episode! It should also be available on your audio podcasting tool of choice.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/JEpLfLWP4YY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Readwise to Obsidian</title><link>https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/</link><pubDate>Sat, 06 Feb 2021 09:55:36 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210206-readwise-to-obsidian/</guid><description>
&lt;meta property=“og:image” content="/assets/20210206-06-readwise-to-obsidian.png" /&gt;
&lt;meta property=”og:image:width” content=”1200″ /&gt;
&lt;meta property=”og:image:height” content=”628″ /&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-06-readwise-to-obsidian.png" alt="Readwise to Obsidian workflow" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;August 10th, 2021: Readwise just released their own Obsidian plugin, &lt;a href="https://help.readwise.io/article/125-how-does-the-readwise-to-obsidian-export-integration-work"&gt;Readwise Official&lt;/a&gt;, which is available now! I now recommend &lt;a href="https://nicolevanderhoeven.com/blog/20210810-readwise-to-obsidian-redux/"&gt;this method&lt;/a&gt; over the one outlined in this article.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m about 9 months into heavily using &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt; as my primary note-taking, task management, capture-everything system, and for the most part, that&amp;rsquo;s gone very well. &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; is another excellent personal knowledge management (PKM) system, though, and I&amp;rsquo;ve been curious about it for almost as long as I&amp;rsquo;ve been using Roam. I&amp;rsquo;ve had it installed for a while, but I never really &lt;em&gt;seriously&lt;/em&gt; attempted to make the switch. Until now. I&amp;rsquo;ve decided to use Obsidian as my primary PKM and zettelkasten for the next month, to see if it&amp;rsquo;s something I can switch to.&lt;/p&gt;
&lt;p&gt;Why I&amp;rsquo;m considering switching from Roam to Obsidian is another post, probably one I&amp;rsquo;ll write at the end of this experiment, when my thoughts and opinions are more solidified. For now, I want to address one of the things I struggled with when switching over: Readwise integration.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt; is an app that&amp;rsquo;s all about importing notes and highlights you&amp;rsquo;ve made from all over the internet and exporting them all into a single format. Readwise supports far more import sources than I use, but here are the ones I&amp;rsquo;ve got hooked up to it:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Instapaper (for highlights and notes on online articles)&lt;/li&gt;
&lt;li&gt;Amazon Kindle (for highlights on ebooks)&lt;/li&gt;
&lt;li&gt;Twitter (for interesting tweets)&lt;/li&gt;
&lt;li&gt;(Readwise) Web highlighter (for straight highlights off any webpage)&lt;/li&gt;
&lt;li&gt;Airr (for quotes and notes from audio podcasts)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Readwise collates my activity in all of these input sources and automatically sends them to my Roam Research account. Here&amp;rsquo;s what that looks like when it gets pulled into my Daily Note:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-01-readwiseimportsinroam.png" alt="Tweet, podcast, and book notes pulled into Roam Research via Readwise" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise also pulls metadata into Roam, depending on the source. Here&amp;rsquo;s what the page for the book &amp;ldquo;Ready Player Two&amp;rdquo; looks like in Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-02-readyplayertwo.png" alt="Ready Player Two book notes in Roam, imported via Readwise" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Readwise integration is an &lt;em&gt;essential&lt;/em&gt; feature for me in any PKM, because I can take notes wherever I&amp;rsquo;m consuming my content and just have it automagically appear in my notes, tagged and ready for processing. So it&amp;rsquo;s absolutely something I need to have in my Obsidian workflow.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s where things get tricky, because Readwise doesn&amp;rsquo;t &lt;em&gt;have&lt;/em&gt; an Obsidian integration.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-03-readwise-export-options.png" alt="Readwise doesn’t automatically export to Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://readwise.io/export"&gt;Readwise Exports&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The closest thing is the Markdown export, but that&amp;rsquo;s not automatic. You can manually trigger an export, and then copy those exports over into your Obsidian vault, and thne make sure they&amp;rsquo;re in the right format with the right tags. I knew I was never going to do that, so I found a way to automate it.&lt;/p&gt;
&lt;h2 id="readwise2directory"&gt;readwise2directory&lt;/h2&gt;
&lt;p&gt;I discovered that Readwise has an API, and briefly thought about building my own integration. Happily, I found &lt;a href="https://github.com/nicrivard/readwise2directory"&gt;this Python project on GitHub&lt;/a&gt; by &lt;a href="https://github.com/nicrivard"&gt;nicrivard&lt;/a&gt;, who had already done that! Why rebuild the wheel? His solution already did what I needed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It connects to Readwise via your Readwise access token&lt;/li&gt;
&lt;li&gt;Checks for new highlights or updated ones&lt;/li&gt;
&lt;li&gt;Exports the new/updated highlights to a local folder of your choosing (presumably your Obsidian vault)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It even pulls in highlight tags from Readwise, if you&amp;rsquo;ve created any (which I haven&amp;rsquo;t).&lt;/p&gt;
&lt;p&gt;I &lt;a href="https://github.com/nicolevanderhoeven/readwise2directory"&gt;forked the project here&lt;/a&gt; to add just a few minor touches:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Changed date format of imported notes&lt;/li&gt;
&lt;li&gt;Added a section to output the import date to a comment block (an &lt;a href="https://forum.obsidian.md/t/obsidian-release-v0-10-12-insider-build/12295"&gt;Obsidian Insider build feature&lt;/a&gt;) rather than YAML frontmatter, so that the date would actually be linked and backlinked.&lt;/li&gt;
&lt;li&gt;Customized tags and filename for my use&lt;/li&gt;
&lt;li&gt;Sort imports into folders within my Obsidian vault depending on source (&lt;code&gt;Article/&lt;/code&gt;, &lt;code&gt;Tweet/&lt;/code&gt;, and so on).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This works out pretty well. Here&amp;rsquo;s an example of an import from the podcast app &lt;a href="https://airr.io"&gt;Airr&lt;/a&gt; into Obsidian, in Edit mode.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-04-airrtoobsidian.png" alt="readwise2directory import from Airr into Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s placed within my &lt;code&gt;Podcast&lt;/code&gt; folder inside my value, is tagged appropriately, and contains links to the source. Switching to Preview mode shows an imported cover photo and even a playable recorder for the part of the podcast that I snipped on Airr:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20210206-05-airrinobsidian_preview.png" alt="Preview mode of imported Airr quote in Obsidian" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;So that works out well, except for one thing: firing off the script that does all this is still manual.&lt;/p&gt;
&lt;h2 id="scheduling-the-script"&gt;Scheduling the script&lt;/h2&gt;
&lt;p&gt;Luckily, it&amp;rsquo;s pretty easy to schedule a Python script to run at certain intervals. I&amp;rsquo;m on macOS, so I used a built-in utility called &lt;code&gt;cron&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="give-cron-full-system-access"&gt;Give cron full system access&lt;/h3&gt;
&lt;p&gt;Cron needs to have the right permissions to run scripts on my behalf, so I had to go to System Preferences &amp;gt; Security &amp;amp; Privacy &amp;gt; Privacy &amp;gt; Full Disk Access on my laptop and add &lt;code&gt;/usr/bin/cron&lt;/code&gt; to the &amp;ldquo;allowed&amp;rdquo; list.&lt;/p&gt;
&lt;h3 id="open-crontab"&gt;Open crontab&lt;/h3&gt;
&lt;p&gt;Then, from my terminal, I ran the command &lt;code&gt;env EDITOR=nano crontab -e&lt;/code&gt; to open up the list of cronjobs I had currently.&lt;/p&gt;
&lt;h3 id="set-a-schedule"&gt;Set a schedule&lt;/h3&gt;
&lt;p&gt;I added a line to crontab for the schedule I wanted to create. This line has to be in the format&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;* * * * * command
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where the five asterisks correspond to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;minute&lt;/li&gt;
&lt;li&gt;hour&lt;/li&gt;
&lt;li&gt;day of the month&lt;/li&gt;
&lt;li&gt;month&lt;/li&gt;
&lt;li&gt;day of the week&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In my case, I wanted it to run every hour, so here&amp;rsquo;s what my schedule looks like:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; * * * * cd /Users/nic/git/readwise2directory/ &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; /Library/Frameworks/Python.framework/Versions/3.9/bin/python3 /Users/nic/git/readwise2directory/readwise-GET.py &amp;gt;&amp;gt; /Users/nic/git/readwise2directory/readwiseGET.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="python-issues"&gt;Python issues&lt;/h4&gt;
&lt;p&gt;I had some trouble getting cron to work until I realized it was because I had multiple versions of Python installed. I ran a &lt;code&gt;which python3&lt;/code&gt; to find the path to the version I wanted to use and added that path to the command. I also had to &lt;code&gt;cd&lt;/code&gt; to the project directory, for some reason.&lt;/p&gt;
&lt;p&gt;While I was troubleshooting, I found it really useful to output to a log so I could see what had gone wrong.&lt;/p&gt;
&lt;p&gt;Once I added the schedule as in the example above, though, it worked a treat!&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;This solution did require some setup at the beginning, but doesn&amp;rsquo;t need any maintenance once it&amp;rsquo;s going. I&amp;rsquo;m pretty happy with it as it means I can keep taking notes on various places from anywhere, and it&amp;rsquo;ll all be waiting for me in my Obsidian vault whenever I&amp;rsquo;m ready to sit down and process them into my system. Thanks to nicrivard for the repo that made it possible!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This post contains an affiliate link for &lt;a href="https://readwise.io/nicole"&gt;Readwise&lt;/a&gt;. Clicking on that link will give you a two-month trial of Readwise, double the usual amount, and they give me a small percentage if you sign up for a plan. Check out &lt;a href="https://nicolevanderhoeven.com/ethics/"&gt;My Ethics Statement&lt;/a&gt; to see my standards for promotions.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>The first ever k6 Office Hours</title><link>https://nicolevanderhoeven.com/blog/20210205-k6-office-hours/</link><pubDate>Fri, 05 Feb 2021 21:47:16 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210205-k6-office-hours/</guid><description>&lt;p&gt;The k6 virtual office is open!&lt;/p&gt;
&lt;p&gt;The first time I heard about office hours was from &lt;a href="https://www.notion.so/"&gt;Notion&lt;/a&gt;. Recently, &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt; went in on this trend as well. The concept involves opening your virtual doors regularly to your community, to answer questions and share best practices.&lt;/p&gt;
&lt;p&gt;A big part of being a Developer Advocate is talking &lt;em&gt;to&lt;/em&gt; people, and even conferences these days are mostly pre-recorded. I kind of miss being able to interact &lt;em&gt;with&lt;/em&gt; people. I miss the immediacy of &lt;em&gt;live&lt;/em&gt;. So I talked &lt;a href="https://simme.dev"&gt;Simme Aronsson&lt;/a&gt; into doing a k6 Office Hours with me.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re both new to livestreaming, so there&amp;rsquo;s a lot that we&amp;rsquo;ve learned and will be improving in future videos, but here&amp;rsquo;s our first attempt!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/bZsWn5ckzVM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Comparing k6 and JMeter for load testing</title><link>https://nicolevanderhoeven.com/blog/20210129-k6-vs-jmeter/</link><pubDate>Fri, 29 Jan 2021 23:01:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210129-k6-vs-jmeter/</guid><description>
&lt;link rel="canonical" href="https://k6.io/blog/k6-vs-jmeter"&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://k6.io/blog/k6-vs-jmeter"&gt;k6.io&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/noZppBruOSY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;When I &lt;a href="https://www.youtube.com/watch?v=zcYeboT5FYE&amp;amp;list=PLJdv3RhAQXNHsC8OOV3ZjwZvC9tRoAYF2"&gt;joined the k6 team in late November&lt;/a&gt;, the foremost question on my mind was &amp;ldquo;How does this compare to JMeter?&amp;rdquo; You see, I come from a performance testing consulting background, and in the last few years, JMeter has been far and away my tool of choice.&lt;/p&gt;
&lt;p&gt;So what am I doing on the k6 site, talking about how much I love JMeter? Well, firstly, it turns out that the k6 team is pretty open and transparent, especially about potential improvements in k6. Secondly, I want to share my reasons for wanting to explore k6 as a load testing tool&amp;ndash; the same reasons that ultimately convinced me to join the team that builds it.&lt;/p&gt;
&lt;h2 id="what-is-jmeter"&gt;What is JMeter?&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://jmeter.apache.org/"&gt;JMeter&lt;/a&gt; is an open source load testing tool built entirely in Java by the &lt;a href="https://www.apache.org/"&gt;Apache Foundation&lt;/a&gt;. It was first released in 1998, and it made waves because of its audacity in taking on more popular but proprietary load testing tools. JMeter took what other companies were charging a lot of money for and published it online for everyone to use&amp;ndash; for free. Although scripts can also be extended using code, majority of the scripting in JMeter is done using the UI. At the time of this writing, the latest version of JMeter is 5.4.&lt;/p&gt;
&lt;h2 id="what-is-k6"&gt;What is k6?&lt;/h2&gt;
&lt;p&gt;k6 is an &lt;a href="https://github.com/loadimpact/k6"&gt;open source&lt;/a&gt; load testing tool released by &lt;a href="https://loadimpact.com"&gt;LoadImpact&lt;/a&gt; in 2017. LoadImpact had previously consisted of the SaaS platform (now &lt;a href="https://k6.io/cloud"&gt;k6 Cloud&lt;/a&gt;) and professional services. k6 is written in Go, but scripts are written in Javascript. Taking the opposite tack to JMeter, k6&amp;rsquo;s main selling point is its code-based scripting and heavy prioritization of the developer experience. The latest version of k6 is 0.30.&lt;/p&gt;
&lt;h2 id="which-is-better"&gt;Which is better?&lt;/h2&gt;
&lt;p&gt;This article isn&amp;rsquo;t about which tool is &lt;em&gt;better&lt;/em&gt;, because as much as we might prefer a clear-cut answer, there&amp;rsquo;s no &amp;ldquo;best tool&amp;rdquo;. Everything depends on the situation your team is in: what, how, why, and when you&amp;rsquo;re testing.&lt;/p&gt;
&lt;p&gt;The question that I want to answer here is: &lt;em&gt;What situations does each tool excel in?&lt;/em&gt;&lt;/p&gt;
&lt;h1 id="when-does-jmeter-excel"&gt;When does JMeter excel?&lt;/h1&gt;
&lt;h2 id="when-you-want-to-get-started-quickly"&gt;When you want to get started quickly&lt;/h2&gt;
&lt;h3 id="jmeter-has-a-gui"&gt;JMeter has a GUI&lt;/h3&gt;
&lt;p&gt;Many testing teams make decisions on load testing tools based on this fact alone. Sometimes, if you&amp;rsquo;re in a situation where people haven&amp;rsquo;t done load testing before and need to learn a new tool, a GUI-driven tool like JMeter is simply the most frictionless option. A tool with a GUI will be less daunting for many testers that are used to the mostly no-code UIs of the likes of Postman or SOAPUI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/01-jmetergui.png" alt="JMeter’s starting screen: a fresh new test plan" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve always thought of JMeter as user-friendly, but a developer friend recently pointed out that the Test Plan screen that greets you when you first start JMeter doesn&amp;rsquo;t provide any indication of how to create an HTTP sampler. None of the icons add elements to the test plan. It takes a bit of exploring to realize that right clicking on the test plan, or going to Edit &amp;gt; Add, will show the &amp;ldquo;Add&amp;rdquo; menu that you need. He has a point there: UI is subjective to a certain degree. However, I&amp;rsquo;d argue that it&amp;rsquo;s definitely easier for non-developers to explore a UI than a bit of code.&lt;/p&gt;
&lt;p&gt;k6 doesn&amp;rsquo;t have a GUI packaged within the tool, but the &lt;a href="https://k6.io/docs/test-authoring/test-builder"&gt;k6 Test Builder&lt;/a&gt; is available for free. It&amp;rsquo;s a way to create tests with a GUI interface, and despite its inclusion in k6 cloud, it doesn&amp;rsquo;t require any subscription to use. However, it isn&amp;rsquo;t as fully-featured as JMeter.&lt;/p&gt;
&lt;h3 id="jmeter-supports-many-protocols-and-features-out-of-the-box"&gt;JMeter supports many protocols and features out of the box&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s &lt;a href="https://jmeter.apache.org/index.html"&gt;the official list&lt;/a&gt; of the protocols that JMeter supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web - HTTP, HTTPS (Java, NodeJS, PHP, ASP.NET, …)&lt;/li&gt;
&lt;li&gt;SOAP / REST Webservices&lt;/li&gt;
&lt;li&gt;FTP&lt;/li&gt;
&lt;li&gt;Database via JDBC&lt;/li&gt;
&lt;li&gt;LDAP&lt;/li&gt;
&lt;li&gt;Message-oriented middleware (MOM) via JMS&lt;/li&gt;
&lt;li&gt;Mail - SMTP(S), POP3(S) and IMAP(S)&lt;/li&gt;
&lt;li&gt;Native commands or shell scripts&lt;/li&gt;
&lt;li&gt;TCP&lt;/li&gt;
&lt;li&gt;Java Objects&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In contrast, k6 supports the following protocols:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Web - HTTP/1.1, &lt;a href="https://k6.io/docs/using-k6/protocols/http-2"&gt;HTTP/2&lt;/a&gt; (Java, NodeJS, PHP, ASP.NET, …)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/using-k6/protocols/websockets"&gt;WebSockets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://k6.io/docs/using-k6/protocols/grpc"&gt;gRPC&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;SOAP / REST Webservices&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The protocols above are those that are natively supported. However, both tools allow the development of third-party plugins, adding support for more protocols. The number of &lt;a href="https://github.com/topics/xk6"&gt;k6 community extensions&lt;/a&gt;, through &lt;a href="https://k6.io/blog/extending-k6-with-xk6"&gt;xk6&lt;/a&gt;, is growing, but &lt;a href="https://jmeter-plugins.org/"&gt;JMeter plugins&lt;/a&gt; still outnumber them. In many cases, the protocols your application uses may make the decision for you of which tool to use.&lt;/p&gt;
&lt;p&gt;JMeter also has most of the features you&amp;rsquo;ll need for a basic load test, and you don&amp;rsquo;t have to code any of it up yourself. Its parent-child element structure means that you can modify a specific element, like an HTTP request, or modify all HTTP requests, with equal ease. Adding think time to all requests is as easy as adding a Uniform Random Timer to your thread group, and all requests within that group will inherit it.
With code-based load testing tools, it can be a bit more difficult to find out what&amp;rsquo;s possible without a UI. Some of the gap, however, can be bridged by an IDE with good autocompletion.&lt;/p&gt;
&lt;h2 id="when-you-want-a-mature-community-with-tons-of-documentation"&gt;When you want a mature community with tons of documentation&lt;/h2&gt;
&lt;p&gt;JMeter&amp;rsquo;s old, and sometimes that&amp;rsquo;s a good thing. It&amp;rsquo;s been around since 1998, so at this point, it&amp;rsquo;s had 22 years to improve and to build a following. JMeter has a presence on nearly every community networking site, and no matter how specific your use case for JMeter is, the chances are that it&amp;rsquo;s been done before. Searching &amp;ldquo;how to load test X with JMeter&amp;rdquo; is bound to yield thousands of hits and some videos showing you exactly how to do it.&lt;/p&gt;
&lt;p&gt;JMeter&amp;rsquo;s &lt;a href="https://jmeter.apache.org/usermanual/component_reference.html"&gt;Component Reference&lt;/a&gt; is proof of JMeter&amp;rsquo;s extensive and thorough documentation. Every element, function, and property is discussed in more detail than most people could ever want, and that&amp;rsquo;s just the &amp;ldquo;official&amp;rdquo; documentation that&amp;rsquo;s on the Apache site. There are thousands of JMeter books, tutorials, and courses by its passionate users.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://github.com/apache/jmeter"&gt;JMeter GitHub repository&lt;/a&gt; has 17,290 commits as of December 2020 - evidence of a community of developers that have committed some time and experience to JMeter over the last two decades.&lt;/p&gt;
&lt;p&gt;In comparison, the k6 community is growing, but still small. There is an official and &lt;a href="https://community.k6.io/"&gt;central community forum&lt;/a&gt; that allows users to share their experiences with k6, which is something missing from the JMeter community. The &lt;a href="https://github.com/loadimpact/k6"&gt;k6 repository&lt;/a&gt; does have more stars, but significantly fewer commits at 3,795. Much of the disparity, of course, is because k6 is very new - the open-source tool k6 was only released in 2017.&lt;/p&gt;
&lt;h2 id="when-you-need-a-cost-effective-way-to-do-distributed-load-testing"&gt;When you need a cost-effective way to do distributed load testing&lt;/h2&gt;
&lt;p&gt;One of JMeter&amp;rsquo;s absolute best features is that it gives you a framework for running distributed load tests with it. This is pretty special for a free and open-source tool.&lt;/p&gt;
&lt;p&gt;Distributed testing means ramping up the amount of load you&amp;rsquo;re generating with your load tests, usually by increasing the number of virtual users and running multiple instances of your script on other load generators. JMeter accomplishes this by designating a controller node and letting you set up worker nodes. Each worker node needs to have a copy of &lt;code&gt;jmeter-server&lt;/code&gt;, a utility included with every JMeter installation (in &lt;code&gt;jmeter/bin&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/02-jmeterdistributed.svg" alt="JMeter comes with a native distributed testing mode" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.html"&gt;Apache JMeter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;These worker nodes then run copies of your test plan and exert load against your application server. You can use on-premise or cloud machines as your worker nodes. A distributed execution like this takes a bit to set up, but it does work surprisingly well.&lt;/p&gt;
&lt;p&gt;k6 doesn&amp;rsquo;t have a &lt;em&gt;native&lt;/em&gt; distributed load testing mode. You &lt;em&gt;can&lt;/em&gt; containerize it yourself and deploy it via Kubernetes, for instance, but it does require a more involved setup. The team is also working on the &lt;a href="https://github.com/k6io/operator"&gt;k6 Operator&lt;/a&gt;, which makes setup significantly easier, but it is experimental and comes with drawbacks such as not supporting threshold synchronization between instances. For now, the easiest way to scale up on k6 is by using the paid service k6 Cloud, which reduces setup time and complexity significantly.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important to note that JMeter can be quite resource-hungry, and thus is more likely to require multiple load generators to generate load than k6. Depending on the resources of the load generator, JMeter can run about a thousand virtual users on average, and scaling up your test beyond that point will require a distributed execution setup. A single instance of k6, on the other hand, can run tens of thousands of virtual users given the same resources. More on that later.&lt;/p&gt;
&lt;h2 id="when-you-want-canned-reports-built-into-your-load-testing-tool"&gt;When you want canned reports built into your load testing tool&lt;/h2&gt;
&lt;p&gt;JMeter&amp;rsquo;s many listeners allow you to decide exactly what format you want to view results in. Debugging? Use the View Results Tree. Wanting metrics for your load test? Use the Summary or Aggregate Report.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/03-jmeterlistener.png" alt="Adding listeners like View Results Tree in JMeter lets you visualize results in different ways" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;In addition, JMeter can generate HTML reports based on your load tests. They&amp;rsquo;re currently quite limited, but functional, and they have several default graphs to help you analyze your load test. They are not interactive, but they are pretty easy to generate and a good starting point for putting together a report template for your tests.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/04-jmeterhtmlreport.png" alt="JMeter’s built-in HTML dashboard is limited but functional" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;k6 does not have built-in reporting. Its modular nature lends itself better to integrating with &lt;a href="https://k6.io/docs/results-visualization"&gt;many other data analytics tools&lt;/a&gt;, including Grafana, Datadog, New Relic, Amazon CloudWatch, and k6 Cloud&amp;ndash; all of which are better analysis tools and can provide more insights than what JMeter&amp;rsquo;s reports can provide, but they do require you to set up another tool to analyze your tests. If you&amp;rsquo;re running low on time and can make do with its reports, JMeter does really well at providing that extra value out of the box.&lt;/p&gt;
&lt;h1 id="when-does-k6-excel"&gt;When does k6 excel?&lt;/h1&gt;
&lt;h2 id="when-you-want-to-get-started-quickly-1"&gt;When you want to get started quickly&lt;/h2&gt;
&lt;p&gt;Yup, I put this one in both the JMeter and k6 sections. JMeter and k6 can each be easy to get started with, but for very different reasons.&lt;/p&gt;
&lt;h3 id="installation"&gt;Installation&lt;/h3&gt;
&lt;p&gt;k6 installs extremely quickly - on my first installation of it on macOS, it took &lt;a href="https://www.youtube.com/watch?v=y5tteMKZUqk&amp;amp;t=99"&gt;7 seconds&lt;/a&gt; via &lt;code&gt;brew install k6&lt;/code&gt;. It doesn&amp;rsquo;t require nodeJS or any other dependencies, either.&lt;/p&gt;
&lt;p&gt;JMeter itself is fairly easy to install, but before you install JMeter, you need to install Java. Especially if you&amp;rsquo;re using Windows, it&amp;rsquo;s a bit of a rite of passage for a new JMeter user to run into issues adding the environment variables needed for Java to function.&lt;/p&gt;
&lt;p&gt;It can also be confusing to determine which version of Java is the right one. There&amp;rsquo;s JDK, JRE, and recently Oracle has added to the confusion by announcing that some versions of Java (but not all) are going to require a license.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/05-javalicense.png" alt="Oracle’s changing Java licensing can cause confusion for JMeter users" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://java.com/en/download/"&gt;Oracle Java&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;While JMeter is still free via OpenJDK, I&amp;rsquo;ve spoken to a few testers who mistakenly thought they&amp;rsquo;d have to pay for JMeter. It&amp;rsquo;s a little disconcerting to see Oracle flexing its muscles here, especially if you&amp;rsquo;ve built a whole performance testing suite on Java through JMeter.&lt;/p&gt;
&lt;h3 id="plugins"&gt;Plugins&lt;/h3&gt;
&lt;p&gt;k6 &lt;a href="https://k6.io/blog/extending-k6-with-xk6"&gt;supports plugins&lt;/a&gt;, but they&amp;rsquo;re not necessary. For most use cases, k6&amp;rsquo;s built-in functionality should be more than sufficient. This is in sharp contrast to JMeter, where everything is a plugin &amp;hellip; even the &lt;a href="https://jmeter-plugins.org/wiki/PluginsManager/"&gt;Plugin Manager&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Most JMeter users would argue that there is a standard set of plugins that you should download before you even begin to use it. A new JMeter user might not necessarily know where to find these and may have a less-than-satisfying experience out of the box.&lt;/p&gt;
&lt;p&gt;Here are a few things you &lt;em&gt;won&amp;rsquo;t&lt;/em&gt; have if you stick to a vanilla, no-plugin JMeter installation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Thread groups: No custom load profile, stages, rendezvous&lt;/li&gt;
&lt;li&gt;Controllers: No parallel controller to execute requests in parallel&lt;/li&gt;
&lt;li&gt;Samplers: No HTTP/2 support&lt;/li&gt;
&lt;li&gt;Test Data: No randomization of lines within a CSV file (sequential only)&lt;/li&gt;
&lt;li&gt;Timers: No throughput shaping timer for setting throughput in stages&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These functions are all available within k6 from the get-go.&lt;/p&gt;
&lt;h3 id="scripting"&gt;Scripting&lt;/h3&gt;
&lt;p&gt;k6 scripts are written in javascript, making them simple to write and run. All you need is one installer (on Microsoft Windows) or a single command on your terminal and any text editor. For JMeter, you&amp;rsquo;ll need to install a few things locally before you can get started: Java, JMeter itself, and the standard set of plugins you&amp;rsquo;ll need. This can be confusing for new users. Who hasn&amp;rsquo;t struggled with environment variables at some point when learning to use JMeter, especially on Windows?&lt;/p&gt;
&lt;p&gt;It also takes time to learn any new UI, whereas javascript is near-ubiquitous and it&amp;rsquo;s a good language to learn when you&amp;rsquo;re load testing web sites anyway.&lt;/p&gt;
&lt;h2 id="when-you-want-to-maximize-performance-and-efficiency"&gt;When you want to maximize performance and efficiency&lt;/h2&gt;
&lt;h3 id="test-your-test-tools"&gt;Test your test tools!&lt;/h3&gt;
&lt;p&gt;Why does all this matter?&lt;/p&gt;
&lt;p&gt;When we&amp;rsquo;re talking about simulating many virtual users, slow performance = high cost. There is a cost to the number of load generators you use, whether it&amp;rsquo;s the cost to acquire and maintain them (on-prem) or the cost of a cloud service.&lt;/p&gt;
&lt;p&gt;It makes sense to consider the performance limitations of your load testing tool before you use it to improve your own application&amp;rsquo;s performance.&lt;/p&gt;
&lt;h3 id="k6-builds-on-gos-stellar-performance"&gt;k6 builds on Go&amp;rsquo;s stellar performance&lt;/h3&gt;
&lt;p&gt;k6 is written in Go, and Go is built with performance in mind. &amp;ldquo;Go is a compiled language and does not need to be interpreted, unlike Java or Python. There is no added layer of complexity.&amp;rdquo; It also has no external dependencies, which is a good thing. Fewer moving parts for a performance tester means fewer potential sources of a bottleneck.&lt;/p&gt;
&lt;p&gt;The simplest and most common way for a load testing tool to run a virtual user is to assign one virtual user to one kernel or OS thread. However, the 1 Thread: 1 Virtual User paradigm has a serious flaw: when a virtual user is waiting for a response or executing a programmed &lt;code&gt;sleep()&lt;/code&gt;, the thread is also blocked, and cannot process other work.&lt;/p&gt;
&lt;p&gt;In k6, each virtual user is run on a goroutine, not a thread. What difference does that make? Well, goroutines can be controlled by something called the Go Scheduler, which acts like a traffic cop. It reuses idle threads and intelligently assigns work, by allowing &amp;ldquo;work stealing&amp;rdquo; and work hand-offs between threads. Does this sound familiar? This is the same principle that load balancers are built on: An external monitor that oversees the flow of work improves general performance. Go itself is intrinsically load-balanced in a way that many programming languages aren&amp;rsquo;t, which makes it the perfect foundation for a load testing tool.&lt;/p&gt;
&lt;p&gt;Being able to leverage Go&amp;rsquo;s innate performance optimizations also translates into significantly less memory utilization. One thread running k6 doesn&amp;rsquo;t go above 100 kb, whereas a JVM thread like JMeter uses, for instance, &lt;a href="https://www.baeldung.com/jvm-configure-stack-sizes"&gt;uses the default of 1MB&lt;/a&gt;. That&amp;rsquo;s 1000% more than k6! Of course, Java allows a user to tweak an app&amp;rsquo;s memory utilization, so the difference is usually not quite as stark, but it&amp;rsquo;s still interesting to note that Go has a much lower starting point.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip; creating [a] new thread in Java is not memory efficient. As every thread consumes approx 1MB of the memory heap size and eventually if you start spinning thousands of threads, they will put tremendous pressure on the heap and will cause shut down due to out of memory. Also, if you want to communicate between two or more threads, it’s very difficult. - &lt;a href="https://medium.com/@kevalpatel2106/why-should-you-learn-go-f607681fad65"&gt;Keval Patel&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="performance-benefits-in-practice"&gt;Performance benefits in practice&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Fewer load generators needed&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;k6&amp;rsquo;s comparatively better performance means it needs fewer load generators to execute a given amount of load. Rafaela Azevedo made a comparison of the memory used by k6 and JMeter, and &lt;a href="https://azevedorafaela.com/2020/07/06/load-tests-jmeter-vs-k6/"&gt;here are her results&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;JMeter took up 760 MB of memory.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/06-jmeterbenchmark.png" alt="In an independent test by Rafaela Azevedo, JMeter took up 760 MB of memory" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://azevedorafaela.com/2020/07/06/load-tests-jmeter-vs-k6/"&gt;Rafaela Azevedo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Meanwhile, k6 took up 256 MB of memory.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/07-k6benchmark.png" alt="In an independent test by Rafaela Azevedo, k6 took up 256 MB of memory compared to JMeter’s 760 MB for the same test" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="https://azevedorafaela.com/2020/07/06/load-tests-jmeter-vs-k6/"&gt;Rafaela Azevedo&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Rafaela&amp;rsquo;s findings are further affirmed by our own benchmarks.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/08-internalbenchmarks.png" alt="A comparison of maximum throughput and memory for the most popular open-source load testing tools" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Source: Ragnar Lönn, in our &lt;a href="https://k6.io/blog/comparing-best-open-source-load-testing-tools"&gt;Load Testing Tool Comparison&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;k6&amp;rsquo;s lower memory footprint is the reason it can run more virtual users and generate more load than average. Whether you&amp;rsquo;re using load generators that are on-premise or in a cloud, you&amp;rsquo;ll pay less for provisioning costs when using k6. This cost saving makes k6 a great tool for budget-conscious teams.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The common misconception of many load testers is that distributed execution (ability to launch a load test on multiple machines) is required to generate large load. This is not the case with k6. - &lt;a href="https://azevedorafaela.com/2020/07/06/load-tests-jmeter-vs-k6/"&gt;Rafaela Azevedo&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;k6 is different from many other load testing tools in the way it handles hardware resources. A single k6 process will efficiently use all CPU cores on a load generator machine. A single instance of k6 is often enough to generate load of 30.000-40.000 simultaneous users (VUs). This amount of VUs can generate upwards of 300,000 requests per second (RPS).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Unless you need more than 100,000-300,000 requests per second (6-12M requests per minute), a single instance of k6 will likely be sufficient for your needs. - &lt;a href="https://k6.io/docs/testing-guides/running-large-tests"&gt;k6 documentation&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;No out of memory errors&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;k6 is also good for when you&amp;rsquo;re short on time. Using JMeter means getting familiar with how to performance tune Java and how to fix the &lt;a href="https://www.eginnovations.com/blog/top-10-java-performance-problems/"&gt;most common Java performance problems&lt;/a&gt;, because there are several. The one that I&amp;rsquo;ve personally run into the most while using JMeter is:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ERROR - jmeter.threads.JMeterThread: Test failed! java.lang.OutOfMemoryError:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Java heap space.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You&amp;rsquo;re not really a JMeter load tester until you&amp;rsquo;ve seen this error. :)&lt;/p&gt;
&lt;p&gt;The cause for this error is usually that there was an insufficient amount of Heap memory allocated to JMeter. Yup&amp;ndash; in addition to monitoring your load generator&amp;rsquo;s memory usage, you&amp;rsquo;ll also need to monitor the JVM&amp;rsquo;s memory usage. You can set the amount of heap memory allocated to JMeter by modifying the JMeter binary itself and changing this line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-java" data-lang="java"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt; This is the base heap size &lt;span style="color:#f92672"&gt;--&lt;/span&gt; you may increase or decrease it &lt;span style="color:#66d9ef"&gt;to&lt;/span&gt; fit your
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;#&lt;/span&gt; system&lt;span style="color:#960050;background-color:#1e0010"&gt;&amp;#39;&lt;/span&gt;s memory availability:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#34;${HEAP:=&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;Xms1g &lt;span style="color:#f92672"&gt;-&lt;/span&gt;Xmx1g &lt;span style="color:#f92672"&gt;-&lt;/span&gt;XX:MaxMetaspaceSize&lt;span style="color:#f92672"&gt;=&lt;/span&gt;256m&lt;span style="color:#e6db74"&gt;&amp;#34;}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even JMeter official documentation suggests that you increase the Java Heap size beyond 1GB before you even run your first load test.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Increase the Java Heap size. By default JMeter runs with a heap of 1 GB, this might not be enough for your test and depends on your test plan and number of threads you want to run - &lt;a href="https://jmeter.apache.org/usermanual/get-started.html"&gt;Apache JMeter&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;No GUI means no resource overhead during load tests&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GUIs typically add significantly more overhead to an application, which is one of the reasons why k6 doesn&amp;rsquo;t have one.&lt;/p&gt;
&lt;p&gt;When you&amp;rsquo;re running a load test, the best practice is to run it from the command line anyway&amp;ndash; because otherwise, it interferes with your results. Code-based load testing tools are performant from the beginning.&lt;/p&gt;
&lt;p&gt;JMeter is peppered with warnings about the GUI&amp;rsquo;s effect on performance. Here&amp;rsquo;s one from the &amp;ldquo;JMeter documentation:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Don&amp;rsquo;t run load test using GUI mode ! - &lt;a href="https://jmeter.apache.org/usermanual/get-started.html"&gt;Apache JMeter&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;And here&amp;rsquo;s a message that occurs upon startup of JMeter:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/09-jmeterguimodewarning.png" alt="JMeter’s startup screen warns users not to use the GUI mode for load testing" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Not having a GUI means there&amp;rsquo;s one less gotcha. Any load testing scripts you create in k6 are ready for prime-time execution whenever you&amp;rsquo;re ready.&lt;/p&gt;
&lt;h2 id="when-you-want-to-do-goal-oriented-testing"&gt;When you want to do goal-oriented testing&lt;/h2&gt;
&lt;p&gt;The most important question a load tester can ask when starting a new load testing project is &amp;ldquo;Why&amp;rdquo;?
Test plans should be made to directly address a team&amp;rsquo;s reasons for wanting to do load testing, and that should be reflected in the non-functional requirements. Non-functional requirements, in turn, should then give some guidance as to the bounds of acceptable performance. A common example for these bounds, or thresholds, is an average response time of less than 3 seconds for all transactions during the test.
k6 does this natively with &lt;a href="https://k6.io/docs/using-k6/thresholds"&gt;global thresholds&lt;/a&gt; worked into the script, and you can also create your own metric to use in a threshold:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;Rate&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/metrics&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;myFailRate&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;new&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Rate&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;failed requests&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;options&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;thresholds&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;failed requests&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;rate&amp;lt;0.1&amp;#39;&lt;/span&gt;], &lt;span style="color:#75715e"&gt;// threshold on a custom metric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;http_req_duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [&lt;span style="color:#e6db74"&gt;&amp;#39;p(95)&amp;lt;500&amp;#39;&lt;/span&gt;], &lt;span style="color:#75715e"&gt;// threshold on a standard metric
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test-api.k6.io/public/crocodiles/1/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;myFailRate&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;add&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;!==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Source: &lt;a href="https://k6.io/docs/using-k6/thresholds"&gt;k6 documentation&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JMeter doesn&amp;rsquo;t natively support thresholds at the test-level. There are a few ways that I&amp;rsquo;ve been able to work around this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Duration Assertion&lt;/strong&gt;: You can add a Duration Assertion to any sampler in JMeter, which allows you set an acceptable response time for that request in milliseconds, beyond which the request (and the transaction that encompasses it) would be marked as failed. However, this is still just at the individual request level, and even putting the duration assertion element at the Test Plan level only applies the same threshold to each child request. It doesn&amp;rsquo;t constitute pass/fail criteria for the test as a whole.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Timers&lt;/strong&gt;: For criteria related to throughput, you can use the Constant Throughput Timer or the Throughput Shaping Timer (plugin). This approach controls how many requests per second are spent. In my experience, it&amp;rsquo;s worth testing how these timers behave when using nested transaction controllers - it may take some rearranging to get right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Performance Plugin&lt;/strong&gt;: When integrating JMeter with Jenkins, you can use the Performance Plugin to set error thresholds and mark test runs (&amp;ldquo;builds&amp;rdquo;) as unstable or failed within Jenkins.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Custom Code&lt;/strong&gt;: You can use the JSR223 Sampler to write a bit of Groovy or BeanShell code that collects and parses response metrics.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The problem is that even though these options make setting thresholds possible in JMeter, they&amp;rsquo;re still workarounds that don&amp;rsquo;t come with JMeter out of the box or don&amp;rsquo;t adequately address the creation of different types of thresholds (error, response time, throughput, CPU, memory). What I end up doing, more often than not, is exporting the raw data from JMeter and doing the analysis myself using another tool.&lt;/p&gt;
&lt;h2 id="when-youre-part-of-a-team-of-scripters"&gt;When you&amp;rsquo;re part of a team of scripters&lt;/h2&gt;
&lt;p&gt;k6 shines in situations where more than one person could be doing the scripting.&lt;/p&gt;
&lt;h3 id="it-strikes-a-middle-ground-that-developers-and-testers-can-compromise-on"&gt;It strikes a middle ground that developers and testers can compromise on&lt;/h3&gt;
&lt;p&gt;Software quality should not be the sole responsibility of testers; quality should be baked into every activity when building software. One of the challenges in implementing this concept, however, is that there has traditionally been a segmentation in tools and languages used by team members with different functions. Developers use one tool; testers use another. It&amp;rsquo;s difficult to encourage developers to test and testers to code in this environment, and many testing tools only further encourage this divide. A developer can&amp;rsquo;t use a tool like JMeter for anything but testing, so the incentive to invest the effort in learning it is lower.&lt;/p&gt;
&lt;p&gt;k6 bridges the gap by bringing testing concepts and features to an environment and language that developers are already spending their time in. Javascript is useful for more than just writing load testing scripts, and k6 works well with any IDE or text editor. A frictionless developer experience is central to the k6 philosophy.&lt;/p&gt;
&lt;h3 id="its-easier-to-collaborate-on-scripts"&gt;It&amp;rsquo;s easier to collaborate on scripts&lt;/h3&gt;
&lt;p&gt;Once you&amp;rsquo;ve convinced both devs and testers to contribute to load testing scripts, how do you keep track of changes? How do you manage scripts that multiple people are working on at the same time?
With tests as code, the easiest way is to just use versioning tools like Git, the way you probably are already using for your application code. Again, no new framework or processes to learn here.
k6&amp;rsquo;s conciseness and portability really proves to be an advantage in collaboration situations. To illustrate this, let&amp;rsquo;s consider a simple test script that contains a few things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A GET request to &lt;a href="https://test.k6.io"&gt;our test site&lt;/a&gt;, &lt;code&gt;https://test.k6.io&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A transaction that calls this request &lt;code&gt;01_Home&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A check to fail non-HTTP 200 responses or responses that don&amp;rsquo;t have the text &lt;code&gt;Collection of simple web-pages suitable for load testing&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Variable think time&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ll just run that as a single user, for a single iteration. Here&amp;rsquo;s what that script looks like in k6:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://test.k6.io&amp;#39;&lt;/span&gt;, {&lt;span style="color:#a6e22e"&gt;tags&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;name&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;01_Home&amp;#39;&lt;/span&gt; }});
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;is status 200&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;text verification&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;includes&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Collection of simple web-pages suitable for load testing&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(Math.&lt;span style="color:#a6e22e"&gt;random&lt;/span&gt;() &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can track JMeter scripts on Git, too. Here&amp;rsquo;s what the same script looks like in JMeter:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;?xml version=&amp;#34;1.0&amp;#34; encoding=&amp;#34;UTF-8&amp;#34;?&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;jmeterTestPlan&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;version=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;1.2&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;properties=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;5.0&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;jmeter=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;5.3&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;TestPlan&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlanGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Test Plan&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.comments&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.functional_mode&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.tearDown_on_shutdown&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.serialize_threadgroups&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;elementProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.user_defined_variables&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;elementType=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ArgumentsPanel&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;User Defined Variables&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;collectionProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments.arguments&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/elementProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TestPlan.user_define_classpath&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/TestPlan&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;ThreadGroup&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroupGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Thread Group&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.on_sample_error&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;continue&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;elementProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.main_controller&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;elementType=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LoopController&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LoopControlPanel&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LoopController&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Loop Controller&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LoopController.continue_forever&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;LoopController.loops&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/elementProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.num_threads&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.ramp_time&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;1&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.scheduler&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.duration&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.delay&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ThreadGroup.same_user_on_next_iteration&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/ThreadGroup&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;TransactionController&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TransactionControllerGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TransactionController&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;01_Home&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TransactionController.includeTimers&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;TransactionController.parent&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/TransactionController&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;HTTPSamplerProxy&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HttpTestSampleGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSamplerProxy&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTP Request&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;elementProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPsampler.Arguments&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;elementType=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPArgumentsPanel&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;User Defined Variables&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;collectionProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Arguments.arguments&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/elementProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.domain&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;test.k6.io&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.port&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.protocol&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;https&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.contentEncoding&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.path&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.method&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;GET&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.follow_redirects&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.auto_redirects&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.use_keepalive&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;true&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.DO_MULTIPART_POST&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.embedded_url_re&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.connect_timeout&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;HTTPSampler.response_timeout&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/HTTPSamplerProxy&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;ResponseAssertion&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;AssertionGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ResponseAssertion&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Response Assertion&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;collectionProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Asserion.test_strings&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;-745788246&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;Collection of simple web-pages suitable for load testing&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/collectionProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Assertion.custom_message&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Assertion.test_field&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;Assertion.response_data&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;boolProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Assertion.assume_success&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;false&lt;span style="color:#f92672"&gt;&amp;lt;/boolProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;intProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Assertion.test_type&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;16&lt;span style="color:#f92672"&gt;&amp;lt;/intProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/ResponseAssertion&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;UniformRandomTimer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;guiclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UniformRandomTimerGui&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testclass=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;UniformRandomTimer&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;testname=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Uniform Random Timer&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;enabled=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;true&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;ConstantTimer.delay&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;1000&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;stringProp&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;RandomTimer.range&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;4000&lt;span style="color:#f92672"&gt;&amp;lt;/stringProp&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/UniformRandomTimer&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;hashTree/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/hashTree&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/jmeterTestPlan&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Which one is easier to understand? If you had to modify the script to add a request, which format would you choose to do it in?&lt;/p&gt;
&lt;p&gt;Scripting in XML makes merge conflicts more likely and breaking changes in automation pipelines way more difficult to pinpoint.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve collaborated with others on JMeter scripts in the past, and we always opened up scripts in the GUI. It&amp;rsquo;s way easier to spot changes there - but that also created some new issues.&lt;/p&gt;
&lt;h2 id="when-you-want-something-easy-to-maintain"&gt;When you want something easy to maintain&lt;/h2&gt;
&lt;h3 id="versioning-for-load-testing"&gt;Versioning for load testing&lt;/h3&gt;
&lt;p&gt;When ramping up load tests to more than one load generator, keeping track of the versions of necessary components ensures that one load generator&amp;rsquo;s traffic is the same as another&amp;rsquo;s. The value of reducing variables in scientific experiments holds true for load testing.&lt;/p&gt;
&lt;p&gt;With k6, you just need to worry about the version of k6 and the script. No other dependencies are required. If you&amp;rsquo;re using plugins, you&amp;rsquo;d need to track those too, but as mentioned previously, plugins in k6 aren&amp;rsquo;t as necessary as they are in some other tools &amp;ndash; and k6 is available as a Docker image to reduce those issues.&lt;/p&gt;
&lt;p&gt;With something like JMeter, there are more levels to consider. There&amp;rsquo;s the version of JMeter itself, Java, versions of plugins, and then the script. Every new layer introduces more changes for incompatibilities. In previous projets I&amp;rsquo;ve worked on, someone would inevitably try out a new plugin and forget to discuss it with the team, and anyone who tried to open that script in their copy of JMeter would see this error:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/10-jmeterpluginerror.png" alt="This is the error that JMeter throws when you attempt to open a test plan that includes a plugin you don’t have installed locally" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The error means there&amp;rsquo;s a plugin that the script uses that JMeter doesn&amp;rsquo;t recognize, but depending on the plugin, it&amp;rsquo;s not always this easy to pinpoint which one (it was the &lt;code&gt;Ultimate Thread Group&lt;/code&gt; in this case).
You don&amp;rsquo;t want that happening in the middle of your load test because you forgot to add a plugin to some of your load generators!&lt;/p&gt;
&lt;h3 id="its-easier-to-link-test-code-with-application-code"&gt;It&amp;rsquo;s easier to link test code with application code&lt;/h3&gt;
&lt;p&gt;If your application code is in Javascript, k6 is a shoo-in as a load testing tool. You could build tests that are tightly integrated with application code by importing objects and having your tests interacting with them directly. This approach would reduce a lot of time spent in refactoring test scripts when objects are changed.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re already using VS Code, k6 even has a &lt;a href="https://marketplace.visualstudio.com/items?itemName=k6.k6"&gt;VS Code plugin&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="test-as-code-gives-you-control"&gt;Test as code gives you control&lt;/h3&gt;
&lt;p&gt;Having your scripts be pure code reduces ambiguities in that you&amp;rsquo;re not limited by poor UI design or bugs in third-party plugins. k6 scripts are Typescript-typed, so most IDEs support autocompletion while you&amp;rsquo;re scripting - the code equivalent of helpful tooltips, except way more universal.
k6 scripts give you the freedom to import and use JS libraries, so you can build on code others have already written. While k6 is not NodeJS, there are even &lt;a href="https://k6.io/docs/using-k6/modules#bundling-node-modules"&gt;some NodeJS packages&lt;/a&gt; that you can bundle for use with your scripts.&lt;/p&gt;
&lt;h3 id="no-external-dependencies"&gt;No external dependencies&lt;/h3&gt;
&lt;p&gt;k6 doesn&amp;rsquo;t require NodeJS or anything else to run, which also reduces the likelihood of bugs that might affect your scripts. For example, since JMeter runs on Java, it is also dependent on Java. When Java receives a new version, that often requires a JMeter update as well. JMeter versions understandably lag a bit behind Java versions as developers refactor code, but this gap can lead to potential security issues in a previous version of Java that may remain unpatched in the meantime.&lt;/p&gt;
&lt;p&gt;With k6, development can proceed independently of any third-party component, so major issues can be addressed more easily.&lt;/p&gt;
&lt;h1 id="comparison-table-jmeter-vs-k6"&gt;Comparison table: JMeter vs k6&lt;/h1&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Feature&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;JMeter&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;k6&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Written in&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scripting language&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited: some Java (Groovy, Beanshell, etc)&lt;/td&gt;
&lt;td&gt;Javascript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocols&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Supports most protocols via plugins (native support for HTTP/1.1, SOAP, FTP, JDBC, LDAP, MOM via JMS, SMTP, POP3, IMAP, shell scripts, TCP, Java objects)&lt;/td&gt;
&lt;td&gt;Supports fewer, modern protocols natively (HTTP/1.1, HTTP/2, WebSockets, gRPC)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;External dependencies&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Java&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Resource utilization&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://k6.io/blog/static/b4075246f21af514c7a1554d1406b337/d5e13/RPSvMemory.png"&gt;Poor&lt;/a&gt;; One load generator can simulate a few thousand virtual users&lt;/td&gt;
&lt;td&gt;&lt;a href="https://k6.io/blog/static/b4075246f21af514c7a1554d1406b337/d5e13/RPSvMemory.png"&gt;Very good&lt;/a&gt;; One load generator can simulate tens of thousands of virtual users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory management&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;JVM heap memory must be set&lt;/td&gt;
&lt;td&gt;Uses load generator memory natively&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Threading model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;1 Thread: 1 Virtual User; Slower performance, higher resource cost&lt;/td&gt;
&lt;td&gt;1 Goroutine: 1 Virtual User; Faster performance, lower resource cost&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ease of scripting&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;GUI-driven, with code blocks&lt;/td&gt;
&lt;td&gt;code-driven; VSCode plugin&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Test-level thresholds&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No, individual request only&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Script format&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;XML&lt;/td&gt;
&lt;td&gt;javascript&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Collaboration&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Difficult to work on simultaneously; tester-friendly; need the GUI app to edit&lt;/td&gt;
&lt;td&gt;Developer-friendly, easy to version; Javascript format promotes collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintenance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Verbose scripts; XML format is difficult to read&lt;/td&gt;
&lt;td&gt;More concise scripts; JavaScript is easy to read&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Community&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Since 1998; Many third-party tutorials; Extensive documentation; No central community&lt;/td&gt;
&lt;td&gt;Since 2017; Extensive documentation; Fewer third-party tutorials; &lt;a href="https://community.k6.io/"&gt;Official community&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plugin support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires plugins for many features, but there are lots of plugins available&lt;/td&gt;
&lt;td&gt;Most features are natively supported, but plugin support is new and availability is sparse&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Native distributed load generation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No (Premium only)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pre-generated reports&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Default and custom HTML reports; logging via listeners&lt;/td&gt;
&lt;td&gt;No built-in pre-generated reports; integration with analytics tools with third-party dashboards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Website&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://jmeter.apache.org/"&gt;jmeter.apache.org&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Source Code&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/apache/jmeter"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;&lt;a href="https://github.com/loadimpact/k6"&gt;Link&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h1 id="conclusion"&gt;Conclusion&lt;/h1&gt;
&lt;p&gt;The best advice, when attempting to choose a load testing tool, is to do a proof of concept with the most promising candidates. Some features or bugs may prove more or less important when used in an actual testing cycle. However, don&amp;rsquo;t put too much weight on comparisons of the load test &lt;em&gt;results&lt;/em&gt; from two different tools - each tool records metrics differently, and it&amp;rsquo;s more meaningful to compare results against previous runs with the same tool. When switching tools, reestablish a baseline in the new tool each time.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a summary that might help you decide between JMeter and k6.&lt;/p&gt;
&lt;h2 id="both-tools-do-well-at"&gt;Both tools do well at:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Generating protocol-level load on an application server by scripting complex user flows&lt;/li&gt;
&lt;li&gt;Realistic scripting with the use of dynamic think time, test data generation and reuse, and customizable workload models&lt;/li&gt;
&lt;li&gt;Documentation of features and consistency of releases&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="neither-tool-supports"&gt;Neither tool supports:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Generating browser-level load and interacting with DOM elements, especially for SPA&lt;/li&gt;
&lt;li&gt;Detailed results analysis (JMeter has pre-generated HTML reports and listeners, but they are far from ideal). Users should expect to integrate results with databases and data visualization software.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jmeter-is-best-for"&gt;JMeter is best for:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;traditional testing teams&lt;/li&gt;
&lt;li&gt;those looking for a GUI-driven testing tool with tons of third-party tutorials and extensive protocol support&lt;/li&gt;
&lt;li&gt;previous users of commercial tools like LoadRunner and NeoLoad&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="k6-is-best-for"&gt;k6 is best for:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;collaborative, cross-functional engineering teams where testing spans acrosss multiple roles&lt;/li&gt;
&lt;li&gt;those looking for a simple and lightweight, yet fully-featured load testing tool&lt;/li&gt;
&lt;li&gt;teams looking to integrate testing into existing development workflows and CI/CD pipelines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Load testing scripting tools are by no means the most important consideration for the success of load testing. Knowing &lt;em&gt;why&lt;/em&gt; you&amp;rsquo;re testing, what the requirements are, and understanding and communicating results are all arguably more important. The right tool will enable you to address those concerns while providing as little friction as possible. There&amp;rsquo;s no unequivocal &amp;ldquo;best&amp;rdquo; tool; there&amp;rsquo;s only the right tool for &lt;em&gt;your&lt;/em&gt; project and context.&lt;/p&gt;</description></item><item><title>Python for Everybody Specialization</title><link>https://nicolevanderhoeven.com/blog/20210126-python-for-everybody/</link><pubDate>Tue, 26 Jan 2021 23:01:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20210126-python-for-everybody/</guid><description>
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/4KQ7OfVztCvpnOBfWcB1p1" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;I&amp;rsquo;m starting off the new year by learning something new. I am a big fan of non-traditional education, and &lt;a href="https://coursera.org"&gt;Coursera&lt;/a&gt; is a platform I&amp;rsquo;ve used a few times before. You may not get courses that qualify as university credit, but I&amp;rsquo;ve found it to be a useful resource for learning. I might be biased (my university degree is in Economics, which I&amp;rsquo;ve never used), but in some ways, I actually prefer a MOOC (that&amp;rsquo;s a Massively Open Online Course) to a typical formal university course for a few reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;MOOCs are entirely online, which means it&amp;rsquo;s more accessible - I don&amp;rsquo;t need to physically be in the US to take a course at Harvard&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MOOCs are usually self-paced - perfect for someone working full-time like me&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;MOOCs are free or cheap - no huge student loans here; MOOCs are democratizing education and making it available to more people&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Good online education tends to be more practical. There is none of the intellectual posturing that I&amp;rsquo;ve seen in physical classrooms; there are no random classes you need to take to get a fancy piece of paper. I love being able to choose a topic and learn ONLY that&amp;ndash; and get right down to business in the first lesson.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Formal education is often centered around getting students jobs, not helping workers do their jobs well. I already have a job, and I want to learn real, usable skills, not &amp;ldquo;marketable&amp;rdquo; ones.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;My main complaint with MOOCs was that they tend to be short (in comparison to a formal course), but Coursera has addressed that somewhat with their specializations. A specialization is a series of courses, but it&amp;rsquo;s more than just disparate courses that are strung together; it&amp;rsquo;s a thoughtfully designed curriculum that builds up on knowledge from previous courses. Last year, I began learning Python.&lt;/p&gt;
&lt;p&gt;Why Python? Others might have different reasons, but here were mine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Python is one of the best languages to learn for data analysis (the other being R). I&amp;rsquo;ve always been interested in data visualization, and as a load tester, I&amp;rsquo;m frequently exposed to large quantities of data that I somehow need to make sense of.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Python is pretty good at retrieving data from websites, and I wanted to explore how good it is to use in load testing. I&amp;rsquo;m always eager to learn different ways to test, and I&amp;rsquo;ve wanted to try &lt;a href="https://locust.io/"&gt;Locust&lt;/a&gt; for a while.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Python is increasing in popularity, and I wanted to see why.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I decided to take the &lt;a href="https://www.coursera.org/learn/python"&gt;Python for Everybody Specialization&lt;/a&gt; from the University of Michigan (via Coursera) to get an introduction to this cool language. The specialization consists of five modules, each of which I had to take separately:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Programming for Everybody (Getting Started with Python)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Python Data Structure&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using Python to Access Web Data&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Using Databases with Python&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Capstone: Retrieving, Processing, and Visualizing Data with Python&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The specialization was really fun, and the teacher, Charles Severance, is fantastic. I&amp;rsquo;d taken courses from him before, so I knew what to expect. He didn&amp;rsquo;t disappoint. He has a way of explaining daunting technical concepts in a way that&amp;rsquo;s easy to digest for beginners.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://coursera.org/share/11534b2c1b88aa2ab1f0098ebbe32e18"&gt;check out my certificate here&lt;/a&gt;. I&amp;rsquo;m pretty happy with my progress. I&amp;rsquo;m by no means a Python expert now, but I&amp;rsquo;m definitely eager to keep learning how to do more things with this new knowledge.&lt;/p&gt;</description></item><item><title>Week of Testing Wrap-up: My thoughts on k6 as a load testing tool</title><link>https://nicolevanderhoeven.com/blog/20201217-week-of-testing-07/</link><pubDate>Thu, 17 Dec 2020 15:29:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201217-week-of-testing-07/</guid><description>&lt;p&gt;I decided to make a final wrap-up video for my &amp;ldquo;Week of Testing&amp;rdquo; with k6&amp;hellip; ok, so it&amp;rsquo;s actually three weeks later now, but I wanted to explore k6 a little bit more before I gave my opinion on it.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zVjLBp543E4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;And here&amp;rsquo;s the audio version:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/0YgYqrPpEzEMSZIloeiQtC" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Thank you, k6, for being awesome enough to agree to this video series before knowing what I&amp;rsquo;d say. Gotta love a company that welcomes transparency and feedback.&lt;/p&gt;</description></item><item><title>Taking Notes on a Video: my YiNote to Roam Research Workflow</title><link>https://nicolevanderhoeven.com/blog/20201215-yinote-to-roam/</link><pubDate>Tue, 15 Dec 2020 22:00:34 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201215-yinote-to-roam/</guid><description>&lt;p&gt;Listen to the audio version of this blog post here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2TzFxvI8tLNUb3yubhdYvP" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;I was working on an article yesterday comparing the performance of k6 with JMeter, and I had a chat to Mihail, one of the devs of k6. He mentioned that a large part of why k6 is so performant compared to other tools (particularly Java-based ones) is that it&amp;rsquo;s written in Go. He talked a bit about Goroutines, and when I told him I was a Go noob, he recommended &lt;a href="https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;ab_channel=GopherAcademy"&gt;this very excellent video&lt;/a&gt; by Kavya Joshi, which explains a bit more about the Go Scheduler and how it manages to achieve performance for Go apps that exceeds the typical 1 Virtual User: 1 kernel thread paradigm that many load testing tools (like JMeter) use.&lt;/p&gt;
&lt;p&gt;Anyway, I got around to watching the video today, and because it was a video I knew I&amp;rsquo;d learn from, I took notes - and ended up improving part of the workflow (more on that later). Other people have commented on my notes before, so I thought I&amp;rsquo;d share how I process videos into my personal wiki, currently held in &lt;a href="https://roamresearch.com"&gt;Roam Research&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="install-yinote-chrome-extension"&gt;Install YiNote Chrome extension&lt;/h2&gt;
&lt;p&gt;I use a free app called &lt;a href="https://yinote.co/"&gt;YiNote&lt;/a&gt; to take video notes in particular. I use &lt;a href="https://chrome.google.com/webstore/detail/yinote/fhpgggnmdlmekfdpkdgeiccfkignhkdf"&gt;their Chrome extension&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="take-notes"&gt;Take Notes&lt;/h2&gt;
&lt;p&gt;I was pretty dubious about using an app just to take notes for video specifically, but there were a few things that sold me:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;When you click on the text field to take notes in the extension, YiNote automatically pauses the video so that you can type without missing what&amp;rsquo;s being said.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YiNote also automatically saves the timestamps associated with notes you create, so that you can click on it afterwards to jump to the specific section that you wrote a note on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;YiNote has an export to Markdown option - great compatibility with Roam or &lt;a href="https://obsidian.md"&gt;Obsidian&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You can also export your notes to a PDF, which is great for sharing. It saves screenshots of the presentation and puts your notes next to the relevant screenshot.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s what it looks like while taking notes:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="export-yinote-notes"&gt;Export YiNote notes&lt;/h2&gt;
&lt;p&gt;After watching the video, I click the Settings wheel from the Chrome extension panel.&lt;/p&gt;
&lt;p&gt;I click the Export as Markdown button.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That lets me save a &lt;code&gt;.md&lt;/code&gt; file to my local drive. I always save YiNote files in the same folder as the script below.&lt;/p&gt;
&lt;h2 id="run-reformatter-script"&gt;Run reformatter script&lt;/h2&gt;
&lt;p&gt;This is the part that I tweaked today. YiNote&amp;rsquo;s exported Markdown file is formatted in a way that doesn&amp;rsquo;t really play well with Roam. Here&amp;rsquo;s what it looks like, fresh from YiNote:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- Generated by &amp;lt;a href=&amp;#34;https://www.yinote.co/#installation&amp;#34;&amp;gt;YiNote&amp;lt;/a&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- # [GopherCon 2018: Kavya Joshi - The Scheduler Saga](https://www.youtube.com/watch?v=YHRO5WQGh0k) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- ## [1:19](https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;t=79) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;The scheduler is what makes sure the Goroutines run concurrently.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;!-- ## [1:29](https://www.youtube.com/watch?v=YHRO5WQGh0k&amp;amp;t=89) --&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All the information is there, but importing that to Roam, with the comments, isn&amp;rsquo;t really useful. I want to see those timestamps as clickable links, and I want my notes to be nested underneath the corresponding timestamp so I know what belongs where.&lt;/p&gt;
&lt;p&gt;So I dusted off my Python skills tonight and wrote up this little script to do just that. Warning: I am not a developer; I just occasionally code. So I&amp;rsquo;m sure that this isn&amp;rsquo;t the most concise way to do it (contact me and let me know how it could have been better if you have any ideas). But it&amp;rsquo;s functional. And, in the spirit of learning in public, here it is:&lt;/p&gt;
&lt;script src="https://gist.github.com/nicolevanderhoeven/8d089da1617cdbce13dcd406d1d0b960.js"&gt;&lt;/script&gt;
&lt;p&gt;The script results in an output file that is better formatted for Roam.&lt;/p&gt;
&lt;h2 id="import-resulting-file-to-roam"&gt;Import resulting file to Roam&lt;/h2&gt;
&lt;p&gt;On Roam, I hit Options &amp;gt; Import Files, select the output file, hit OK, and that creates a new page in a way better format than the one directly from YiNote. After adding the date, author, and &amp;ldquo;Recommended By&amp;rdquo; fields, this is what it looks like in Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201215-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="thats-it"&gt;That&amp;rsquo;s it!&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t do this for every video I watch, but I find this process useful for more technical videos that I really want to learn from. It&amp;rsquo;s really important to me to get all my notes from disparate sources into Roam, so that they then get processed like any other note into my Zettelkasten - but that&amp;rsquo;s a process for another day.&lt;/p&gt;</description></item><item><title>How I use Roam Research for D&amp;D: Session Notes</title><link>https://nicolevanderhoeven.com/blog/20201214-roam-for-dnd/</link><pubDate>Mon, 14 Dec 2020 20:13:13 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201214-roam-for-dnd/</guid><description>&lt;p&gt;In case you thought this site was all about performance and load testing, surprise! It&amp;rsquo;s not.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve talked to me personally for longer than ten minutes in the last year, there&amp;rsquo;s a pretty good chance I&amp;rsquo;ve mentioned &lt;a href="https://roamresearch.com/"&gt;Roam Research&lt;/a&gt;, or the note-taking and learning methodology called &lt;a href="https://en.wikipedia.org/wiki/Zettelkasten"&gt;Zettelkasten&lt;/a&gt;. Sorrynotsorry. I&amp;rsquo;ve been obsessed since I discovered it.&lt;/p&gt;
&lt;p&gt;To say Roam Research is a note-taking device is like saying Bitcoin is currency: yes, it IS that, but also so much more. To me, it&amp;rsquo;s my second brain. It&amp;rsquo;s a record of what I know and what I want to know, and sometimes even things I don&amp;rsquo;t know yet. The real reason that Roam and the Zettelkasten idea resonated with me so much is that I can use it a lot for my work. But I&amp;rsquo;ve discovered another use case that Roam is perfect for: Dungeons &amp;amp; Dragons.&lt;/p&gt;
&lt;p&gt;This became longer than I thought it would be, so I&amp;rsquo;ll just talk about how I handle Session Notes in particular.&lt;/p&gt;
&lt;h2 id="starting-a-new-session"&gt;Starting a new session&lt;/h2&gt;
&lt;p&gt;Everything starts with sitting down to play D&amp;amp;D. I write a log of events and information that comes out while I&amp;rsquo;m playing. Here&amp;rsquo;s what a new session log looks like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I preface pages in this campaign with &lt;code&gt;D&amp;amp;D/&lt;/code&gt; to make it a separate &lt;a href="https://forum.roamresearch.com/t/namespaces-how-do-they-work/276"&gt;namespace&lt;/a&gt;. A namespace is like a folder, and I use it mainly because I have two D&amp;amp;D campaigns, both of which would have the page &lt;code&gt;Campaign&lt;/code&gt;, &lt;code&gt;Characters&lt;/code&gt;, &lt;code&gt;Locations&lt;/code&gt;, etc, even though the two campaigns are on different worlds. To keep them separate, and to keep from getting mixed up (&lt;em&gt;Was Gloomtoes an NPC in this campaign or that one?&lt;/em&gt;) I use different namespaces for each campaign.&lt;/p&gt;
&lt;p&gt;I add the real-world date in the page name, and then an in-game date reference. The in-game date reference is useful for keeping track of time since I might go a couple weeks (okay, maybe &lt;em&gt;one&lt;/em&gt; week; let&amp;rsquo;s not get too crazy) without playing this campaign, but no time in the in-game world has elapsed. Then, I end the page name with a descriptive title, which I always end up changing after the session. Sometimes I&amp;rsquo;ll title a page &lt;code&gt;Exploring Castle Never&lt;/code&gt;, but then we end up getting carried away in another part of the city instead. That&amp;rsquo;s okay - when I change a page name, Roam then updates all references to that page that I&amp;rsquo;ve made from other pages.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t type all this out manually - I use a &lt;a href="https://textexpander.com/"&gt;TextExpander&lt;/a&gt; template so that to start a new session, all I have to do is create a page in Roam, type &lt;code&gt;;s.dnd&lt;/code&gt; and that is automatically replaced with prompts for a few fields.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Date&lt;/code&gt;: This is the real-world date of when I played this particular session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Tags&lt;/code&gt;: When I first create session notes, this is prepopulated with &lt;code&gt;#TVZ&lt;/code&gt;, which stands for &lt;em&gt;To Verzettelen&lt;/em&gt;. It&amp;rsquo;s just my personal way of marking a note as one that needs to be processed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Location&lt;/code&gt;: Here I note down the in-game places that my character visited this session. Usually I&amp;rsquo;ll just put city names, but I sometimes also split locations up into districts within a city or rooms within a dungeon.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Characters&lt;/code&gt;: I&amp;rsquo;ve found it helpful to keep track of which characters (players and NPCs) I&amp;rsquo;ve come across in this session.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Session Summary&lt;/code&gt;: This is a section I leave blank when the session is initially created.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="filling-in-the-session-log"&gt;Filling in the session log&lt;/h2&gt;
&lt;p&gt;The rest of the page, after &lt;code&gt;Session Summary&lt;/code&gt;, is where I&amp;rsquo;ll spend most of the time writing. I just write whatever comes to mind and whatever I have time to write, in bullet form. I don&amp;rsquo;t worry about formatting or grammar or linking to other pages. I just type all my thoughts out in plain text.&lt;/p&gt;
&lt;h3 id="hp"&gt;HP&lt;/h3&gt;
&lt;p&gt;I like to play healers, which means I care a lot about how everyone in the party is doing so that I can figure out who best needs healing. &lt;code&gt;{{[[table]]}}&lt;/code&gt; in Roam lets me create a custom table, and I have a &lt;code&gt;;hp&lt;/code&gt; snippet in TextExpander that recreates this table, with all the names of the people currently in my party, so that I just worry about filling in the values. Sometimes I still get it wrong, or miss a bit of damage that the DM calls out, but it&amp;rsquo;s enough to give me an idea of who needs heals.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I also write down initiative orders, the defenses/vulnerabilities/immunities of monsters we face, descriptions of NPCs we meet, suspicions or questions I might have&amp;hellip; basically anything and everything that comes to mind. Session time is pretty much a brain dump, with no formatting.&lt;/p&gt;
&lt;h3 id="equipment"&gt;Equipment&lt;/h3&gt;
&lt;p&gt;If I acquire a new item during a session, I&amp;rsquo;ll tag that line with &lt;code&gt;#[[D&amp;amp;D/Carrying]]&lt;/code&gt;. This lets me stay on the Session Notes page while still maintaining an up-to-date record of what I&amp;rsquo;m carrying.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-05.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A tag in Roam is the same as a page, so when I click on that link, it takes me to the &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt; page, which conveniently also shows me all the references to that page from other pages.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Roam shows me not just the page, but the exact block where I made the reference to &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt;, so it&amp;rsquo;s easy to see at a glance what I have and where I got it.&lt;/p&gt;
&lt;h3 id="next-actions-and-waiting-for"&gt;Next Actions and Waiting For&lt;/h3&gt;
&lt;p&gt;I use David Allen&amp;rsquo;s &lt;a href="https://gettingthingsdone.com/"&gt;GTD&lt;/a&gt; methodology in D&amp;amp;D too. When I want to remember to do something later, I tag it with &lt;code&gt;#[[D&amp;amp;D/Agenda]]&lt;/code&gt; and &lt;code&gt;#[[Next Actions]]&lt;/code&gt; or &lt;code&gt;#[[Waiting For]]&lt;/code&gt;. This presents me with the same opportunities as &lt;code&gt;D&amp;amp;D/Carrying&lt;/code&gt;, where I can see references to those pages later as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-07.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="processing-the-session"&gt;Processing the session&lt;/h2&gt;
&lt;p&gt;Sometime after the session, I&amp;rsquo;ll go and fill in the metadata from my template, including the session summary, which is just a paragraph or two describing what happened in the session at a high level. This is mainly to jog my memory in the next session, when I&amp;rsquo;ve already forgotten what we did in the previous one.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what it looks like, all filled in:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="adding-links-and-fleshing-out-pages"&gt;Adding links and fleshing out pages&lt;/h3&gt;
&lt;p&gt;I then go back through the notes themselves and add turn any people, places, or interesting objects that I mention into links. In Roam, that&amp;rsquo;s a matter of highlighting them and hitting &lt;code&gt;[[&lt;/code&gt;. Then, I click on the page I&amp;rsquo;ve just created and try to add information that I&amp;rsquo;ve learned. This isn&amp;rsquo;t strictly necessary, since all mentions of that page will show up as a linked reference, but it&amp;rsquo;s an opportunity to consolidate my information on that subject and see how it fits into what else I&amp;rsquo;ve written there.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a page for an NPC:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-09.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Having these links means that when an NPC says &amp;ldquo;I&amp;rsquo;m from Leilon&amp;rdquo;, I can type &lt;code&gt;Leilon&lt;/code&gt; into Roam:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-08.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&amp;hellip; and say, &amp;ldquo;Oh, Leilon. I heard you had a dragon problem there recently. Did your family get out okay?&amp;rdquo; Boom! Instant advantage on a Diplomacy check.&lt;/p&gt;
&lt;p&gt;Sometimes we&amp;rsquo;re in a dungeon with many rooms, and this is the point where I draw a quick map on my iPad Pro and Apple Pencil using &lt;a href="https://www.gingerlabs.com/"&gt;Notability&lt;/a&gt;, and then I upload it right from my iPad to Roam.&lt;/p&gt;
&lt;p&gt;This map is in my page for Castle Never:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-10.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The little blue &amp;ldquo;8&amp;rdquo; on the upper left of the map is versions. Information rarely comes all at once in D&amp;amp;D; it usually comes in trickles. As I learned more about the castle, I revised the map and added a new version to it, so that I can still see previous versions and what I thought the map was like when we first explored it.&lt;/p&gt;
&lt;p&gt;At this stage, I also add any tags I forgot to add during the session.&lt;/p&gt;
&lt;h3 id="reviewing-quests-and-questions"&gt;Reviewing quests and questions&lt;/h3&gt;
&lt;p&gt;After I go through the session notes, I go to the page called &lt;code&gt;D&amp;amp;D/Quests and Questions&lt;/code&gt;, where I keep a running list of all the open quest hooks and any unanswered questions I might have.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-11.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Not everything on this page is meant to be resolved, but I find it comforting to track everything anyway, in case I happen to find myself in a city with nothing in particular to do. I mark these with a checkbox (&lt;code&gt;{{[[TODO]]}})&lt;/code&gt; in Roam) and tick the box when one is resolved. Roam lets me filter out the resolved quests so I only see things that are outstanding.&lt;/p&gt;
&lt;p&gt;This is where I get the most value out of taking notes. It&amp;rsquo;s at this point where I&amp;rsquo;ll add our progress towards quests, make connections between two seemingly disconnected quests, and situate what I&amp;rsquo;ve just learned in the session within the broader context of the world and the campaign. I also review and update items on the Next Actions and Waiting For.&lt;/p&gt;
&lt;p&gt;This is the part that takes the longest, but it&amp;rsquo;s also what most prepares me for when I get to the table again next week.&lt;/p&gt;
&lt;h2 id="tying-it-all-together"&gt;Tying it all together&lt;/h2&gt;
&lt;p&gt;I use a &lt;code&gt;D&amp;amp;D/Campaign&lt;/code&gt; page as my landing page for this campaign. It includes &lt;code&gt;D&amp;amp;D/Quests and Questions&lt;/code&gt; as well as a list of all sessions to date, so that I always know what happened and when.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20201214-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="why-do-i-take-notes-for-a-game"&gt;Why do I take notes for a game?&lt;/h2&gt;
&lt;p&gt;You might be wondering why I go to so much trouble. Why do I take complicated notes about something I do &amp;ldquo;just&amp;rdquo; for fun?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Taking notes helps me offload this all safely from my brain.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I take my fun as seriously as I take my work.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;</description></item><item><title>Week of Testing: Day 5 - The thing about learning in public</title><link>https://nicolevanderhoeven.com/blog/20201128-week-of-testing-5/</link><pubDate>Sat, 28 Nov 2020 20:03:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201128-week-of-testing-5/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/quoOYnweKw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Yesterday I mentioned that I&amp;rsquo;d used the &lt;code&gt;constant-vus&lt;/code&gt; executor to recreate the stepped load profile. Well, the thing about learning publicly is that it also means making mistakes publicly!&lt;/p&gt;
&lt;p&gt;I was kindly informed by a few of my new colleagues that &lt;code&gt;constant-vus&lt;/code&gt; was not the most optimal way to recreate the stepped load profile. &lt;a href="https://simme.dev"&gt;Simme&lt;/a&gt; wrote up a little function so I wouldn&amp;rsquo;t have to repeat myself so much, and &lt;a href="https://twitter.com/ppcano_"&gt;Pepe Cano&lt;/a&gt; and Pawel Suwala (the CTO of k6 himself) both told me nicely that using &lt;a href="https://k6.io/docs/getting-started/running-k6#stages-ramping-up-down-vus"&gt;stages&lt;/a&gt; would have been the better solution.&lt;/p&gt;
&lt;p&gt;So, let&amp;rsquo;s chalk that up to a TIL (Today I Learned) and record that snippet here for prosperity (found in the k6 documentation linked above):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6/http&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;k6&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;options&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stages&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; [
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;30s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;20&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;1m30s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; { &lt;span style="color:#a6e22e"&gt;duration&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;20s&amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;target&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ],
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;function&lt;/span&gt; () {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;res&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;get&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://httpbin.org/&amp;#39;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;check&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;res&lt;/span&gt;, { &lt;span style="color:#e6db74"&gt;&amp;#39;status was 200&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;r&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;status&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;200&lt;/span&gt; });
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;sleep&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Week of Testing: Day 4 - Load profiles on k6</title><link>https://nicolevanderhoeven.com/blog/20201127-week-of-testing-4/</link><pubDate>Fri, 27 Nov 2020 19:54:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201127-week-of-testing-4/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/jDmMmc75RRM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;k6 has a cool feature where even if you start a load test locally via the CLI, you can still stream the results to k6 Cloud. It&amp;rsquo;s an interesting compromise between debugging a test locally (and therefore not paying for cloud infrastructure) and sharing results for load tests run on the cloud. It worked seamlessly, too.&lt;/p&gt;
&lt;p&gt;I also wanted to see how to recreate a specific load profile that I commonly use - the stepped load profile. In JMeter, I typically do this with a plugin - the jp@gc Ultimate Thread Group is my thread group of choice. So, I created it in JMeter (I love that it shows a little image of it as well, while you&amp;rsquo;re building it) and then attempted to recreate it in k6.&lt;/p&gt;
&lt;p&gt;I definitely had to look at the k6 documentation for this. I used the &lt;code&gt;constant-vus&lt;/code&gt; executor for this, but k6 has &lt;a href="https://k6.io/docs/using-k6/scenarios#executors"&gt;several other executors&lt;/a&gt; to choose from, and it worked as well as I had hoped.&lt;/p&gt;
&lt;p&gt;So far, my experience with k6 has been positive. Things are well-documented, and they just work out of the box. No plugins necessary.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 3 - Running a load test locally using k6</title><link>https://nicolevanderhoeven.com/blog/20201126-week-of-testing-3/</link><pubDate>Thu, 26 Nov 2020 19:31:33 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201126-week-of-testing-3/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y5tteMKZUqk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;I&amp;rsquo;ve had my fun playing around with k6 Cloud, the SaaS component. For Day 3, I thought it was time to jump into the heart of k6: k6 the &lt;a href="https://github.com/loadimpact/k6"&gt;open source load testing tool&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;First impressions: logging was a little sparser than I expect, coming from having used load testing tools that just do this for me automatically. I think one of the first things I&amp;rsquo;ll do with k6 is to create my own little &amp;ldquo;load testing starting script&amp;rdquo; that I&amp;rsquo;ll always use, with all of the appropriate logging already set up.&lt;/p&gt;
&lt;p&gt;Otherwise, I was really impressed with how quickly it installed. If you scrub over to the timestamp &lt;a href="https://www.youtube.com/watch?v=y5tteMKZUqk&amp;amp;ab_channel=k6&amp;amp;ts=106"&gt;1:46&lt;/a&gt; in the video, you&amp;rsquo;ll hear that I was actually expecting to have to speed up the installation process while editing to save time, but the installation actually finished before I could say that I was going to do so. By my count that was 7 seconds between hitting enter in my terminal and the download finishing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;7 seconds&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;I can&amp;rsquo;t help but compare that to &lt;a href="https://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;. JMeter is honestly probably my go-to load testing right now&amp;ndash; it&amp;rsquo;s not good for absolutely everything, but it&amp;rsquo;s the tool that I reach for when I &amp;ldquo;just want to test this one thing&amp;rdquo;. I&amp;rsquo;ve used it for years, and it&amp;rsquo;s the tool that I know the most. But one of the issues with JMeter is that there&amp;rsquo;s so much to do before it&amp;rsquo;s actually usable.&lt;/p&gt;
&lt;p&gt;Before you even open JMeter, you need to install Java, and when I first started in load testing, I spent a long time wrestling with getting setting the Java environment variable in Windows before my computer would even recognize that Java was installed. Then you need to install JMeter&amp;ndash; but any JMeter tester will tell you that there are some plugins that you just can&amp;rsquo;t do without, and that really you should always install. That&amp;rsquo;s why there are so many &amp;ldquo;best plugins in JMeter&amp;rdquo; lists (&lt;a href="https://nicolevanderhoeven.com/blog/20200414-aaf11"&gt;here&amp;rsquo;s my top 3&lt;/a&gt;)&amp;hellip; because most of them are necessary, but you wouldn&amp;rsquo;t know that if you&amp;rsquo;re new to JMeter.&lt;/p&gt;
&lt;p&gt;The fact that k6 starts up in 7 seconds is&amp;hellip; shockingly good.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 2 - Comparing tests against a baseline</title><link>https://nicolevanderhoeven.com/blog/20201125-week-of-testing-2/</link><pubDate>Wed, 25 Nov 2020 19:21:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201125-week-of-testing-2/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/dcahi7-9pRs?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Day 2 of my Week of Testing!&lt;/p&gt;
&lt;p&gt;Yesterday I ran my first load test on k6, and actually set up the thresholds wrong. I still maintain that there are some UI improvements that could still be made in that area, and that feedback was well-received. Apparently I&amp;rsquo;m not the only one who has made the same mistake.&lt;/p&gt;
&lt;p&gt;Today I learned that on k6, you can actually set one test to be a baseline. There&amp;rsquo;s so much I want to say on this topic - that&amp;rsquo;s probably a whole blog post there - but for now, suffice it to say that having a baseline test to compare succeeding tests to is a key to a successful round of load testing. I was happy to see that k6 thinks so too, because that functionality is built into the UI by default.&lt;/p&gt;
&lt;p&gt;I also think that being able to schedule a test regularly is fantastic for practicing Continuous Testing. Of course, teams already using CI/CD pipelines would probably get the most benefit out of running load tests using the command line rather than through the UI, but it&amp;rsquo;s nice to know that scheduling is an option in the UI as well.&lt;/p&gt;</description></item><item><title>Week of Testing: Day 1 - Running a load test on k6</title><link>https://nicolevanderhoeven.com/blog/20201124-week-of-testing-1/</link><pubDate>Tue, 24 Nov 2020 19:13:03 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201124-week-of-testing-1/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6qXJUS6yMDc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;On my first real day of testing with &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;, I wanted to jump right in and figure out how to run a load test on k6 Cloud. k6 has documentation on this, but I didn&amp;rsquo;t use it for this test, since the point of a week of testing is to record how easy the product is to use.&lt;/p&gt;
&lt;p&gt;My verdict: I&amp;rsquo;m pleasantly surprised with how easily everything went. Is it just me, or was that AWS startup time exceptionally fast? I&amp;rsquo;m used to AWS taking at least a couple of minutes to provision a machine, but this seemed to start up almost instantaneously.&lt;/p&gt;</description></item><item><title>Week of Testing: Intro</title><link>https://nicolevanderhoeven.com/blog/20201123-week-of-testing-intro/</link><pubDate>Mon, 23 Nov 2020 20:45:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201123-week-of-testing-intro/</guid><description>&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/zcYeboT5FYE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Today was my first day at &lt;a href="https://k6.io"&gt;k6.io&lt;/a&gt;! I&amp;rsquo;m happy to announce that I&amp;rsquo;ve joined as their newest Developer Advocate for Performance Testing. k6 is a company I&amp;rsquo;ve had my eye on for a while, even (or maybe especially) when I was working for a competitor, &lt;a href="https://flood.io"&gt;Tricentis Flood&lt;/a&gt;. I always admired k6&amp;rsquo;s stance on open source, their involvement with the developer community, and the slick web app that brings load testing into the hands of many developers and testers.&lt;/p&gt;
&lt;p&gt;As a load tester, I try to be tool-agnostic. I have to admit, though, that I do have a strong bias towards opensource tools. I joined Flood because of their focus on tools I already loved like &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;JMeter&lt;/a&gt;, &lt;a href="https://gatling.io/"&gt;Gatling&lt;/a&gt;, and &lt;a href="https://element.flood.io"&gt;Element&lt;/a&gt; (based on Puppeteer). (And Selenium, but it&amp;rsquo;s a stretch to say I love Selenium.) But these are tools I&amp;rsquo;ve used for years, most of them from even before I joined Flood. What kind of load tester would I be if I could only really talk about scripting in a handful of tools?&lt;/p&gt;
&lt;p&gt;So I thought it was time for a change, and k6 was the first and only company on my list for a couple reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/loadimpact/k6"&gt;The free and open source tool k6&lt;/a&gt;, which recently crossed over to 10,000 stars on Github, is often touted as the developer&amp;rsquo;s load testing tool of choice.&lt;/li&gt;
&lt;li&gt;k6&amp;rsquo;s &lt;a href="https://k6.io/cloud"&gt;cloud offering&lt;/a&gt; integrates seamlessly with the OSS tool, and it adds some killer features like performance insights that add real value to teams wanting to scale their load tests.&lt;/li&gt;
&lt;li&gt;The k6 team is incredibly responsive to the needs of their community. Unlike most companies, where only marketing, sales, and customer support people talk to customers, k6 developers are active on GitHub, social media, and other blog sites. Everyone is passionate about what they&amp;rsquo;re building.&lt;/li&gt;
&lt;li&gt;Roles in testing are changing, and the lines between tester and developer are blurring. Developers who don&amp;rsquo;t test are going to become just as obsolete as testers who don&amp;rsquo;t develop. I see k6&amp;rsquo;s popularity among the developer crowd as a good opportunity for me to sharpen my coding skills.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I had to see for myself whether k6 was actually as good as it seemed.&lt;/p&gt;
&lt;p&gt;Luckily, it turns out that k6 has a tradition of a &amp;ldquo;Week of Testing&amp;rdquo;, where every new member of the k6 team, regardless of role, spends their first week putting the product through its paces. Every part of the whole k6 solution (Cloud and OSS tool) is fair game, and the goal of the Week of Testing is to present feedback to the team at the end of it, while the new member&amp;rsquo;s eyes are fresh. When they told me about it, they said &amp;ldquo;We want to see you learn the tool on your own to see what parts are difficult to figure out.&amp;rdquo; To which I responded, &amp;ldquo;Challenge accepted!&amp;rdquo;&lt;/p&gt;
&lt;p&gt;I decided to not only give a presentation at the end, but also to video the process for posterity&amp;rsquo;s sake&amp;hellip; and, let&amp;rsquo;s face it, to impress my new managers and coworkers with my dazzling work ethic.&lt;/p&gt;
&lt;p&gt;Step 1: Get the company&amp;rsquo;s name right.&lt;/p&gt;
&lt;p&gt;In the first video, I share the differences between k6 vs. k6 Cloud vs. Load Impact!&lt;/p&gt;</description></item><item><title>How to Become a Load Tester</title><link>https://nicolevanderhoeven.com/blog/20201007-how-to-become-a-load-tester/</link><pubDate>Wed, 07 Oct 2020 14:15:45 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20201007-how-to-become-a-load-tester/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-to-become-a-load-tester"&gt;
&lt;p&gt;&lt;em&gt;&lt;a href="https://www.flood.io/blog/how-to-become-a-load-tester"&gt;Originally posted here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Load testing can be a pretty intimidating field to get into, but it&amp;rsquo;s easy to get started. Here are some concrete steps you can take to start learning how to load test from scratch.&lt;/p&gt;
&lt;p&gt;In this video, Flood co-founder Tim Koopmans and I teamed up at Tricentis User Conference 2020 to talk about the essential ingredients for load testing.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/_R2dmEmtO48?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="background-required-for-load-testing"&gt;Background required for load testing&lt;/h2&gt;
&lt;p&gt;Load testing can be quite technical. It involves not just the ability to use different programming languages to create load testing scripts but also familiarity with software engineering practices, DevOps, application infrastructure, site reliability, and networking. A good load tester needs to be able to understand the basics of how an application works and how different components interact with each other. It&amp;rsquo;s common for a load tester to work on applications employing a variety of technologies, so staying up to date with recent technological trends and switching seamlessly from one language to another, or from one platform to another, is of utmost importantance. This technical side of load testing might make you think that a load tester needs to have formal studies in computer science and several years of experience in software testing. The reality is that there are many load testers who stumbled into the field from wildly unexpected backgrounds. So you might think load testing looks like this:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@wocintechchat?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Christina @ wocintechchat.com&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/meeting?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;And sometimes it does. But it more often looks something like this:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Photo by &lt;a href="https://unsplash.com/@youxventures?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;You X Ventures&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/meeting?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You see, load testing is an interdisciplinary field. So much of the job involves talking to people. Sometimes the requirements for a project are not clear, and someone needs to talk to the both the business and the developers to make sure that nonfunctional requirements are clarified. A load tester is a detective, tracing a request as it goes from one application component to another, coordinating with different application teams. A load tester is a scientist, using the scientific method to design experiments that yield the results. A load tester is a statistician, making sense of a jumble of data and seeking correlations between variables. A load tester is a public speaker. Even when the actual load testing has been completed and the report has been sent, a load tester makes sure all stakeholders understand the report so that the results can be used to make meaningful changes to improve application performance. All these tasks require a mishmash of skills and competencies that can be difficult to find in just the field of computer science.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s take our backgrounds as anecdotal examples.&lt;/p&gt;
&lt;p&gt;Tim grew up and currently lives in a small country town in Australia, and he joined the military straight after school. He later developed a love of automating things, which led him first to use tools like perl to scrape websites and try to win bids with early versions of ebay, and then later to starting a performance engineering consulting career and co-founding Flood itself.&lt;/p&gt;
&lt;p&gt;I, Nicole, grew up in Metro Manila in the Philippines (which has 14,000 more people per km2 than Mumbai does). I learned English as a foreign language in school, and I have a university degree in Economics. When I discovered load testing, I had a job in a completely different field– I was working for an airline and making sure engine components were properly maintained and repaired. My love for gadgets and technology took me down an 8-year rabbit hole involving doing performance consulting for clients across a variety of industries in Australia and the Netherlands. At Flood, I help customers around the world improve their application performance.&lt;/p&gt;
&lt;p&gt;As you can see, Tim and I came from very different backgrounds and different parts of the world. Neither of us knew what load testing even was when we started working. Neither of us got formal instruction in load testing. But somehow, we still both ended up becoming load testers at Flood.&lt;/p&gt;
&lt;h2 id="reasons-to-become-a-load-tester"&gt;Reasons to become a load tester&lt;/h2&gt;
&lt;p&gt;So why become a load tester? Here are some practical reasons.&lt;/p&gt;
&lt;h3 id="load-testing-is-cool"&gt;Load testing is cool&lt;/h3&gt;
&lt;p&gt;A little-known fact about load testing is that it can be really satisfying to be involved in big-name projects that end up going live.&lt;/p&gt;
&lt;p&gt;You may have heard of Flood. But even if you haven’t, we’re sure you&amp;rsquo;re familiar with the results of load testing done on Flood. In the last few years, we have been helping Hotstar, one of the largest streaming services in the world, load test their systems in preparation for the Indian Premier League.&lt;/p&gt;
&lt;p&gt;Hotstar uses an open-source tool that we support, Gatling, to create scripts to simulate users tuning in to watch cricket games. Then, they use Flood to create a “Game Day” simulation. They scale up those load tests and run 5 million users on thousands of machines in the cloud. We help them coordinate execution, spot problems quickly with real-time results from all those machines while the test is still running, and identify bottlenecks so that they don’t occur in production, when India’s playing.&lt;/p&gt;
&lt;p&gt;As a load tester, you&amp;rsquo;ll definitely be working with brands you recognize and love.&lt;/p&gt;
&lt;h3 id="load-testing-can-pay-well"&gt;Load testing can pay well&lt;/h3&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/IN/Job=Software_Tester/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/IN/Job=Performance_Engineer/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I said this would be a practical list, right?&lt;/p&gt;
&lt;p&gt;Here are 261,768 practical reasons. The average performance engineer’s salary is 71% more than that of an average software tester in India, according to Payscale.com. We all know that money isn’t everything, but this is a clear signal from the market about the importance of performance-related skills. Adding load testing to your CV as a tester makes you more attractive to employers. It’s a great way to differentiate yourself in an over-saturated market.&lt;/p&gt;
&lt;h3 id="load-testing-can-literally-take-you-places"&gt;Load testing can literally take you places&lt;/h3&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester05.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://twitter.com/shamim_j"&gt;Shamim&lt;/a&gt; from &lt;a href="https://www.flood.io/blog/inside-the-career-of-a-digital-nomad-is-a-life-on-the-road-right-for-you"&gt;Flood&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Then there are the side benefits of being in load testing. The photos above are real ones from the Flood team. That’s me on the upper left, exploring a castle in Belgrade, Serbia, and that’s Tim in the bottom right, taking a photo in San Francisco, USA.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/inside-the-career-of-a-digital-nomad-is-a-life-on-the-road-right-for-you"&gt;We’re a fully distributed team on Flood&lt;/a&gt;, which means we can work from anywhere. Flood is a web app, so you don’t need to install anything– I’ve been known to start load tests from my iPad in a café. Load testing on the cloud frees you from being tied to running tests from the office. You can start load generators when you need them and shut them down when you don’t– all from a web browser. It’s a job that can come with a great work/life balance, if you find the right company.&lt;/p&gt;
&lt;p&gt;Load testing can also be a great way to move to another country. It’s what’s allowed me to move to other countries– twice. In Australia, the average performance engineer’s salary is AU$108,053, or over 5.6 million rupee.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.payscale.com/research/AU/Job=Performance_Engineer/Salary"&gt;Payscale&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So it’s clear that there are some pretty good reasons for you to become a load tester. I&amp;rsquo;m going to walk you through the practical steps to become a load tester. You may not be an expert by the end of this, but I hope I can convince you that you can get started in load testing whether your background looks like Tim’s or mine.&lt;/p&gt;
&lt;h3 id="load-testing-adds-real-value"&gt;Load testing adds real value&lt;/h3&gt;
&lt;p&gt;And the trite, but absolutely true reason: Everyone fails.&lt;/p&gt;
&lt;p&gt;As a load tester, you are a gatekeeper of quality. What you do directly affects revenue and customer experience.&lt;/p&gt;
&lt;p&gt;Performance is an aspect of software that is often overlooked, but it’s only becoming more important in a world where everything is going online. People are being born who have never known what it’s like not to have the internet, and consumers in general expect applications to be responsive and stable. Would-be customers who can’t get an e-commerce site to load within 3 seconds may switch to a competitor’s site, and we all know there are many of them. Performance-related outages can be seriously damaging to a company’s reputation, and social networking amplifies customer dissatisfaction by effectively giving everyone a megaphone to complain into.&lt;/p&gt;
&lt;p&gt;Software functionality is still important. However, if an online store goes live with no critical functional defects, but it fails when the 100th person logs into it, or it takes 10 seconds to load the homepage, can you really say that it was ready for production?&lt;/p&gt;
&lt;p&gt;Load testing is a crucial part of ensuring software quality, and quality is the responsibility of everyone on a team, even if the word “performance” isn’t in your job title.&lt;/p&gt;
&lt;h2 id="the-essential-ingredients-of-a-load-test"&gt;The essential ingredients of a load test&lt;/h2&gt;
&lt;p&gt;Load testing is like cooking a meal. This is one of Tim&amp;rsquo;s favorite dishes, aloo matar.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.cubesnjuliennes.com/aloo-matar-recipe/"&gt;Cubes n Juliennes&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can approach cooking as a science. There are recipes with a list of ingredients, a precise measurement of how much you need for each, and a procedure for creating the dish.&lt;/p&gt;
&lt;p&gt;But you can also look at cooking as an art. Cooking the same dish over and over again will give you an experience in working with those ingredients that a novice cook won’t have. There’s room in cooking for adding one ingredient, changing the quantity of another, or just trying something new.&lt;/p&gt;
&lt;p&gt;A master chef knows how to use both the science and the art to create something delicious. But you don’t HAVE to be at that level in order to cook.&lt;/p&gt;
&lt;p&gt;Anyone can cook. If you know how to follow a basic recipe, you may not create a masterpiece, but if you’re like me and you haven’t had lunch yet, you’ll still end up with something you’ll eat.&lt;/p&gt;
&lt;p&gt;So here’s the recipe for load testing.&lt;/p&gt;
&lt;p&gt;I prefer kadai paneer myself, but aloo matar requires, among other things, peas. And so does load testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;P is Preparation&lt;/strong&gt;. To prepare for a load test, you need to get your ingredients ready. You need to decide what it is you want to test, why you’re testing it, and how. You write load testing scripts that will simulate real users as closely as possible.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;E is Execution&lt;/strong&gt;. This is when you do the actual cooking. You run your load tests and scale them up according to your requirements.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A is Analysis&lt;/strong&gt;. You figure out whether the dish you created is edible. You determine how your application servers responded during the load test, and decide if that’s acceptable.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preparation – Execution – Analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="preparing-for-a-load-test"&gt;Preparing for a load test&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;“As far as the World Cup is concerned, it is a process. We don’t want to jump to the 50th floor straight away. We must start on the ground floor.” - Sachin Tendulkar, via &lt;a href="https://www.espncricinfo.com/story/_/id/22538610/world-cup-final-dream-tendulkar"&gt;ESPN&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Load testing doesn’t start with writing a script. Load testing starts with building a foundation for later tests.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester08.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.insidesport.co/cricket-sachin-tendulkar-comes-to-aid-of-ailing-ashraf-who-once-fixed-his-bats/"&gt;Inside Sport&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Part of that foundation is asking WHY. Why do you want to do a load test? Has there been a performance-related issue before? Are you trying to determine whether an application is ready to go live, or is it already live, and you just want to improve its performance? What type of application do you want to test?&lt;/p&gt;
&lt;p&gt;WHOM are you cooking for? I think you’d cook differently for yourself than you would for Sachin Tendulkar. What do your end users typically do on your site? Where do they come from?&lt;/p&gt;
&lt;p&gt;These are questions that need to be answered before you think about scripting. Here are some resource for planning your load tests:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;Start with Why: How to write requirements for API load testing&lt;/a&gt;
&lt;a href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;How to write a test plan for load testing&lt;/a&gt;
&lt;a href="https://guides.flood.io/ebooks/api-load-testing/scripting-an-api-load-test"&gt;Selecting a tool for load testing&lt;/a&gt;
Generating a load testing script without coding: &lt;a href="https://guides.flood.io/overview-of-flood/scripting-your-load-test"&gt;Getting Started with Test Builder&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="execution-of-a-load-test"&gt;Execution of a load test&lt;/h2&gt;
&lt;p&gt;So now we’re ready to start cooking. This is the Execution phase. You’ll need a machine to use as a load generator. Depending on the number of users you want to run with, you may need more than one machine. You might be tempted to run a load test on your laptop, or on a bunch of machines you have lying around, but that introduces new variables that may affect the results.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester09.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://unsplash.com/@suicide_chewbacca?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Ashwini Chaudhary&lt;/a&gt; on &lt;a href="https://unsplash.com/s/photos/indian-food?utm_source=unsplash&amp;amp;utm_medium=referral&amp;amp;utm_content=creditCopyText"&gt;Unsplash&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like any good cook, you’ll also need to make sure you have all your ingredients handy. In load testing, that means making sure your scripts and test data files are ready to be executed on every load generator.&lt;/p&gt;
&lt;p&gt;Both of these problems – provisioning a load generator and transferring files over to them – are solved pretty easily by running on the cloud using something like Flood.&lt;/p&gt;
&lt;p&gt;Designing and executing your load test&lt;/p&gt;
&lt;p&gt;Where should you run your load tests? A look at demand, hosted, and on-premise infrastructure&lt;/p&gt;
&lt;h2 id="analysis-of-results"&gt;Analysis of Results&lt;/h2&gt;
&lt;p&gt;The last part is Analysis.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester10.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://www.finedininglovers.com/recipes/brunch/potato-pakoras-yogurt-sauce"&gt;Fine Dining Lovers&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This is a pretty crucial moment, because this is when you figure out whether what you cooked was delicious or not. Unfortunately, in load testing, it’s not always easy to tell how your test went. It’s like this photo of pakora (onion is my favorite kind). It’s kind of hard to say what expression that is in their faces. Is it disgust? Or is the pakora so yummy that they just can’t wait to eat more?&lt;/p&gt;
&lt;p&gt;Load testing typically generates a LOT of data. You’d have to go copy every single file from every load generator you used. But can you imagine the hundreds of load generators that Hotstar used? Of course they didn’t manually copy those files. Instead, they used Flood.&lt;/p&gt;
&lt;p&gt;On Flood, we show real-time graphs as you’re running the test so that you can tell immediately whether transactions are failing or whether a server has stopped responding.&lt;/p&gt;
&lt;p&gt;After the test, you can also compare this data to previous tests to spot trends, or even create your own dashboards using an analytics engine.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/results-analysis/metrics-during-test"&gt;Real-time metrics during your load test&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/results-analysis/archived-results"&gt;Downloading results and logs after the test&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="is-that-it"&gt;Is that it?&lt;/h2&gt;
&lt;p&gt;You’ve prepared for a load test, you’ve executed a load test, and you’ve analysed the results from the load test. Congratulations, you’re a load tester! By following this recipe, you’re already doing better than many people, and you’re certainly doing a lot better than those who do not run any load tests at all.&lt;/p&gt;
&lt;p&gt;The cool thing about load testing, though, is that this is just the beginning. There’s always room for improvement.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-become-a-load-tester11.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://popupcity.net/observations/dabbawalla-hot-lunch-delivery-by-mumbais-fastest/"&gt;Pop Up City&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Dabbawallas are people who deliver hot lunches, and while the concept is not new, the implementation in India is particularly interesting.&lt;/p&gt;
&lt;p&gt;For these dabbawallas, having the meals prepared is not the end of the job. Once the food is ready, it needs to be packed into lunchboxes, picked up, separated according to destination, put on trains, and delivered. Later, the empty lunchboxes are picked up, and the system works in reverse.&lt;/p&gt;
&lt;p&gt;It turns out that this is actually a pretty sophisticated system. In fact, it’s been estimated that only one tiffin every two months is not delivered. That’s equivalent to a &lt;a href="https://www.bbc.com/future/article/20170114-the-125-year-old-network-that-keeps-mumbai-going"&gt;Six-Sigma quality rating of 99.9999999%&lt;/a&gt; (that’s nine nines) or more.&lt;/p&gt;
&lt;p&gt;Dabbawallas didn’t get that rating just by delivering quickly. They did it by being consistent and reliable. They did it by having a process.&lt;/p&gt;
&lt;p&gt;Once you see the benefits of running a load test, you may also start to understand that the real value of load testing is not in a test that you run once whenever you think of it. Imagine having the benefits of a load test tied to your development process, so that it is automated.&lt;/p&gt;
&lt;p&gt;As an advanced topic, &lt;a href="https://www.flood.io/blog/load-testing-in-devops-pipelines-with-azure-and-flood"&gt;adding your load testing&lt;/a&gt; to your team&amp;rsquo;s Continuous Integration/Continuous Development pipelines such as sets up a repeatable process that reaps benefits far into the future, not just whenever official load testing activities are carried out.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/continuous-integration/what-is-continuous-integration"&gt;Continuous Integration with Flood&lt;/a&gt;: Integrating Travis CI, Circle CI, and Jenkins&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;So that’s the recipe for becoming a load tester.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Preparation – Execution – Analysis.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Preparation&lt;/strong&gt;, you determine why you’re testing and what tool best fits your needs. We showed you how to use Element, but there are many open source tools out there. Don’t get overwhelmed by scripting– a lot of times it can just mean replacing a URL with the one YOU want to test.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Execution&lt;/strong&gt;, you run a baseline test that will serve as a point of comparison for future testing, choose the number of users and the number of regions you want, and then you run your test. Running on the cloud is the easiest (and usually cheapest) way to get started.&lt;/p&gt;
&lt;p&gt;In &lt;strong&gt;Analysis&lt;/strong&gt;, you view the results in real-time, compare historical performance to see trends, and share reports to stakeholders so that your team can make changes to your application.&lt;/p&gt;
&lt;p&gt;We also talked about the bonus topic of &lt;strong&gt;CI/CD&lt;/strong&gt; and how you can incorporate load testing into your pipeline to get a continuous feedback during your development cycle.&lt;/p&gt;
&lt;p&gt;Tim and I started in very different places and had different experiences before we discovered load testing. But eventually, we ended up on the same path, and that’s what we’ve outlined for you here. We hope that this convinces you that load testing doesn’t have to be complicated.&lt;/p&gt;
&lt;p&gt;You absolutely don’t need to be an expert to run a load test. Even if you don’t think you’ll get all these steps right, a load test that is less than ideal is still better than no load testing at all.&lt;/p&gt;
&lt;p&gt;In the end, anyone can be a load tester with the right attitude and the right tools.&lt;/p&gt;
&lt;h2 id="learning-about-load-testing"&gt;Learning about load testing&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.goodreads.com/book/show/1681559.High_Performance_Web_Sites"&gt;High Performance Websites&lt;/a&gt; book by Steve Souders&lt;/p&gt;
&lt;p&gt;Ministry of Testing/PerfBytes &lt;a href="https://www.ministryoftesting.com/dojo/lessons/a-quick-start-guide-to-learning-performance-testing"&gt;list of resources&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.perfbytes.com/"&gt;PerfBytes podcast&lt;/a&gt; (EN and ES)&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guildconferences.com/conference/perfguild-2020/"&gt;PerfGuild conferences&lt;/a&gt; by Joe Colantonio&lt;/p&gt;
&lt;p&gt;Señor Performo’s YouTube Channel: &lt;a href="https://www.youtube.com/channel/UCO-RlGccAUQnMqTaBkvUJhQ"&gt;Señor Performo ENG&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Scott Moore’s &lt;a href="https://www.youtube.com/watch?v=9H2GSGvGwqQ&amp;amp;list=PLXRCdih3vTUEFz1TVyP7RRqEEk__CYGoB"&gt;Performance Tour&lt;/a&gt; on YouTube&lt;/p&gt;</description></item><item><title>Lifting the lid on performance testing</title><link>https://nicolevanderhoeven.com/blog/20200924-testing-talks-online/</link><pubDate>Thu, 24 Sep 2020 23:38:56 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200924-testing-talks-online/</guid><description>&lt;p&gt;I joined other performance and testing engineers in this online panel at Testing Talks Online about load testing best practices.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/pHQ4FwdwGGk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;From the &lt;a href="https://www.testingtalks.com.au/presentations/lifting-the-lid-on-performance-testing-best-practices-from-leading-companies"&gt;Testing Talks Online site&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Performance testing is an essential part of the quality assurance function. However, across the industry the great majority of companies still struggle to master and execute a successful performance testing strategy that produces measurable results.
In this panel discussion, Cameron Bradley will host some of the best performance engineers in the world. The panel will discuss how we as quality assurance experts and performance engineers can better understand performance testing, the value of performance testing and how world leaders are approaching and succeeding with performance testing as part of the delivery life cycle.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>How to Write a Load Test Plan</title><link>https://nicolevanderhoeven.com/blog/20200921-how-to-write-a-load-test-plan/</link><pubDate>Mon, 21 Sep 2020 16:33:23 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200921-how-to-write-a-load-test-plan/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/how-to-write-a-test-plan-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;People often start load testing by creating a script in their favorite load testing tool, but good load testing starts before that. Planning a load test may seem like a tedious exercise, but it is essential to ensuring the success of your testing.&lt;/p&gt;
&lt;p&gt;A test plan should answer why, what, who, when, and how the testing will be carried out.&lt;/p&gt;
&lt;p&gt;A good test plan, particularly for load testing, includes the following components:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Requirements&lt;/li&gt;
&lt;li&gt;Scope&lt;/li&gt;
&lt;li&gt;Entry criteria&lt;/li&gt;
&lt;li&gt;Workload modeling&lt;/li&gt;
&lt;li&gt;Server monitoring&lt;/li&gt;
&lt;li&gt;Test doubltes&lt;/li&gt;
&lt;li&gt;Test Scenarios&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll dive into each of these, but first, a note on the format of a test plan.&lt;/p&gt;
&lt;h2 id="test-plan-format"&gt;Test Plan Format&lt;/h2&gt;
&lt;p&gt;Test plans have been traditionally presented as a document, but there&amp;rsquo;s no hard-and-fast rule. Instead, the length of a test plan, and the level of detail it goes into, should be tailored for the complexity of the project and the backgrounds of the stakeholders.&lt;/p&gt;
&lt;p&gt;Teams using Agile methodologies may not have a formal test plan at all, but I would argue that all teams should still have some sort of plan, whether it&amp;rsquo;s a Word document or a list of bullet points. Written plans clarify and communicate intent, and testing can be an expensive and fruitless exercise without a consensus on its intent.&lt;/p&gt;
&lt;p&gt;Technical documentation can be difficult to digest and understand, and that&amp;rsquo;s dangerous when it comes to software development and testing, where it&amp;rsquo;s imperative that all stakeholders are on the same page about the state of an application.&lt;/p&gt;
&lt;p&gt;Paul McLean, a performance engineer, has a creative solution for this. He creates a companion video for every technical report, giving stakeholders the option to read the written report for details but watch the video for a more high-level and nuanced explanation.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of a companion video he created for a test plan:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/FJj_7nyV3Ak?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="requirements"&gt;Requirements&lt;/h2&gt;
&lt;p&gt;Everything starts with requirements. Until requirements are identified, load testing can only ever be aimless and explanatory, and any performance bottlenecks spotted will be incidental.&lt;/p&gt;
&lt;p&gt;Requirements inform every step of the load testing process. Why are we doing load testing? What exactly do we want to test? How will we know when a test has passed or failed? How will we know if application performance is good enough to go into production? What does “good enough” mean?&lt;/p&gt;
&lt;p&gt;This is such an important part of the planning process that I felt it deserved its own blog post. See it here: &lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;Start with Why: How to Write Requirements for API Load Testing&lt;/a&gt;. Even though I specifically mention API load testing, the principles apply to load testing in general.&lt;/p&gt;
&lt;h2 id="scope"&gt;Scope&lt;/h2&gt;
&lt;p&gt;At Flood, we use a product development methodology called &lt;a href="https://basecamp.com/shapeup"&gt;Shape Up&lt;/a&gt; to keep us on track as we build new features. Projects in Shape Up are called &amp;ldquo;shaped work&amp;rdquo;, and one of the basic properties of shaped work is that it is bounded.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;hellip;shaped work [also] indicates what not to do. It tells the team where to stop. There’s a specific appetite—the amount of time the team is allowed to spend on the project. Completing the project within that fixed amount of time requires limiting the scope and leaving specific things out.- Ryan Singer, &lt;a href="https://basecamp.com/shapeup"&gt;Shape Up: Stop Running in Circles and Ship Work that Matters&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Defining scope is setting boundaries. Business priorities need to be weighed against the resource limitations (number of people available to do the work and time available) in order for testing to deliver maximum value.&lt;/p&gt;
&lt;p&gt;Some considerations for scope include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Specific features or key transactions to be tested&lt;/li&gt;
&lt;li&gt;Types of tests included (component test vs end-to-end test)&lt;/li&gt;
&lt;li&gt;Test scenarios (peak load test vs disaster recovery)&lt;/li&gt;
&lt;li&gt;Applications included in testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;As with most things in the planning phase, scope is something that can change during the test when unexpected circumstances arise or when priorities change. But it&amp;rsquo;s still a good practice to define the scope at the beginning, and update it as it changes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s important, however, to &lt;em&gt;prune with intention&lt;/em&gt;. By keeping our objectives in mind, we can keep our work in line with our intentions.&lt;/p&gt;
&lt;h2 id="entry-criteria"&gt;Entry criteria&lt;/h2&gt;
&lt;p&gt;Occasionally, you may be asked to load test an application that isn&amp;rsquo;t ready to be load tested. This happens more often than you think. While it&amp;rsquo;s true that Performance Testing is something that should be baked into all software development from the beginning, this doesn&amp;rsquo;t hold true for Load Testing. Load testing is only one activity that falls underneath the broader umbrella of performance testing.&lt;/p&gt;
&lt;p&gt;Entry criteria are conditions that you need to be fulfilled before the testing actually begins. It’s a good idea to have these conditions communicated beforehand so that everyone is clear on what needs to be set up before you can do your job.&lt;/p&gt;
&lt;h3 id="functional-testing-does-the-application-work"&gt;Functional testing: Does the application work?&lt;/h3&gt;
&lt;p&gt;Load testing cannot realistically be carried out until at least the core functionality has been tested and high-severity defects have been fixed. Depending on the kind of load test you want to execute, you may also want to specify that UAT has been executed, as there’s no point doing an end-to-end load test with 1000 users if it doesn’t work for one user.&lt;/p&gt;
&lt;h3 id="load-testing-environment-is-it-production-like"&gt;Load Testing Environment: Is it production-like?&lt;/h3&gt;
&lt;p&gt;Nonfunctional testing has stricter requirements for an environment than does functional testing, and you may have to champion this cause. For load testing, it is not enough to have an application staging environment that is a virtual machine that is a quarter of the size of the production environment. It’s important to get as close to a production-like environment as possible in terms of capacity (memory, CPU), codebase (the actual build that will be deployed), and integrations with other environments or servers (if within test scope).&lt;/p&gt;
&lt;p&gt;Load testing is not linear: a response time of 5 seconds on a server with half the capacity of the production server does not necessarily equate to a response time of 2.5 seconds in production.&lt;/p&gt;
&lt;p&gt;This is also the time to think about your load injectors. Will they be on-premises, or in the cloud? A good entry criterion is the availability of the machines in the right network and with the right tools installed. If you’re using commercial tools, license provisioning should be a criterion. What sort of capacity will your load testing scripts require?&lt;/p&gt;
&lt;h3 id="support-are-there-people-available-with-expertise-in-key-components"&gt;Support: Are there people available with expertise in key components?&lt;/h3&gt;
&lt;p&gt;Load testing is a team activity. When a load test involves multiple application teams, it’s important to request availability of key persons on those teams during the test. Often as load testers, we are seen as working independently, but the truth couldn’t be farther from that. Load testing is a team sport. We need support from:&lt;/p&gt;
&lt;p&gt;business analysts who will be able to tell us how things are expected to work and what the current priorities are&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;developers whom we can consult when poorly performing code needs to be optimised&lt;/li&gt;
&lt;li&gt;functional testers who can show us how the application works&lt;/li&gt;
&lt;li&gt;DevOps engineers who can help us provision and monitor servers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;and many more!&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="test-data-do-you-have-dummy-data-for-your-virtual-users-to-interact-with"&gt;Test Data: Do you have dummy data for your virtual users to interact with?&lt;/h3&gt;
&lt;p&gt;Once you have as close a copy of the production environment as possible, keep in mind that it’s still a clean copy, which may not be realistic. If there are databases in production, how much data do they contain? The application server may respond differently when your test database is empty compared to when it must contend with gigabytes of data in the production database.&lt;/p&gt;
&lt;p&gt;Using production data for testing purposes can be dangerous, not to mention illegal, in certain circumstances. To avoid this, you can scrub sensitive data or generate your own, either by injecting records into a database or by writing an automation script to create data on the front-end. If you write a script, you may be able to reuse parts of it later for your load test.&lt;/p&gt;
&lt;h2 id="workload-modeling"&gt;Workload Modeling&lt;/h2&gt;
&lt;p&gt;A workload model is a schema describing the load profile for a given test scenario, and it involves determining what (the key transactions), how much (the load distribution among the transactions) and when (timing of the load) to test.&lt;/p&gt;
&lt;p&gt;Workload modeling can be the most difficult part of the testing process because it involves finding out how load test scripting can best mimic what is actually happening in production. It can also be the most critical.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s my account of working on a project in horse racing, where workload modeling was of particular importance: &lt;a href="https://www.flood.io/blog/workload-modeling-preparing-for-large-events-like-the-melbourne-cup"&gt;Workload Modeling - Preparing for Large Events like the Melbourne Cup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;When you&amp;rsquo;re selling bets for the Melbourne Cup, every second matters.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="server-monitoring"&gt;Server monitoring&lt;/h2&gt;
&lt;p&gt;Executing a load test without monitoring server health is like flying blind. You’ll know when you land safely and you’ll know when you crash, but even if you do crash, you won’t know why—or how you can avoid it next time. Monitoring server health is the black box that will tell you what went wrong.&lt;/p&gt;
&lt;p&gt;For load testing, you&amp;rsquo;ll want to monitor the application servers that you&amp;rsquo;re testing as well as the load generators that you&amp;rsquo;re using to run the load tests themselves. That&amp;rsquo;s right; if you&amp;rsquo;re not watching carefully, the machines you run the load tests on can be the bottlenecks in themselves, causing unnecessary failures in your load tests.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://testguild.com/performance-test-resource-utilization/"&gt;Joe Colantonio&lt;/a&gt; goes over the basics of resource utilization in terms of four main areas of concern:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CPU&lt;/li&gt;
&lt;li&gt;Memory&lt;/li&gt;
&lt;li&gt;Disk&lt;/li&gt;
&lt;li&gt;Network&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;Here&amp;rsquo;s another guide&lt;/a&gt; I put together on the basic metrics as well as some tools you can use to set up your monitoring.&lt;/p&gt;
&lt;p&gt;Regardless of which metrics you identify as key or which tools you use, you&amp;rsquo;ll want to make sure that they&amp;rsquo;re all set up to measure server health before you run your load tests.&lt;/p&gt;
&lt;h2 id="test-doubles"&gt;Test doubles&lt;/h2&gt;
&lt;p&gt;Part of the strategic planning around load testing is deciding which components need to be tested in conjunction with your stated requirements. Applications can sometimes be complex enough that load testing end-to-end is not feasible due to the number of teams involved or the cost of duplicating application infrastructure.&lt;/p&gt;
&lt;p&gt;Keeping it as simple as possible will lead to fewer dependencies, so it&amp;rsquo;s worth considering creating test doubles to isolate relevant components. Test doubles include stubs, mocks, and full virtual services.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/how-to-write-a-load-test-plan04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;A test double is that part that replaces a complicated component that is not within scope. It’s a “dumber” version that responds to requests enough to allow you to go on with your load testing without actually requiring that component.&lt;/p&gt;
&lt;p&gt;Test doubles allow us to abstract out other components we don&amp;rsquo;t want to test so that we can concentrate on the one that we do. The point of a test double is to remove the variables and noise introduced by other parts of the application so that we can focus on testing how one component responds.&lt;/p&gt;
&lt;p&gt;If you are willing to put the time into creating a test double, you can drastically reduce the amount of resources you need to set up an environment and isolate components. Reducing variables in your test allows you to more quickly determine where performance bottlenecks lie.&lt;/p&gt;
&lt;h2 id="test-scenarios"&gt;Test Scenarios&lt;/h2&gt;
&lt;p&gt;A test scenario is the description of a contained situation or condition under which the application will be tested. A test scenario is usually based on several test cases and includes a plan for how these test cases will be executed.&lt;/p&gt;
&lt;p&gt;Choosing your test scenarios means deciding which situation is most likely to yield the data that you require. Employing several different types of scenarios will give you a greater understanding of your application’s capabilities. You should feel free to create your own scenarios that are uniquely tailored to your requirements, but here are some common scenarios to start out with. Take the number of users and durations mentioned as guidelines and not rules.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what our Flooder amigo, Señor Performo, has to say about test scenarios:&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EGzoAadzWwM?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;em&gt;Text version &lt;a href="https://www.flood.io/blog/ask-a-flooder-21-senor-performo-on-load-testing-scenarios"&gt;here&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Creating a test plan can seem daunting, but the process of writing it serves as a prompt for discussions among your team.&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a &lt;a href="https://techbeacon.com/app-dev-testing/how-go-performance-tester-performance-engineer"&gt;pro tip from Scott Moore&lt;/a&gt;: Once you come up with a template you&amp;rsquo;re happy with, save it and reuse it for future projects. Modify it over time based on feedback to see progressive improvement.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Building a set of reusable documents and other deliverables (&amp;ldquo;templates&amp;rdquo;) to use in the initial planning phase and final reporting will speed your initial startup time. I recommend working with or learning from others with experience to build out some of these templates.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;‍When in doubt, remember that the format of a test plan is not as important as making sure it is meaningful and comprehensible for your team.&lt;/p&gt;
&lt;p&gt;‍For more information about the load testing process, check out &lt;a href="https://guides.flood.io/ebooks/api-load-testing"&gt;my book on API load testing&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Pros and Cons of API load testing</title><link>https://nicolevanderhoeven.com/blog/20200818-pros-and-cons/</link><pubDate>Tue, 18 Aug 2020 21:22:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200818-pros-and-cons/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/pros-and-cons-of-api-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/pros-and-cons-of-api-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍API load testing is one of the most popular ways to run a load test because of the number of open source and commercial load testing tools available on the market that support it. Creating a script to hit your application&amp;rsquo;s API endpoints is the traditional approach to load testing, but it&amp;rsquo;s not the only one.&lt;/p&gt;
&lt;p&gt;Here are some things to consider when deciding whether or not API load testing is right for your application.&lt;/p&gt;
&lt;h2 id="disadvantages-of-api-load-testing"&gt;Disadvantages of API load testing&lt;/h2&gt;
&lt;h3 id="api-load-testing-does-not-simulate-real-users-interacting-with-elements-of-your-webpage"&gt;API load testing does not simulate real users interacting with elements of your webpage.&lt;/h3&gt;
&lt;p&gt;‌In contrast to a customer opening up a browser and filling out forms on your site, an API load testing script will consist only of the underlying requests to the server that are made by clicking on those on-screen elements. Exactly how the customer triggers those requests, and what buttons they’ve pressed, is irrelevant. It’s all about the raw requests.‌&lt;/p&gt;
&lt;p&gt;The format of these requests will be dictated by the type of API your application uses, and it may take some technical knowledge or expertise to be able to formulate requests correctly. However, a RESTful API is one of the most common types, and it is considered to be relatively simple to use.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200818-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;HTTPS requests for amazon.com. This is what an API load testing script would need to replicate.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="it-doesnt-give-you-an-idea-of-how-user-friendly-your-application-is"&gt;It doesn’t give you an idea of how user-friendly your application is.&lt;/h3&gt;
&lt;p&gt;‌API load testing tools don’t give you feedback on how long your pictures took to render on your users’ browsers or whether that “SUBMIT” button is in an obvious spot.&lt;/p&gt;
&lt;h3 id="it-doesnt-measure-front-end-performance-or-how-quickly-pages-render-in-different-browsers"&gt;‌It doesn’t measure front-end performance or how quickly pages render in different browsers.&lt;/h3&gt;
&lt;p&gt;‌While all the resources that the server returns can be downloaded by your tool of choice, there is no browser on which to run them.&lt;/p&gt;
&lt;h3 id="api-load-testing-doesnt-run-client-side-scripts"&gt;‌API load testing doesn’t run client-side scripts.&lt;/h3&gt;
&lt;p&gt;‌It isn’t what you’re looking for if your application is a single-page web app that relies heavily on JavaScript or AJAX to dynamically populate and update the page. Your load testing tool will download the scripts, but not execute them.‌&lt;/p&gt;
&lt;p&gt;‌This includes scripts like those required to trigger Google Analytics, which prompts many an engineer to question the results of an API load test due to the inability to see the traffic come in on Google Analytics. API load testing won’t help you with that. Running browser-level load tests using tools like &lt;a href="https://element.flood.io"&gt;Flood Element&lt;/a&gt; or &lt;a href="https://selenium.dev"&gt;Selenium&lt;/a&gt; may be more useful.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve decided that API load testing is not the best way to load test your application, you can look at browser-based load testing as an alternative.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200818-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Executing a browser-based load testing script using Flood Element.&lt;/em&gt;
‌&lt;/p&gt;
&lt;h2 id="advantages-of-api-load-testing"&gt;‌Advantages of API load testing&lt;/h2&gt;
&lt;p&gt;Now that we’ve talked about what API load testing isn’t good at, let’s talk about what it IS good at.&lt;/p&gt;
&lt;p&gt;‌### It allows you to load test specific servers rather than the whole stack.&lt;/p&gt;
&lt;p&gt;‌API load testing allows you to tailor your load testing by applying load only on particular servers. This is particularly useful in more complicated applications that involve several components and would require substantial effort to reproduce in a test environment. Using APIs, you can test only the functions you want to test.&lt;/p&gt;
&lt;h3 id="it-is-well-supported-"&gt;It is well-supported. ‌&lt;/h3&gt;
&lt;p&gt;API load testing has been around for decades. There are lots of robust tools you can choose from, both commercial and open-source, and many of these tools have large communities and extensive documentation around how to script the most common cases. It’s a far cry from the browser-level testing space, which is relatively new and sparsely populated by comparison.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200818-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;The &lt;a href="https://jmeter.apache.org/usermanual/index.html"&gt;JMeter site&lt;/a&gt; contains a wealth of information, including a User&amp;rsquo;s Manual&lt;/em&gt;
‍&lt;/p&gt;
&lt;h3 id="its-not-as-resource-intensive-as-browser-level-testing"&gt;It’s not as resource-intensive as browser-level testing.&lt;/h3&gt;
&lt;p&gt;You can simulate more users with API load testing than with browser-level load testing. Since most interactions on the browser-level get translated to requests anyway, generating load this way is incredibly efficient, allowing you to hit your server with requests while bypassing the UI layer and the resource overhead that that entails.&lt;/p&gt;
&lt;p&gt;For example, at &lt;a href="https://flood.io"&gt;Flood&lt;/a&gt; we’ve baselined some of the tools that we support to see how many users we can run on an AWS m5.xlarge instance:&lt;/p&gt;
&lt;p&gt;Selenium: 5 users
Flood Element: 20-40 users
JMeter: 1000 users
Gatling: 1000 users&lt;/p&gt;
&lt;p&gt;‌You’ll see that the browser-level test tools, Selenium and Flood Element, can run significantly fewer users on the same sized node as can the protocol-level tools, JMeter and Gatling. This isn’t due to an inefficiency in the tools but rather to the fact that browser-level tools inherently need more CPU and memory to start separate instances of browsers per user and render pages graphically. You can run more users per node (or machine) by carrying out API load testing with protocol-level tools.&lt;/p&gt;
&lt;h3 id="its-cheaper"&gt;It’s cheaper.&lt;/h3&gt;
&lt;p&gt;‌The efficiency in resource utilization translates directly into cost savings because every node that you don’t need to execute your tests on is one fewer node that you’ll have to pay to provision (whether on premises or in the cloud).&lt;/p&gt;
&lt;p&gt;‌For this reason, API load testing is one of the most cost-efficient ways you can get started with load testing, allowing you to scale up your load relatively cheaply while getting immediate results.&lt;/p&gt;
&lt;h2 id="how-to-get-started-with-api-load-testing"&gt;How to get started with API load testing&lt;/h2&gt;
&lt;p&gt;API load testing isn&amp;rsquo;t for every application, but depending on your test scenario, it may be the easiest way to test application performance.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re new to non-functional testing or API load testing in particular and would like some step-by-step tutorials on how to get started, check out my free ebook, &lt;a href="https://guides.flood.io/ebooks/api-load-testing"&gt;API Load Testing: A Beginner&amp;rsquo;s Guide&lt;/a&gt;. It takes you through the basics of API load testing, including planning your first load test, selecting an open source tool, scripting, executing a test on the cloud, analyzing results, and even integrating it into your CI/CD pipelines.&lt;/p&gt;</description></item><item><title>Performance testing the Dutch coronavirus hotline</title><link>https://nicolevanderhoeven.com/blog/20200813-dutch-coronavirus-hotline/</link><pubDate>Thu, 13 Aug 2020 22:18:04 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200813-dutch-coronavirus-hotline/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-the-story-of-the-dutch-coronavirus-hotline"&gt;
&lt;p&gt;&lt;em&gt;Read the original Dutch version &lt;a href="https://nicolevanderhoeven.com/blog/20200704-performanceverbeteringen-voor-de-coronalijn/"&gt;here&lt;/a&gt;.&lt;/em&gt;
&lt;em&gt;This English version was first posted &lt;a href="https://www.flood.io/blog/performance-testing-the-story-of-the-dutch-coronavirus-hotline"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On June 1st, 2020, the National Institute of Health and Environment (RIVM) announced that everyone with certain symptoms could call the hotline 0800-1202 to arrange a free COVID-19 test. The promise: call today, get tested tomorrow, and receive the results the day after that. The reality, though, did not live up to expectations.&lt;/p&gt;
&lt;p&gt;The opening day of the hotline was chaotic, and many Dutch people reported connection problems due to a system overload. Yet this could have been prevented with a better understanding of how human psychology can affect application performance.&lt;/p&gt;
&lt;h2 id="the-situation"&gt;The situation&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nos.nl/collectie/13824/artikel/2335758-ggd-en-klaar-voor-massaal-testen-tijd-van-limiterende-factoren-voorbij"&gt;According to Dr. Ann Vossen&lt;/a&gt;, chairperson of the task force charged with scaling up mass testing in the Netherlands, the country was ready to process 30,000 tests per day. This number corresponds to &lt;a href="https://nos.nl/artikel/2335790-drukte-op-nieuw-telefoonnummer-voor-coronatests-0800-1202.html"&gt;the national capacity&lt;/a&gt; of all the municipal health clinics (GGDs) in the Netherlands. Despite this claim, though, &lt;a href="https://www.ad.nl/binnenland/liefst-323-000-telefoontjes-naar-nieuw-nummer-voor-coronatest-systemen-overbelast~a16a9a50"&gt;only 1,146 people were actually tested&lt;/a&gt; on the first day of testing (the day after the opening of the hotline). Perhaps more importantly, only 5,748 appointments were set on June 1st. The situation was no doubt exacerbated by the overwhelming 323,000 people who called the hotline on its first day, prompting even the telephone operators to admit that &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/coronatestnummer-kampt-met-kinderziektes-maar-ggd-s-kunnen-de-drukte-goed-aan~b2f332d2/"&gt;they&amp;rsquo;d had troubles&lt;/a&gt; logging into the appointment system.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Bron: From &lt;a href="https://twitter.com/GGDGHORNL/status/1267351996379643906"&gt;@ggdghornl&lt;/a&gt;, Twitter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;[&amp;ldquo;We see that there are many calls going to 0800-1202. You can call for an appointment until 8pm tonight. Please try your call later to avoid long wait times.&amp;rdquo;]&lt;/p&gt;
&lt;p&gt;On Twitter, users shared horror stories: one claimed to have &lt;a href="https://twitter.com/Ed_van_Iterson/status/1267429180347691011"&gt;waited on the line for 6 hours&lt;/a&gt;, only to be told that the system was down and no appointments could be made; another complained about &lt;a href="https://twitter.com/maticus_spazz/status/1267374692941418496"&gt;getting disconnected&lt;/a&gt; after getting in touch with an operator. Yet another &lt;a href="https://twitter.com/leovanlinden/status/1267408142813605888"&gt;posted a video&lt;/a&gt; of calling the hotline and a recorded message saying &amp;ldquo;Al onze medewekers zijn op dit moment in gesprek. We zullen u zo snel mogelijk te woord staan. [All of our operators are currently on other calls. We will answer you as soon as possible].&amp;rdquo;&lt;/p&gt;
&lt;p&gt;The second day was somewhat better: &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/coronatestnummer-kampt-met-kinderziektes-maar-ggd-s-kunnen-de-drukte-goed-aan~b2f332d2/"&gt;there were 11,000 appointments made&lt;/a&gt;, partly because of the lower amount of phone calls and partly because of some fixes of technical problems. In the first week, the number of appointments increased to 50,000 (about 7,142 per day), which was still significantly lower than expected.&lt;/p&gt;
&lt;p&gt;There are some lessons that we can learn from this case study.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: Coronavirus test procedure from &lt;a href="https://ggdhm.nl/thema-s/item/infectieziekten/testbeleid"&gt;GGD Hollands Midden&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;English translation:&lt;/em&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Do you have these (mild) symptoms?:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cough&lt;/li&gt;
&lt;li&gt;blocked or runny nose&lt;/li&gt;
&lt;li&gt;fever&lt;/li&gt;
&lt;li&gt;loss of smell or taste&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 1: Make an appointment&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Call the national number 0800-1202&lt;/li&gt;
&lt;li&gt;Have your BSN with you when you call&lt;/li&gt;
&lt;li&gt;Make an appointment to get tested at one of our locations&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 2: Test&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Go to the selected location at the scheduled time&lt;/li&gt;
&lt;li&gt;You will be tested at the test location&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Step 3: Results and eventual start of source and contact research&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You will be called with your results within 48 hours&lt;/li&gt;
&lt;li&gt;If you are infected with the coronavirus, the GGD will call you for source and contact research
*If you show more serious symptoms, or if you fall within a high-risk group, report to your doctor or to the emergency help line.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id="the-effect-of-fear-on-performance"&gt;The effect of fear on performance&lt;/h2&gt;
&lt;p&gt;This coronavirus has already shown us a side of humanity that we&amp;rsquo;d perhaps rather not see: &lt;a href="https://www.bbc.com/news/world-australia-51731422"&gt;fights over toilet paper&lt;/a&gt;, &lt;a href="https://snacks.robinhood.com/newsletters/rMxwcb7y7lMZoI5NY6qf7/"&gt;chaos on the stock market&lt;/a&gt; due to panic, and &lt;a href="https://www.volkskrant.nl/nieuws-achtergrond/nctv-waarschuwt-voor-extremistische-protestacties-door-5g-tegenstanders-die-vrezen-voor-coronavirus~bf1400b8/"&gt;sabotage of 5G cell towers&lt;/a&gt; based on a belief that they caused COVID-19. As much as we&amp;rsquo;d like to believe it, we&amp;rsquo;re not always the most rational beings. We all have the tendency to behave unpredictably, especially when we&amp;rsquo;re afraid.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s no wonder that the coronavirus testing line was so welcome. The fact that there were 323,000 callers on the first day is even more remarkable when we remember that majority of Dutch residents had been in self-isolation for months at that point, which lowered their chances of contracting the virus. In theory, the fear that drove these callers might have been somewhat irrational, but not unpredictable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-03.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;In English, we call this FOMO (Fear of Missing Out). We&amp;rsquo;ve already clearly seen &lt;a href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;how FOMO can drive users&lt;/a&gt; en masse to an application, with effects on its performance. In this case, people were afraid that coronavirus test shortages would mean there weren&amp;rsquo;t enough tests to go around, and they wanted to be first in line to get tested.&lt;/p&gt;
&lt;p&gt;Another problem was that &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;one in four callers&lt;/a&gt; just wanted general information about COVID-19, despite government pleas to keep the hotline free for coronavirus test appointments only. It didn&amp;rsquo;t help that the hotline opened on a Dutch national holiday, White Monday, and more people were home than usual for a Monday. The high number of unrelated calls was unexpected, but nevertheless factored into system overload.&lt;/p&gt;
&lt;p&gt;What could we have done to improve this system?&lt;/p&gt;
&lt;h2 id="improvements-to-the-corona-hotline"&gt;Improvements to the corona hotline&lt;/h2&gt;
&lt;h3 id="better-estimation"&gt;Better estimation&lt;/h3&gt;
&lt;p&gt;As difficult as it is to predict FOMO&amp;rsquo;s effects, we can still try. We can make educated guesses based on related statistics.&lt;/p&gt;
&lt;p&gt;Just one month before the coronavirus test hotline was opened, &lt;a href="https://www.zwollenu.nl/500-000-tot-700-000-nederlanders-besmet-met-coronavirus/"&gt;Jaap van Dissel&lt;/a&gt;, the head of RIVM, estimated that there were up to 700,000 Dutch residents infected by the coronavirus. Why, then, was it such a surprise that more than 300,000 of them had called? Furthermore, the RIVM had encouraged people with a broad list of symptoms (such as colds, coughs, or fever) to call, and it&amp;rsquo;s reasonable to assume that some people with conditions other than COVID-19 might also have called.&lt;/p&gt;
&lt;p&gt;Even if we assume that 20% of the 700,000 people with the novel coronavirus did not have symptoms (&lt;a href="https://www.who.int/docs/default-source/coronaviruse/situation-reports/20200306-sitrep-46-covid-19.pdf?sfvrsn=96b04adf_4"&gt;according to WHO research&lt;/a&gt;), we still arrive at a predicted 140,000 calls, which is still 25 times what was the coronavirus testing system was able to process on the first day.&lt;/p&gt;
&lt;p&gt;If we have an educated estimate, we can start testing.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="injecting-load"&gt;Injecting load&lt;/h3&gt;
&lt;p&gt;When a resident calls the hotline, the call is routed to one of several operators working from home. This is often done with a telephony server that forwards calls based on some type of round-robin system. We can execute load tests on this server to determine how many phone calls a server can process and route successfully, with minimal delay and without message queueing.&lt;/p&gt;
&lt;p&gt;Then, the operator enters personal information from the caller into the appointment system, including their government identification number (BSN) and address. We can surmise that the system checks the identity to verify the validity of the BSN, and then sends some details to a database. The closest municipal clinic to the caller can then use the data to process and schedule an appointment. We can also inject load at this stage by simulating the calls that the appointment system creates with an API load testing tool like JMeter or Gatling.&lt;/p&gt;
&lt;h3 id="using-different-test-scenarios"&gt;Using different test scenarios&lt;/h3&gt;
&lt;p&gt;With such a public announcement of the hotline&amp;rsquo;s opening, a &lt;strong&gt;spike test&lt;/strong&gt; before release could have yielded some useful information. In a spike test, we simulate a sharp increase in users over a short period of time. For example, we could have simulated an increase in users from 0 to 700,000 on the telephony system over 10 minutes to see how the application would have handled that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Soak tests&lt;/strong&gt; could also have been useful in this case. The hotline&amp;rsquo;s opening hours were from 8 am to 8 pm, so it was open for 12 hours in total. With soak tests, we can generate load on an application for an extended amount of time. Soak tests can reveal memory leaks or other bottlenecks in the processing of data that might occur after hours.&lt;/p&gt;
&lt;p&gt;These are ways we could have tested the system as it is, but are there improvements that we could have made in the system to make it more resilient to reduce the FOMO factor?&lt;/p&gt;
&lt;h2 id="using-automation-to-lessen-fomo-risk"&gt;Using automation to lessen FOMO risk&lt;/h2&gt;
&lt;p&gt;The system had some manual parts of the process that may have exacerbated load issues. Here&amp;rsquo;s how this system could have been automated to reduce bottlenecks.&lt;/p&gt;
&lt;h3 id="interactive-voice-response"&gt;Interactive Voice Response&lt;/h3&gt;
&lt;p&gt;Telephony servers commonly use Interactive Voice Response (IVR), an automated menu system for voice calls that uses either voice recognition or keypress tones to navigate a user through a series of choices. We&amp;rsquo;re all familiar with it: &amp;ldquo;&lt;em&gt;For Dutch, press 1. For English, press 2&amp;hellip;&lt;/em&gt;&amp;rdquo; Such a system might have helped reduce the overall load by quickly filtering out callers in the 25% who weren&amp;rsquo;t interested in creating an appointment. &amp;ldquo;&lt;em&gt;If you&amp;rsquo;d like to book an appointment for a coronavirus test, press 1. Otherwise, please call the information hotline at&amp;hellip;.&lt;/em&gt;&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s what an IVR system could look like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200704-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;From: &lt;a href="http://vanguardnetworks.com.sg/IVR.html"&gt;Vanguard Networks&lt;/a&gt;&lt;/em&gt;
‍
Load testing IVR systems can be difficult, and it usually requires the use of highly specialized commercial tools. However, introducing a new tool may also increase the time required for load testing.&lt;/p&gt;
&lt;h3 id="building-a-web-app"&gt;Building a web app&lt;/h3&gt;
&lt;p&gt;Another approach would be to implement a web app to verify identity and capture personal information quickly. In the Netherlands, we already have &lt;a href="https://www.digid.nl/wat-is-digid/"&gt;DigiD&lt;/a&gt;, an identity verification system that is heavily used for governmental services. &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt;, which is a central government portal accessible to every Dutch resident, already interfaces with DigiD as the sole method of logging in. Reusing these existing services could have saved a lot of the work on a web app— not to mention reducing the bottlenecks inherent in a more manual process like a telephone hotline.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: &lt;a href="https://mijn.overheid.nl/"&gt;Mijn Overheid&lt;/a&gt;&lt;/em&gt;
‍&lt;/p&gt;
&lt;h2 id="testing-the-system-end-to-end"&gt;Testing the system end-to-end&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ve identified a few ways to load test various components of the coronavirus hotline, both in its current incarnation as well as in hypothetical improved versions. Isolating each component and running load tests at that level can help us resolve performance issues inherent in the component. However, there are still bottlenecks that are only revealed when the integrations between components is tested as well. That&amp;rsquo;s where end-to-end testing comes in.&lt;/p&gt;
&lt;p&gt;For the coronavirus hotline, end-to-end testing means being able to run load tests on the entire process and seeing how data flows from one to the other: the call forwarding from the telephony server, the identity verification system, the appointment system, the database of personal information, the servers of every municipal clinic, and the email/text notifications with appointment details. As modern applications grow more complex, it can be tempting not to run end-to-end tests, but we do so at great risk of functional or nonfunctional issues.&lt;/p&gt;
&lt;p&gt;An area of end-to-end testing that is often overlooked is the human factor, which can also be a bottleneck. Had hotline operators been trained to ask early on in the call whether the caller wanted to make an appointment, to filter out unrelated calls? Can the coronavirus testing and test result processing, heavily involving manual work from medical professionals, match the stated requirements (test within 24 hours, result within 48 hours) even when the digital components are performant? Some people waited for an hour in the cities of &lt;a href="https://www.ed.nl/eindhoven/in-de-file-voor-een-stukje-zekerheid-meteen-drukte-bij-teststraat-voor-corona-in-eindhoven~a27eec83/"&gt;Eindhoven&lt;/a&gt; and &lt;a href="https://www.pzc.nl/zeeuws-nieuws/drukte-bij-teststraat-in-goes-na-openstellen-nummer-voor-coronatest~aa8a6cb2/"&gt;Goes&lt;/a&gt; due to traffic congestion from cars near the test centers, leading to delays in the testing schedule.&lt;/p&gt;
&lt;p&gt;While it can be difficult to load test these logistical systems with automated tools, they may have significant effects on the overall performance of an application and should be considered.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Often, performance issues can lead to a tangible loss in profits or a more intangible loss in reputation. In this case study, poor performance had a direct impact on people&amp;rsquo;s health. Potentially sick people were unable to make appointments to get tested, and later treated. Delayed tests could have led to an increased infection rate as people waited for a confirmed diagnosis. Hotline operators also admitted that slowness in the system led to them sometimes &lt;a href="https://wnl.tv/2020/06/08/chaos-bij-de-coronalijn-personeel-slaat-alarm/"&gt;giving out test results&lt;/a&gt; against instructions to wait for trained medical professionals to do so.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200704-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Human psychological factors can make a system more complex to load test. &lt;a href="https://www.trouw.nl/binnenland/de-balans-na-een-week-testen-het-plan-was-mooier-dan-de-praktijk~b86399b7/"&gt;According to Andrea Evers&lt;/a&gt; (LUCM), a health psychological professor, &amp;ldquo;&lt;em&gt;Door de uitbraak van corona zijn mensen in een langdurige stresssituatie beland. Onzekerheid, onvoorspelbaarheid en oncontroleerbaarheid maken dat ze de behoefte hebben om zaken juist wel te controleren of voorspelbaar te maken&lt;/em&gt; [The coronavirus outbreak has put people in a situation of chronic stress. The uncertainty, unpredictability, and helplessness of the situation cause a need to make things controllable or predictable].&amp;rdquo;&lt;/p&gt;
&lt;p&gt;As performance testers, we can use statistics and a systematic attitude combined with knowledge of human factors in applications to try to predict the unpredictable.&lt;/p&gt;</description></item><item><title>Ask a Flooder 20: How can fear affect application performance?</title><link>https://nicolevanderhoeven.com/blog/20200806-aaf20/</link><pubDate>Thu, 06 Aug 2020 22:43:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200806-aaf20/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-20-how-can-fear-affect-application-performance-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-20-how-can-fear-affect-application-performance-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about the power of fear, and how it can end up affecting performance test results.
‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oeEFCrTYULE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2cOfQrrUwyIKWbztgNdoXR" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, I&amp;rsquo;m Nicole van der Hoeven, back with another Ask a Flooder, and today I want to talk about the effect of fear on your performance outcomes.&lt;/p&gt;
&lt;h2 id="the-dutch-coronalijn"&gt;The Dutch &amp;ldquo;coronalijn&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;I currently live in Maastricht, in the Netherlands. At the beginning of this global pandemic, the only people getting tested actively for COVID-19 were either people who presented with serious symptoms of the disease, or health care professionals who were continually exposed to the disease and therefore at a higher risk of contracting it.&lt;/p&gt;
&lt;p&gt;Last month, on June 1st, the Dutch government made testing available to everybody. They set up a telephone hotline that any Dutch resident could call to set an appointment to get tested for a COVID-19 test. A task force was dispatched to make sure that they could test up to 30.000 people per day. Yet on the first day of testing, only 1.146 people were tested. So what happened?&lt;/p&gt;
&lt;p&gt;Well, it turned out that the bottleneck of the entire process wasn&amp;rsquo;t getting enough tests, registering the tests, or even processing the test results. The bottleneck actually occurred way before that, when people called up the hotline to get an appointment.&lt;/p&gt;
&lt;p&gt;323.000 people called on the first day that the hotline opened. And not even all of them had called to make an appointment. Some of them were just calling for general information on the coronavirus despite the fact that the government made it clear that that&amp;rsquo;s not what the line was for, and that there were other lines dedicated to information. There were reports on Twitter of people waiting up to 6 hours on the line just to talk to someone who would make an appointment for them. There were calls that got dropped. People said that sometimes it happened in the middle of a call. Even telephone operators that the appointment system was down or slow and unusable for a lot of it.&lt;/p&gt;
&lt;p&gt;As a result, only 5,500 people actually had appointments booked on a day where there were 323,000 that called. That&amp;rsquo;s 1.70%.&lt;/p&gt;
&lt;h2 id="what-does-that-have-to-do-with-performance"&gt;What does that have to do with performance?&lt;/h2&gt;
&lt;p&gt;As performance engineers, we like to believe that everything we do is reasoned. We design tests based on quantitative data. We look at historical trends and metrics to help us decide how to build a workload model. But the truth is that that&amp;rsquo;s often not enough.&lt;/p&gt;
&lt;p&gt;If anything, this pandemic has shown us just how wrong our guesses can be, whether or not they&amp;rsquo;re informed by facts, especially when it has to do with human behavior. We&amp;rsquo;ve seen violent fights erupt over toilet paper. We&amp;rsquo;ve seen peaks and troughs on the stock market that didn&amp;rsquo;t have anything to do with the underlying companies. We&amp;rsquo;ve seen arson on 5G cell towers. Because human beings are irrational, and it&amp;rsquo;s really hard to capture that irrationality in our model for how users are going to behave.&lt;/p&gt;
&lt;p&gt;We may never be able to accurate predict how irrationality is going to affect the load on our application in production. But that doesn&amp;rsquo;t mean that we shouldn&amp;rsquo;t try. There are still things that we can do to mitigate the risk. I think that any application that is public-facing should be assessed for exposure to the risk of fear or other human psychological factors.&lt;/p&gt;
&lt;h2 id="how-do-we-account-for-fear-in-our-performance-testing"&gt;How do we account for fear in our performance testing?&lt;/h2&gt;
&lt;p&gt;I actually wrote a whole blog post on this particular situation (the Dutch corona line), and how it might have been possible to predict (maybe not with 100% accuracy but with reasonable accuracy) how many people would have called the hotline.&lt;/p&gt;
&lt;p&gt;For example, we can look at statistics like the of the Netherlands or how many people normally get flu-like symptoms or at least report them at this time of the year. These are statistics that are readily available from the Department of Health, and we could have used them to inform our decisions on the workload model for such an application. We may not have gotten it exactly, but we would have at least bin in the same ballpark.&lt;/p&gt;
&lt;p&gt;If we have a good enough idea about the workload that our application would have to handle when it&amp;rsquo;s influenced by fear, we can start running load tests around that. Another good open-ended kind of test to run, especially for applications that are particularly susceptible to fear, is the stress test. In a stress test, you push your application to its limits and you find out what they are. You could, for instance, start with your peak work load, and then add a certain number of users every 30 minutes and see how much your application can actually handle. You can do the same with soak tests, where you&amp;rsquo;re exposing your application to the same amount of load for an extended period of time. Both of those kind of exploratory tests help you define the limits of your application and how it would respond if fear plays a role in the workload model in production.&lt;/p&gt;
&lt;p&gt;If we overlook this critical human element in our test design, then we leave ourselves, and our applications, vulnerable to performance degradation and, perhaps, outages.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Read &lt;a href="blog/20200813-dutch-coronavirus-hotline/"&gt;this blog post&lt;/a&gt; for more about the coronavirus hotline.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 18: How do I load test video streaming with JMeter?</title><link>https://nicolevanderhoeven.com/blog/20200722-aaf18/</link><pubDate>Wed, 22 Jul 2020 22:49:15 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200722-aaf18/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-18-how-do-i-load-test-video-streaming-with-jmeter-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-18-how-do-i-load-test-video-streaming-with-jmeter-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I answer the question: &amp;ldquo;How do I load test video streaming with JMeter?&amp;rdquo;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q00briuogto?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/69F5lmOeFfEJr6ZgVWFGOu" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="http-live-streaming-hls-and-performance"&gt;HTTP Live Streaming (HLS) and performance&lt;/h2&gt;
&lt;p&gt;One of the most popular protocols for video streaming is &lt;a href="https://developer.apple.com/streaming/examples/"&gt;HTTP Live Streaming&lt;/a&gt;, or HLS, and that&amp;rsquo;s what I&amp;rsquo;m going to show you today. An HLS video ends with the [file extension .m3u8‍](&lt;a href="https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8%5D(https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8)"&gt;https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8](https://devstreaming-cdn.apple.com/videos/streaming/examples/bipbop_4x3/bipbop_4x3_variant.m3u8)&lt;/a&gt;. According to the HLS protocol, when a video is streamed, the first request sent must be a manifest. A manifest is sometimes called a playlist, and it is a list of all the chunks or parts that make up the video. Then, each chunk is downloaded.&lt;/p&gt;
&lt;p&gt;To assess the performance of a video stream, we still want the response time of the manifest, the chunks, and the whole video. However, there are many more metrics that are important in video streaming which aren&amp;rsquo;t captured by just the response time. For example, how do you determine whether a video was played smoothly or if it stopped to buffer? A video that keeps pausing might just drive a user away, and it&amp;rsquo;s difficult to tell whether that is happening just from the response time.&lt;/p&gt;
&lt;h2 id="how-to-load-test-video-streaming-with-jmeter"&gt;How to load test video streaming with JMeter&lt;/h2&gt;
&lt;h3 id="downloading-and-installing-the-ubik-video-streaming-plugin"&gt;Downloading and installing the Ubik Video Streaming plugin&lt;/h3&gt;
&lt;p&gt;Luckily, there&amp;rsquo;s a plugin for that, created by a company called Ubik Ingénierie. The &lt;a href="https://ubikloadpack.com/"&gt;Ubik Load Pack&lt;/a&gt; is a set of enterprise-grade plugins for JMeter. One of those plugins is a &lt;a href="https://ubikloadpack.com/video-streaming-performance.php"&gt;Video Streaming Plugin&lt;/a&gt;, and it happens to be a really easy way to get started with video streaming. This is a paid plugin, but you can &lt;a href="https://ubikloadpack.com/video-streaming-performance.php#formulaire"&gt;sign up for a free 11-day trial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once you do that, you&amp;rsquo;ll get an email from Ubik with a link to download the bundle. Go to lib/ext and then copy this .jar file into the same directory on your JMeter installation. Start up JMeter, and it&amp;rsquo;ll ask you for the license file. Browse to the license file in the bundle you downloaded. JMeter will restart.&lt;/p&gt;
&lt;h3 id="using-the-jmeter-plugin-in-your-load-testing-script"&gt;Using the JMeter plugin in your load testing script&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s start creating the Test Plan. Create a Thread group, and then right click on the thread group, go to Add &amp;gt; Sampler and then select the &amp;ldquo;ULP Video Streaming sampler&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Click on the sampler and then paste in the URL to the HLS file that you&amp;rsquo;d like to test. This should end in a .m3u8. This plugin supports several protocols for video streaming, but we can just leave it at auto and it&amp;rsquo;ll automatically detect which one it is.&lt;/p&gt;
&lt;p&gt;In Play Options, you can choose whether to play the entire video or just a part of it, or even whether you want to include the video subtitles in your test.&lt;/p&gt;
&lt;p&gt;This Network Options panel is fantastic because it allows you to limit your network speed. Slow networks, like mobile networks, really affect user experience, so it&amp;rsquo;s really important to take this into account when running load tests. You might even use a parameter here and do something like throttle to 3G speeds for 80% of your traffic, and leave it on Auto 20% of the time. But I&amp;rsquo;ll just leave this blank for now.&lt;/p&gt;
&lt;p&gt;Next, let&amp;rsquo;s add a View Results Tree listener. Then, let&amp;rsquo;s run the script once, just to see if it works.&lt;/p&gt;
&lt;p&gt;As you can see, we can see the manifest retrieved first, and then all the chunks. We didn&amp;rsquo;t get any errors, so let&amp;rsquo;s run this as a load test. We can disable this listener because it just consumes extra resources on our load generator.&lt;/p&gt;
&lt;h3 id="ramping-up-your-load-test-on-flood"&gt;Ramping up your load test on Flood&lt;/h3&gt;
&lt;p&gt;To ramp this up into a load test, we&amp;rsquo;ll have to go into Thread Group and change these settings. Ideally, we want to be able to change these values from the Flood UI later so we don&amp;rsquo;t have to go into the script whenever we change them, so I&amp;rsquo;ll type in these Flood-specific properties. I&amp;rsquo;ll leave a link in the description about these properties. I&amp;rsquo;ll also set it to run Forever so that we can change the duration and the video will just keep playing to fill that duration.&lt;/p&gt;
&lt;p&gt;To capture some of Ubik&amp;rsquo;s cool metrics, let&amp;rsquo;s add a Simple Data Writer listener here and write the results to a CSV file. On Flood, all flood results are stored on /data/flood/results, so we&amp;rsquo;ll add an output.csv file in that directory that we can download after the test.&lt;/p&gt;
&lt;p&gt;So that&amp;rsquo;s our script! Now we&amp;rsquo;ll have to include the plugin and related files so that Flood can access them as well.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go back to the bundle we downloaded and go to the bin folder to look for &lt;a href="http://user.properties/"&gt;user.properties&lt;/a&gt;. Let&amp;rsquo;s open that up, and we&amp;rsquo;ll change the license path to &lt;code&gt;/data/flood/files&lt;/code&gt;, which is the directory that Flood saves files we upload to. To preserve this directory structure, we&amp;rsquo;ll compress just the lib and bin folders.&lt;/p&gt;
&lt;p&gt;On Flood, we&amp;rsquo;ll start a new stream here and upload three things: the jmx script, the license, and the compressed archive of the lib and bin folders from the bundle.&lt;/p&gt;
&lt;p&gt;Then we&amp;rsquo;ll go through the rest of the process here, setting the test parameters. Time to launch the test!&lt;/p&gt;
&lt;h3 id="analyzing-video-streaming-load-test-results"&gt;Analyzing video streaming load test results&lt;/h3&gt;
&lt;p&gt;Flood shows you results of your load test while it&amp;rsquo;s running as well as after the test. You can see metrics like concurrency, network throughput, transaction rate, and response time for the test. You can also see these metrics for each individual transaction, including the video or sampler as a whole, the manifest, and the chunks.&lt;/p&gt;
&lt;p&gt;To see the CSV that our script generated, we can download the Archived Results from a flood.&lt;/p&gt;
&lt;p&gt;In JMeter, click on Tools &amp;gt; Generate Report and fill in the fields, selecting the output.csv from the flood&amp;rsquo;s Archived Results, JMeter&amp;rsquo;s &lt;a href="http://user.properties"&gt;user.properties&lt;/a&gt; file, and then an output directory for the report.&lt;/p&gt;
&lt;p&gt;Ubik&amp;rsquo;s plugin creates a few custom graphs in the HTML report:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buffer fill in Millis&lt;/li&gt;
&lt;li&gt;Lag ratio in percentage&lt;/li&gt;
&lt;li&gt;Lag ratio without buffer fill in percentage&lt;/li&gt;
&lt;li&gt;Lag time in Millis&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Using Ubik&amp;rsquo;s Video Streaming plugin is an easy and thorough way to load test video streaming with JMeter, and I highly recommend it. I used an HLS video to demonstrate it, but this plugin supports several protocols:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;HLS&lt;/li&gt;
&lt;li&gt;Mpeg DASH&lt;/li&gt;
&lt;li&gt;Smooth&lt;/li&gt;
&lt;li&gt;Adobe HDS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For more information, read Ubik&amp;rsquo;s tutorial on how to use their plugin with Flood &lt;a href="https://www.flood.io/blog/running-a-video-streaming-performance-test-using-flood-io-and-ubikloadpack"&gt;here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Performance Testing FOMO</title><link>https://nicolevanderhoeven.com/blog/20200722-performance-testing-fomo/</link><pubDate>Wed, 22 Jul 2020 21:30:43 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200722-performance-testing-fomo/</guid><description>&lt;p&gt;On this episode of the &lt;a href="https://testguild.com/"&gt;TestGuild performance podcast&lt;/a&gt;, Joe Colantonio interviews me about how human factors are often not taken into consideration when designing load tests&amp;ndash; a mistake that can have serious consequences.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/M5l9Ba0ykpw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Here&amp;rsquo;s the plain audio version:&lt;/p&gt;
&lt;iframe style="border: none" src="//html5-player.libsyn.com/embed/episode/id/15312620/height/90/theme/custom/thumbnail/yes/direction/backward/render-playlist/no/custom-color/87A93A/" height="90" width="100%" scrolling="no" allowfullscreen webkitallowfullscreen mozallowfullscreen oallowfullscreen msallowfullscreen&gt;&lt;/iframe&gt;</description></item><item><title>Ask a Flooder 17: How do I use unique test data on Element?</title><link>https://nicolevanderhoeven.com/blog/20200618-aaf17/</link><pubDate>Thu, 18 Jun 2020 21:58:49 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200618-aaf17/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-17-how-do-i-use-unique-test-data-on-element"&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.flood.io/blog/ask-a-flooder-17-how-do-i-use-unique-test-data-on-element"&gt;Tricentis Flood&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about how to ensure that Flood Element uses unique test data, using the example of a customer wanting to script unique logins for his application.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/qVpX7MX3jxE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or listen to the audio version instead:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/7k5TXtoHnswJwBbKHXgJR7" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript:&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here again back with another Ask a Flooder, and this week&amp;rsquo;s question is a follow-up question from last week. That user had previously asked about test data in Flood Element. This week he&amp;rsquo;s asking: &amp;ldquo;How do I ensure that Flood Element uses unique test data?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;So this user is actually trying to script a login for an application. He has a list of usernames and corresponding passwords that he wants to use. He&amp;rsquo;s already set both of these up in a CSV file, and he&amp;rsquo;s also set up the Element script in the same way that I outline in my previous video. However, this user is seeing errors in the test due to the application not allowing a given user account to be used simultaneously in two or more devices. The problem is that the way that he&amp;rsquo;s set it up is that he has Element running on multiple nodes, and each node has the chance to pick the same user account.&lt;/p&gt;
&lt;p&gt;So how do you make sure that it&amp;rsquo;s a unique 1:1 ratio for an instance of Element and a user account in the CSV file? If you haven&amp;rsquo;t already watched the previous week&amp;rsquo;s video, you should pause this, watch that, and then come back here, so it makes a little more sense because the script that I&amp;rsquo;m using is building on what we already did in the previous week.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s talk about the differences between this script and the previous week&amp;rsquo;s.&lt;/p&gt;
&lt;p&gt;First, I&amp;rsquo;m declaring a global variable here called &lt;code&gt;globalBrowserID&lt;/code&gt;. The idea is to create a unique and globally identifiable string that I can attach to every account in the CSV file.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FLOOD_GRID_INDEX&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;FLOOD_GRID_NODE_SEQUENCE_ID&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;_&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;BROWSER_ID&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;toString&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The global browser ID consists of three parts:- The first is a grid index, which is a number assigned to every grid, and it&amp;rsquo;s also globally unique. So if there are three grids being used in the test, then the grid indexes would be 0, 1, and 2.- The second one is a grid node sequence ID, and this is unique within the grid. The node sequence ID is a number that is assigned to every node in a single grid.- The last one is a browser ID. The browser ID is a number assigned to an instance of Element running on a single node.&lt;/p&gt;
&lt;p&gt;These are all zero-based, so the very first instance of Element running on the very first node and on the very first grid in the entire test would be &lt;code&gt;0_0_0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to have to modify our CSV file to make use of this browser ID. So whereas the user previously had username and password, I&amp;rsquo;ve added an ID column. From then, these will have to be sequential. So &lt;code&gt;0_0_0&lt;/code&gt;, &lt;code&gt;0_0_1...&lt;/code&gt; And &lt;code&gt;0_0_1&lt;/code&gt; would be the second instance of Element running still on the first node, on the first grid. And you can make as many of these as you need.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;id,username,password
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_0,user1,password1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_1,user2,password2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;0_0_2,user3,password3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1_0_0,user4,password4
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;1_0_1,user5,password5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve also modified the interface &lt;code&gt;UserData&lt;/code&gt; to describe the fields in the CSV file. So there&amp;rsquo;s &lt;code&gt;id&lt;/code&gt;, &lt;code&gt;username&lt;/code&gt;, and &lt;code&gt;password&lt;/code&gt;, and I&amp;rsquo;ve defined them all as strings.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;UserData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;users_multiplegrids.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;filter&lt;/span&gt;((&lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;index&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;browserID&lt;/span&gt;) =&amp;gt; &lt;span style="color:#a6e22e"&gt;line&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt; &lt;span style="color:#f92672"&gt;===&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This line is telling Element to take this data file with this filename and filter it based on the line, the index, and the browserID such that &lt;code&gt;id&lt;/code&gt; is equal to the browser ID. So what happens here is that Element will take the global browser ID, which let&amp;rsquo;s say is &lt;code&gt;0_0_0&lt;/code&gt; for the very first one. It&amp;rsquo;ll then take that &lt;code&gt;0_0_0&lt;/code&gt; and look at the CSV file for anything in the ID field that has the value &lt;code&gt;0_0_0&lt;/code&gt;. And then it will continue to use the rest of that line.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve also made the CSV file circular just because that&amp;rsquo;s always a good practice to get into.&lt;/p&gt;
&lt;p&gt;And as always, I think it&amp;rsquo;s a great idea to debug this, especially when you&amp;rsquo;re dealing with multiple grids and multiple nodes on that grid.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;UserData&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;global browser ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;globalBrowserID&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39;| user: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;username&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#39; | password: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;password&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve also added the username and password here, just in case we need to verify the state that that user is in.&lt;/p&gt;
&lt;p&gt;So let&amp;rsquo;s run the test. Since we&amp;rsquo;re just running this locally, we&amp;rsquo;ll see that the first value indeed is &lt;code&gt;0_0_0&lt;/code&gt;, and the user we&amp;rsquo;re selecting is &lt;code&gt;user1&lt;/code&gt; and &lt;code&gt;password1&lt;/code&gt;, which lines up with the username and password values corresponding to &lt;code&gt;0_0_0&lt;/code&gt; in the CSV file.&lt;/p&gt;
&lt;p&gt;I hope that helped, and until next time, happy flooding!&lt;/p&gt;
&lt;p&gt;Download the &lt;a href="https://github.com/flood-io/load-testing-playground/blob/master/element/test-data/example.ts"&gt;full script&lt;/a&gt; and the &lt;a href="https://github.com/flood-io/load-testing-playground/blob/master/element/test-data/users.csv"&gt;data file&lt;/a&gt; to follow along.&lt;/p&gt;</description></item><item><title>Ask a Flooder 16: How do I use test data with Element?</title><link>https://nicolevanderhoeven.com/blog/20200609-aaf16/</link><pubDate>Tue, 09 Jun 2020 22:18:41 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200609-aaf16/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-16-how-do-i-use-test-data-with-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted on &lt;a href="https://www.flood.io/blog/ask-a-flooder-16-how-do-i-use-test-data-with-element-video"&gt;Tricentis Flood&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I discuss how to make your load testing scripts more realistic by including test data. The load testing tool I use is &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, but you can apply these principles to any tool. You&amp;rsquo;ll find a copy of the Element script I used below.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/EGhVm-R12qI?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;And, if you prefer, here&amp;rsquo;s the audio version:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/4OW5slSCmAuBc9NPa1NKtk" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here back with another Ask a Flooder, and this time the question is: How do I use test data with Flood Element?&lt;/p&gt;
&lt;p&gt;Now let&amp;rsquo;s talk about why you might want to use test data. In load testing, it&amp;rsquo;s important to make your scripts behave as similarly to real users as possible so that the load that you generate is production-like. The problem is that if you send the same data over and over again to the server, that server is probably going to cache that response. The response being cached means that the server will return the response way faster than it normally would if it had been a unique request. So we can use test data, instead of static data hardcoded in your scripts, to make sure that this doesn&amp;rsquo;t happen.&lt;/p&gt;
&lt;p&gt;Using test data can also help us test different responses. For example, let&amp;rsquo;s say we&amp;rsquo;re testing a loan application system, where a user inputs the application ID, the server looks it up, and returns the status of that loan application. Now, loan applications might be in different stages of the process. For instance, some might be saved but not submitted, or maybe they&amp;rsquo;ve been submitted but failed the identity verification check.&lt;/p&gt;
&lt;p&gt;If we used the same application ID every time, then the server would always return the same status and the same details. Instead, let&amp;rsquo;s create a CSV file that we can use as test data. It might look something like this.‍&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;applicationId
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;A100001
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;B100002
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;C100003
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;D100004
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can have &lt;code&gt;applicationId&lt;/code&gt; as the single header here, and we can populate this with a list of different application IDs in different stages of the process. That way, when we run the script, the server will have to respond authentically to every request without it being cached.&lt;/p&gt;
&lt;p&gt;Now to create our script. This is an empty Element script. To start with, make sure you&amp;rsquo;re importing &lt;code&gt;TestData&lt;/code&gt; here in the first line of your script.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first thing we&amp;rsquo;re going to need to do is to create an interface for the CSV file. Let&amp;rsquo;s call it &lt;code&gt;AppData&lt;/code&gt;. Within this interface, we&amp;rsquo;ll need to define all the fields that we intend to use in our data file and what type of values we can expect to be in those fields. Looking at our CSV here, we&amp;rsquo;ve just got the application ID, so I&amp;rsquo;m just going to copy that, and it&amp;rsquo;s a mixture of characters and numbers, so I&amp;rsquo;m going to put that in as a string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we need to tell Element how to find this test data. We&amp;rsquo;ll say that it&amp;rsquo;s from the CSV, using the interface we&amp;rsquo;ve just created. Now we&amp;rsquo;ll tell Element the filename. In this situation, the CSV file that I&amp;rsquo;m using is actually in the same directory, so I don&amp;rsquo;t need to specify a path here, but if you&amp;rsquo;re putting it somewhere else, then you&amp;rsquo;ll need to specify the folder and the path to it.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s use the data in a step. In real life, you might want to use an application ID to type it into a text field, but for demonstration purposes, I&amp;rsquo;m just going to show you how to output it to the console log. Printing to the console is also a good way to debug your tests, especially if you&amp;rsquo;re dealing with test data.&lt;/p&gt;
&lt;p&gt;We need to let Element know that we want to use AppData. So now, let&amp;rsquo;s output this to the console. Since we&amp;rsquo;re just debugging, let&amp;rsquo;s output the application ID. To actually get the value from the data file, we&amp;rsquo;ll use this syntax:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;) =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;application ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;) 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;‍By default, Element reads the data files sequentially. The problem with that is we only have a handful of application IDs. So if we wanted to run this one script 100 times, we&amp;rsquo;re going to run out of data. What we can do here is add &lt;code&gt;circular&lt;/code&gt;. That way, when the script reaches the very last value of the file, the next value it selects will be the first one, and it never runs out of test data.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Another thing you might be wondering is how to make it so that Element chooses a random value every time. To do that, we&amp;rsquo;ll also have to add &lt;code&gt;shuffle&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;‍Now let&amp;rsquo;s try to run the test.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element run test-data.ts
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;As you can see, it&amp;rsquo;s been finished. The application ID that was selected was indeed a random one because the first one would have started with A. So, it actually chose the last one randomly.&lt;/p&gt;
&lt;p&gt;And that&amp;rsquo;s it for test data with Element. Now, this user actually had a follow-up question, which was about unique test data. I&amp;rsquo;m going to answer that in the next video. Until next time, happy Flooding!&lt;/p&gt;
&lt;h2 id="sample-script"&gt;Sample script&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;assert&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loopCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;description&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Test Data&amp;#39;&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCookies&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;/*** Test Data * Version: 1.0 */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; () =&amp;gt; {    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;interface&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt; {        
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt; &lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;string&lt;/span&gt;    }    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;TestData&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;fromCSV&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;applicationids.csv&amp;#39;&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;circular&lt;/span&gt;()    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; .&lt;span style="color:#a6e22e"&gt;shuffle&lt;/span&gt;()    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Print to console&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Browser&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;AppData&lt;/span&gt;) =&amp;gt; {        
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;application ID: &amp;#39;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;`&lt;/span&gt;&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;applicationId&lt;/span&gt;&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;`&lt;/span&gt;)    
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Hybrid load testing: the best of testing using protocols and real browsers</title><link>https://nicolevanderhoeven.com/blog/20200602-hybrid-load-testing/</link><pubDate>Tue, 02 Jun 2020 22:21:11 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200602-hybrid-load-testing/</guid><description>&lt;p&gt;At &lt;a href="https://guildconferences.com/speaker/nicole-hoeven/"&gt;PerfGuild 2020&lt;/a&gt;, I spoke about hybrid load testing and how to mix two different approaches to load testing: protocol-based and browser-based.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200602-01.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Here’s the unlisted video from that presentation:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/KwlU6unOD9E?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;</description></item><item><title>Load testing on the Google Cloud Platform</title><link>https://nicolevanderhoeven.com/blog/20200528-load-testing-on-google-cloud-platform/</link><pubDate>Thu, 28 May 2020 22:25:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200528-load-testing-on-google-cloud-platform/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-on-the-google-cloud-platform"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-on-the-google-cloud-platform"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re excited to welcome another cloud provider to the Flood lineup, giving you even more options for running your load tests. You can now use Flood to run load tests on the &lt;a href="https://cloud.google.com/"&gt;Google Cloud Platform (GCP)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Many of you have requested an integration with Google Cloud, citing many of its strengths:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Full &lt;a href="https://cloud.google.com/blog/products/open-source/bringing-the-best-of-open-source-to-google-cloud-customers"&gt;integrations with open-source tools&lt;/a&gt; like Influx and Redis&lt;/li&gt;
&lt;li&gt;World-class &lt;a href="https://cloud.google.com/security"&gt;security&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;High-performance &lt;a href="https://cloud.google.com/infrastructure"&gt;global network&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Seamless access to other apps in the Google ecosystem, such as Search and Maps&lt;/p&gt;
&lt;p&gt;We think that adding support for GCP instances opens up a lot of opportunities for flooders wanting to take advantage of these benefits.&lt;/p&gt;
&lt;h2 id="using-flood-with-google-cloud"&gt;Using Flood with Google Cloud&lt;/h2&gt;
&lt;p&gt;You&amp;rsquo;ll notice a new Google Cloud section in &lt;a href="https://app.flood.io/account/integrations"&gt;the Integrations page&lt;/a&gt; while you&amp;rsquo;re logged into Flood:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200528-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll need to add your GCP service account key to allow Flood to access your account on your behalf. Once you&amp;rsquo;ve done this, you&amp;rsquo;ll be able to start grids and floods right from the Flood interface you&amp;rsquo;re already using.&lt;/p&gt;
&lt;p&gt;For more details on how to set up Flood to use your GCP account, check out &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-google-cloud-account"&gt;our documentation&lt;/a&gt; or follow along with the video below:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oYTo0jwRfMo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Anyone with a Flood subscription, including a free one, can use Google Cloud instances at no extra cost from Flood; however, GCP usage may incur separate costs.&lt;/p&gt;
&lt;p&gt;GCP is the third cloud provider that we support at Flood, after &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-aws-account"&gt;Amazon Web Services&lt;/a&gt; and &lt;a href="https://guides.flood.io/infrastructure/host-your-own-infrastructure/using-your-own-azure-account"&gt;Microsoft Azure&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Ask a Flooder 15: How do I install Element?</title><link>https://nicolevanderhoeven.com/blog/20200512-aaf15/</link><pubDate>Tue, 12 May 2020 22:45:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200512-aaf15/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-15-how-do-i-install-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-15-how-do-i-install-element-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this Flood Element tutorial, I demonstrate the steps required to install Flood Element, including dependencies it requires. Flood Element is an open-source browser-based load testing tool created by Tricentis Flood.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2YM1mnV"&gt;Learn more about Flood Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://nodejs.org/en/download/current/"&gt;Installation instructions for NodeJS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://classic.yarnpkg.com/en/docs/install/"&gt;Installation instructions for Yarn&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2yuYrWl"&gt;Installation instructions for Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.youtube.com/watch?v=oWtnStKrh98"&gt;Video: Getting Started with Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://bit.ly/2YJIQg5"&gt;Guides: Using Element with Flood‍&lt;/a&gt;&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/N7VLqqueqJE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/6EZ97ImNGUiDAGcEyGGNYM" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;h2 id="transcript"&gt;Transcript&lt;/h2&gt;
&lt;p&gt;Hi everyone, Nicole van der Hoeven here again, back with another Ask a Flooder, and today&amp;rsquo;s question is: &amp;ldquo;How do I install Element?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Now, I already made a previous video on how to get started with Element, but I didn&amp;rsquo;t actually go into the details of how to install it, so that&amp;rsquo;s what I&amp;rsquo;m going to do in this video today. There are actually a few parts to installing Element, and all of these instructions are going to be on &lt;a href="http://element.flood.io/"&gt;element.flood.io&lt;/a&gt;. If you go onto the site and click on Install, you&amp;rsquo;ll see all of the instructions depending on which operating system you&amp;rsquo;re on.&lt;/p&gt;
&lt;p&gt;First, you need to install NodeJS. This is sort of like how, if you&amp;rsquo;re familiar with JMeter, you have to install Java before installing JMeter. NodeJS is what Element runs on. Secondly, you&amp;rsquo;ll need a package manager. You can use NPM or Yarn, but in this video, I&amp;rsquo;m going to take you through how to do it with Yarn. And thirdly, there&amp;rsquo;s installing Element itself.&lt;/p&gt;
&lt;p&gt;First, download NodeJS. I&amp;rsquo;m going to leave links in the description to all of the sites that I visit so that you can go through all of the instructions later. On the Node site, download whichever installer suits your operating system. Go through the installation steps, and afterwards, check to make sure that NodeJS is properly installed on your machine. You can do that by going into the terminal and typing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;node -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Just make sure that the version that&amp;rsquo;s shown here is the same version that you&amp;rsquo;ve downloaded.&lt;/p&gt;
&lt;p&gt;Secondly, install the latest version of Yarn. On the Yarn site, you&amp;rsquo;re going to have to choose your operating system and the version. We recommend using the latest stable version. And then go through the instructions for your operating system. After you&amp;rsquo;ve done that, check your Yarn installation by typing:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yarn --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And the last step is installing Element. On the Element site, you can find the exact code that you need to type into your terminal. It&amp;rsquo;s:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;yarn global add @flood/element-cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So you can just copy that into your terminal. As of the time of this recording, the latest version of Element is 1.2.3. Looks like that&amp;rsquo;s installed. To check the version of Element, type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;element --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So that&amp;rsquo;s how to install Element. We&amp;rsquo;ve gotten a lot of questions recently about Element in particular, so I&amp;rsquo;m going to answering them in future videos. Hope this helped, and until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Innovation in Isolation</title><link>https://nicolevanderhoeven.com/blog/20200505-innovation-in-isolation/</link><pubDate>Tue, 05 May 2020 22:59:57 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200505-innovation-in-isolation/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/innovation-in-isolation"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/innovation-in-isolation"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ve always been a fully distributed team at Flood, but the current world crisis has still changed the way we work. Here are some of the things we&amp;rsquo;re doing to keep self-isolation from being &lt;em&gt;too&lt;/em&gt; isolating— and maybe it&amp;rsquo;ll help your team too!&lt;/p&gt;
&lt;p&gt;Within the Flood team, flooders-in-training (aka children) have made more surprise appearances in team meetings. Work has been punctuated with grocery runs to buy essentials before they run out. Some of us who were out of our home countries when all this happened have had to arrange emergency travel before international borders shut. It would be foolish to deny the impact on team morale as the entire world goes through this collective trauma, eyes glued to numbers that increase by the minute.&lt;/p&gt;
&lt;p&gt;Not exactly the most productive work environment.&lt;/p&gt;
&lt;p&gt;Yet there&amp;rsquo;s still work to be done (something we&amp;rsquo;re grateful for), and there are still many features we&amp;rsquo;d love to bring to Flood. So how do we keep everyone motivated to release and maintain software?&lt;/p&gt;
&lt;h2 id="encouraging-banter"&gt;Encouraging banter&lt;/h2&gt;
&lt;p&gt;Work shouldn&amp;rsquo;t be all about work. Understanding everyone&amp;rsquo;s personal circumstances is vital to a team&amp;rsquo;s ability to work together professionally. We use Slack as our primary communication tool throughout the day, and we already had quite a few non-work channels on there (#anything, #hobbies, #gaming, #drones, and #travel to name a few). Now we have one for COVID-related chatter as well.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;In this channel, we share news from our parts of the world, post photos of things that are sold out in our local supermarkets, talk about new hobbies we&amp;rsquo;ve taken up to stay sane, and discuss the struggles of co-working with spouses and children who are now also working or studying from home.&lt;/p&gt;
&lt;p&gt;Having a dedicated channel gives people license to open up about what&amp;rsquo;s going on in their personal lives, and it helps the team understand where everyone&amp;rsquo;s headspace is at. We also use #eng-covid-19 for memes. A lot of memes. It&amp;rsquo;s easier to work through a tough situation if you can laugh about it together.&lt;/p&gt;
&lt;h2 id="over-communicating"&gt;Over-communicating&lt;/h2&gt;
&lt;p&gt;Our co-founder and Product Manager, Ivan Vanderbyl, recently &lt;a href="https://enterprisersproject.com/article/2020/4/9-collaboration-tool-tips-remote-teams"&gt;wrote a great article&lt;/a&gt; with some tips for keeping communication lines open. This is particularly important during this crisis, where schedules and priorities can change quickly.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Emojis - We use emojis as a non-verbal cue to convey tone, approval, agreement, and disagreement. We add emojis to messages we send and also use them as reactions on Slack to messages from other people. Even when you don&amp;rsquo;t have an answer or when a response is not required, emojis signal acknowledgment so that nobody feels like they&amp;rsquo;re shouting into the void. Over time, we&amp;rsquo;ve developed emojis that are specific to Flood culture, such as the avocado:&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Source: Our &lt;a href="https://twitter.com/flood_io/status/1230166412066512896"&gt;Twitter account&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍We even have a fruit-based vocabulary of emojis that we can use in our Slack status messages to convey our general mood. Being in Carrot Mode, for instance, means that you&amp;rsquo;re trying to focus and would appreciate not being direct messaged or @ mentioned.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;‍When working remotely, and especially when in self-isolation, everyone has their own cadence for working. It&amp;rsquo;s on each person to communicate that schedule so that others can respect it.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Text chat - We&amp;rsquo;re used to working asynchronously due to time zones, so text-based discussions are necessary. We try to over-communicate and &amp;ldquo;think out loud&amp;rdquo; before making decisions just in case we have to suddenly stop working due to illness or other pandemic-related reasons. Even something as simple as leaving a link to a document that we&amp;rsquo;re working on means that someone else will be able to find it if we&amp;rsquo;re unavailable.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Voice chat - We tend to use voice chat for quick discussions or updates about work-related things. It&amp;rsquo;s also great for those of us in Europe who are suffering from slower internet connection speeds at certain times of the day due to everyone being home and streaming Netflix.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Video calls - Video calls are for team retros, 1:1 calls with managers, and personal or sensitive conversations where body language is crucial. It&amp;rsquo;s also great for recreating that &amp;ldquo;hanging out at a pub&amp;rdquo; vibe. Speaking of which&amp;hellip; welcome to the Flood pub!&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-04.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The Flood Pub is open on Friday afternoons. It&amp;rsquo;s where we all hang out together with a beverage of our choice and talk about things that are entirely not work-related. We hop on a Zoom call together, Tim (our General Manager) fires up the &amp;ldquo;jukebox&amp;rdquo; (Spotify playlist), and we end the week by getting some facetime with each other—just as we would do (and have done) if we were together in person.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-05.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;‍Meeting in this low-pressure context lets us talk about things we wouldn&amp;rsquo;t mention otherwise. It&amp;rsquo;s also a fun way to check in with each other after another week at work (and in quarantine).&lt;/p&gt;
&lt;h2 id="doing-stuff"&gt;Doing stuff&lt;/h2&gt;
&lt;p&gt;While communicating openly is productive, getting stuff done as a team boosts spirits.  Here&amp;rsquo;s what we&amp;rsquo;ve done recently to kick our output into high gear.&lt;/p&gt;
&lt;h3 id="boinc"&gt;BOINC&lt;/h3&gt;
&lt;p&gt;Like most of you, we&amp;rsquo;ve been cooped up in our houses, watching events unfold and feeling helpless as things happen that are beyond our control. BOINC gives us a chance to do something to contribute that IS in our control.&lt;/p&gt;
&lt;p&gt;BOINC is a platform by the University of California Berkeley that lets you volunteer your spare computer (or mobile device!) processing power to science. From the official site, Boinc &amp;ldquo;downloads scientific jobs to your computers and runs them invisibly in the background.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;In our case, we wanted to help sequence proteins like the novel coronavirus using Rosetta@Home. BOINC is a perfect fit for Flood because we are in the unique position of starting up and managing thousands of virtual machines 24/7. Our Ops team has been hard at work automating the donation of our computing power to the Rosetta@Home project when these machines aren&amp;rsquo;t being used.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-06.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re proud to say our contribution is INcreasing over time as our engineers find new ways to streamline the process. We&amp;rsquo;re already in the &lt;a href="https://www.boincstats.com/stats/-1/user/detail/87605321733/overview"&gt;top 5% of BOINC users in the world&lt;/a&gt; by contribution.&lt;/p&gt;
&lt;h3 id="gig-great-ideas-gathering"&gt;GIG: Great Ideas Gathering&lt;/h3&gt;
&lt;p&gt;Every year, the mothership (Tricentis) runs a three-day hackathon called GIG. Two weeks ago was the first-ever GIG where most participants, not just the Flood team, were working remotely.&lt;/p&gt;
&lt;p&gt;The theory behind hackathons is that the daily grind can be exhausting after a while, and it can sometimes be beneficial to introduce a short burst of work to revitalize the team. Hackathons provide a framework for small groups to pitch, execute, and report on a single idea without committing too much time to it. Everyone gets a chance to step away from regular duties and work furiously together on something they might not have otherwise gotten to work on.&lt;/p&gt;
&lt;p&gt;A hackathon where the team members are separated by distance and timezone is certainly another beast, but here are some lessons we learned about remote hackathons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Come up with a good idea&lt;/strong&gt;: This is easier said than done, but a good hackathon idea is a creative solution that delivers a lot of value. Here are the ideas we came up with:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Floody - Use AI to improve onboarding by walking new users through the steps for running a flood (live on Flood now!)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flood Bot - Add smarter checks to detect patterns in load tests and help flooders understand their results (prototype)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Flood Gate - Use AWS Fargate to reduce costs in provisioning, scaling, and managing virtual servers by about 30% (proof of concept)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When thinking up ideas for GIG, we didn&amp;rsquo;t commit to releasing them publicly. Even a project idea that doesn&amp;rsquo;t end up making it into the finished product is an occasional worthwhile detour for team productivity and morale.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Limit scope&lt;/strong&gt;: GIG is a sprint, not a marathon. While my team (comprised of Jason Rizio and me) was planning out what we wanted to do, we quickly realized that there was a lot more that we wanted to do, but it just wasn&amp;rsquo;t feasible within the strict timeframe. In the end, we decided to go for an incremental piece of work that we could push to production before the deadline instead of completing just one step towards something abstract and unreleasable.The other Flood teams also needed to whittle down the scope to a smaller, completable chunk: a working prototype.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Clarify assignments&lt;/strong&gt;: With members on different timezones, it was essential to have an initial meeting to plan out everything that needed to be done and by when. In this situation particularly, we found it useful to split apart the project into independent chunks, to minimize the need to collaborate in real-time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Touch base regularly&lt;/strong&gt;: When working independently, team members can quickly diverge off the main path. To avoid that, we met up at least daily by hopping on an audio call on Zoom to spend a few minutes updating each other on the work we&amp;rsquo;d done. Doing this gives others a chance to help out when one member encounters roadblocks.For anything that didn&amp;rsquo;t need to be real-time, we worked asynchronously on chat. Here&amp;rsquo;s a screenshot of the number of messages and files exchanged to our dedicated GIG Slack channel during the event:&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-07.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;‍Yup, 1,535 messages and 60 files in 3 days. That&amp;rsquo;s collaboration!&lt;/p&gt;
&lt;p&gt;We generally prefer public rather than private channels, and we certainly stuck to that throughout GIG. When you&amp;rsquo;re working with more than one person, it&amp;rsquo;s counterproductive to have private conversations that can&amp;rsquo;t be referenced by other people.&lt;/p&gt;
&lt;p&gt;We also learned that it&amp;rsquo;s useful to keep tabs on what the other teams are doing. After the event started, my team realized that another team was changing a page on the Flood app that we intended to use. Luckily, both teams were able to work around it.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also only fair to let other teams chime in on important decisions within the project that might affect future work— like the name for your mascot.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200505-08.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Leave time for the video&lt;/strong&gt;: It&amp;rsquo;s not just about doing the work; it&amp;rsquo;s about communicating what you&amp;rsquo;ve done in a way that others can appreciate. Here&amp;rsquo;s a video that my team (composed of Jason Rizio and me) put together for Floody and our improvements to the onboarding process:&lt;/li&gt;
&lt;/ul&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/OeIPWovOua4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Celebrate&lt;/strong&gt;: After the work is done, don&amp;rsquo;t forget to pat each other on the back for the hard work! For us, this meant &lt;a href="https://twitter.com/c_a_dunlop/status/1246111919762591746"&gt;a round of tacos&lt;/a&gt; for everyone and a trip to the Flood pub. (Why do we have so many food-based rewards?)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="its-not-easy"&gt;It&amp;rsquo;s not easy&lt;/h2&gt;
&lt;p&gt;Keeping a team unified and working efficiently towards a common goal is always tricky, and working remotely, especially during a world crisis, doesn&amp;rsquo;t change that. Distributed team members need to put in more effort to consciously over-communicate, make room for each other&amp;rsquo;s unique circumstances, and do little projects that foster creativity when we&amp;rsquo;re all feeling a little lackluster. Incorporating these tips can create a culture of healthy productivity within a remote team.&lt;/p&gt;
&lt;p&gt;‍&lt;/p&gt;</description></item><item><title>On-premise load testing advantages and disadvantages</title><link>https://nicolevanderhoeven.com/blog/20200430-on-premise-load-testing/</link><pubDate>Thu, 30 Apr 2020 23:06:59 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200430-on-premise-load-testing/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/on-premise-load-testing-advantages-and-disadvantages"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/on-premise-load-testing-advantages-and-disadvantages"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Where you run your load test can affect the results that you get as well as your project&amp;rsquo;s bottom line. In general, there are two infrastructure options to consider for load testing your apps: on-premise and cloud. Which type of environment is best for load testing both web or mobile apps?&lt;/p&gt;
&lt;h2 id="differences-between-on-premise-and-cloud-load-testing"&gt;Differences between on-premise and cloud load testing&lt;/h2&gt;
&lt;h3 id="what-is-on-premise-load-testing"&gt;What is on-premise load testing?&lt;/h3&gt;
&lt;p&gt;On-premise load testing is running your performance or load testing scripts on load generators you physically control. Typically, these load generators are machines that are either in your office or data center. In on-premise load testing, you are responsible for all aspects of the maintenance of the load generators, including hardware upgrades and software installations such as testing tools, but that also comes with increased control and security.&lt;/p&gt;
&lt;h3 id="what-is-cloud-load-testing"&gt;What is cloud load testing?&lt;/h3&gt;
&lt;p&gt;In cloud load testing, you run your load tests on a service provider&amp;rsquo;s machines, effectively outsourcing the provisioning and maintenance of your load generators. Running &amp;ldquo;on the cloud&amp;rdquo; means you&amp;rsquo;re paying someone else to be responsible for these machines. In cloud load testing, you don&amp;rsquo;t &amp;ldquo;own&amp;rdquo; the machines your test is running on; it&amp;rsquo;s more like renting some time on someone&amp;rsquo;s data center whenever you need it. Cloud-based infrastructure isn&amp;rsquo;t necessarily less secure than on-premise infrastructure, but there are certainly more security considerations to keep in mind.&lt;/p&gt;
&lt;h3 id="pros-and-cons-of-on-premise-load-testing"&gt;Pros and cons of on-premise load testing&lt;/h3&gt;
&lt;p&gt;On-premise load testing is no better or worse than cloud load testing; it just depends on what you need. There&amp;rsquo;s a meme that the cloud is just a fancy term for someone else&amp;rsquo;s computer— but &lt;a href="https://www.zdnet.com/article/stop-saying-the-cloud-is-just-someone-elses-computer-because-its-not/"&gt;that&amp;rsquo;s an oversimplification&lt;/a&gt; that glosses over nuances that might make a difference to your bottom line.&lt;/p&gt;
&lt;p&gt;Here are some questions to ask yourself when deciding between load testing on the cloud or on-premise.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Test infrastructure can make or break your load tests.&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="cloud-vs-on-premise-load-testing-how-do-you-decide"&gt;Cloud vs. on-premise load testing: how do you decide?&lt;/h3&gt;
&lt;h4 id="why-are-you-running-a-load-test"&gt;Why are you running a load test?&lt;/h4&gt;
&lt;p&gt;If your intention for running load tests is to test your web application&amp;rsquo;s load balancing, the source of the web traffic, and the location of your environment, may not be as important. If you intend to do stress testing, you may want the scalability of a cloud setup.&lt;/p&gt;
&lt;h4 id="who-is-the-intended-audience-of-your-application"&gt;Who is the intended audience of your application?‍&lt;/h4&gt;
&lt;p&gt;Load testing is most accurate when it is as realistic to the production workload and user base as possible. Running a load test on-premises means that the traffic comes from one location, which could be ideal if your application is an internal one.&lt;/p&gt;
&lt;h5 id="do-you-have-the-resources-in-your-teamcompany-to-maintain-load-generators"&gt;Do you have the resources in your team/company to maintain load generators?&lt;/h5&gt;
&lt;p&gt;All machines need to be provisioned, set up, and maintained to function correctly. Depending on how many machines you need, you may even need a team of trained professionals to monitor your environment.&lt;/p&gt;
&lt;h4 id="what-is-your-budget"&gt;What is your budget?&lt;/h4&gt;
&lt;p&gt;Both cloud and on-premise load testing have costs. Cloud load testing requires a smaller outlay of cash initially but may cost more to maintain as you continue to pay for the computing time. On-premise load testing requires more money upfront but may cost less to maintain in the long run.&lt;/p&gt;
&lt;h4 id="how-many-virtual-users-do-you-want-to-run"&gt;How many virtual users do you want to run?&lt;/h4&gt;
&lt;p&gt;The number of virtual users you intend to test your application against correlates to the number of load generators you require. In general, the more machines you need, the more expensive it becomes (for both cloud and on-premise load testing), but if you only need a handful of users, perhaps you can find a machine or two on-premise that could do the trick.&lt;/p&gt;
&lt;h3 id="advantages-of-on-premise-load-testing"&gt;Advantages of on-premise load testing&lt;/h3&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200430-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="increased-control"&gt;Increased control&lt;/h4&gt;
&lt;p&gt;Since you own the machines you&amp;rsquo;re testing on, you can set your environment up with your exact specifications in mind. You&amp;rsquo;ll be able to make hardware upgrades or update versions of operating systems and load testing tools whenever you want, without needing to liaise with a third-party provider. This option can come in handy if you routinely use non-standard configurations or legacy software. If you&amp;rsquo;re also doing other types of non-functional testing, like security testing, it may be easier to change the configuration on on-premise machines.&lt;/p&gt;
&lt;h4 id="greater-data-security"&gt;Greater data security&lt;/h4&gt;
&lt;p&gt;The question of cloud vs. on-premises may be a business decision. Some industries or businesses with stringent compliance and regulatory requirements may have no choice but to run tests on-premise because owning the load generators also means controlling who has access to the data that&amp;rsquo;s on them. An on-premise environment lets you lock down access if necessary. With cloud load testing, you&amp;rsquo;d need to have security arrangements with the cloud provider that you choose so that any test data or identifying client information seen or accessed by your test scripts remains confidential.&lt;/p&gt;
&lt;h4 id="lower-cost-and-lower-barrier-to-entry-in-some-situations"&gt;Lower cost and lower barrier to entry in some situations&lt;/h4&gt;
&lt;p&gt;If you don&amp;rsquo;t intend to run too many users of your test script and you already have a spare machine or two at the office, on-premise load testing may be the easiest and most cost-effective way to get started. This way, you avoid having to request the budget for a new tool and needing to train your team on a new interface.&lt;/p&gt;
&lt;h4 id="fewer-variations-due-to-latency"&gt;Fewer variations due to latency&lt;/h4&gt;
&lt;p&gt;Controlling your own load generators means controlling the network they run on. If your corporate network is generally stable, and your test scenarios don&amp;rsquo;t involve testing from different geographical locations, reported response times (and user experience) more closely reflect server processing time rather than latency and travel time.&lt;/p&gt;
&lt;h3 id="disadvantages-of-on-premise-load-testing"&gt;Disadvantages of on-premise load testing&lt;/h3&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200430-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="higher-cost-in-some-situations"&gt;Higher cost in some situations&lt;/h4&gt;
&lt;p&gt;Maintaining your own load generators comes with a higher up-front cost, which may be a showstopper for smaller projects or companies. The more concurrent users you require for your load test, the more machines you need, the more licenses you need for your testing tool (unless it&amp;rsquo;s open source), and the longer it takes to recover your investment.&lt;/p&gt;
&lt;h4 id="geographical-limitations"&gt;Geographical limitations&lt;/h4&gt;
&lt;p&gt;Since all your machines are in one place, you can&amp;rsquo;t accurately simulate the user experience for customers who might access your web app from another location. You also can&amp;rsquo;t fully test the effect of CDNs and other tools that your application might employ to keep response times low. Web apps that can be accessed by anyone on the internet might require performance tests that take into account customers from different regions.&lt;/p&gt;
&lt;h4 id="more-setup"&gt;More setup&lt;/h4&gt;
&lt;p&gt;You need to do all the setup yourself for both hardware and software components. You also need a way to coordinate your test, so that load generators start and end when you want them to. You may want to divert some resources towards environment management.&lt;/p&gt;
&lt;h4 id="less-flexibility"&gt;Less flexibility&lt;/h4&gt;
&lt;p&gt;With on-premise load generators, you can&amp;rsquo;t add, remove, or scale up nodes on the fly according to your test— something cloud load testing excels at.&lt;/p&gt;
&lt;h2 id="on-premise-load-testing-best-practices"&gt;On-premise load testing best practices&lt;/h2&gt;
&lt;p&gt;The environment you&amp;rsquo;re testing in is especially important when you&amp;rsquo;re using your own infrastructure. Here are some best practices for a performance testing strategy that involves on-premise load generation.&lt;/p&gt;
&lt;h3 id="run-baseline-tests"&gt;Run baseline tests&lt;/h3&gt;
&lt;p&gt;Treat load testing like a scientific experiment. Before you begin changing variables to improve performance, spend some time figuring out your test configuration so that it&amp;rsquo;s repeatable. Pay attention to things like workloads, business processes, the number of users you&amp;rsquo;re running per load generator, test environment configuration values, script pacing and think time set in your testing tool, and test script transactions. Make sure that the resource utilization on your machines remains healthy during a test; otherwise, you&amp;rsquo;re load testing the load generators themselves rather than your application servers.&lt;/p&gt;
&lt;p&gt;Then, run a few tests against your application servers without making any changes. This way, you create a &amp;ldquo;control group&amp;rdquo; or control test against which to compare future tests.&lt;/p&gt;
&lt;p&gt;This process is called &lt;em&gt;baselining&lt;/em&gt; your application performance.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Flood&amp;rsquo;s Project View lets you track an application&amp;rsquo;s performance over time and compare recent tests to a baseline&lt;/em&gt;
‍&lt;/p&gt;
&lt;h3 id="consider-using-containers-or-virtual-machine-images"&gt;Consider using containers or virtual machine images&lt;/h3&gt;
&lt;p&gt;Along the lines of reducing variables, it&amp;rsquo;s especially important to use load generators that are as identical as you can make them. You can manually check that you&amp;rsquo;re installing the same software and tools on each one, or you can do as cloud providers do and automate this process.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s easy to miss software that are necessary for monitoring or the load testing tool you&amp;rsquo;re using. For example, JMeter and Gatling require certain versions of Java. Test automation or browser-level load testing tools might require web browsers.&lt;/p&gt;
&lt;p&gt;You can use &lt;a href="https://www.docker.com/resources/what-container"&gt;containers such as Docker&lt;/a&gt; to create a standalone package of everything you need for your test. Alternatively, if you&amp;rsquo;re using virtual machines, you can also create a full system image that you can use for every virtual machine.&lt;/p&gt;
&lt;p&gt;The difference between the two is that a container lets you be more granular about what is included in the package that you then deploy to all your load generators. Virtual machines include hardware components that you can set, whereas containers are software-only, decreasing package sizes.&lt;/p&gt;
&lt;p&gt;Using containers or images allows you to keep your load generators as identical as possible (in terms of hardware and software) so that you can assume similar results from each one.&lt;/p&gt;
&lt;p&gt;‍‍&lt;img src="https://nicolevanderhoeven.com/assets/20200430-05.jpg" alt="" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;h3 id="dont-neglect-monitoring"&gt;Don&amp;rsquo;t neglect monitoring&lt;/h3&gt;
&lt;p&gt;It&amp;rsquo;s easy to forget that your application servers aren&amp;rsquo;t the only ones that need monitoring. Your load generators need monitoring as well, so that they don&amp;rsquo;t end up being the bottleneck in your tests. Here&amp;rsquo;s &lt;a href="https://flood.io/blog/load-testing-tutorial-server-monitoring"&gt;a starter list of server metrics&lt;/a&gt; that you should consider monitoring.&lt;/p&gt;
&lt;p&gt;You might also consider how you can integrate &lt;a href="https://stackify.com/mistakes-evaluating-application-performance-management/"&gt;performance management&lt;/a&gt; tools you already use into your monitoring strategy.&lt;/p&gt;
&lt;h3 id="spend-time-on-a-framework-for-gathering-data"&gt;Spend time on a framework for gathering data&lt;/h3&gt;
&lt;p&gt;One of the biggest challenges in on-premise load testing is figuring out how to get data from your tests. Each machine runs your test script independently of the others, so at the end of your test, you&amp;rsquo;re likely to end up with several results files. After you download these off every machine, how do you combine them into a single summary?&lt;/p&gt;
&lt;p&gt;Manually collating results is an option, but it&amp;rsquo;s a tedious one. You can copy all the files into one directory and then concatenate them so that you end up with one giant one. Depending on the size of those results files and how long you ran the test, however, this may not be feasible. For larger files, you might consider aggregating the data and increasing the granularity, so that instead of seeing raw response time for every transaction, you only see the average response time for every 15 seconds. You can use a tool like &lt;a href="https://www.elastic.co/logstash"&gt;Logstash&lt;/a&gt; for this.&lt;/p&gt;
&lt;p&gt;It takes some time and technical expertise to set up a framework for results gathering that works for your purposes, especially if you want to go a step further and have real-time results.&lt;/p&gt;
&lt;p&gt;Of course, you can also skip this part by just using the framework we&amp;rsquo;ve already set up on Flood. Tim Koopmans, our co-founder, created the first prototype of what would become Flood specifically because he got tired of having to set up this framework for every engagement.&lt;/p&gt;
&lt;h2 id="how-to-run-an-on-premise-load-test-with-flood-agent"&gt;How to run an on-premise load test with Flood Agent&lt;/h2&gt;
&lt;p&gt;‍
The easiest way to get started with an on-premise load test is by using &lt;a href="https://flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;Flood Agent&lt;/a&gt;. Flood Agent is an executable that you can install onto a machine that effectively turns it into a full-fledged load generator. Then, you can start a test from the Flood web interface and have your test script start running on your machines.&lt;/p&gt;
&lt;p&gt;Agent takes care of a few typical problems we&amp;rsquo;ve discussed so far:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It uses containers to ensure that load generators are identically provisioned.&lt;/li&gt;
&lt;li&gt;It automatically gathers CPU, memory, and network metrics on load generators.&lt;/li&gt;
&lt;li&gt;It coordinates the execution of the load test so that you only need to start it from one central place.&lt;/li&gt;
&lt;li&gt;It enables real-time monitoring of results while the test is running.&lt;/li&gt;
&lt;li&gt;It aggregates and collates all the results for you into a dashboard.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We think Agent addresses pain points that we&amp;rsquo;ve seen over and over again in our own on-premise performance testing projects as well as in our customers&amp;rsquo;. Agent is a &lt;a href="https://github.com/flood-io/flood-agent/releases/latest"&gt;free download&lt;/a&gt; and works with &lt;a href="https://guides.flood.io/scripting-and-tools/choosing-a-tool"&gt;all performance testing tools that Flood supports&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;On-premise load testing is still a valid option despite the growth in popularity of cloud-based infrastructure, and it has its advantages and disadvantages. This type of load testing trades a little bit of flexibility for increased data security and control, which is a tradeoff that some companies may be willing to make.&lt;/p&gt;
&lt;p&gt;On-premise load testing has traditionally included a lot of tedious setup and maintenance. Still, you can reduce maintenance effort by creating an internal load testing framework upfront that automates coordination, monitoring, and results collection. Using Flood Agent can mitigate time spent on this initial setup.&lt;/p&gt;</description></item><item><title>Ask a Flooder 13: How do you do mobile load testing?</title><link>https://nicolevanderhoeven.com/blog/20200428-aaf13/</link><pubDate>Tue, 28 Apr 2020 23:21:08 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200428-aaf13/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-13-how-do-you-do-mobile-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-13-how-do-you-do-mobile-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How do you load test a native mobile app? I discuss the general approach to mobile load testing, what a device farm is, and why a device farm isn&amp;rsquo;t necessary for load testing. I also discuss the best mobile load testing tools to use.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/y_rRu0cDey4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or listen to the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/2fevtJd7pPIAUDkMpdnzkV" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here again, back with another Ask a Flooder, and today&amp;rsquo;s question is:&lt;/p&gt;
&lt;h2 id="how-do-you-do-mobile-load-testing"&gt;How do you do mobile load testing?&lt;/h2&gt;
&lt;p&gt;Now, this question came from a customer who was under the misconception that in order to do mobile load testing, they would need to use what we call a device farm. A device farm is a collection of different kinds of mobile phones. You would ideally have the most popular makes of mobile phones (the hardware models) and the operating systems and system versions. You can imagine that this can very easily get a little out of hand to coordinate because of fragmentation. There are just so many devices out on the market, and then there&amp;rsquo;s the question of how you actually generate the load from that.&lt;/p&gt;
&lt;p&gt;You would somehow need some sort of test automation script that was running and then coordinate os that they all run at the same time, and you would use that as a load test. As you can imagine, whether you use real devices or simulators, this kind of thing would get complicated and expensive very quickly. But the good news is that it&amp;rsquo;s unnecessary if it&amp;rsquo;s load testing that you want to do. Now I say that because, for functional testing or compatibility testing, you ARE going to want to test your application on a variety of different browsers. But with load testing, you&amp;rsquo;re really more concerned about the back end part of the equation. You want to generate load on your application servers. In reality, most mobile apps work by sending API requests to that server, usually by some sort of restful API. Luckily, API load testing has been around for a while, so we do have some industry-tested ways to run this.&lt;/p&gt;
&lt;h2 id="what-are-the-best-tools-for-api-load-testing"&gt;What are the best tools for API load testing?&lt;/h2&gt;
&lt;p&gt;Essentially, you&amp;rsquo;re going to want to test protocol-level tools. That means that you don&amp;rsquo;t want to be using browser-level tools in which you&amp;rsquo;re using scripts to drive a full browser. All you really need is something that sends requests on the protocol-level. That&amp;rsquo;s great because it&amp;rsquo;s actually way more efficient.&lt;/p&gt;
&lt;p&gt;You have two really good open-source options for this, JMeter and Gatling. I&amp;rsquo;ve already gone a little bit into the differences between these two in my previous video on how you choose a tool for load testing, which I will leave a link to.&lt;/p&gt;
&lt;p&gt;And here are some other resources that will help you get started with mobile load testing. I also have another video about how to record network traffic from a native mobile app on JMeter, which sounds a little complicated, but I promise it&amp;rsquo;s not. In that video, I go over the steps with you, and I&amp;rsquo;m actually doing it in real-time with you as well. I show you the screen recording from my mobile and from JMeter on my laptop, so you can always pause and watch it at your own pace.&lt;/p&gt;
&lt;p&gt;The second thing is that I already wrote a blog post, which is sort of a guide for mobile load testing, which goes into the steps into way more detail than I can here.&lt;/p&gt;
&lt;p&gt;And lastly, I have written blog posts about two real-life examples of mobile load testing. The first one was the Iowa Caucus Reporter app. I ran through it from the workload modeling to the scripting and then the actual execution. More recently, I also wrote about the Robinhood app. Be sure to check out the links in the description to find out more.&lt;/p&gt;
&lt;p&gt;Until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Browser-based load testing in 2020</title><link>https://nicolevanderhoeven.com/blog/20200423-browser-based-load-testing-2020/</link><pubDate>Thu, 23 Apr 2020 16:48:09 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200423-browser-based-load-testing-2020/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/browser-based-load-testing-in-2020"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/browser-based-load-testing-in-2020"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We &lt;a href="https://flood.io/blog/level-up-your-load-testing-with-browser-level-users"&gt;first announced&lt;/a&gt; our open-source browser-based load testing tool based on Puppeteer, &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, in February 2018. Despite our decision to make it an entirely separate tool from Flood, we&amp;rsquo;ve enjoyed using it so much as a team that several of us have written about it:&lt;/p&gt;
&lt;p&gt;Tim Koopmans: &lt;a href="https://flood.io/blog/load-testing-for-devops-with-browser-level-users-blu"&gt;Load testing for DevOps&amp;hellip; with Browser Level Users (BLU)&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kevin Dunne: &lt;a href="https://flood.io/blog/a-new-approach-to-load-testing-with-browser-level-users"&gt;A new approach to load testing with browser level users&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;me: &lt;a href="https://flood.io/blog/prepare-for-viral-videos-with-flood-element"&gt;Prepare for viral videos with Flood Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Lachie Cox: &lt;a href="https://flood.io/blog/why-you-should-load-test-with-browsers"&gt;Why should you load test with real browsers?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;our friend Eduardo Riol, as translated by Antonio Jimenez: &lt;a href="https://flood.io/blog/selenium-vs-puppeteer-for-test-automation-is-a-new-leader-emerging"&gt;Puppeteer vs. Selenium for test automation: is a new leader emerging?&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Clearly, we&amp;rsquo;re huge fans of load testing a web application with real browsers. But does the wider software testing industry share that sentiment?&lt;/p&gt;
&lt;h2 id="browser-based-load-testing-in-2020"&gt;Browser-based load testing in 2020&lt;/h2&gt;
&lt;p&gt;Browser-level load testing is still pretty new, and there aren&amp;rsquo;t too many providers offering it right now. Luckily, we just so happen to have access to a database of load tests run on Flood since 2013. Here&amp;rsquo;s a bar chart visualizing data we&amp;rsquo;ve collected about the load testing tools flooders have used (we support Selenium, JMeter, Gatling, and Element).&lt;/p&gt;
&lt;h3 id="load-tests-executed-on-flood-over-time-grouped-by-load-testing-tool"&gt;Load tests executed on Flood over time, grouped by load testing tool&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="browser-level-load-testing-is-increasing-in-popularity"&gt;Browser-level load testing is increasing in popularity&lt;/h3&gt;
&lt;h4 id="in-2020-almost-35-of-the-load-tests-run-on-flood-are-browser-based-load-tests"&gt;In 2020, almost 35% of the load tests run on Flood are browser-based load tests.&lt;/h4&gt;
&lt;p&gt;While the total number of load tests run across all tools increased across the board, the percentage of tests that utilized Selenium and Element, as compared to JMeter and Gatling, has also increased from 2018. Both Selenium and Element are browser-based load testing tools.&lt;/p&gt;
&lt;p&gt;By contrast, JMeter, a protocol-level load testing tool which previously enjoyed a 70% share of the traffic on Flood, now accounts for only a bit over 50% of usage. JMeter&amp;rsquo;s share of the protocol-level pie is higher than Gatling&amp;rsquo;s, but the percentage of usage for both tools appears to be contracting when compared to that of browser-based tools.&lt;/p&gt;
&lt;h3 id="element-use-is-increasing-faster-than-selenium-use"&gt;Element use is increasing faster than Selenium use&lt;/h3&gt;
&lt;p&gt;Despite the fact that Selenium has been around longer, &lt;strong&gt;25% of all floods today are run using Element&lt;/strong&gt;. This is a significant increase in just two years, and one that bodes well for the future. While we&amp;rsquo;re still fans of Selenium and still support it, one reason we see for the dominance of Element in today&amp;rsquo;s market is resource efficiency.&lt;/p&gt;
&lt;p&gt;In our baseline tests, we&amp;rsquo;ve seen that Element can run from 20-50 users per Flood node (an &lt;a href="https://aws.amazon.com/blogs/aws/m5-the-next-generation-of-general-purpose-ec2-instances/"&gt;AWS m5.xlarge instance&lt;/a&gt;), whereas Selenium can only run up to 5. This leads to some significant cost savings, as running the same number of users with Element requires fewer load generators than with Selenium.&lt;/p&gt;
&lt;p&gt;Another reason might be the fact that Element uses Puppeteer in the background. Puppeteer, developed by Google, understandably shines when driving Google Chrome (and recently, Firefox). Puppeteer load testing is growing in popularity due to the wealth of metrics it has access to.&lt;/p&gt;
&lt;h2 id="how-browser-based-load-testing-works"&gt;How browser-based load testing works&lt;/h2&gt;
&lt;p&gt;Traditional load testing is done on the protocol level by sending messages directly to the web server. These messages are sent without simulating the application interface, and the responses that are received from the server are not visualized, either. &amp;ldquo;Users&amp;rdquo; in protocol-level load testing scripts are actually threads, with each one sending a list of messages at predefined intervals, and we refer to these users as Protocol-Level Users (PLU). JMeter and Gatling use PLU to generate load.&lt;/p&gt;
&lt;p&gt;The screenshot below shows what one request for a single action might look like in a JMeter test plan.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-02.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Example of an HTTP request with parameters on JMeter&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In browser-based load testing, real browser instances are opened on load generators, and the load testing tool plays the part of a real user in navigating the web application using the GUI. We refer to the virtual users in browser-based load testing as Browser-Level Users (BLU).&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s an example of the same action in the JMeter example above, but this time in an Element test script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Step 1&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click Start button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startButton&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;.btn-default&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;startButton&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;})
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This version simply describes the button to be found and clicked, whereas the protocol-level version needs to be more precise in what exactly is passed to the server.&lt;/p&gt;
&lt;p&gt;Both types of load testing tools can apply the same load on an application (as long as it supports both methods— see the next section). The main difference is in how the load is generated.&lt;/p&gt;
&lt;p&gt;A protocol-level script will contain instructions on which messages to send, which protocols to use, which headers to include, and other information that a typical end-user would not see.&lt;/p&gt;
&lt;p&gt;A browser-level script will contain instructions on how to &lt;em&gt;interact&lt;/em&gt; with the application: which buttons to click, what to type in text fields, which links to follow, and other on-screen elements that an end-user would be familiar with. This leads us to one of the big advantages of browser-based load testing.&lt;/p&gt;
&lt;h2 id="pros-and-cons-of-browser-based-load-testing"&gt;Pros and cons of browser-based load testing&lt;/h2&gt;
&lt;h3 id="pros"&gt;Pros&lt;/h3&gt;
&lt;h4 id="simple-scripting-or-no-scripting-at-all"&gt;Simple scripting— or no scripting at all&lt;/h4&gt;
&lt;p&gt;Protocol-level tools require in-depth knowledge about how an application works, what format it expects requests to be in, and how it responds. On the browser-level, you don&amp;rsquo;t need to know any of that. When scripting a login process, for instance, you just need to tell the script to type a username and password in the right fields and then click Log In. The script doesn&amp;rsquo;t need to know that the form submits an encrypted request using the Auth0 API (something you&amp;rsquo;d need to know for a protocol-level script).&lt;/p&gt;
&lt;p&gt;In some cases, you might be able to get away with using something like our &lt;a href="https://flood.io/blog/record-load-tests-in-flood-element-using-qtest-explorer"&gt;qTest Explorer plugin&lt;/a&gt; to record a business process, generating a script without any scripting at all. Even when you have to write or modify the script, though, it&amp;rsquo;s a lot less intimidating than most protocol-level scripts.&lt;/p&gt;
&lt;p&gt;They&amp;rsquo;re also easier to troubleshoot. In addition to opening a real browser instance on your computer when you run a script locally, Element can also display this information on the console (shown here on iTerm):&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200423-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;em&gt;Screenshots upon execution on Element using iTerm&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;‍This allows you to understand what&amp;rsquo;s going on in the script and in the application, letting you detect bottlenecks faster.&lt;/p&gt;
&lt;h4 id="reduced-test-complexity"&gt;Reduced test complexity&lt;/h4&gt;
&lt;p&gt;The streamlined requirements for scripting lead to a straightforward test. There&amp;rsquo;s no chance of getting request parameters or values wrong.&lt;/p&gt;
&lt;h4 id="ability-to-test-entire-stack-from-the-user-perspective"&gt;Ability to test entire stack from the user perspective&lt;/h4&gt;
&lt;p&gt;Unlike testing APIs, you don&amp;rsquo;t need to decide which server you want to hit or make sure you have the appropriate requests to hit all the servers. A browser-level test script interacts with page elements like a real user would, so all underlying application servers are tested. Pair this with &lt;a href="https://guides.flood.io/infrastructure/demand-infrastructure/advantages-of-testing-in-the-cloud"&gt;cloud-based infrastructure on Flood&lt;/a&gt;, and you&amp;rsquo;ve got a compact package for testing your application.&lt;/p&gt;
&lt;h4 id="capable-of-testing-any-user-behavior"&gt;Capable of testing any user behavior&lt;/h4&gt;
&lt;p&gt;Protocol-level load test tools struggle with some types of applications, such as single-page apps (SPAs), where a lot of the processing is done on the client side. Browser-level load testing tools shine here, because scripted interactions for these apps are no different for SPAs than other web apps.&lt;/p&gt;
&lt;h4 id="record-network-and-user-interaction-times-for-front-end-optimization"&gt;Record network and user interaction times for front-end optimization&lt;/h4&gt;
&lt;p&gt;Browser-level tools show you response times from the user&amp;rsquo;s perspective: how long after a user clicks the log in button does the user see his or her account balance? This metric is a practical one that may differ wildly from the traditional response times that a protocol-level tool reports. Measuring real user experience is a great value add for your test.&lt;/p&gt;
&lt;h4 id="easier-to-maintain"&gt;Easier to maintain&lt;/h4&gt;
&lt;p&gt;Lower script complexity means that a browser-based test script is more resilient to changes in the codebase. A change in the underlying requests sent will not require a change in the test script, making it perfect for regression testing.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also easier to pass on to other members of the team due to high readability. Here&amp;rsquo;s an example of how to select a value from a dropdown menu in Element:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;selectByValue&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;#challenger_age&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;34&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s easy to see that the script is looking for an element with the ID &amp;ldquo;challenger_age&amp;rdquo; and selecting the value &amp;ldquo;34&amp;rdquo;. This step could correspond to dozens of requests that need to be scripted if testing on the protocol level, which makes those scripts harder to understand without a proper handover.&lt;/p&gt;
&lt;h3 id="cons"&gt;Cons&lt;/h3&gt;
&lt;p&gt;Browser-based load testing tools have a higher CPU and memory footprint than protocol-based tools. Test scripts in JMeter and Gatling send messages to and record responses from a server without really needing to parse responses. By contrast, browser-based tools parse the server response in order to access the Domain Object Model (DOM) elements on the page.&lt;/p&gt;
&lt;p&gt;Using real browsers might be closer to the real user experience, but it also takes its toll on node resources. It is possible to run in headless mode, where browsers are started &amp;ldquo;invisibly&amp;rdquo; without actually graphically rendering them. However, even then, a browser-level tool can run fewer concurrent users on a node than a protocol-level tool.&lt;/p&gt;
&lt;h2 id="best-tools-and-applications-for-browser-based-load-testing"&gt;Best tools and applications for browser-based load testing&lt;/h2&gt;
&lt;p&gt;While other commercial tools exist for this, we&amp;rsquo;re partial to open source tools at Flood.&lt;/p&gt;
&lt;h3 id="selenium"&gt;Selenium&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Selenium load testing is appealing because Selenium is already well-known for test automation and functional testing, and a lot of companies already have full test suites in Selenium. The possibility of reusing those resources and just running them at scale as load tests is, by far, the most compelling reason to use Selenium.&lt;/p&gt;
&lt;h3 id="puppeteer"&gt;Puppeteer&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Google&amp;rsquo;s just getting started with Puppeteer, and the amount of metrics it exposes is exciting: it seems like anything in Chrome Developer Tools can be accessed by Puppeteer. Imagine running a load test on ONE tool that gives you statistics about back-end performance (response times, the effect of bandwidth restrictions, resources returning errors) AND front-end performance (client-side script console logs, render times, time to first paint, etc). It&amp;rsquo;s hard to imagine a future where this ISN&amp;rsquo;T a valuable tool in the performance arsenal.&lt;/p&gt;
&lt;p&gt;Under Puppeteer, of course, is &lt;a href="https://element.flood.io/"&gt;Element&lt;/a&gt;— our load-flavored version of Puppeteer.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200423-06.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="is-protocol-based-load-testing-dead"&gt;Is protocol-based load testing dead?&lt;/h2&gt;
&lt;p&gt;No. Testing on the protocol-level may have its drawbacks, but it&amp;rsquo;s popular for a reason. If you&amp;rsquo;re testing mobile apps or API endpoints, protocol-level testing tools allow you to focus on hitting what you want to test and only what you want to test. Sometimes you don&amp;rsquo;t want to test the whole stack. It really depends on your test scenarios.&lt;/p&gt;
&lt;p&gt;Plus, protocol-level tools tend to be really resource efficient. We&amp;rsquo;ve been able to easily run about 1000 users per Flood node with JMeter and Gatling, easily outstripping browser-level tools. It makes sense, since JMeter and Gatling don&amp;rsquo;t need to start browser instances to generate load.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s significantly cheaper to generate very high loads with protocol-level tools. This efficiency makes protocol-level tools a good choice for high concurrency load testing and especially stress testing.&lt;/p&gt;
&lt;h2 id="what-are-we-doing-to-support-blu"&gt;What are we doing to support BLU?&lt;/h2&gt;
&lt;p&gt;Clearly, our usage metrics show that browser-based load testing is on the rise, and we&amp;rsquo;re planning to ramp up our offerings in this area while also maintaining support for protocol-level tools. Here&amp;rsquo;s what you can look forward to from us:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New releases
&lt;ul&gt;
&lt;li&gt;We just released &lt;a href="https://element.flood.io/docs/1.0/install"&gt;version 1.2.3 of Element&lt;/a&gt; a few weeks ago, which addresses some bugs and improve stability for certain actions.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Dedicated Element team
&lt;ul&gt;
&lt;li&gt;We&amp;rsquo;ve put together a team of developers who will be focusing on improving Element exclusively. Despite Element being an open source tool, we&amp;rsquo;re putting our own resources behind it to improve it faster.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Partnering with consulting services
&lt;ul&gt;
&lt;li&gt;It can be difficult to get started on a new tool, and Element is no exception. While we provide a load testing platform to run Element scripts, some companies want help to create the scripts in the first place. To this end, we&amp;rsquo;ve partnered with expert consultants who have already been using Element with great success: &lt;a href="https://foulkconsulting.com/"&gt;Foulk Consulting&lt;/a&gt; and &lt;a href="https://www.planittesting.com/"&gt;Planit Testing&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;When choosing a performance testing tool, it&amp;rsquo;s important to consider the advantages and disadvantages of protocol-level and browser-level testing tools. We think both types of tools deserve to be in a solid performance and load testing strategy. They can also be used in tandem in a hybrid load testing approach, improving overall application performance and scalability.&lt;/p&gt;
&lt;p&gt;In 2018, we predicted that testing web-based applications with real browsers would increase in popularity, so we&amp;rsquo;re thrilled to see our theory validated in 2020. Browser-based load testing is increasing in usage, and our open source tool, Element, is leading the charge. It&amp;rsquo;s exciting to be at the forefront of this revolution, and we intend to increase support for load testing with real browsers even more this year.&lt;/p&gt;</description></item><item><title>Ask a Flooder 12: Puppeteer vs Selenium: which one is better for load testing?</title><link>https://nicolevanderhoeven.com/blog/20200421-aaf12/</link><pubDate>Tue, 21 Apr 2020 17:36:28 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200421-aaf12/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-12-puppeteer-vs-selenium-which-one-is-better-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-12-puppeteer-vs-selenium-which-one-is-better-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;When it comes to software testing, the debate of Puppeteer vs Selenium is a hot one. Nicole tackles it here to determine which one is better for load testing in particular. Spoiler: The answer is still &amp;ldquo;it depends&amp;rdquo;.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/K61W7ivhsuE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Or catch the audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/76u25lI7sFx5SwgbsFLU5Z" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here again, back for another Ask a Flooder, and today, the question is: &amp;ldquo;Puppeteer vs. Selenium: which one is better for load testing?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re actually getting this quite a bit now as Puppeteer grows in popularity, but first, let&amp;rsquo;s discuss the similarities. They&amp;rsquo;re tools that you can use to drive browsers. The work by identifying and interacting with elements on a website in the same way that a user would. They are also both open-source, and both can be used for load testing. This is a great strategy because instead of writing tests for an automation suite and then tests for load testing, you can just write the one test suite and re-use it, so it saves a lot of resources in the end. To answer this question, I&amp;rsquo;m going to focus on load testing because that&amp;rsquo;s what my experience is in.&lt;/p&gt;
&lt;h2 id="difference-between-selenium-and-puppeteer"&gt;Difference between Selenium and Puppeteer&lt;/h2&gt;
&lt;h3 id="pros-and-cons-of-selenium"&gt;Pros and cons of Selenium&lt;/h3&gt;
&lt;p&gt;Now for the difference. Selenium supports more browsers than does Puppeteer. It supports Chrome, Firefox, IE, Safari, and Opera, so there are a lot more options to choose from depending on your application.&lt;/p&gt;
&lt;p&gt;Selenium is also what I would call automation-first. It was built with automation in mind, which means it&amp;rsquo;s very good at that. It&amp;rsquo;s very robust, and if you have a complicated test scenario, Selenium is an excellent choice.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also been around for much longer than Puppeteer, which is important because that means it&amp;rsquo;s had more time to build up a community. There are way more resources and tutorials for Selenium than for Puppeteer.&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s also, unfortunately, very resource-intensive. That&amp;rsquo;s not something that you would typically care too much about from a test automation perspective, but when you&amp;rsquo;re running thousands of users on the cloud, it IS important to keep in mind that Selenium, just because of how it&amp;rsquo;s built and its complexity, can only run about five users per node. We&amp;rsquo;ve found that out at Flood, after baselining specifically an AWS m5.xlarge instance. So you can look at the specs of that and compare it with the machines that you&amp;rsquo;re wanting to run Selenium on, to see how that would equate for you.&lt;/p&gt;
&lt;h3 id="pros-and-cons-of-puppeteer"&gt;Pros and cons of Puppeteer&lt;/h3&gt;
&lt;p&gt;Puppeteer is a NodeJS library developed by Google, which means it plays very well with Chrome. There are a whole lot of things that you have access to with Puppeteer, and if you&amp;rsquo;re using it with Chrome, pretty much anything in Chrome, including rendering times, you can see and access with a Puppeteer script. So that&amp;rsquo;s a huge advantage.&lt;/p&gt;
&lt;p&gt;Unfortunately, that also means it supports fewer browsers. Obviously, it supports Chrome very well, and they recently came out with support for Firefox, although they do have plans to incorporate support for more browsers in the future.&lt;/p&gt;
&lt;p&gt;One of Puppeteer&amp;rsquo;s advantages is that we at Flood actually created a tool on top of Puppeteer. It&amp;rsquo;s also open-source. It&amp;rsquo;s called Flood Element, and Element is built to be performance-first because obviously, that&amp;rsquo;s what we had in mind when we were building it. It takes everything that&amp;rsquo;s good about Puppeteer and makes it really easy to set parameters that you normally would expect to need for load testing, like users and ramp-up.&lt;/p&gt;
&lt;p&gt;This also means that it&amp;rsquo;s way less resource-intensive. I said that with Selenium, you can run up to five users on an AWS m5.xlarge instance, and for the same instance type, you can run, from our experiments, anywhere from 30-50 Element scripts/users. That is a huge saving when you&amp;rsquo;re running a really large-scale test.&lt;/p&gt;
&lt;h2 id="should-you-choose-selenium-or-puppeteer-for-load-testing"&gt;Should you choose Selenium or Puppeteer for load testing?&lt;/h2&gt;
&lt;p&gt;I would say that if you already have a large Selenium automation suite, if you have a complex test scenario, or if you aren&amp;rsquo;t running that many users for your load test, then Selenium is a great choice. If you ARE running thousands of users, though, and resource efficiency, and therefore cost efficiency, is really important to you, then choose Element.&lt;/p&gt;
&lt;p&gt;My advice is always to try both. If you have the time, do a proof of concept with both of them. That way, your whole team can better understand what the pros and cons are for each one and decide which one is best going forward. Or maybe you don&amp;rsquo;t even decide on one. At Flood, we support both of them at the same price, so it depends on what you prefer.&lt;/p&gt;
&lt;p&gt;Until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 11: What are the best JMeter plugins?</title><link>https://nicolevanderhoeven.com/blog/20200414-aaf11/</link><pubDate>Tue, 14 Apr 2020 19:47:53 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200414-aaf11/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-11-what-are-the-best-jmeter-plugins"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-11-what-are-the-best-jmeter-plugins"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this video, I talk about how to install the JMeter Plugin Manager as well as other plugins, what the best JMeter plugins are, and why you need them. JMeter is an open-source load testing tool that is already robust, but there are some fantastic plugins that have been developed for it that you might want to use in your next load test.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/eYyLoH-FQrk?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Audio version here:&lt;/p&gt;
&lt;iframe src="https://open.spotify.com/embed-podcast/episode/36GUgvf17bRwmJxg8CNkvy" width="100%" height="232" frameborder="0" allowtransparency="true" allow="encrypted-media"&gt;&lt;/iframe&gt;
&lt;p&gt;Hi everyone, Nicole here, back again for another Ask a Flooder, and I hope everybody is staying alert, not anxious, during these crazy times. In today&amp;rsquo;s Ask a Flooder, our customer asks: &amp;ldquo;What are the best JMeter plugins?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="what-is-a-jmeter-plugin"&gt;What is a JMeter plugin?&lt;/h2&gt;
&lt;p&gt;So first, I want to talk about what a JMeter plugin is and how you can actually install one. Apache JMeter is a really great, robust load testing that is one of my personal favorites. There are still some things that could be done better or could be extended, and the great thing about being an open-source tool is that anybody, pretty much, can just jump in and develop these plugins for JMeter to extend functionality, so that it supports more protocols or to customize load profiles in a way that is easier. We already have &lt;a href="https://flood.io/blog/jmeter-plugins-the-top-10-plugins-and-how-they-help"&gt;a blog post on this&lt;/a&gt;, and I will leave a link to that article as well in the description because it goes into a lot more detail. However, I still want to give you my personal top 3 JMeter plugins.&lt;/p&gt;
&lt;h2 id="how-do-you-install-a-jmeter-plugin"&gt;How do you install a JMeter plugin?&lt;/h2&gt;
&lt;p&gt;You can install a plugin for JMeter in two ways.&lt;/p&gt;
&lt;p&gt;One is to download it from &lt;a href="https://jmeter-plugins.org/"&gt;JMeter Plugins&lt;/a&gt;, which I will give you a link to, and then you paste that into either the lib — it&amp;rsquo;s usually in the lib folder, but it could be in the ext (extensions) folder. Each plugin is going to differ as to what you need to copy into what folder, but that&amp;rsquo;s why I prefer the second method, which is the &lt;a href="https://jmeter-plugins.org/wiki/PluginsManager/"&gt;Plugin Manager&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The Plugin Manager is a plugin itself, so you will initially need to do that copy and pasting of the jar file. Once you have the JMeter Plugin Manager installed, downloading and installing a plugin is as simple as choosing which ones you want and then clicking install. JMeter restarts, and that&amp;rsquo;s pretty much it. So I do recommend that the Plugin Manager be the first plugin that you install. But that&amp;rsquo;s still not my top 3 favorite - that&amp;rsquo;s just an optional step.&lt;/p&gt;
&lt;h2 id="what-are-the-top-3-jmeter-plugins"&gt;What are the top 3 JMeter plugins?&lt;/h2&gt;
&lt;h3 id="custom-thread-groups"&gt;Custom Thread Groups&lt;/h3&gt;
&lt;p&gt;Now for the actual plugins. My #1 favorite is the Custom Thread Groups. See, with JMeter, you get the standard default thread group, and all that does is it asks you how many users you want to run, how many loops, the duration, and the ramp-up. That&amp;rsquo;s it. So that&amp;rsquo;s good for a lot of uses, but it doesn&amp;rsquo;t really help you in cases where maybe you want to plan a spike test, and you want to make sure that all the users have fully ramped up and gotten to a certain point, and then all hit the server at once. Or maybe you want to do a step load. Previously I&amp;rsquo;ve discussed stress testing and how a step load can be useful for that. In that case, the Thread Group doesn&amp;rsquo;t quite cut it because it only ramps up a user, and then it continues at the same level of load for the duration of the test.&lt;/p&gt;
&lt;p&gt;So, if you want any sort of variation in the middle (increasing users or decreasing), then you&amp;rsquo;re going to want something else.The Custom Thread Groups plugin has a lot of different types of thread groups. My favorite is the Ultimate One because you can probably do almost anything on that one. It also has the Stepping, Concurrency, Arrivals, and Free-Form Arrivals, so you have quite a few options.&lt;/p&gt;
&lt;h3 id="throughput-shaping-timer"&gt;Throughput Shaping Timer&lt;/h3&gt;
&lt;p&gt;Plugin #2 is the Throughput Shaping Timer. I love it because not a lot of load testing tools, even the proprietary ones, actually have this. This is really handy when you have a project where you&amp;rsquo;re given a requirement that isn&amp;rsquo;t in terms of the number of users; it&amp;rsquo;s in terms of hits per second, or requests per second, or something to do with the actual throughput of the test.&lt;/p&gt;
&lt;p&gt;The problem with that is that the throughput tends to change, so you can&amp;rsquo;t actually take as a given that it&amp;rsquo;ll remain constant for the duration of the test. Things like response time or latency are going to affect that throughput. For instance, when you have one user or one thread that&amp;rsquo;s running, and it sends a request and receives the response back in one second, you can&amp;rsquo;t necessarily say that that&amp;rsquo;s going to be the same when there are a thousand threads doing the same thing. The server&amp;rsquo;s under more load, so maybe it&amp;rsquo;ll take five seconds instead of one second— but that&amp;rsquo;s already changed your throughput. Before, one thread was doing one request per second, and now it&amp;rsquo;s doing one request every five seconds.&lt;/p&gt;
&lt;p&gt;So it can get a little complicated, and the Throughput Shaping Timer is one of my favorites because it promises to solve all that. The Throughput Shaping Timer dynamically changes the think time, so at the beginning of a test, for instance, when there are no response time issues and requests are being returned really quickly, it might increase the think time so that it slows down your load test. So you&amp;rsquo;re not going over that throughput that you wanted to maintain. And then later on in the test, when all the users are ramped up, then it&amp;rsquo;ll decrease the think time that it uses. So it&amp;rsquo;s great because you just have this consistent throughput throughout your test. It&amp;rsquo;s a really intelligent way to test.&lt;/p&gt;
&lt;p&gt;I do want to say, though, that you do also want to play around with this a bit and make sure you understand how this works. One page could have several requests in it, and you&amp;rsquo;ll want to take that into consideration when you&amp;rsquo;re choosing what to set in that timer.&lt;/p&gt;
&lt;h3 id="http2-request-sampler"&gt;HTTP/2 Request Sampler&lt;/h3&gt;
&lt;p&gt;My #3 is the HTTP/2 Sampler. If you don&amp;rsquo;t know what HTTP/2 is, it&amp;rsquo;s an upgraded or next-generation protocol to the normal HTTP that we already use. The HTTP/2 protocol is supposed to be faster and more efficient, so more and more web apps are switching to it because of that.&lt;/p&gt;
&lt;p&gt;The problem is that JMeter&amp;rsquo;s HTTP request sampler is only really for HTTP sites, so the HTTP/2 sampler is an upgraded version of the HTTP sampler. It&amp;rsquo;s really easy to use. The experience is pretty much going to be the same for you, but in the background, it uses the faster HTTP/2 protocol rather than the slower one.&lt;/p&gt;
&lt;p&gt;My colleague, Jason Rizio, actually &lt;a href="https://flood.io/blog/jmeter-tutorial-http2-test"&gt;wrote a whole blog post about this&lt;/a&gt;, so if you want to learn more, I will put a link in the description.&lt;/p&gt;
&lt;p&gt;I hope that answered your question, and until next time, happy flooding!&lt;/p&gt;</description></item><item><title>Introducing Flood Agent: standalone infrastructure for load testing</title><link>https://nicolevanderhoeven.com/blog/20200407-introducing-flood-agent/</link><pubDate>Tue, 07 Apr 2020 19:03:42 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200407-introducing-flood-agent/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/introducing-flood-agent-standalone-infrastructure-for-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Working from home during this pandemic and wondering how to start load tests from the office? Today, we&amp;rsquo;re officially introducing Flood Agent, a way to turn your own physical or virtual machines into load generators that you can control from anywhere with an internet connection.&lt;/p&gt;
&lt;h2 id="tldr"&gt;TL;DR:&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Installing Flood Agent on a machine lets you start load tests on it remotely from Flood—even if it&amp;rsquo;s within a corporate VPN.&lt;/li&gt;
&lt;li&gt;Flood Agent is a simple binary that you can install on Linux, macOS, and Windows machines.&lt;/li&gt;
&lt;li&gt;Once you&amp;rsquo;ve installed Flood Agent, your machines show up on the Flood web app to use as load generators or grids.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="boldly-going-where-no-one-has-gone-before"&gt;Boldly going where no one has gone before&lt;/h2&gt;
&lt;p&gt;Load testing within your company&amp;rsquo;s VPN and trying to coordinate it from home is like being on a maintenance pod trying to contact your starship, but a Mazarite ship is broadcasting a jamming signal, so comms are down. That Mazarite ship is your company&amp;rsquo;s firewall, and it can make testing difficult.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The easiest way around this is to provision load generators in the cloud. However, because your application servers are still behind a firewall, you&amp;rsquo;d need to convince IT security to &lt;a href="https://guides.flood.io/test-execution/infrastructure/static-ip-addresses#hosted-grids"&gt;whitelist the IP addresses&lt;/a&gt; of the load generators. Depending on how tight security policies are, this may not be an option even in this new world of remote working.&lt;/p&gt;
&lt;p&gt;Flood Agent is a way to start load tests on Flood from the load generators you already have. It&amp;rsquo;s a cross-platform agent that you can install on your regular load generators, allowing you to control them on Flood.&lt;/p&gt;
&lt;p&gt;‍‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Flood Agent is kind of like the &lt;a href="https://en.wikipedia.org/wiki/Borg#Borg_Collective"&gt;Borg Collective&lt;/a&gt;. Each machine that you install Flood Agent on is assimilated into the Borg. A hive mind (you, on the Flood site) controls all Borgs, coordinating test execution with robotic efficiency.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://media.giphy.com/media/J6P7vFEQ6PcgE/giphy.gif" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Check out this video to follow along as I walk you through the process of setting up Flood Agent, or you can keep reading for the text version.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/6VFn96aKSU8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
‍&lt;/p&gt;
&lt;h2 id="installing-and-configuring-flood-agent"&gt;Installing and configuring Flood Agent&lt;/h2&gt;
&lt;p&gt;Flood Agent is a free binary, and it runs on Linux, Mac, or Windows machines. You can &lt;a href="https://github.com/flood-io/flood-agent/releases/latest"&gt;download the appropriate version&lt;/a&gt; for your operating system and then follow the installation instructions here for more information:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-linux"&gt;Getting started on Linux&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-macos"&gt;Getting started on macOS&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-on-windows"&gt;Getting started on Windows&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After installing Flood Agent, you can configure it according to how you want to use it. Start Flood Agent in your terminal and use the configure functionality. Here&amp;rsquo;s what that command looks like on macOS, but you can follow the links above for other operating systems:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./flood-agent configure
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="linking-your-flood-account"&gt;Linking your Flood account&lt;/h3&gt;
&lt;p&gt;The command above yields a prompt for a token like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This token allows Flood to run load tests on the load generator that you&amp;rsquo;ve installed Flood Agent in. To get the token, go to the &lt;a href="https://app.flood.io/account/api"&gt;API Access page&lt;/a&gt; on your Flood account (&lt;a href="https://app.flood.io/sign-up"&gt;you already have one, don&amp;rsquo;t you?&lt;/a&gt;) and click REVEAL token.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-04.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;You should see a string of characters like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-05.jpg" alt="" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;p&gt;Copy your token (anything after the = sign) and paste it into the Flood Agent terminal window.&lt;/p&gt;
&lt;h3 id="choosing-load-testing-tools"&gt;Choosing load testing tools&lt;/h3&gt;
&lt;p&gt;Next, you can choose which tools you&amp;rsquo;d like to set up and which version of those tools Flood Agent uses to run your tests.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Starting with JMeter, Flood Agent asks you which of the tools you&amp;rsquo;d like to configure. You can choose to set up your tools at the beginning so that you don&amp;rsquo;t have to set them up again, or you can go back to this configuration wizard at any point to add another tool. Either way, you need to provide the tools that you select in one of two ways: via a Docker image supplied by Flood, or via a &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/getting-started-local-jmeter-and-gatling"&gt;local installation&lt;/a&gt; that you already have.&lt;/p&gt;
&lt;p&gt;For this example, I chose to configure JMeter and to use a local installation. Local installations give you the most flexibility because you can use the version of the tool that you prefer, along with any special plugins. However, if you already have Docker installed or don&amp;rsquo;t want to manually install JMeter separately, you can also use our Docker image for JMeter.&lt;/p&gt;
&lt;p&gt;Selecting a local installation prompts you to provide the location of that directory:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;For JMeter, this looks something like &lt;code&gt;/Users/nvanderhoeven/jmeter/apache-jmeter-5.1.1.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;After you enter this file path, Flood Agent checks to make sure the directory is valid. You can also set the configuration for other tools in this dialog.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200407-08.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;After you finish the configuration, the wizard writes to a config.yaml file in your Flood Agent directory. You can also edit this configuration file directly in the future if you prefer.&lt;/p&gt;
&lt;h2 id="verifying-flood-agent-configuration"&gt;Verifying Flood Agent configuration&lt;/h2&gt;
&lt;p&gt;To run a final check on whether Flood Agent has been installed correctly, type &lt;code&gt;./flood-agent check&lt;/code&gt;. You should see a summary of the configuration options you selected as well as some connectivity and validity checks, like this:&lt;/p&gt;
&lt;p&gt;‍
&lt;img src="https://nicolevanderhoeven.com/assets/20200407-09.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;These green check marks mean you&amp;rsquo;re good to go! If you&amp;rsquo;re running Flood Agent from within a corporate network, though, you may see some errors here.&lt;/p&gt;
&lt;h2 id="troubleshooting-network-connectivity-within-a-corporate-network"&gt;Troubleshooting network connectivity within a corporate network&lt;/h2&gt;
&lt;p&gt;If your company already has a web proxy, check out &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/deployment/integrating-with-a-web-proxy"&gt;our guide on running floods through this proxy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Please ensure that the load generator that you&amp;rsquo;ve installed Flood Agent on has access to the following endpoints:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://drain.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://beacon.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://vault.flood.io&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://flood-archives.s3-accelerate.amazonaws.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://logs.us-east-1.amazonaws.com&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://sns&amp;gt;.*.amazonaws.com
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&amp;lt;https://sqs&amp;gt;.*.amazonaws.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You may need to request these from your IT department.&lt;/p&gt;
&lt;p&gt;If you get stuck, please contact us at &lt;a href="mailto:support@flood.io"&gt;support@flood.io&lt;/a&gt;. We&amp;rsquo;d love to go over your specific situation and get you up and running.&lt;/p&gt;
&lt;p&gt;Once Flood Agent returns a successful check, you can start up your own grid!&lt;/p&gt;
&lt;h2 id="turning-your-machine-into-a-flood-grid"&gt;Turning your machine into a Flood grid&lt;/h2&gt;
&lt;p&gt;A grid, in Flood terminology, is a group of machines to be used for load generation. To make your machine a grid, run this command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;./flood-agent --grid askaflooder
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where &lt;code&gt;askaflooder&lt;/code&gt; is the name of your grid.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-10.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Once you see those [agent] ready and awaiting next job messages, you&amp;rsquo;re ready to run your test!&lt;/p&gt;
&lt;h2 id="running-a-load-test-on-your-own-infrastructure"&gt;Running a load test on your own infrastructure&lt;/h2&gt;
&lt;p&gt;Log into your account on Flood, if you aren&amp;rsquo;t already, and &lt;a href="https://guides.flood.io/overview-of-flood/scripting-your-load-test#creating-a-stream"&gt;create a new stream&lt;/a&gt; like you normally would, uploading your load testing script and data files. When &lt;a href="https://guides.flood.io/overview-of-flood/launching-your-test"&gt;launching your test&lt;/a&gt;, though, select the option for Hosted infrastructure and then choose the grid with Flood Agent running on it.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-11.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Go ahead and launch your test. Congratulations, you&amp;rsquo;re now set up to run a load test on your on-premise load generators!&lt;/p&gt;
&lt;h2 id="giving-it-a-go"&gt;Giving it a go&lt;/h2&gt;
&lt;p&gt;Flood Agent is a free download, so you&amp;rsquo;ll only need to pay when you run load tests on Flood. However, we also have a free tier— perfect for a proof-of-concept while you&amp;rsquo;re working from home.&lt;/p&gt;
&lt;p&gt;If you have any questions about Flood Agent, check out &lt;a href="https://guides.flood.io/infrastructure/standalone-infrastructure/flood-agent"&gt;our documentation&lt;/a&gt; or &lt;a href="mailto:support@flood.io"&gt;email us&lt;/a&gt;. We&amp;rsquo;d be happy to get you started!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/flood-io/flood-agent/releases"&gt;Download Flood Agent for free here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200407-12.gif" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;</description></item><item><title>Ask a Flooder 10: What is the difference between load testing and stress testing?</title><link>https://nicolevanderhoeven.com/blog/20200406-aaf10/</link><pubDate>Mon, 06 Apr 2020 20:26:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200406-aaf10/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-10-what-is-the-difference-between-load-testing-and-stress-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-10-what-is-the-difference-between-load-testing-and-stress-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What&amp;rsquo;s the difference between load testing and stress testing? When should you choose to run a load test on your application, and when is a stress test more appropriate? Well, it&amp;rsquo;s all in the intention.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/igP2q__zMcc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Hi everyone, Nicole here again, back with another Ask a Flooder, and this time the question is:&lt;/p&gt;
&lt;h2 id="what-is-the-difference-between-load-testing-and-stress-testing"&gt;What is the difference between load testing and stress testing?&lt;/h2&gt;
&lt;p&gt;Okay, again, this is a matter of semantics, but I think the difference is in the intention. Load testing and stress testing are both types of back-end performance testing, and I did also make a video on it that I&amp;rsquo;ll link in the description down below.&lt;/p&gt;
&lt;h3 id="load-testing-is-about-seeing-how-your-server-reacts-to-finite-load"&gt;Load testing is about seeing how your server reacts to finite load&lt;/h3&gt;
&lt;p&gt;Now, with load testing, you usually have to start with a specific idea of the load profile that you want to test. You get to this number by looking through your Google Analytics or other analytics on your site to see what load you need to test at, and then the intention is to see how your server responds to that load. So the load is fixed: you know WHAT you want to test, and you just want to see how the server reacts to it. So it&amp;rsquo;s more finite in scope. In general, it&amp;rsquo;s also more about how your server reacts to normal or expected load, whether that&amp;rsquo;s now or in the future.&lt;/p&gt;
&lt;h3 id="stress-testing-explores-your-applications-upper-limits"&gt;Stress testing explores your application&amp;rsquo;s upper limits&lt;/h3&gt;
&lt;p&gt;Stress testing, on the other hand, is a little bit more open-ended and a little bit more destructive. So instead of starting with how much load you want to put on [your server], in stress testing, what you generally do is you increase the load. You usually use a step load profile: so you start a certain number of users, you wait maybe 30 minutes, and then you increase it again. And you end up with this staircase kind of load profile. What you&amp;rsquo;re doing there is you just let it increase until your server fails because the intention of stress testing is to get your server to fail. And, once it fails, does it fail gracefully? Does it show an error message? These are really things that test the upper limits of your server, and that&amp;rsquo;s what stress testing really is.&lt;/p&gt;
&lt;h3 id="they-can-be-interchangeable"&gt;They can be interchangeable&lt;/h3&gt;
&lt;p&gt;At Flood, we tend to use the word &amp;ldquo;load&amp;rdquo; testing to refer to both kinds of testing because both of them entail applying load on your application server. It&amp;rsquo;s not really that important to distinguish between one or another; what&amp;rsquo;s [important] is that your team uses the same definition so that when YOU say &amp;ldquo;load testing,&amp;rdquo; they know what you mean.&lt;/p&gt;
&lt;p&gt;Until the next time, happy flooding!&lt;/p&gt;
&lt;h2 id="resources"&gt;Resources&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://nicolevanderhoeven.com/blog/20200324-aaf07"&gt;Video on performance testing vs load testing&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Real-life stress testing in action: &lt;a href="https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing"&gt;Robinhood app failure&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 09: What are the best tools for load testing?</title><link>https://nicolevanderhoeven.com/blog/20200331-aaf09/</link><pubDate>Tue, 31 Mar 2020 20:35:36 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200331-aaf09/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-09-what-are-the-best-tools-for-load-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-09-what-are-the-best-tools-for-load-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of our most commonly-asked questions is: &amp;ldquo;What are the best tools for load testing?&amp;rdquo; The answer will depend on a few things: your reason for load testing, the application you want to test, what kind of load testing you want to carry out, your team&amp;rsquo;s experience with scripting, and how many virtual users you want to run.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: In this video, I say that traditional load testing tools can&amp;rsquo;t simulate requests that are triggered by interactions on the client-side. This isn&amp;rsquo;t technically true: if you know what the requests are, you can build those requests manually on a protocol-level tool (like JMeter or Gatling). However, this takes more work compared to browser-level tools that just do this natively.&lt;/em&gt;
‍
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/I5Wo6x2OoZU?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi everyone, Nicole back again with another Ask a Flooder, and this time I&amp;rsquo;m tackling one of the questions we get asked A LOT, which is:&lt;/p&gt;
&lt;h2 id="what-are-the-best-tools-for-load-testing"&gt;What are the best tools for load testing?&lt;/h2&gt;
&lt;h3 id="why-open-source-load-testing-tools-are-awesome"&gt;Why open-source load testing tools are awesome&lt;/h3&gt;
&lt;p&gt;Now, I want to preface this by saying that we really love open-source tools here at Flood, because 1) they&amp;rsquo;re really pretty full-fledged these days. You don&amp;rsquo;t have to make any compromises on features, and, in fact, some of these open-source tools have more features than some newer load testing tools just because they&amp;rsquo;ve been out longer. And secondly, they have large communities. Because they&amp;rsquo;re open-source, lots of people are using it, and lots of people are developing for it. So there are lots of plugins normally, and they support any kind of protocol that you can think of. And lastly, cost. It&amp;rsquo;s hard not to mention cost because it can be a really important factor depending on the budget of your project. And if you&amp;rsquo;re starting out as a load tester, I think that it might even be the best way to start with load testing, because you can take that knowledge with you and apply it to other projects and other companies regardless of the budget that they have.&lt;/p&gt;
&lt;h3 id="questions-to-ask-yourself-in-choosing-a-load-testing-tool"&gt;Questions to ask yourself in choosing a load testing tool&lt;/h3&gt;
&lt;h4 id="why-are-you-doing-load-testing"&gt;Why are you doing load testing?&lt;/h4&gt;
&lt;p&gt;I always advocate starting with WHY. Why are you actually load testing? Is there a particular production defect that you noticed that you&amp;rsquo;re trying to solve? Is there already a problem, or are you just preparing to launch? These are things that are going to inform the type of tool that you use because you might want to make sure that that tool supports the protocols that you need.&lt;/p&gt;
&lt;h4 id="what-are-you-load-testing"&gt;What are you load testing?&lt;/h4&gt;
&lt;p&gt;Secondly, what type of app are you testing? Because if you have a single-page app, where your end-user is interacting with the page and client-side scripts are running to make requests to servers, then that&amp;rsquo;s something that most traditional load testing tools aren&amp;rsquo;t going to be able to do.&lt;/p&gt;
&lt;p&gt;There are two general types of load testing tools: there&amp;rsquo;s browser-based, and there&amp;rsquo;s protocol-based. I&amp;rsquo;ll leave a link in the description talking about the differences between the two, but in general, if you want to go for browser-level testing, I would suggest Selenium and Element. Now, they&amp;rsquo;re both very good options. Selenium is probably the more robust in terms of automation of the two, but Element is better one in terms of efficiency because it was built with performance in mind. So Selenium&amp;rsquo;s automation-first and Element is really performance-first.&lt;/p&gt;
&lt;p&gt;Now, for protocol-level tools, you can&amp;rsquo;t go wrong with either JMeter or Gatling.&lt;/p&gt;
&lt;h4 id="what-experience-does-your-team-have-with-scripting"&gt;What experience does your team have with scripting?&lt;/h4&gt;
&lt;p&gt;Thirdly, what&amp;rsquo;s the level of technical expertise that your team has? I think it&amp;rsquo;s important to be realistic about what your team can do, given the amount of time that they have. So if you have a team that has never done load testing and has never done any scripting before, then I would suggest using our Test Builder or something similar. On Flood, we have a Test Builder that is really just an easy interface that actually runs JMeter under the hood, but it just kind of simplifies JMeter and boils it down to what are the URLs that you want to test. That is a really easy way to get started, and it&amp;rsquo;s also a great [way to run a] proof of concept. If you have some automation testers on your team that are trying to do the load testing, well, maybe you should stick to tools that they already use. So it might be easier for them to get up and running with either Selenium or Element rather than learning a new tool. And if you have developers on your team, you might consider Ruby JMeter rather than the vanilla JMeter because Ruby JMeter is a lot easier to deal with&amp;mdash; because you don&amp;rsquo;t have to deal with the XML files of a JMeter file (a normal JMX script). You can just plan out your load tests in Ruby. Or, Gatling is also a really good option because it allows you to write scripts in Scala. Scala is really really powerful, and you can create an entire framework with Gatling, which is also something to keep in mind.&lt;/p&gt;
&lt;h4 id="how-many-virtual-users-do-you-want-to-run-in-your-load-tests"&gt;How many virtual users do you want to run in your load tests?&lt;/h4&gt;
&lt;p&gt;And lastly, how many users do you want to simulate? Now protocol-level tools are going to really shine here because Element and Selenium both require a higher usage of resources on your load generators just because of the complexities involved in starting a browser instance, whereas protocol-level tools are just super efficient at sending these requests. So I would suggest that if you&amp;rsquo;re talking about thousands of users, I would use the protocol-level tools unless there&amp;rsquo;s a really good reason why that&amp;rsquo;s not going to give you the results that you&amp;rsquo;re looking for. Between JMeter and Gatling&amp;ndash; well, they&amp;rsquo;re both excellent tools, but Gatling has been shown to particularly be good for really high levels of usage. But JMeter is also a good alternative, and you can run thousands of users of JMeter without any problem.&lt;/p&gt;
&lt;h2 id="just-get-started"&gt;Just get started!&lt;/h2&gt;
&lt;p&gt;As always, I&amp;rsquo;d suggest just getting started. Pick whatever tool sounds like it might be the best for you, do a proof of concept on that one, and you can always try the other ones as well. On Flood, we don&amp;rsquo;t restrict you to just using one tool, so you can use one; you can use all four; you can run them at the same time if you want. It all depends on what you need for your testing.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 08: Why is concurrent users an ambiguous measure of throughput?</title><link>https://nicolevanderhoeven.com/blog/20200326-aaf08/</link><pubDate>Thu, 26 Mar 2020 20:41:22 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200326-aaf08/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-08-why-is-concurrent-users-an-ambiguous-measure-of-throughput-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-08-why-is-concurrent-users-an-ambiguous-measure-of-throughput-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;What is the meaning of concurrent users in performance testing? You might have seen concurrent users in JMeter or other tools, but what does it mean and how can you use the term properly?&lt;/p&gt;
&lt;p&gt;&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/uJE2hm50TIw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
‍&lt;/p&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi everyone! Nicole here again for another Ask a Flooder, except this time it&amp;rsquo;s not really a question&amp;ndash; it&amp;rsquo;s just something I want to talk about.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200326-01.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: The &lt;a href="https://twitter.com/flood_io/status/1224284942932332544"&gt;Flood Twitter account&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So I&amp;rsquo;m going to put the tweet up here, but last month I actually tweeted about something that somebody else posted. Netflix actually reported some of their viewership figures, and one thing that they reported was that 76 million households watched their new show, The Witcher, which is a large amount of people. So I posted something about why concurrent users is actually an ambiguous way to measure throughput, and I want to expound a little bit more on that.&lt;/p&gt;
&lt;h2 id="concurrent-users-in-performance-testing---limitations"&gt;&amp;ldquo;Concurrent users&amp;rdquo; in performance testing - limitations&lt;/h2&gt;
&lt;p&gt;In load testing, the number of concurrent users is a pretty standard measure of throughput, and generally, it means the number of users that are accessing an application at any one point in time. And even on Flood, we use it because it&amp;rsquo;s a really good rule of thumb. When we want to get a feel for how big a test is, load testers generally ask, &amp;ldquo;How many users?&amp;rdquo; However, we should be aware, as load testers, that that doesn&amp;rsquo;t always give us the full picture.&lt;/p&gt;
&lt;h3 id="what-type-of-user-is-it"&gt;What type of user is it?&lt;/h3&gt;
&lt;p&gt;For instance, the type of user that it is can really change the traffic. Sometimes mobile browsers will optimize requests so that they send fewer because they realize that mobile networks are slower.&lt;/p&gt;
&lt;h3 id="what-is-the-user-doing"&gt;What is the user doing?&lt;/h3&gt;
&lt;p&gt;Secondly, what is the user doing? Are they browsing on different tabs all the time? Or are they just refreshing the content on the same tab? Because if they&amp;rsquo;re just using the same page and fetching it over and over again, then caching could come into play, so that would create a different load on the system.&lt;/p&gt;
&lt;h3 id="how-long-is-the-user-doing-it"&gt;How long is the user doing it?&lt;/h3&gt;
&lt;p&gt;And thirdly, how long is the user doing it? Are we talking about a sustained load for an hour, or is it a shorter time period, like a spike test of five minutes where all the users just ram a system? There are things like the number of requests per second that you need to take into account, which is affected by the think time and the delays that you set in your script. Perhaps your script has a user that just sends a request, then waits for a minute, and then sends another request. That&amp;rsquo;s very different from a user just sending one request after another as fast as possible.&lt;/p&gt;
&lt;h3 id="when-does-the-user-do-it"&gt;When does the user do it?&lt;/h3&gt;
&lt;p&gt;Lastly, it&amp;rsquo;s also important to take into account the seasonality of the request. When does the user do it? If you have a timesheeting application, for instance, then it might only get traffic on Fridays and a little bit on Monday, so you need to specify, when you report these numbers, whether it&amp;rsquo;s for the peak time period on Friday - you know, around 3 pm or something - or you&amp;rsquo;re reporting on figures from a Wednesday when there really wouldn&amp;rsquo;t be that many people accessing it.&lt;/p&gt;
&lt;p&gt;In the case of Netflix, what they counted as a view was only a two-minute watch time. So if you&amp;rsquo;re one of those people who went into The Witcher and didn&amp;rsquo;t watch past two minutes, that still counted as a view. So the 76 million users is still not completely accurate, because not all of those people would have watched the entire thing.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Concurrent users is a good way in order to get a quick feel of the throughput that a test outputs, but it really needs to be examined in context along with things like requests per second and the network throughput (kbps) in order to get a really good understanding of how much load a test is generating.&lt;/p&gt;
&lt;p&gt;Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 07: What is the difference between performance testing and load testing?</title><link>https://nicolevanderhoeven.com/blog/20200324-aaf07/</link><pubDate>Tue, 24 Mar 2020 20:31:06 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200324-aaf07/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-07-what-is-the-difference-between-performance-testing-and-load-testing-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-07-what-is-the-difference-between-performance-testing-and-load-testing-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In a two-for-one Ask a Flooder, I answer two questions: What is the difference between performance testing and load testing and in which situations is performance testing a better option than load testing?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/8CueAkDY5yE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;Hi again, it&amp;rsquo;s Nicole back for another Ask a Flooder. And this time, the question from one of our customers is:&lt;/p&gt;
&lt;h2 id="what-is-the-difference-between-performance-testing-and-load-testing"&gt;What is the difference between performance testing and load testing?&lt;/h2&gt;
&lt;p&gt;Now, this is really a matter of semantics, and it kind of depends on whom you ask, but in general, performance is how quickly an application responds. So when you&amp;rsquo;re doing performance testing, you&amp;rsquo;re doing one of two things: there&amp;rsquo;s front-end performance, and then there&amp;rsquo;s back-end performance.&lt;/p&gt;
&lt;p&gt;In front-end performance, you&amp;rsquo;re looking at things like how quickly does the application render for the customer on the client-side. It&amp;rsquo;s how fast something renders on the screen, so it&amp;rsquo;s how page resources can be rearranged or optimized so that the experience is a lot faster for the end customer. So the focus is on the client-side on the end user&amp;rsquo;s actual device.&lt;/p&gt;
&lt;p&gt;On the back-end performance side, you&amp;rsquo;re looking at the server. How quickly does the server send a response to a request that&amp;rsquo;s sent by the browser?&lt;/p&gt;
&lt;p&gt;So those are really two different things because back-end performance really looks at everything outside - everything beyond - the device of the customer. Both kinds of performance testing are important. A solid, holistic performance testing strategy will incorporate both front-end and back-end performance.&lt;/p&gt;
&lt;p&gt;There are different types of back-end performance testing. You might have heard of load testing, stress testing, volume testing. At Flood, we kind of refer to all of those under the bracket of load testing. They do have some semantic differences between them, but in general, we talk about load testing to refer to simulating traffic against an application server to see how that server responds.&lt;/p&gt;
&lt;p&gt;Now the type of the testing that you want to do will also affect the kind of performance testing tool that you choose. For instance, a tool like Flood Element can do both front-end and back-end testing, but a tool like JMeter is only going to be useful for the back-end performance testing. So you need to choose your test according to the testing type that you&amp;rsquo;d like to carry out.&lt;/p&gt;
&lt;p&gt;This customer also had a follow-up question:&lt;/p&gt;
&lt;h2 id="in-which-situations-is-performance-testing-a-better-option-than-load-testing"&gt;In which situations is performance testing a better option than load testing?&lt;/h2&gt;
&lt;p&gt;And one answer to this is when front-end performance is required. So if what you&amp;rsquo;re after is trying to speed up how quickly your application renders on a mobile device, for instance, you might be better off looking at tools like GTMetrix or WebPageTest in order to measure and improve that side of it.&lt;/p&gt;
&lt;p&gt;I really want to stress here that neither front-end performance nor back-end performance is better than the other. If you&amp;rsquo;re asking me which type of testing you should do, my answer would be both. Till next time, happy flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 06: How to record traffic from a mobile app with JMeter</title><link>https://nicolevanderhoeven.com/blog/20200319-aaf06/</link><pubDate>Thu, 19 Mar 2020 20:50:44 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200319-aaf06/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-06-how-to-record-traffic-from-a-mobile-app-with-jmeter-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-06-how-to-record-traffic-from-a-mobile-app-with-jmeter-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;How do you record the traffic from your native mobile app using Apache JMeter? In this video, I explain step-by-step how to begin load testing a native mobile app.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/VVUyYF1VPlo?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;You might want to be doing this because you&amp;rsquo;re load testing a mobile app but either you don&amp;rsquo;t have access to your developers right now so they can&amp;rsquo;t help you with how the requests are made or what the requests are, or maybe you just want to verify what you&amp;rsquo;ve already been told. Either way, I&amp;rsquo;m going to show you how using my Android device (it&amp;rsquo;s a Samsung Galaxy Note 10+) and a Macbook Pro 13&amp;quot;. However, the same principles should apply to other mobile devices and laptops.&lt;/p&gt;
&lt;h2 id="step-1-download-and-install-the-mobile-app"&gt;Step 1: Download and install the mobile app&lt;/h2&gt;
&lt;p&gt;The first thing you&amp;rsquo;ll want to do is download and install the app. Now, if the app has already been released, then that&amp;rsquo;s no problem. You just go to the Google Play Store and download it. However, if it hasn&amp;rsquo;t been released yet and you&amp;rsquo;ve been given an APK file for the app, then you&amp;rsquo;ll have to tweak your settings a little bit in order to get your phone to allow you to download it.&lt;/p&gt;
&lt;p&gt;And I&amp;rsquo;m going to do this right with you. So go into Settings: pull down the little notification screen and hit the little gear icon, and you&amp;rsquo;ll see a bunch of settings there. Scroll down all the way to the bottom until you see About phone. Click that and then click Software Information. You&amp;rsquo;ll see the Build number halfway through the screen here&amp;ndash; and I know this is weird, but click on it seven times. You have to draw your pattern if you have one set up, but you&amp;rsquo;ll see here that it says Developer Mode has been enabled. That&amp;rsquo;s all you need to do; from now on you can install any APK, but be careful, because if you don&amp;rsquo;t trust the source, you know, they could do some damage to your phone.&lt;/p&gt;
&lt;h2 id="step-2-set-up-the-https-test-script-recorder-on-jmeter"&gt;Step 2: Set up the HTTP(S) Test Script Recorder on JMeter&lt;/h2&gt;
&lt;p&gt;The second step is setting up an HTTP recorder on JMeter. So let&amp;rsquo;s head over to our laptop. Make sure you&amp;rsquo;re connected to a wifi network. Now, this is a completely new JMeter test plan here. So just right-click on Test Plan and then hover over Add, and then you&amp;rsquo;re going to go down to Non-Test Elements. Select the HTTP(S) Test Script Recorder. You&amp;rsquo;ll see here that the port it uses is 8888. We&amp;rsquo;ll need that for later. Now right-click on the Test Script Recorder, hit Add, and then Listener. We&amp;rsquo;ll add a View Results Tree to be able to capture the results that we need later. Now we&amp;rsquo;ll click on the Test Plan - right-click - and then we&amp;rsquo;re going to Add a Thread Group. Now let&amp;rsquo;s right-click on the Thread Group and go to Add &amp;gt; Logic Controller &amp;gt; Recording Controller. This is where the requests that we&amp;rsquo;re going to send are going to be recorded, and we&amp;rsquo;ll see both the requests and the responses in View Results Tree.&lt;/p&gt;
&lt;h2 id="step-3-set-up-your-mobile-to-use-the-https-test-script-recorder-as-a-proxy"&gt;Step 3: Set up your mobile to use the HTTP(S) Test Script Recorder as a proxy&lt;/h2&gt;
&lt;p&gt;Now, the third step is to set up your mobile to use a proxy. So, back on the mobile, go back to Settings and hit Connections. And then click on Wifi. Now verify that the wifi network that you&amp;rsquo;re connected to on your mobile is the same one as the wifi network that you&amp;rsquo;re connected to on your laptop. If it&amp;rsquo;s the same, click the gear icon. And then hit Advanced all the way at the bottom. Now the Proxy settings are on the second option here so hit the down menu here and then hit Manual. Now, for the Proxy host name we&amp;rsquo;ll have to go back to the computer to see what our local IP address is.&lt;/p&gt;
&lt;p&gt;So, in order to do that, you just have to go to System Preferences. I&amp;rsquo;m doing it from the Apple menu here and from System Preferences, click on Network. And once you&amp;rsquo;ve selected the wifi network, hit Advanced, and then TCP/IP. So what you&amp;rsquo;re looking for will be this IPv4 Address. Now you&amp;rsquo;re going to type that into the Host name field on your mobile. So let me just type that in.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ll note that this is actually a local IP address. It&amp;rsquo;s not your public IP address. Now for our proxy port, we&amp;rsquo;ll go and look at the laptop to see the Test Script Recorder Settings and it was 8888, so that&amp;rsquo;s what we&amp;rsquo;re going to put in here. All right. And then click on Save.&lt;/p&gt;
&lt;h2 id="step-4-start-recording"&gt;Step 4: Start recording&lt;/h2&gt;
&lt;p&gt;Step 4 is recording the traffic. Now, go back to your laptop on JMeter and click on the Test Script Recorder. Now we&amp;rsquo;re going to click on Start. It&amp;rsquo;ll come up with this popup box here and you can just click OK since we already trust the source. You&amp;rsquo;ll see this little popup here to confirm that we are recording traffic. Now let&amp;rsquo;s see if we&amp;rsquo;ve actually configured it correctly.&lt;/p&gt;
&lt;p&gt;On our mobiles, let&amp;rsquo;s go back and open the app that you want to use. So I&amp;rsquo;m going to be using the IowaReporterApp. I just did an article on this on The New Stack (link in the description below) about how I would load test the Iowa Caucus Reporter App. So that&amp;rsquo;s what I&amp;rsquo;m going to be using for this tutorial as well. So I&amp;rsquo;m going to open that (&amp;ldquo;getting ready to caucus&amp;rdquo;) and I don&amp;rsquo;t have a valid precinct ID so I&amp;rsquo;m just going to put flood.io and I&amp;rsquo;m going to click Login. So it&amp;rsquo;s telling me that the connection isn&amp;rsquo;t private. I don&amp;rsquo;t actually expect this to work, because the app has been taken down and I don&amp;rsquo;t have valid login credentials, but I&amp;rsquo;m still just going to go forward. So, Proceed. You might have to do this as well if your certificates haven&amp;rsquo;t been set up correctly.&lt;/p&gt;
&lt;p&gt;Okay, so now we&amp;rsquo;ve gotten this error here and it says, &amp;ldquo;Oops, something went wrong&amp;rdquo;. So it&amp;rsquo;s handy to know what it looks like on your mobile so that you can go into JMeter and see if that&amp;rsquo;s what you see as well.&lt;/p&gt;
&lt;p&gt;So on JMeter let&amp;rsquo;s go to the View Results Tree and it looks like Google Play tried to do a few things beforehand but what we&amp;rsquo;re really looking for is this IDP caucus thing. So, these are the requests that my phone made and these are the responses. So this is where we got the certificate error because it says &amp;ldquo;certificate unknown&amp;rdquo;. Now this is the actual request we sent for login. You can see the request here - the full request - and also the full response. Now, just to check we&amp;rsquo;ll make sure we got the same response in the body here on JMeter that we saw on our mobile phones.&lt;/p&gt;
&lt;p&gt;And here it is; it says &amp;ldquo;Oops!, something went wrong&amp;rdquo;. You can of course just search for this. So we&amp;rsquo;ll stop the recording now because we&amp;rsquo;ve confirmed that we&amp;rsquo;ve gotten what we wanted. So in the recording controller, we can see the requests that were recorded from our mobile app and the first one looks like it was one to Google so that&amp;rsquo;s not one we want. If we were doing this again, we could actually go into the Test Script Recorder, go into this Requests Filtering tab, and we could just filter out or exclude the domains that we don&amp;rsquo;t want to test, like Google. But this looks like the request that we were actually looking for. You&amp;rsquo;ll see the full request here with all the parameters and the values.&lt;/p&gt;
&lt;h2 id="whats-next"&gt;What&amp;rsquo;s next?&lt;/h2&gt;
&lt;p&gt;And that&amp;rsquo;s how you record traffic from a native mobile app on JMeter. From here, you can then play around with the request. Like we saw, there were a lot of dynamic values that were recorded in the request. We would probably want to correlate those and make sure that we&amp;rsquo;re doing those correctly. But this is a really great starting point for testing a mobile app.&lt;/p&gt;
&lt;p&gt;Till the next Ask a Flooder, happy Flooding!&lt;/p&gt;</description></item><item><title>Ask a Flooder 05: How do I get started with Flood Element?</title><link>https://nicolevanderhoeven.com/blog/20200317-aaf05/</link><pubDate>Tue, 17 Mar 2020 20:58:12 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200317-aaf05/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/ask-a-flooder-05-how-do-i-get-started-with-flood-element-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/ask-a-flooder-05-how-do-i-get-started-with-flood-element-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;On this Ask a Flooder, I talk about getting started with Flood Element. Element is an open-source tool that is a good Selenium alternative for browser-based load testing. It runs Puppeteer under the hood to drive real browsers at scale and can be paired with Flood for cloud load testing.&lt;/p&gt;
&lt;p&gt;‍&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/oWtnStKrh98?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;/p&gt;
&lt;p&gt;TRANSCRIPT:&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re sold on browser-based load testing and want to get started on Element, I think the easiest way to do that is by going to &lt;a href="http://element.flood.io"&gt;element.flood.io&lt;/a&gt; and clicking on Install on the upper left corner. You can follow those instructions to get started, and you can also click on the links on the left side if you get stuck.&lt;/p&gt;
&lt;p&gt;Once Element is installed, open up the directory and look at the examples folder. There you&amp;rsquo;ll find a lot of sample scripts that we&amp;rsquo;ve already made up for you. The easiest way to get started is to just modify some of these slightly so that you&amp;rsquo;re testing your site. For example, you could just change the URL and step names to make it appropriate for what you&amp;rsquo;re testing.&lt;/p&gt;
&lt;p&gt;Then, you can run it locally using the command element run the name of your test script, like test.ts, and then I also like to include the no-headless flag.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run test.ts --no-headless&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The no-headless flag is going to run a real browser, a Chromium browser, on your machine, so that you can see what the script is actually doing. This is a great way to debug and troubleshoot.&lt;/p&gt;
&lt;p&gt;Once you&amp;rsquo;re ready to run your load test on the cloud, you can simply drag and drop your Element script into the Flood stream editor and then start your load test as usual.&lt;/p&gt;
&lt;p&gt;Check out the links in the description below for more information about Element, how to get started, and how to run an Element script on Flood.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://element.flood.io/"&gt;More about Element&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://guides.flood.io/scripting-and-tools/flood-element/getting-started-with-element"&gt;Getting started with Element&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Ask a Flooder 04: Why would your load testing tool report higher response times than you expect?</title><link>https://nicolevanderhoeven.com/blog/20200311-aaf04/</link><pubDate>Wed, 11 Mar 2020 21:02:48 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200311-aaf04/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/why-would-your-load-testing-tool-report-higher-response-times-than-you-expect-video"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/why-would-your-load-testing-tool-report-higher-response-times-than-you-expect-video"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this Ask a Flooder, I tackle a question we get all the time from users regarding results, particularly for cloud load testing. Sometimes you might notice that response times that are reported in by your load testing tool do not match up with the response time you see from your own browser. What causes this, and how can we fix it?&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/goKK2aACZZY?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Transcript:&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s always confusing when your load testing tool reports higher average response times than what you can see while you&amp;rsquo;re manually accessing your application on your browser. There are many things that might cause this, but one of the most common causes for it is that you&amp;rsquo;re overloading your node generators.&lt;/p&gt;
&lt;p&gt;As a general rule of thumb, you&amp;rsquo;ll want to keep your CPU utilization at 80% or less throughout the duration of the test. It is normal for it to spike in the beginning, but it should ideally come to a more stable spot below 80%. If your node&amp;rsquo;s CPU utilization is going over 80% for most of the test, then what that means is that your node is struggling to get those requests out, which may lead to some inaccurate results.&lt;/p&gt;
&lt;p&gt;You can confirm whether or not this is the cause of your high response times by checking the logs and checking the resource utilization on your nodes.If you&amp;rsquo;re running on Flood, you can do this while the flood is running by going over to Grids, selecting the grid, and then scrolling down on the panel on the right to see the CPU and memory as well as the network throughput.&lt;/p&gt;
&lt;p&gt;There are a couple of things you can do to fix this. The first one is to increase any sort of delays or think times in your script — and, if you don&amp;rsquo;t already have any, you should add some. Think times make the script a lot more realistic and a lot closer to what real users would do. If these values are too low, then your load testing tool is just going to run the script as fast as possible, consuming more resources than necessary.&lt;/p&gt;
&lt;p&gt;The second thing you can do is reduce the number of users you&amp;rsquo;re running per node. This will free up more resources per node and make it a lot easier to scale up your load tests more effectively.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Check out &lt;a href="https://guides.flood.io/results-analysis/troubleshooting-results-analysis/reported-response-times-higher-than-observed"&gt;this article&lt;/a&gt; for more detailed information on resource over-utilization and other possible reasons for differences between response times in a test and on a browser.&lt;/p&gt;</description></item><item><title>FOMO and performance testing: Why Robinhood went down</title><link>https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing/</link><pubDate>Mon, 09 Mar 2020 20:29:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200309-fomo-and-performance-testing/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/fomo-and-performance-testing-why-robinhood-went-down"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Angry customers flocked to the internet when the Robinhood investment brokerage app went down last Monday and part of Tuesday, leaving them unable to trade stocks on a day where Wall Street reported historic gains. Could this have been prevented?&lt;/p&gt;
&lt;p&gt;The answer is yes. Applications should always be assessed for risk and tested accordingly. Risk-based load testing helps unearth problems that would otherwise only surface in production. Testing applications end-to-end as a system instead of just as a collection of isolated components allows us to build software that is more resilient. The problem is that this type of testing can be difficult to carry out. In this article, I&amp;rsquo;ll go through the entire process.&lt;/p&gt;
&lt;h2 id="what-is-robinhood"&gt;What is Robinhood?&lt;/h2&gt;
&lt;p&gt;Robinhood is an app I&amp;rsquo;ve personally had my eye on since it opened a waiting list about five years ago for Australians wanting to see the American company come to our shores. It &lt;a href="https://australianfintech.com.au/local-start-stake-beats-us-giant-robinhood-bring-australians-free-share-trading/"&gt;doesn&amp;rsquo;t look like it&amp;rsquo;s happening&lt;/a&gt; now, but if that waiting list still exists, I&amp;rsquo;m on it.&lt;/p&gt;
&lt;p&gt;Robinhood is a brokerage app that takes inspiration from the legend it was named after to &amp;ldquo;give to the poor,&amp;rdquo; bring zero-commission trading to its customers. Instead of earning from commissions, Robinhood makes its money from &lt;a href="https://www.investopedia.com/articles/active-trading/020515/how-robinhood-makes-money.asp"&gt;a variety of other methods&lt;/a&gt;, including premium platform fees, interest on customers&amp;rsquo; uninvested capital, and payments received in exchange for coursing customers&amp;rsquo; orders through third-party market-makers. It&amp;rsquo;s an enticing premise, and one that the company has used in conjunction with mobile apps to appeal to millennials and technophiles.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: From &lt;a href="https://robinhood.com/us/en/"&gt;Robinhood&amp;rsquo;s homepage&lt;/a&gt;&lt;/em&gt;
‍&lt;/p&gt;
&lt;h2 id="what-caused-the-robinhood-app-to-fail"&gt;What caused the Robinhood app to fail?&lt;/h2&gt;
&lt;p&gt;Unfortunately, its wild success with the tech-savvy crowd also meant that when it went down last Monday morning in the US, its customers took to the internet in droves to draw attention to the failure. In a &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;blog post from Robinhood&lt;/a&gt;, the company&amp;rsquo;s co-founders, Baiju Bhatt and Vladimir Tenev, admitted that the outage was due to &amp;ldquo;stress on [their] infrastructure— which struggled with unprecedented load.&amp;rdquo;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The outages you have experienced over the last two days are not acceptable and we want to share an update on the current situation. Our team has spent the last two days evaluating and addressing this issue. We worked as quickly as possible to restore service, but it took us a while. Too long. - &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;Baiju Bhatt and Bladimir Tenev&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bhatt and Tenev went on to explain that the load on their servers had caused a &amp;ldquo;thundering herd&amp;rdquo; effect. This effect describes a situation in which a backend server receives a large number of concurrent requests and, instead of different threads processing these requests simultaneously, all threads attempt to process the same request.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;ve ever played four-player Overcooked, it&amp;rsquo;s like having everyone sprint to a fire extinguisher to try to put out a fire from overcooked pasta, but instead, the constant button mashing means you just pass the extinguisher around and yell at each other while the fire rages on. Before you know it, the entire kitchen is on fire.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-02.jpeg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: From &lt;a href="https://twitter.com/csac0425/status/963053160259510277"&gt;Twitter user @csac0425&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;So the technical cause of the outage was an infrastructure problem.&lt;/p&gt;
&lt;p&gt;But I think the REAL cause was FOMO.&lt;/p&gt;
&lt;h2 id="what-is-fomo"&gt;What is FOMO?&lt;/h2&gt;
&lt;p&gt;FOMO is the Fear Of Missing Out, and it&amp;rsquo;s a phenomenon that&amp;rsquo;s been particularly exacerbated by social media. Instead of only hearing news from people you interact with in the physical world, it just takes a few seconds to open up Twitter on your smartphone and see what thousands of people are talking about. Twitter will even helpfully tell you what&amp;rsquo;s &amp;ldquo;trending&amp;rdquo; in your country, and other social networks also employ algorithms to determine what messages to show you.&lt;/p&gt;
&lt;h2 id="how-does-fomo-affect-application-performance"&gt;How does FOMO affect application performance?&lt;/h2&gt;
&lt;p&gt;We can see FOMO in how people have reacted to the coronavirus COVID-19. Despite pleas to leave masks for medical professionals at real risk, people have bought out the stock for these masks despite living in countries with little to no sign of the coronavirus. In Sydney, Australia, residents are stockpiling toilet paper (of all things) in large quantities, clearing out shelves from supermarkets, and &lt;a href="https://www.bbc.com/news/world-australia-51731422"&gt;getting into knife fights over toilet paper&lt;/a&gt; due to their panic at the thought of doing without.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-03.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;This photo of an empty toilet paper aisle was taken by our Principal Engineer, &lt;a href="https://github.com/lachie"&gt;Lachie Cox&lt;/a&gt;, in a supermarket in Sydney last week.&lt;/em&gt;
‍
FOMO of this magnitude ultimately also manifests itself in the stock market. The Dow Jones Industrial Average, which represents the performance of the top 30 largest companies in the US, dropped by 3,500 points last week amidst fears that the coronavirus would stall production in countries most affected by COVID-19, leading to lower returns across the board.&lt;/p&gt;
&lt;p&gt;Then, an abrupt about-face. The Dow went from recording its &lt;a href="https://nypost.com/2020/03/09/dow-loses-over-2000-points-worst-single-day-drop-ever-as-oil-prices-crash/"&gt;biggest &lt;em&gt;ever&lt;/em&gt; loss in a single day on Thursday&lt;/a&gt; to posting a record gain of 1,200 points on Monday.&lt;/p&gt;
&lt;p&gt;Guess who gets to adjust to all this volatility.&lt;/p&gt;
&lt;p&gt;Robinhood&amp;rsquo;s founders reported that the &amp;ldquo;highly volatile and historic market conditions; record volume; and record sign-ups&amp;rdquo; contributed to the infrastructure issues they faced. We can only imagine just how many users they saw on their systems during this period.&lt;/p&gt;
&lt;p&gt;FOMO creates mass hysteria and panic, both of which cause customers to behave irrationally and likely very differently than previously recorded. So how do you create a workload model that accounts for this volatility? How do you tailor your load tests for FOMO? I&amp;rsquo;ll run you through the process, using Robinhood as an example.&lt;/p&gt;
&lt;h2 id="does-your-application-require-fomo-load-testing"&gt;Does your application require FOMO load testing?&lt;/h2&gt;
&lt;p&gt;All testing should be risk-based. Start with why: why should you test an application component? Why does your application require this kind of testing or that one?&lt;/p&gt;
&lt;p&gt;In Robinhood&amp;rsquo;s case, there were a few indicators that pointed to the necessity of FOMO testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;A customer base made up of a younger, tech-savvy generation&lt;/strong&gt;. ‍This demographic is very likely to take to social media with complaints, making negative publicity a real risk.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Complexity&lt;/strong&gt;. ‍Robinhood&amp;rsquo;s systems must receive customers&amp;rsquo; orders, forward and place those orders to market makers, and display real-time market data. Robinhood customers can also purchase options on stocks as well as cryptocurrency, further increasing the complexity.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Financial component&lt;/strong&gt;. ‍Anything that involves taking people&amp;rsquo;s money should have a high priority for any testing.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When it comes to your money, we know how important it is for you to have answers. - &lt;a href="https://blog.robinhood.com/news/2020/3/3/an-update-from-robinhoods-founders"&gt;Baiju Bhatt and Bladimir Tenev&lt;/a&gt;, co-founders of Robinhood&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Record-breaking growth&lt;/strong&gt;. ‍Robinhood had 1 million users in 2016, 6 million in 2018, and 10 million last December, &lt;a href="https://www.cnbc.com/2019/12/04/start-up-robinhood-tops-10-million-accounts-even-as-industry-follows-in-free-trading-footsteps.html"&gt;according to CNBC&lt;/a&gt;. Exponential growth brings some major growing pains.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Industry history of expensive failures&lt;/strong&gt;. ‍&lt;a href="https://qz.com/1812086/robinhood-brokerage-app-suffers-second-day-of-outages/"&gt;Quartz points out&lt;/a&gt; that software or infrastructure failures have cost the financial industry millions in recent years.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Recent legal action&lt;/strong&gt;. The regulatory body FINRA &lt;a href="https://www.cnn.com/2019/12/19/investing/robinhood-trading-app-fine-finra/index.html"&gt;fined Robinhood&lt;/a&gt; US$1.25 million just last December for placing orders for customers without looking for the lowest price. While this isn&amp;rsquo;t a huge fine for a company that was &lt;a href="https://www.bloomberg.com/news/articles/2019-07-22/robinhood-is-worth-7-6-billion-after-new-funding-round"&gt;valued at US$7.6 billion last July&lt;/a&gt;, any legal action should make a company tread more carefully.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These are solid reasons to warrant load testing Robinhood&amp;rsquo;s systems beyond just &amp;ldquo;expected&amp;rdquo; load.&lt;/p&gt;
&lt;h2 id="planning-for-fomo"&gt;Planning for FOMO&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;ve determined that your application is susceptible to FOMO, the next thing to do is plan how to structure your load tests to include its effect in your test runs.&lt;/p&gt;
&lt;h3 id="what-type-of-app-is-it"&gt;What type of app is it?&lt;/h3&gt;
&lt;p&gt;Robinhood consists of three apps: two for mobile (iOS and Android) and one for the web. It is currently only available to US residents, which means that getting mobile apps downloaded is problematic as it would entail changing countries in the app stores to get access. Since I live in the Netherlands and I don&amp;rsquo;t want to do that, I&amp;rsquo;ll focus on the web app specifically when scripting the load test, and I&amp;rsquo;ll assume that the same underlying application servers service both web and mobile apps.&lt;/p&gt;
&lt;h3 id="workload-modeling"&gt;Workload modeling&lt;/h3&gt;
&lt;h4 id="business-processes-to-test"&gt;Business processes to test&lt;/h4&gt;
&lt;p&gt;Given that the app went down on a day where markets were &lt;em&gt;up&lt;/em&gt;, we can assume that most of the people on Robinhood&amp;rsquo;s apps were doing one of two things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Signing up&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Buying shares&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We should ideally test both, but let&amp;rsquo;s focus on signups here because it&amp;rsquo;s easier to test without access to the actual app (which requires a US social security number).&lt;/p&gt;
&lt;h4 id="number-of-virtual-users-at-peak-load"&gt;Number of virtual users at peak load&lt;/h4&gt;
&lt;p&gt;Let&amp;rsquo;s try to come up with a number of users that we can use as Robinhood&amp;rsquo;s peak hourly load. This task would be easier if Robinhood shared their analytics, but we can still make some educated guesses with what &lt;em&gt;has&lt;/em&gt; been made public.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Image from &lt;a href="https://blog.apptopia.com/robinhood-now-has-more-mobile-monthly-active-users-than-the-top-legacy-providers-combined"&gt;Apptopia&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://blog.apptopia.com/robinhood-now-has-more-mobile-monthly-active-users-than-the-top-legacy-providers-combined"&gt;According to Apptopia&lt;/a&gt;, Robinhood&amp;rsquo;s highest number of mobile installations was in 2018, when it saw 2 million downloads of its mobile app in a quarter. This period coincides with when Robinhood released cryptocurrency trading support, which looks like increased signups—in the third quarter of 2019, this figure was about 1.5 million. 2 million quarterly downloads translates to about 666,666 downloads per month. Let&amp;rsquo;s call that 700,000 and take this number of mobile downloads as a starting figure.&lt;/p&gt;
&lt;p&gt;The stock market is only open on the weekdays, so we can divide 700,000 signups a month by 20 days, and we get 35,000 signups a day. The markets are also only open for about 7 hours a day, but the load probably isn&amp;rsquo;t evenly spread out across the 7 hours— I would expect that people would have more time during lunch to sign up for Robinhood. So let&amp;rsquo;s say that the majority of those signups would happen within three hours (from 11 am to 2 pm, for example). By dividing 35,000 signups per day by 3 hours, we get about 11,667 users per hour. Let&amp;rsquo;s round that up to 12,000.&lt;/p&gt;
&lt;p&gt;How do we translate this to the number of virtual users we need to run? Let&amp;rsquo;s think about how long each user stays on the app. The signup process does require approval, so that&amp;rsquo;s a hard stop— new users won&amp;rsquo;t be able to sign up and then start trading immediately afterwards. &lt;a href="https://robinhood.com/us/en/support/articles/360001213123/open-my-account/"&gt;This approval could take up to a day&lt;/a&gt;, or up to seven days if documents are required.&lt;/p&gt;
&lt;p&gt;Looking at the application form itself, we can see it is relatively standard and requires only information that most people are likely to have handy (social security number and contact details). I timed how long it took me to go through the part of it I could access, and I estimated that 10 minutes would be sufficient time to go through all the tabs.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-05.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://signup.robinhood.com/?"&gt;Robinhood&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;We want to spread out users evenly across the hour— that is, we don&amp;rsquo;t want 12,000 users to sign up and leave, all within 10 minutes. We want equal portions of those users to be signing up throughout the entire hour. Dividing 12,000 by 6 (the number of 10-minute intervals in an hour), we get 2,000. 2,000 is the number of threads we need active at any one point of time. Each of those threads signs up one user for 10 minutes, then signs up 5 more users until the hour is up.&lt;/p&gt;
&lt;p&gt;So we have our figure: we need 2,000 &lt;em&gt;virtual&lt;/em&gt; users per hour to simulate 12,000 signups in an hour.&lt;/p&gt;
&lt;h3 id="test-scenarios"&gt;Test scenarios&lt;/h3&gt;
&lt;p&gt;In addition to running the standard battery of load tests, testing for FOMO requires exploring the upper limits of the application. Assuming the peak load testing goes well, we can use the 2,000 virtual users per hour figure from our peak load calculations as a starting point for these more destructive tests. To this end, here are some test scenarios I&amp;rsquo;d consider running if I were testing the Robinhood app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Soak testing&lt;/strong&gt;. ‍Soak testing means running typically a little less than the peak load profile, but over a longer amount of time. In Robinhood&amp;rsquo;s case, perhaps we could run 1,000 virtual users for 8 hours. We would expect that the response times reported during this test would be the same; otherwise, there is likely a performance bottleneck, such as a memory leak.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Stress testing&lt;/strong&gt;. ‍Stress testing means increasing the number of users on an application at regular increments until the application crashes. We can start with 2,000 virtual users per hour, and then add 500 users every 30 minutes to see how the application handles it. This test helps determine how much room there is for growth.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-06.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Stepped load profile for stress testing, generated in JMeter&lt;/em&gt;
‍&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Resilience testing&lt;/strong&gt;. ‍Resilience testing involves running the peak load test and then simulating an outage by turning off key components to see how the application behaves. If two servers share the load, for instance, we could turn one off and check to make sure that the user sessions on the terminated node are moved over onto the remaining node. This test shows whether the application recovers gracefully from an unforeseen event.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;All these tests help us prepare for the unexpected, and they might have identified the &amp;ldquo;thundering herd&amp;rdquo; problem that contributed to Robinhood&amp;rsquo;s outage.&lt;/p&gt;
&lt;h2 id="scripting-for-fomo"&gt;Scripting for FOMO&lt;/h2&gt;
&lt;h3 id="tool-selection"&gt;Tool selection&lt;/h3&gt;
&lt;p&gt;To test mobile as well as web apps, I would typically use a protocol-level load testing tool like JMeter to simulate the load. However, &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;I&amp;rsquo;ve already done that&lt;/a&gt;. I also noticed that Robinhood makes use of some dynamic parameters, such as a csrf token:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-07.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: Chrome Developer Tools on &lt;a href="https://signup.robinhood.com/?"&gt;Robinhood&lt;/a&gt;&lt;/em&gt;
‍
We can usually find the value of this token in the response of the previous page. It is a security feature to allow Robinhood to verify that the same users make all requests in the same session. Tokens can be scripted around in a tool like JMeter, but it can be time-consuming. So for this article, I decided to show another tool that makes this problem go away. I used &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;, which is an open-source tool we created based on Puppeteer. One of its advantages is that it runs on the browser level. Instead of diving into HTTP requests and tokens, I just told Element which buttons to click.&lt;/p&gt;
&lt;p&gt;I wanted a script that would do the following things:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Navigate to Robinhood&amp;rsquo;s home page.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on &amp;ldquo;Sign Up&amp;rdquo;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Click on the &amp;ldquo;Get Your Free Stock&amp;rdquo; button.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Fill out the signup form.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note that I stopped short of actually submitting the form because I don&amp;rsquo;t want to create dummy accounts on Robinhood&amp;rsquo;s database— I just want to show how this flow can be scripted with Element.&lt;/p&gt;
&lt;p&gt;To help me identify the elements on the page that I wanted the script to interact with, I used Chrome&amp;rsquo;s built-in Developer Tools. Specifically, I used the Inspect Element button (in orange below) to click on a field and find where it was in the code.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-08.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;For instance, to find out how to identify the email field, I right-clicked on the code on the right, hovered over Copy, and then clicked Copy selector.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-09.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This gave me the value &lt;code&gt;#signup_email_field&lt;/code&gt;, which I then used in the script like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//Type Email address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;signup_email_field&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;nicole@flood.io&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s the script that I ended up with:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;MouseButtons&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Device&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Driver&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ENV&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;as&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;assert&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;assert&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loopCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;actionDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stepDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;userAgent&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;flood-element-test&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;01_Home&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Navigate to Robinhood homepage
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;&amp;lt;https://robinhood.com&amp;gt;&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;It’s Time to Do Money&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;02_Signup&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click &amp;#34;Sign Up&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;signupBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//a[@href=&amp;#34;&amp;lt;https://signup.robinhood.com&amp;gt;&amp;#34;]&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;signupBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Free Stock Waiting For You&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;03_GetFreeStock&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click Get Your Free Stock
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;freestockBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//a[@href=&amp;#34;&amp;lt;https://signup.robinhood.com/?&amp;#34;&amp;gt;]&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;freestockBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Validate text
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visibleText&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;Make Your Money Move&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;elementIsVisible&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;validation&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;04_FillForm&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type First name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;first_name&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;Nicole&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type Last name
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;last_name&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;van der Hoeven&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type Email address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;id&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;signup_email_field&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;nicole@flood.io&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Type password
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;type&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//input[@name=&amp;#34;password&amp;#34;]&amp;#39;&lt;/span&gt;),&lt;span style="color:#e6db74"&gt;&amp;#39;demo123456&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In every step, I also added a &lt;code&gt;takeScreenshot()&lt;/code&gt; , which is one of my very favorite features of Element. It&amp;rsquo;s so useful to be able to save these screenshots and use them to determine exactly what&amp;rsquo;s happening in the script. Here&amp;rsquo;s what it looks like running my Element script locally. The automated browser is on the left, and my terminal (iTerm) is on the right, running Element.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-10.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="running-a-fomo-test"&gt;Running a FOMO test&lt;/h2&gt;
&lt;p&gt;Now we&amp;rsquo;ve got a script that runs locally. How do we run it at scale? Additionally, Robinhood won&amp;rsquo;t allow users outside the US to sign up. How do we make sure that our virtual users are allowed to sign up?&lt;/p&gt;
&lt;p&gt;The answer is a load testing platform like &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;With Flood, running our script is a matter of uploading the script and selecting some options.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-11.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;The Flood test design interface&lt;/em&gt;
‍
Flood also lets us choose which regions to generate load from. Below I&amp;rsquo;ve got it set up to run for an hour from four different US cities, with each one starting 500 users. This configuration gives us our 2,000 virtual user figure.&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200309-12.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;If this peak load test goes well, we could then go on to run the other test scenarios that we described earlier. Each one puts pressure on application servers in different ways, identifying performance bottlenecks.&lt;/p&gt;
&lt;h2 id="results-and-reruns"&gt;Results and reruns&lt;/h2&gt;
&lt;p&gt;Since Robinhood is a live application, I didn&amp;rsquo;t run the test— it&amp;rsquo;s never a good idea to load test a domain you don&amp;rsquo;t own when you&amp;rsquo;re talking about thousands of users. However, &lt;a href="https://api.flood.io/pfQuAGz3"&gt;here&amp;rsquo;s a shareable link&lt;/a&gt; to another small Element test I ran previously.&lt;/p&gt;
&lt;p&gt;Real-time dashboards like that one on Flood allow you to get a quick look into how the load test is running and to make any changes if necessary. When testing for FOMO, I think they&amp;rsquo;re invaluable. For example, during a stress test where users are added at regular intervals, a real-time dashboard would help you identify increases in response time as a result of the increased number of users. It would also let you monitor the test and stop it when necessary.&lt;/p&gt;
&lt;p&gt;From the link above, click on the right arrow on the lone transaction.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-13.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;That will take you to the Transaction Detail page. Remember those screenshots from Element? If you have any in your script, you&amp;rsquo;ll see them here, arranged according to time.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200309-14.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This lets you troubleshoot issues during FOMO testing and react quickly.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Even with sound load testing strategies in place, it&amp;rsquo;s challenging to plan for the massive spike in traffic that FOMO can bring, yet it&amp;rsquo;s necessary to do so. FOMO, as a phenomenon, is only going to increase in magnitude as social networks make it easier to spread fear, uncertainty, and doubt as well as information.&lt;/p&gt;
&lt;p&gt;We may not be able to determine precisely what will break, or when, but what we can do is put systems into place to plan for it. We can assess an application&amp;rsquo;s susceptibility to FOMO and plan for end-to-end performance engineering of the system as a whole. We can start with the assumption that applications will fail and then determine the most likely candidates for that failure. We can routinely expose systems to traffic and circumstances that are extraordinary, and in doing so, we can improve our preparedness for something like FOMO.&lt;/p&gt;
&lt;p&gt;FOMO is irrational and unpredictable— but that doesn&amp;rsquo;t mean it needs to be unexpected.&lt;/p&gt;</description></item><item><title>Load Testing Lessons from the Iowa Caucus</title><link>https://nicolevanderhoeven.com/blog/20200306-load-testing-lessons/</link><pubDate>Fri, 06 Mar 2020 21:59:02 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200306-load-testing-lessons/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-lessons-from-the-iowa-caucus"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-lessons-from-the-iowa-caucus"&gt;here&lt;/a&gt; and &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;TL;DR? Here are the highlights in this article:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Shadow, Inc. created a mobile app for the Iowa Caucus in February 2020, and the app failed, causing reported results to be delayed.
The app reported different vote totals due to a system integration bug where the output was in a different format than what it needed to be.
Here are the steps to load testing a mobile app:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Test planning: Does the app require load testing? If yes, what is the underlying technology? How do we create a workload model?&lt;/li&gt;
&lt;li&gt;Scripting: Which mobile load testing tool should we use? How do we record traffic from a mobile device?&lt;/li&gt;
&lt;li&gt;Execution: What load test scenarios should we have? How can we scale up the load generated?
Conclusion: While the Iowa Reported App failure was not due entirely to load testing, load testing could have helped make it more robust.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;p&gt;A company called Shadow, Inc. made headlines earlier this week when they developed an app to count and report votes during the Iowa Democratic Caucus in the US. This app, called IowaReporterApp, ended up failing on several fronts, resulting in a &lt;a href="https://www.nytimes.com/2020/02/06/upshot/iowa-caucuses-errors-results.html"&gt;days-long delay&lt;/a&gt; in publishing the total votes, during which manual methods had to be employed.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Source: &lt;a href="https://twitter.com/ShadowIncHQ/status/1224773796307050497"&gt;@ShadowIncHQ on Twitter&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This delay led to significant criticism from the software testing industry as well as from the general public. Some developers raised questions about the &lt;a href="https://www.vice.com/en_us/article/3a8ajj/an-off-the-shelf-skeleton-project-experts-analyze-the-app-that-broke-iowa"&gt;code quality of the app&lt;/a&gt;. The app &lt;a href="https://twitter.com/iowademocrats/status/1225170253778444291"&gt;inaccurately reported voting totals&lt;/a&gt; that differed from the Democratic Party&amp;rsquo;s own manual reports, suggesting an issue with functional testing, particularly system integration testing. Shadow&amp;rsquo;s &lt;a href="https://thehill.com/policy/cybersecurity/481409-dhs-chief-says-offer-to-vet-iowa-caucus-app-was-declined"&gt;refusal to accept the Department of Homeland Security&amp;rsquo;s help with security testing&lt;/a&gt; also raised eyebrows. What was perhaps the most damning, though, was the question of &lt;a href="https://twitter.com/zeynep/status/1224545350364672001"&gt;whether such an app was necessary in the first place&lt;/a&gt;, when cheaper and more effective solutions existed.&lt;/p&gt;
&lt;p&gt;What I&amp;rsquo;m most interested in, however, are the load issues that the app faced. Let&amp;rsquo;s rewind a little to before the caucus. How would I have load tested an app like the IowaReporterApp?&lt;/p&gt;
&lt;h2 id="planning-a-mobile-load-testing"&gt;Planning a mobile load testing&lt;/h2&gt;
&lt;p&gt;One of the first things to figure out when planning a load test is whether a load test is even necessary.&lt;/p&gt;
&lt;h3 id="do-you-even-need-to-load-test-your-mobile-app"&gt;Do you even need to load test your mobile app?&lt;/h3&gt;
&lt;p&gt;To answer that, I had to find out more about the app.&lt;/p&gt;
&lt;p&gt;In the caucus, residents of Iowa who registered themselves as Democratic voters gathered to vote on whom they thought should be the party&amp;rsquo;s candidate for the presidential elections later this year.&lt;/p&gt;
&lt;p&gt;There are a few things that I think make this app the perfect candidate for load testing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It was highly publicized.&lt;/strong&gt; The caucuses would always have been an event of international interest, but the hype surrounding electronic voting increased media attention on the caucus even further.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It was mission-critical&lt;/strong&gt;. The precinct chairs would use the app as the primary device for capturing votes.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;It needed to handle significant simultaneous load&lt;/strong&gt;. There were &lt;a href="https://en.wikipedia.org/wiki/2020_Iowa_Democratic_caucuses"&gt;over a thousand precinct caucuses&lt;/a&gt; organized, each with a precinct chair that would be using the app.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For these reasons, the answer is a resounding &amp;ldquo;Yes.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="what-type-of-app-is-it"&gt;What type of app is it?&lt;/h3&gt;
&lt;p&gt;The best way to learn about an app is to ask its developers. In this case, I opted to do a little research on my own by &lt;a href="https://www.vice.com/en_us/article/z3b3g9/here-is-a-link-to-the-shadow-inc-app-that-blew-up-the-iowa-caucus"&gt;downloading the .apk file that Motherboard (Vice) made available&lt;/a&gt; and looking through the code myself.&lt;/p&gt;
&lt;p&gt;The app is a mobile-only app for Android and iOS devices, written mostly using Facebook&amp;rsquo;s React Native package. The primary function of the app was to sent the vote totals to Shadow Inc.&amp;rsquo;s &lt;a href="https://cloud.google.com/functions/?utm_source=google&amp;amp;utm_medium=cpc&amp;amp;utm_campaign=emea-nl-all-en-dr-bkws-all-all-trial-e-gcp-1008073&amp;amp;utm_content=text-ad-none-any-DEV_c-CRE_253510459861-ADGP_Hybrid+%7C+AW+SEM+%7C+BKWS+~+EXA_M:1_NL_EN_General_Cloud+Functions_ETL+Warehouse-KWID_43700019207359819-kwd-135583196912-userloc_9065312&amp;amp;utm_term=KW_google%20functions-ST_google+functions&amp;amp;ds_rl=1242853&amp;amp;ds_rl=1245734&amp;amp;ds_rl=1245734&amp;amp;gclid=EAIaIQobChMI6bKKzNi_5wIVk-R3Ch04HA1XEAAYASAAEgKTcPD_BwE"&gt;Google Cloud Functions&lt;/a&gt; server.&lt;/p&gt;
&lt;p&gt;The technology involved is worth noting because it can help determine which load testing tool to use. Since the Iowa Reporter App, like most mobile apps, sends requests to a RESTful API, JMeter or Gatling, both well-tested, robust, and open-source protocol-level tools with large user bases, were perfect for the job. I decided to go with JMeter, my personal tool of choice.&lt;/p&gt;
&lt;h3 id="how-do-we-create-a-workload-model"&gt;How do we create a workload model?&lt;/h3&gt;
&lt;p&gt;Now let&amp;rsquo;s talk about the workload model, which is a plan for how the load we generate needs to look. The objective here is to simulate the load that matches the expected real-life load as closely as possible.&lt;/p&gt;
&lt;p&gt;At this point, I would typically look at historical data to try to see the amount of load and the load profile. If I had metrics on the server traffic after previous releases of the app using something like Google Analytics or an APM tool, I would have used that data as a starting point for the workload model of this release. However, in this case, the app hadn&amp;rsquo;t been publicly released before, so I needed to make some educated guesses.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/2020_Iowa_Democratic_caucuses"&gt;According to Wikipedia&lt;/a&gt;, there were a total of 1,777 Iowa precinct caucuses, of which 99 were global satellite caucuses set up for Iowa residents temporarily not able to attend the local caucuses.&lt;/p&gt;
&lt;p&gt;In a Democratic caucus, the actual voting process generally takes &lt;a href="https://www.theguardian.com/us-news/2020/feb/03/iowa-caucuses-2020-elections-candidates"&gt;about two hours&lt;/a&gt;. In the Iowa caucus, the precinct chairs would have used the app twice - once for each round of voting. Around the end of the two hours, each chair&amp;rsquo;s app would have sent the main payload, containing total votes for each candidate, to the backend server. All this is done simultaneously across all 1,777 precincts.&lt;/p&gt;
&lt;p&gt;At a minimum, there are two main events here:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The login - Precinct chairs needed to log in to the app, which would presumably have happened around the same time across all precincts towards the beginning of the voting process, because the app also contained instructions on how to run a caucus.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The submission - This is the transmission of the total vote counts for each candidate, sent to Google Cloud Functions, and would also have happened around the same time.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;It&amp;rsquo;s possible that the app also sent other requests between these two events, but since most of the app is inaccessible without a valid login, I&amp;rsquo;ll focus on the initial login request.&lt;/p&gt;
&lt;p&gt;In a situation like this where I don&amp;rsquo;t have previous data to show how spread out those requests was, it&amp;rsquo;s prudent to err on the side of caution. Assuming the precinct chairs triggered those requests within 10 minutes of each other and rounding up the number of requests for some wiggle room, I estimated that there would have been 1,800 login requests within 10 minutes.&lt;/p&gt;
&lt;p&gt;I decided to test this as a gradual ramp-up of users within 10 minutes.&lt;/p&gt;
&lt;h2 id="scripting-for-mobile"&gt;Scripting for mobile&lt;/h2&gt;
&lt;p&gt;Okay, time to write the script. Since I didn&amp;rsquo;t have the luxury of being able to ask the developers for the format of the login request, I did the next best thing and tried to find out myself by recording the app traffic in action.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-02.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="recording-mobile-traffic-on-a-laptop-with-jmeter"&gt;Recording mobile traffic on a laptop with JMeter&lt;/h3&gt;
&lt;p&gt;Here&amp;rsquo;s how I was able to see the request from the mobile app:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;I downloaded the app to a spare Android mobile by using the APK link above.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up an HTTP(S) Test Script Recorder on JMeter on my laptop with the port 8888. I also made sure my laptop was connected to my wifi network.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;I set up my mobile to use a proxy using my laptop&amp;rsquo;s local IP address on the network and port 8888.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Then, I went back to JMeter on my laptop and started the HTTP(S) Test Script Recorder.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Finally, I navigated to the app, typed in flood.io in the Precinct ID field (obviously not a real ID), and clicked the &amp;ldquo;Click here to log in&amp;rdquo; button.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the traffic as seen on JMeter&amp;rsquo;s View Results Tree listener afterward:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-03.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;And here&amp;rsquo;s the recorded request within the recording controller:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200306-04.png" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="analyzing-the-request"&gt;Analyzing the request&lt;/h3&gt;
&lt;p&gt;It looks like at least the initial login request is a GET to an Auth0 service, with several parameters being passed in the body. It also has some authorization headers.&lt;/p&gt;
&lt;p&gt;The parameter values also look like they might be dynamic, meaning they change from session to session. At this point, I would typically change some of these from being hardcoded values into dynamic ones so that the application receives a request in the right format, and I could look through &lt;a href="https://auth0.com/docs/api/authentication"&gt;Auth0&amp;rsquo;s API documentation&lt;/a&gt; to find out how the authentication message should be formulated.&lt;/p&gt;
&lt;p&gt;Since I don&amp;rsquo;t have a valid login for testing purposes, I skipped this step and just used the raw request for demonstration purposes.&lt;/p&gt;
&lt;h3 id="preparing-to-run"&gt;Preparing to run&lt;/h3&gt;
&lt;p&gt;Think time is a delay between requests meant to simulate the time it takes for a user to think before taking another action. Without think time, JMeter would fire off requests one after another, which often isn&amp;rsquo;t realistic and drains resources. I don&amp;rsquo;t want that, so I added a JMeter timer. There are plenty of timers available, but I settled on a Uniform Random Timer.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.vice.com/en_us/article/3a8ajj/an-off-the-shelf-skeleton-project-experts-analyze-the-app-that-broke-iowa"&gt;The CEO of Shadow told Motherboard&lt;/a&gt; that many precinct chairs were confused by the login process as they had to put in three strings of numbers in the right sequence. So, I decided to work that into the script with the timer. I set it up with a constant delay of 2 minutes and a random delay of 1 minute so that the delay would vary from 2 minutes to 3 minutes to simulate a precinct chair attempting to log in a few times.&lt;/p&gt;
&lt;h2 id="execution-running-your-mobile-load-test"&gt;Execution: Running your mobile load test&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.vice.com/en_us/article/z3b3g9/here-is-a-link-to-the-shadow-inc-app-that-blew-up-the-iowa-caucus"&gt;According to Motherboard&lt;/a&gt;, Shadow has already taken the app servers offline. However, it&amp;rsquo;s not a good idea to run a full load test against an endpoint that you don&amp;rsquo;t own, so I decided not to run a test.&lt;/p&gt;
&lt;p&gt;Usually, though, I’d want to start with a shakeout test of 10 users or so, and then gradually increase the user load until the peak of 1,800 users. I also would have played around with changing the load profile, such as by increasing or decreasing the ramp-up or steady-state durations, experimenting with stress tests and soak tests, and adding traffic from another availability zone to simulate the 99 satellite precincts around the world. Running multiple load generators can quickly get out of hand if you want to use physical machines, so I would run load tests on the cloud with something like &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt;. All of these little changes would have given valuable data that would help me gauge the app’s performance in production-like situations.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Building quality software is not a trivial task. There are many moving parts to account for, and critical errors can be introduced in every stage of an app&amp;rsquo;s development. While load issues were not the main culprit in the failure of the IowaReporterApp, a simple load test like the one I describe here, might have improved app stability and reliability. Even in cases where load testing doesn&amp;rsquo;t seem necessary, it can still uncover gross issues in configuration, usability, or security for an app developed on a deadline.&lt;/p&gt;</description></item><item><title>How AirTasker uses Ruby JMeter and Flood for their load testing</title><link>https://nicolevanderhoeven.com/blog/20200224-airtasker/</link><pubDate>Mon, 24 Feb 2020 18:23:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200224-airtasker/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/how-airtasker-uses-ruby-jmeter-and-flood-for-their-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/how-airtasker-uses-ruby-jmeter-and-flood-for-their-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In the recent RubyConf 2020 held in Melbourne, Australia, Nancy Cai from AirTasker talked about how they built a performance testing framework using Ruby JMeter and Flood. Luckily, we had some pleasantly surprised Flooders in attendance to take notes during this fantastic talk!&lt;/p&gt;
&lt;p&gt;AirTasker is a platform allowing the outsourcing of everyday tasks. When discussing the reasons that AirTasker decided they wanted to carry out performance and load testing, Nancy told a fascinating story about an overly successful marketing campaign—a good problem to have, but a problem nonetheless. The Sydney Cats and Dogs Home, an animal shelter, teamed up with AirTasker to pay one lucky person $500 to spend the day playing with the resident animals. The prospect of this dream job created an enormous surge in AirTasker&amp;rsquo;s traffic that caused alarm bells to go off on the underlying application servers, resulting in an end-user experience that was less than desired.&lt;/p&gt;
&lt;p&gt;Nancy included this hilarious slide about some common feelings regarding application performance.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-01.png" alt="A common feeling when application performance is brought up" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="steps-for-running-a-performance-test-the-airtasker-way"&gt;Steps for running a performance test, the AirTasker way&lt;/h2&gt;
&lt;p&gt;To avoid repeating that mistake, Nancy and her team set out to run performance testing by using the following simple steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Determine performance criteria.&lt;/li&gt;
&lt;li&gt;Configure the test environment to be as production-like as possible.&lt;/li&gt;
&lt;li&gt;Plan and design based on user behavior, including preparing test data.&lt;/li&gt;
&lt;li&gt;Implement test design and set up the framework (which in AirTasker&amp;rsquo;s case involved Ruby JMeter as the performance testing tool and Flood as a load testing solution).&lt;/li&gt;
&lt;li&gt;Run test.&lt;/li&gt;
&lt;li&gt;Analyze and fine-tune results.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="setting-up-a-load-testing-tool-and-framework"&gt;Setting up a load testing tool and framework&lt;/h2&gt;
&lt;p&gt;When it came to selecting the right tools for the job, AirTasker wanted tools that met the following criteria:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ability to simulate production-like traffic easily&lt;/li&gt;
&lt;li&gt;Widespread use in the industry&lt;/li&gt;
&lt;li&gt;Ease of creation and maintenance of tests for everyone&lt;/li&gt;
&lt;li&gt;Historical results aggregation&lt;/li&gt;
&lt;li&gt;Visualization of performance metrics&lt;/li&gt;
&lt;li&gt;Integration with CI and monitoring tools&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nancy&amp;rsquo;s team compared several load testing tools and found they enjoyed using the Apache JMeter tool, which is a popular open source load testing software. However, they quickly ran into an &amp;ldquo;out of memory&amp;rdquo; error after attempting to run about 400-800 concurrent users on a single machine. She and her team decided to use a distributed load testing platform to run the load they required to scale up more effectively.&lt;/p&gt;
&lt;p&gt;Enter Flood.&lt;/p&gt;
&lt;h2 id="why-airtasker-chose-flood"&gt;Why AirTasker chose Flood&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-02.png" alt="JMeter, Flood, and the Ruby JMeter gem combination is a winner" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We also chose Flood.io [&amp;hellip;] because it comes in with a really good open-source gem called Ruby JMeter. It is a Ruby-based DSL for building JMeter test plans. - Nancy Cai, AirTasker&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Nancy and her team enjoyed the benefits of being able to write load tests natively in Ruby and then using Flood&amp;rsquo;s Ruby JMeter gem, which is a Domain-Specific Language (DSL). Flood allowed them to turn their Ruby scripts into .jmx files, which is the native XML format that JMeter uses.&lt;/p&gt;
&lt;p&gt;When they were ready to scale up, AirTasker ran the same JMeter script in Flood.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200224-03.png" alt="Sample of a report on Flood from a JMeter test" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;The real-time Flood dashboard allowed them to see that there was a problem on one of the API endpoints, called &amp;ldquo;Get pet reviews.&amp;rdquo; Further investigations revealed a performance issue due to a long-running query against a database server in the code, which AirTasker&amp;rsquo;s developers could fix.&lt;/p&gt;
&lt;h2 id="best-practices"&gt;Best practices&lt;/h2&gt;
&lt;p&gt;Nancy gives some great advice for anyone running a performance test, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;asking the right questions as a load tester&lt;/li&gt;
&lt;li&gt;running baseline tests&lt;/li&gt;
&lt;li&gt;being aware of the difference between your test and production environments&lt;/li&gt;
&lt;li&gt;keeping in mind the caching and autoscaling mechanisms that may drastically change the results&lt;/li&gt;
&lt;li&gt;the differences between stress testing and other types of performance testing&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We were so thrilled to hear Nancy&amp;rsquo;s story on how Flood helped AirTasker run their performance tests. Catch the entirety of Nancy&amp;rsquo;s talk below, and check out the resource links at the end of the post to follow Nancy&amp;rsquo;s story.‍&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/Q09wJm4P8Xw?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/flood-io/ruby-jmeter"&gt;Flood&amp;rsquo;s Ruby JMeter gem&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/nancy-cai/performance-test-ruby-jmeter"&gt;Nancy&amp;rsquo;s GitHub repo&lt;/a&gt; where you can find a copy of her test scripts&lt;/p&gt;
&lt;p&gt;Follow Nancy on &lt;a href="https://twitter.com/nancycai8"&gt;Twitter&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Follow Nancy on &lt;a href="https://github.com/nancy-cai"&gt;GitHub&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Mobile Load Testing on the Cloud</title><link>https://nicolevanderhoeven.com/blog/20200221-mobile-load-testing-on-the-cloud/</link><pubDate>Fri, 21 Feb 2020 18:44:58 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20200221-mobile-load-testing-on-the-cloud/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/mobile-load-testing-on-the-cloud"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/mobile-load-testing-on-the-cloud"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="what-is-mobile-load-testing"&gt;What is mobile load testing?&lt;/h2&gt;
&lt;p&gt;What is the difference between load testing web apps and mobile apps? In general, your goal is the same: to improve app performance by systematically exposing your app to the load you expect, whether it&amp;rsquo;s on the web or on a mobile device. However, while the purpose may be the same, there a few extra things to consider when it comes to mobile app performance, and it&amp;rsquo;s easy to make some key mistakes. In this article, I&amp;rsquo;ll give you a little bit of the theory behind mobile load testing and then show you practical steps to script and execute a load test.&lt;/p&gt;
&lt;h2 id="challenges-in-mobile-load-testing"&gt;Challenges in mobile load testing&lt;/h2&gt;
&lt;p&gt;If you have a web app that is mobile first, and your users typically access your site through a browser on their mobile devices as well as on their laptops, you have more choices for optimizing mobile performance. You can use browser-based load testing tools as well as protocol-level load testing tools to generate load.&lt;/p&gt;
&lt;p&gt;If you have a native mobile app that you&amp;rsquo;d like to load test, though, browser-based load testing tools are a little more complicated. One of the most common approaches to mobile load testing is to use some type of device farm. A device farm is a collection of mobile devices and a way to orchestrate and control them so that they access an application simultaneously. Here&amp;rsquo;s why they&amp;rsquo;re not the best choice for load testing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-01.jpg" alt="Fragmentation can make mobile load testing difficult" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="device-fragmentation"&gt;Device fragmentation&lt;/h3&gt;
&lt;p&gt;One of the biggest challenges is mobile device fragmentation. Not only are there a lot of mobile devices, but there are also many operating systems and versions. Even narrowing the pool to Android and ios leaves us with a large selection. A common mistake in mobile load testing is trying to account for these hundreds of combinations.&lt;/p&gt;
&lt;h3 id="logistics"&gt;Logistics&lt;/h3&gt;
&lt;p&gt;Another challenge is the logistics of controlling physical devices with different operating systems, which is not trivial. Unless you have a thousand friends that you can rope into doing this at the same time, you&amp;rsquo;ll need to pay for some sort of service that can orchestrate this for you.&lt;/p&gt;
&lt;h3 id="cost"&gt;Cost&lt;/h3&gt;
&lt;p&gt;There&amp;rsquo;s also the fact that this process is resource-intensive. Even if your device farm consists of emulators on virtual machines rather than physical mobile devices, that still uses up a lot of CPU and memory, and you&amp;rsquo;d need to spin up dozens or hundreds of machines.&lt;/p&gt;
&lt;p&gt;Luckily, this type of mobile load testing is not the only option available to us.&lt;/p&gt;
&lt;h2 id="better-strategies-for-mobile-load-testing"&gt;Better strategies for mobile load testing&lt;/h2&gt;
&lt;p&gt;A better option for back-end performance testing or load testing your mobile application is by using API load testing, which works on the protocol level. To understand this, let&amp;rsquo;s talk about what aspects of software we are analyzing when we test for &amp;ldquo;performance.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;We can generally break up performance testing into two types: front-end and back-end. Both types have the goal of making the app respond faster to end-users, but they do so by optimizing different parts of the application.&lt;/p&gt;
&lt;h3 id="front-end-performance"&gt;Front-end performance&lt;/h3&gt;
&lt;p&gt;Front-end performance is primarily concerned with the UI of the app. A front-end performance tester optimizes page resources (like CSS, images, JS) to render faster on the page. Since a mobile app runs on a user&amp;rsquo;s smartphone or another mobile device, its front-end performance would also be affected by things we can&amp;rsquo;t control, such as the operating system and version of the mobile or its physical configuration (CPU and memory). A front-end issue for a particular mobile device type might not necessarily affect performance on another. Device farms can be good at measuring front-end performance.&lt;/p&gt;
&lt;h3 id="back-end-performance"&gt;Back-end performance&lt;/h3&gt;
&lt;p&gt;In contrast, back-end performance focuses on the underlying mobile application servers. A back-end performance tester optimizes the things behind the interface, and it is affected by things like the size of the responses that a server sends to a user, server configuration, application infrastructure, and how downstream servers talk to each other. These factors may be invisible to a typical end-user. A performance bottleneck in the back-end is likely to affect all users of an app to some degree.&lt;/p&gt;
&lt;h3 id="load-testing-for-back-end-performance"&gt;Load testing for back-end performance&lt;/h3&gt;
&lt;p&gt;Load testing is about determining how your mobile application behaves in response to traffic, so it targets the back-end components of the application, not the front-end.&lt;/p&gt;
&lt;p&gt;Both front-end and back-end performance are necessary to get a holistic view of mobile performance. Still, &lt;strong&gt;if you want to load test your mobile app, you need to generate traffic on your application &lt;em&gt;server&lt;/em&gt;, and not necessarily to drive the app on real devices&lt;/strong&gt;. Understanding this opens up options for mobile load testing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-02.jpg" alt="A data center can be out of most testing teams’ reach" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="api-load-testing"&gt;API load testing&lt;/h2&gt;
&lt;p&gt;Most native mobile apps work by using a RESTful API to send instructions to the application server. Luckily for us, there&amp;rsquo;s no magic in sending these types of requests from a smartphone— we can simulate this easily by using an API load testing tool to send these requests on a non-mobile device too.&lt;/p&gt;
&lt;p&gt;Here are some advantages of using API load testing tools to test your mobile app instead of using a device farm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s easier to set up and maintain&lt;/strong&gt;: API load testing can be easier because you don&amp;rsquo;t have to account for changes in the user interface as long as the underlying API calls are the same.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It&amp;rsquo;s cost-effective&lt;/strong&gt;: You can run about 1,000 users for an API test on a single machine (we used AWS m5.xlarge machines to arrive at this estimate). This translates into fewer resources that you&amp;rsquo;ll need to pay for whether you&amp;rsquo;re running a thousand users or [a million](whether you&amp;rsquo;re running a thousand users or a million), and, ultimately, a lower cost.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It lets you narrow your load testing scope&lt;/strong&gt;: If you have a particular endpoint that has historically shown performance issues, you can use API load testing to target just that one endpoint. On a device farm, you would have to create a test automation script that might click a button and send dozens of requests, only one of which you actually wanted to test.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="tools-for-mobile-load-testing"&gt;Tools for mobile load testing&lt;/h3&gt;
&lt;p&gt;You can use many tools for API load testing, but you can&amp;rsquo;t go wrong with robust open-source tools like JMeter and Gatling. Both tools are well-used tools in the performance industry, and they also have large user bases and ample documentation for helping anyone get started. In this article, I&amp;rsquo;ll continue with JMeter specifically.&lt;/p&gt;
&lt;p&gt;How do you get started with writing your script? Ideally, your developers should be able to point you to the API documentation for your app or be able to describe the format of the request themselves. But what if you wanted to get started on your own?&lt;/p&gt;
&lt;h2 id="how-to-record-network-traffic-from-a-native-app-with-apache-jmeter"&gt;How to record network traffic from a native app with Apache JMeter&lt;/h2&gt;
&lt;p&gt;Recently I wrote &lt;a href="https://thenewstack.io/how-id-load-test-the-iowa-caucus-app/"&gt;an article on The New Stack&lt;/a&gt; about how I would have load tested the IowaReporterApp, which was responsible for delays in reported vote totals for the 2020 Iowa Democratic Caucuses. To show how to load test that app, I created an actual load testing script for that article, without any input from the app developers. I chose to script using Apache JMeter, a popular open source API load testing tool, but Gatling (also open source) is another good option.&lt;/p&gt;
&lt;p&gt;Here are the steps I took on my Android mobile, a Samsung Galaxy Note 10+. The same principles should apply to iOS devices and other Android devices.&lt;/p&gt;
&lt;h3 id="1-download-and-install-the-app"&gt;1. Download and install the app.&lt;/h3&gt;
&lt;p&gt;Even if the app isn&amp;rsquo;t on the Google Play store, you can install an app using the .apk file. You may have to enable Developer Mode on your phone, which is not the same as jailbreaking. All this does is bypass the security feature that would otherwise not allow you to install apps that don&amp;rsquo;t come from the Play store.&lt;/p&gt;
&lt;p&gt;To enable Developer Mode, go to Settings &amp;gt; About phone &amp;gt; Software information. Then, scroll down to the field Build number and tap it seven times. You should see a confirmation message that Developer mode is on.&lt;/p&gt;
&lt;p&gt;Now download the .apk, click on it, and follow the prompts to install it.&lt;/p&gt;
&lt;h3 id="2-set-up-an-https-test-script-recorder-on-jmeter"&gt;2. Set up an HTTP(S) Test Script Recorder on JMeter&lt;/h3&gt;
&lt;p&gt;You&amp;rsquo;ll need to have JMeter set up already for this step.&lt;/p&gt;
&lt;p&gt;Connect your laptop to a wi-fi network.&lt;/p&gt;
&lt;p&gt;From a new test plan on JMeter, right-click on Test Plan and then click on Add &amp;gt; Non-Test Elements &amp;gt; HTTP(S) Test Script Recorder. Click on it and take note of the port it uses in Global Settings.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-03.png" alt="Checking the port in the JMeter HTTPS Test Script Recorder" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Next, right-click on the test recorder element you just created and click Add &amp;gt; Listener &amp;gt; View Results Tree. This element shows details of requests and responses when we run tests.&lt;/p&gt;
&lt;p&gt;Then, right-click on Test Plan again and click Add &amp;gt; Threads &amp;gt; Thread Group.&lt;/p&gt;
&lt;p&gt;Finally, right-click on Thread Group and click Add &amp;gt; Logic Controller &amp;gt; Recording Controller.&lt;/p&gt;
&lt;p&gt;Your test plan should look something like this:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-04.png" alt="JMeter Test Plan containing a Recording Controller and an HTTPS Test Script Reocrder" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="3-set-up-your-mobile-to-use-a-proxy"&gt;3. Set up your mobile to use a proxy.&lt;/h3&gt;
&lt;p&gt;On your mobile, connect to the same wireless network that your laptop is connected to.&lt;/p&gt;
&lt;p&gt;Go back to your laptop and find out its local IP address. On a Mac, you can see this by clicking on the Apple logo &amp;gt; System Preferences &amp;gt; Network &amp;gt; Advanced &amp;gt; TCP/IP. The IPv4 Address is what you&amp;rsquo;re looking for, and it might look something like 192.168.86.125.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-05.png" alt="Getting your local IP address on a Mac" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;On your mobile, go to Settings &amp;gt; Connections &amp;gt; Wi-Fi. Under Current network, click on the settings wheel next to your wireless network. Click on Advanced.&lt;/p&gt;
&lt;p&gt;Enter your computer&amp;rsquo;s local IP address in the Proxy host name field.&lt;/p&gt;
&lt;p&gt;In the Proxy port field, enter 8888, or the port that was displayed in the HTTP(S) Test Script Recorder on JMeter.&lt;/p&gt;
&lt;p&gt;Click Save.&lt;/p&gt;
&lt;h3 id="4-start-recording-traffic"&gt;4. Start recording traffic.&lt;/h3&gt;
&lt;p&gt;On JMeter, click on the HTTP(s) Test Script Recorder element and click Start.&lt;/p&gt;
&lt;p&gt;On your mobile, open the app and log in or perform the action that you&amp;rsquo;d like to record.&lt;/p&gt;
&lt;p&gt;As you use the app, you should be able to see the requests coming in on JMeter in the View Results Tree:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-06.png" alt="View Results Tree listener view of traffic coming from the proxy" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;If you click on the Recording Controller, you&amp;rsquo;ll also see the exact format of the requests that the app made:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-07.png" alt="Seeing parameters sent with a recorded request in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="scripting-and-troubleshooting-your-mobile-load-testing-script"&gt;Scripting and troubleshooting your mobile load testing script&lt;/h2&gt;
&lt;p&gt;What you now have is a recording of the mobile traffic you need to simulate. If you stop here and try to run it, you may find that it fails. That&amp;rsquo;s because you haven&amp;rsquo;t done any scripting yet.&lt;/p&gt;
&lt;p&gt;Here are a few things you&amp;rsquo;ll need to do to turn a recording into a script.&lt;/p&gt;
&lt;h3 id="add-assertions"&gt;Add assertions&lt;/h3&gt;
&lt;p&gt;An assertion is a way to verify that the request is returning the response that you expect. JMeter only marks a request as failed when it returns an HTTP 4xx or HTTP 5xx response code. However, there are times when the HTTP response code returned is an HTTP 200 OK, but the page that was returned was still not the one you expected. Without assertions, JMeter would mark this request as passed, yielding false positives.&lt;/p&gt;
&lt;p&gt;For instance, if you&amp;rsquo;re sending a login request, then a good assertion for the response to that request might be text like &amp;ldquo;Welcome, Nicole&amp;rdquo; or &amp;ldquo;Logged in.&amp;rdquo; To see the data that should be returned, you can either run through the action manually in your browser and use Developer Tools to inspect the response or click on the response tab in the View Results Tree listener in JMeter from your recording.&lt;/p&gt;
&lt;p&gt;Assertions also allow you to pinpoint more accurately where in your script the error is.&lt;/p&gt;
&lt;h3 id="replace-hardcoded-values-with-dynamic-values"&gt;Replace hardcoded values with dynamic values&lt;/h3&gt;
&lt;p&gt;The last screenshot above shows the parameters that the mobile application sends to the server to log in. If you examine the parameter values, you&amp;rsquo;ll notice that several of them are long strings. The script fails when you just send the same request again because some of these are dynamic. This means that parts of the request need to change before your device is allowed to access the application. You might need to add a timestamp, the right answer to a challenge, a session or client ID, or codes returned in previous requests. These dynamic values help the server determine whether the login request is a valid login attempt.&lt;/p&gt;
&lt;p&gt;This is where help from a developer would come in handy because he or she can tell you how each parameter value needs to be formed.&lt;/p&gt;
&lt;h3 id="add-think-time"&gt;Add think time&lt;/h3&gt;
&lt;p&gt;Think time is a delay between requests that simulates the pauses that a real user takes to read text on the page or otherwise interact with your application. Most performance testing tools do this. In JMeter, they are called timers, and there are several to choose from.&lt;/p&gt;
&lt;p&gt;I like the Uniform Random Timer because it allows you to set a constant value for the delay as well as an additional random delay on top of it. I recommend having a variable delay because setting a completely constant delay makes the test too regular and causes unnaturally high load at the interval you set. Real users don&amp;rsquo;t coordinate with each other, so stagger your requests by using a variable component to your think time.&lt;/p&gt;
&lt;h3 id="debug-your-test-script"&gt;Debug your test script&lt;/h3&gt;
&lt;p&gt;Before you think about scaling up, run your test a few times with one user on your local machine. If you don&amp;rsquo;t get any errors, try other configurations such as running two sequential users and running two threads at the same time. This way, you can test any correlations you&amp;rsquo;ve had to make for those dynamic values.&lt;/p&gt;
&lt;p&gt;It may be tempting to skip this step, but it&amp;rsquo;s necessary before scaling up your load test.&lt;/p&gt;
&lt;h3 id="set-test-parameters"&gt;Set test parameters&lt;/h3&gt;
&lt;p&gt;Test parameters are settings like the number of threads, ramp-up, and duration, which allow you to shape the pattern of the load you want to generate according to your test scenarios and test cases.&lt;/p&gt;
&lt;h4 id="number-of-concurrent-users-or-threads"&gt;Number of concurrent users or threads&lt;/h4&gt;
&lt;p&gt;This is the most obvious way to increase load. The more instances of your script running, the more requests are executed.&lt;/p&gt;
&lt;p&gt;You can change this in JMeter by clicking on your Thread Group and changing the “Number of Threads (users)” field:&lt;/p&gt;
&lt;p&gt;‍&lt;img src="https://nicolevanderhoeven.com/assets/20200221-08.png" alt="Changing the number of threads in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="ramp-up"&gt;Ramp-up&lt;/h4&gt;
&lt;p&gt;In production, load on servers very rarely goes from 0 to 1000 in one second. Even for cases with a very definitive start time (such as an item going on sale at a particular time), the load generally increases gradually. You can simulate this gradual increase by adding ramp-up times in your script. A ramp-up is the amount of time during which new users are added at staggered intervals.&lt;/p&gt;
&lt;p&gt;Here’s an example of what that might look like:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-09.png" alt="Changing the ramp-up of a test in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h4 id="duration"&gt;Duration&lt;/h4&gt;
&lt;p&gt;Duration is how long the whole test lasts.&lt;/p&gt;
&lt;p&gt;The simplest way to set these values in JMeter is to use the basic Thread Group. You’ll need to change the fields highlighted below:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-10.png" alt="Changing test parameters in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;To use the duration, you’ll have to select “Forever” next to Loop Count and “Scheduler” and type in the number of seconds in the Duration field. Otherwise, you can also run the script according to the number of loops, or iterations, that you want to run. However, since response times vary, using the Loop Count as a proxy for duration yields different results from test to test.&lt;/p&gt;
&lt;h2 id="running-a-shakeout-test-against-your-mobile-application"&gt;Running a shakeout test against your mobile application&lt;/h2&gt;
&lt;p&gt;When you&amp;rsquo;re ready to run on your load generators, resist the urge to jump straight to the peak load you want. This is a great way to incur unnecessary costs. Instead, run a small test with dozens of users. Running locally is for debugging issues in the script. The purpose of running a shakeout test is to spot errors elsewhere, such as in your test environment and your test data.&lt;/p&gt;
&lt;h2 id="baselining-your-mobile-application-performance"&gt;Baselining your mobile application performance&lt;/h2&gt;
&lt;p&gt;Finding a baseline is one of the primary goals you’ll have as you start executing load tests. To be able to assess how changes in the environment or code affect application performance, you’ll need a stable point of comparison. To accurately measure the effect of a variable (like a code change), it’s best to keep as much of the other circumstances surrounding the test as fixed as possible. The baseline is your &lt;strong&gt;unchanging&lt;/strong&gt; test scenario that you can use as a point of comparison to assess future performance.&lt;/p&gt;
&lt;p&gt;The application you&amp;rsquo;re scripting against, your tool of choice, and your script all affect your performance baseline, so do some experimenting to find out the setup that works best for your situation. This setup includes characteristics like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the number of concurrent users&lt;/li&gt;
&lt;li&gt;test duration&lt;/li&gt;
&lt;li&gt;think time, pacing, and all other waits and delays&lt;/li&gt;
&lt;li&gt;the script (including how requests are broken up into transactions)&lt;/li&gt;
&lt;li&gt;user density&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="user-density"&gt;User Density&lt;/h3&gt;
&lt;p&gt;User density is the number of threads that you can run on a node or a load generator. Figuring out user density it essential because all load generators, even virtual ones, have finite resources. Each load generator also has a finite amount of load that it can generate, based on its CPU and memory utilization, among other things. Trying to generate too many users on a single node may result in the node itself being the bottleneck for your test.&lt;/p&gt;
&lt;p&gt;To accurately assess your application’s performance, your load generators need to remain healthy during the test.&lt;/p&gt;
&lt;p&gt;It can be helpful to have a number to start with. At Flood, we’ve found that we can reliably run 1000 users using JMeter or Gatling with one of our AWS &lt;a href="https://aws.amazon.com/es/ec2/instance-types/"&gt;m5.xlarge machines&lt;/a&gt;. For reference, an m5.xlarge machine has 4 VCPUs and 16 GB RAM.&lt;/p&gt;
&lt;p&gt;If your machine is similarly specced, run a test on a single node with 1000 users. While the test runs, watch the CPU and memory utilization. If the test finishes without either of those consistently hitting over 80%, you’ll know that the node can handle that number of users.&lt;/p&gt;
&lt;p&gt;Let me reiterate, though, that you should use the 1000 users figure as a starting point only. You can then figure out your number through trial and error. Increase the number of users past 1000 and watch the resource utilization again. If that still looks good, add some more users and rerun. When you get to a test where the resource utilization hovers above 80%, stop and fall back to the previous number of users. You’ll now have your number.&lt;/p&gt;
&lt;p&gt;Another thing you might want to play with is the think time and pacing in your script. These waits tend to have a significant impact on resource utilization, so you can expect to be able to run more users per node if you increase your delays.&lt;/p&gt;
&lt;p&gt;If you’re using JMeter, always run your tests in non-GUI mode. GUI mode is great for debugging, but is unnecessarily resource-intensive for real load tests. While you’re at it, disable any listeners you may have that you don’t need to capture results.&lt;/p&gt;
&lt;p&gt;Figuring out the appropriate user density now prevents you from getting inaccurate test results. Running as many users as you can without overloading the load generators is also cost-effective, as you’ll be making sure that you provision only as many nodes as you need.&lt;/p&gt;
&lt;h2 id="scaling-up-your-load-test-on-the-cloud"&gt;Scaling up your load test on the cloud&lt;/h2&gt;
&lt;p&gt;It’s relatively simple to run a load test on one machine, but if you want to run on two or more machines, things quickly get unwieldy. Here are some options for achieving this.&lt;/p&gt;
&lt;h3 id="1-upload-your-tool-of-choice-and-script-to-every-machine-and-kick-off-each-test-separately"&gt;1. Upload your tool of choice and script to every machine and kick off each test separately.&lt;/h3&gt;
&lt;p&gt;Instead of running one large load test, think of this method as running several smaller ones at (about) the same time. This is relatively easy to set up, but the main disadvantage is that it’s tedious. You may also need licenses for your tools if you&amp;rsquo;re not using an open source one. You’ll want to ensure that each load generator is as similar as possible to the others in terms of operating system, tool version, and script version. Since each node kicks off a separate test, you’re not going to be able to see a real-time combined view of all the load tests, and after execution, you’ll need to retrieve results files individually and combine them.&lt;/p&gt;
&lt;h3 id="2-use-your-tools-distributed-testing-mode"&gt;2. Use your tool’s distributed testing mode.&lt;/h3&gt;
&lt;p&gt;JMeter has a feature that allows you to scale. This involves setting up agents on each load generator and using scripts to coordinate execution and results collection. This method requires a little bit more know-how and time to set up, but it’s a little more cohesive than the first method. Here are links on how to set this up: Remote Testing with JMeter&lt;/p&gt;
&lt;h3 id="3-use-a-load-testing-platform"&gt;3. Use a load testing platform.&lt;/h3&gt;
&lt;p&gt;I&amp;rsquo;m admittedly biased, but if I were to go back to doing performance testing consulting work, I would choose Flood to run my tests. A platform like Flood that is built for distributed load testing is an excellent choice because it takes away all the setup considerations. This is the easiest option, especially for teams that are new to load testing or are perhaps less technical, because all the setup is done through a UI. Scaling out in this case just means uploading your script, choosing the number of nodes you want to run and in which region, and all the work is done for you in the background.&lt;/p&gt;
&lt;p&gt;While you can run on-premises, I would consider running your test cloud-based infrastructure for greater flexibility and ease of scaling unless you already have a data center.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20200221-11.jpg" alt="Running a load test on the cloud is the easiest way to get started with mobile load testing" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="what-happens-next"&gt;What happens next?&lt;/h2&gt;
&lt;p&gt;Running your test is just the beginning of mobile performance testing— there&amp;rsquo;s still metrics collection, results analysis, and resolving performance bottlenecks that you uncover. After all, it&amp;rsquo;s what you do with the test results that counts. Remember that performance and load testing, whether for web-based applications or mobile ones, are iterative. The real value comes from building the app performance testing principles discussed here into your release cycles, so that load testing becomes a habit rather than just a one-off exercise.&lt;/p&gt;</description></item><item><title>Load Testing Tutorial: Server Monitoring</title><link>https://nicolevanderhoeven.com/blog/20190926-load-testing-tutorial-server-monitoring/</link><pubDate>Thu, 26 Sep 2019 19:30:10 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190926-load-testing-tutorial-server-monitoring/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/load-testing-tutorial-server-monitoring"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s difficult to be a good load tester if you don’t like data, because a lot of the value of the load testing is in the analysis. Even if you successfully generate load against an application, it’s ineffective without enough data to determine how your application coped with the load. At &lt;a href="https://flood.io"&gt;Flood&lt;/a&gt;, we’re passionate about data because we know it drives decisions, so we’re always working to improve how we present data generated by our nodes. However, there’s another important source of data that in my experience is too often overlooked by new load testers: your own application servers.&lt;/p&gt;
&lt;p&gt;Executing a load test without monitoring server health is like flying blind: you’ll know when you land safely and you’ll know when you crash, but even if you do crash, you won’t know why—or how you can avoid it next time. Monitoring server health is the black box that will tell you what went wrong.&lt;/p&gt;
&lt;h2 id="what-server-metrics-should-you-monitor"&gt;What server metrics should you monitor?&lt;/h2&gt;
&lt;p&gt;There are a lot of metrics that you can monitor, and we always recommend that you choose what to measure based on your own specific circumstances, such as the &lt;a href="https://flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing/"&gt;purpose for your testing&lt;/a&gt; or any previous outages you’ve had in the past. If you’re new to load testing, though, here’s a list of metrics you might consider measuring:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Processor Time&lt;/strong&gt; - how much the processor is being utilised&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Interrupt Time&lt;/strong&gt; - how much time the processor is spending to handle interrupts&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Privileged Time&lt;/strong&gt; - the time the processor spends handling overhead activities&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Processor Queue Length&lt;/strong&gt; - the number of threads that are waiting to be executed&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory (Available Bytes)&lt;/strong&gt; - unused memory available to process new requests&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Memory Cache Bytes&lt;/strong&gt; - the size of the memory cache, which is where copies of frequently accessed data are stored&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk I/O&lt;/strong&gt; - number of reads and writes to the disk during the test&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Idle Time&lt;/strong&gt; - time that disks are not doing work&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Transfer/sec&lt;/strong&gt; - average number of seconds that an I/O request takes to complete&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Disk Write/sec&lt;/strong&gt; - average number of seconds that a write request takes to complete&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Network I/O&lt;/strong&gt; - bytes sent and received&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="how-do-you-determine-which-one-to-use"&gt;How do you determine which one to use?&lt;/h2&gt;
&lt;p&gt;If you’re still not sure where to start: &lt;strong&gt;At a minimum, you’ll need the CPU and memory utilisation&lt;/strong&gt; (in bold in the list above) of every major component you want to test. These two metrics are vital and if either of these is consistently maxing out at (or close to) 100%, that’s a sign that the component is struggling with the number of requests.&lt;/p&gt;
&lt;p&gt;As an aside, CPU and memory over-utilisation is a very common reason for less-than-ideal response times on the load generators, which is why we also show you those metrics on our nodes while you’re running the test.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-01.png" alt="A snapshot of the server metrics provided for Flood’s servers during execution" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="how-can-you-monitor-these-metrics"&gt;How can you monitor these metrics?&lt;/h2&gt;
&lt;p&gt;How you get these metrics depends on your budget and your operating system. I’ll start with the free or lower cost methods and work my way up to enterprise solutions.&lt;/p&gt;
&lt;p&gt;If your servers are running Windows, &lt;a href="https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/perfmon"&gt;PerfMon&lt;/a&gt; is a good alternative. It’s built into Windows and the interface allows you to choose the counters that you want to measure and start recording.&lt;/p&gt;
&lt;p&gt;There’s also a JMeter &lt;a href="https://github.com/undera/perfmon-agent"&gt;server agent that you can download&lt;/a&gt;, confusingly called “PerfMon” but not to be mistaken with Windows’ PerfMon, that you can install on your (Windows or Linux) server and will gather metrics. It’s normally used in conjunction with the &lt;a href="https://jmeter-plugins.org/wiki/PerfMon/"&gt;PerfMon JMeter plugin&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-02.png" alt="Overview of the setup in the PerfMon JMeter plugin" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.nagios.org/projects/nagios-core/"&gt;Nagios Core&lt;/a&gt; is another good open-source way to not only collect metrics but also set up alerts when values exceed certain thresholds that you can set.&lt;/p&gt;
&lt;p&gt;Moving from free and open-source options to more enterprise solutions, &lt;a href="https://www.dynatrace.com/"&gt;Dynatrace&lt;/a&gt; is a powerful tool that allows you to track not just server health but can actually be used to trace individual requests using a custom header.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.appdynamics.com/"&gt;AppDynamics&lt;/a&gt; is another fantastic tool that allows you to really drill down to specific SQL queries that take a long time to execute, for example, feeding you important information to give to your DBAs.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://newrelic.com/"&gt;New Relic&lt;/a&gt; is another good choice for monitoring production as well as test environments, and we particularly love its thread profiling feature.&lt;/p&gt;
&lt;p&gt;Other noteworthy tools are the &lt;a href="https://docs.microsoft.com/en-us/system-center/scom/welcome?view=sc-om-2019"&gt;Microsoft System Center Operations Manager&lt;/a&gt;, the &lt;a href="https://www.oracle.com/technetwork/oem/enterprise-manager/overview/index.html"&gt;Oracle Enterprise Manager&lt;/a&gt;, and &lt;a href="https://support.microsoft.com/en-us/help/3134893/new-with-bluestripe-factfinder-8-1"&gt;BlueStripe FactFinder&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Flood offers out of the box integrations with Dynatrace, AppDynamics and New Relic. If you’re already using one of these tools, you can push the load metrics from Flood into the dashboards that you’re already using, allowing you to see both load metrics and server metrics in the same place. Here’s an example of a dashboard our own Antonio Jimenez created in New Relic which combined Flood-provided metrics with server-side metrics:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20190926-03.png" alt="Combined dashboard displaying Flood’s front end focused metrics alongside back end focused metrics captured by New Relic" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This view helps with spotting correlations or trends across the different sets of data, such as a response time graph that begins to increase at the same time that server memory utilization does.&lt;/p&gt;
&lt;h2 id="putting-it-all-together"&gt;Putting It All Together&lt;/h2&gt;
&lt;p&gt;Having both sides of the puzzle, the metrics from the application servers along with those from our load generators, gives you a more holistic look of your application performance as a whole, and increases the value you get from load testing. We’d encourage you to take advantage of the 5 free node hours we provide in our trial to give this integrated load testing solution a spin. You can head on over to Flood to sign up for a free trial which will include 5 free node hours and you can drop us a note to get help integrating Flood with your APM solution.&lt;/p&gt;</description></item><item><title>Start with Why: How to Write Requirements for API Load Testing</title><link>https://nicolevanderhoeven.com/blog/20190610-start-with-why/</link><pubDate>Wed, 19 Jun 2019 21:49:17 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190610-start-with-why/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally published &lt;a href="https://www.flood.io/blog/start-with-why-how-to-write-requirements-for-api-load-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Every good test begins with requirements.&lt;/p&gt;
&lt;p&gt;You may think, “But I’m a tester! I’m not a business analyst!”, and I hear you. But as testers, especially on smaller teams or shorter projects, it’s still part of our job to make sure we know what our clients want. Otherwise, how do we know whether we’ve succeeded or failed?&lt;/p&gt;
&lt;p&gt;At Flood, I often speak to project teams who ask for help interpreting reports. Most of those times, the problem is not that they don’t understand the metrics or what they measure. The problem is that they didn’t set pass or fail criteria in the first place, and so they don&amp;rsquo;t have anything to judge the results against. This is always a big warning sign.&lt;/p&gt;
&lt;h2 id="which-performance-testing-metrics-are-important-why-are-we-testing-anyway"&gt;Which performance testing metrics are important? Why are we testing, anyway?&lt;/h2&gt;
&lt;p&gt;Requirements inform every step of the load testing process. Why are we doing load testing? What exactly do we want to test? How will we know when a test has passed or failed? How will we know if application performance is good enough to go into production? What does “good enough” mean?&lt;/p&gt;
&lt;p&gt;&lt;a href="https://flood.io/blog/author/tim-koopmans/"&gt;Tim Koopmans&lt;/a&gt;, co-founder of Flood, coined the acronym SPEAR to describe the different aspects of a performance that should be considered in load testing. This is a great starting point when thinking about what we want our nonfunctional requirements to cover.&lt;/p&gt;
&lt;h3 id="scalability"&gt;Scalability&lt;/h3&gt;
&lt;p&gt;Scalability is the application’s ability to cope with increasing demands by increasing the amount of server resources. This could mean scaling &lt;em&gt;up&lt;/em&gt; (increasing the resources of the dedicated server) or scaling &lt;em&gt;out&lt;/em&gt; (adding more nodes to shoulder the load). What happens when more users than expected sign up in response to a promotion on your site?&lt;/p&gt;
&lt;h3 id="performance"&gt;Performance&lt;/h3&gt;
&lt;p&gt;The most common performance metric is page response time, but there are other considerations to be made here, such as throughput (requests per minute) and the number of concurrent sessions that need to be supported. Things like the total size of the resources on the page, whether or not a CDN is being used, and what to cache are also worth discussing.&lt;/p&gt;
&lt;h3 id="elasticity"&gt;Elasticity&lt;/h3&gt;
&lt;p&gt;Elasticity is a relatively newer aspect to performance testing brought about by advances in the cloud that allow application infrastructure to adapt to changes in load. Unlike scalability, elasticity emphasises scaling down as much as it does scaling up. Testing that virtual machines scale up when load increases is important, but testing that virtual machines also scale down when load decreases can also help save on unnecessary costs.&lt;/p&gt;
&lt;h3 id="availability"&gt;Availability&lt;/h3&gt;
&lt;p&gt;To test for high availability, ask yourself what would happen when (not if) your application’s server fails. Is there another server that the load balancer will seamlessly send traffic towards? Does the throughput fluctuate wildly? If users are connected to one server that fails, is your application smart enough to make new connections to another server? Or will it simply serve up an error page that users won’t know what to do with? Disaster recovery is best tested when there’s no disaster imminent.&lt;/p&gt;
&lt;h3 id="reliability"&gt;Reliability&lt;/h3&gt;
&lt;p&gt;Reliability encompasses a lot of scenarios, but they all have to do with whether or not your application returns expected responses. Does your error rate increase when you increase the duration of your load test? Are you adding verification steps to your load testing scripts to check whether or not the HTTP 200 response that the application returned is not actually an error page?&lt;/p&gt;
&lt;h2 id="what-should-my-applications-response-time-be"&gt;What should my application’s response time be?&lt;/h2&gt;
&lt;p&gt;Our clients frequently ask us what the industry standard is for response times, wanting to make sure their applications measure up. The answer, however, is more complicated than a single number.&lt;/p&gt;
&lt;p&gt;Industry standards for response time are only useful when applications are very similar. Constantly changing technologies used in web development as well as innate differences in business processes, however, make it very difficult to extrapolate a single number that will apply to all, or even most, applications in a certain industry.&lt;/p&gt;
&lt;p&gt;The home page of one e-commerce app, for instance, might be several seconds slower than that of their main competitor. However, that doesn’t take into account the fact that their app loads a video showcasing new products. Does that mean that the development team should remove the video in order to fall in line with their competition?&lt;/p&gt;
&lt;p&gt;Well, maybe. But not necessarily. It’s a business decision that needs to be made after perhaps using focus groups to determine the impact of the video, forecasting changes in conversion rate due to it, and comparing its projected value to the effects of being slower than the competition. A/B experiments could be used to test these assumptions and gather quantifiable data to support the team decision.&lt;/p&gt;
&lt;p&gt;These factors are often not considered in the search for one number to rule them all, which is why a fixation on that number can be detrimental. Instead, I encourage project teams to brainstorm and come up with their own numbers for all metrics that would be more appropriate for their application. Gathering comparative metrics from a competitor may be part of this process.&lt;/p&gt;
&lt;h2 id="what-is-a-good-api-load-testing-requirement"&gt;What is a good API load testing requirement?&lt;/h2&gt;
&lt;p&gt;A good requirement, just like any good goal, is SMART:&lt;/p&gt;
&lt;h3 id="specific"&gt;Specific&lt;/h3&gt;
&lt;p&gt;Vagueness in a requirement leads to vagueness in results interpretation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The performance of the web application…”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The average response time of the Login transaction&amp;hellip;”&lt;/p&gt;
&lt;h3 id="measurable"&gt;Measurable&lt;/h3&gt;
&lt;p&gt;Make sure there is a quantifiable way to know whether requirements have been achieved.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “Decrease user frustration.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The error rate must be below 3% at peak load.”&lt;/p&gt;
&lt;h3 id="agreed-upon"&gt;Agreed Upon&lt;/h3&gt;
&lt;p&gt;Have the appropriate stakeholders been involved?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The system must be able to generate emails as soon as users register.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The system must be able to generate a maximum of 100 emails an hour, after which emails are queued.”&lt;/p&gt;
&lt;p&gt;A good example for this is a project I was involved in that aimed to increase the speed with which emails were generated. Unfortunately, the particular email being sent included a big change that many customers were expected to contact the support team about. The problem was that nobody had thought to include Support in the conversation. Once they heard about the expected end result, the support team quickly raised their concern that they would not be able to handle the expected volume of emails unless the emails were staggered. This could have been avoided if they had been brought into discussions from the very beginning, in the requirements gathering phase.&lt;/p&gt;
&lt;h3 id="realistic"&gt;Realistic&lt;/h3&gt;
&lt;p&gt;Can we meet this requirement given the resources available?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “All requests must be returned within 5 ms.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “90% of the Catalog page requests should be returned within 3 seconds.”&lt;/p&gt;
&lt;h3 id="timely"&gt;Timely&lt;/h3&gt;
&lt;p&gt;Especially for nonfunctional testing, consider adding a timeframe to requirements.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Instead of&lt;/em&gt;: “The digital code is sent by SMS upon successful client log in at peak load.”&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Try&lt;/em&gt;: “The digital code will be sent by SMS no later than 5 minutes after successful client log in at peak load.”&lt;/p&gt;
&lt;h2 id="go-forth-and-write-great-load-testing-requirements"&gt;Go forth and write great load testing requirements&lt;/h2&gt;
&lt;p&gt;Requirements represent a great opportunity to think things through and make sure everyone on the project team is on the same page about the goals for your load testing. Too often projects skip this phase, only to realise much later that the tests that were executed didn’t address a key stakeholder’s concerns.&lt;/p&gt;
&lt;p&gt;In load testing, as in many things: when in doubt about what to do, start with why.&lt;/p&gt;</description></item><item><title>TestCon Moscow 2019: Dismantling Cognitive Biases</title><link>https://nicolevanderhoeven.com/blog/20190403-testcon-moscow-2019/</link><pubDate>Wed, 03 Apr 2019 23:14:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20190403-testcon-moscow-2019/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/dismantling-cognitive-biases-in-performance-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/dismantling-cognitive-biases-in-performance-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Developers and testers alike prefer to think of themselves as entirely rational beings, because both software development and software testing do require systematic rigor and logical reasoning. However, the reality is that the human element still comes into play when building and testing software.&lt;/p&gt;
&lt;p&gt;In &lt;a href="https://testconf.ru/2019/en/nicole-van-der-hoeven/index.html"&gt;this year’s TestCon conference&lt;/a&gt;, held in Moscow, Russia, I delivered a talk on how cognitive biases affect web performance outcomes.&lt;/p&gt;
&lt;p&gt;In the talk, I discuss:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;two types of thinking: fast thinking and slow thinking (from Daniel Kahneman&amp;rsquo;s book &lt;a href="https://www.amazon.com/Thinking-Fast-Slow-Daniel-Kahneman/dp/0374533555"&gt;Thinking, Fast and Slow&lt;/a&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;how to influence the sentence duration that judges give perpetrators&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what cognitive biases are and how they can affect performance testing results&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;a real-life production incident that occurred on Flood and how our team&amp;rsquo;s cognitive biases got in the way of its resolution&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;what to do to avoid cognitive biases when testing software&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Here&amp;rsquo;s the video of my full talk:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
&lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/GPD8F0e7eX8?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;p&gt;Download the presentation &lt;a href="https://nicolevanderhoeven.com/assets/20190403-01.pdf"&gt;in PDF format&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 3: LoadRunner</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-3/</link><pubDate>Thu, 20 Dec 2018 22:54:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-3/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-3-loadrunner-interview-questions"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-3-loadrunner-interview-questions"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Like it or not, &lt;a href="https://www.microfocus.com/en-us/products/loadrunner-load-testing/overview"&gt;LoadRunner&lt;/a&gt; is one of the most popular commercial load test tools, and with good reason. Its protocol support is extensive, and many a load tester has cut his/her teeth on LoadRunner. In this last part of our interview series, we’ll go over some questions you may have to answer when interviewing for a role using Mercury HP MicroFocus LoadRunner.&lt;/p&gt;
&lt;h3 id="what-sort-of-transactions-would-you-put-into-vuser_init-and-vuser_end"&gt;What sort of transactions would you put into vuser_init and vuser_end?&lt;/h3&gt;
&lt;p&gt;Both are used for transactions that would only need to run once, at the beginning and at the end of a script. They’re akin to &lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;’s &lt;code&gt;setUp&lt;/code&gt; and &lt;code&gt;tearDown&lt;/code&gt; thread groups. Some things you might put in vuser_init are user logins or navigation to get to the start of the business process you really want to test, and logouts and any data cleanup to reset the application for the next test are common things to put in vuser_end. Note that if you want each virtual user to iterate through a list of user accounts during the test, you &lt;em&gt;won’t&lt;/em&gt; want to put logins and logouts in vuser_init and vuser_end.&lt;/p&gt;
&lt;h3 id="when-would-you-run-a-script-in-vugen-and-when-would-you-run-it-in-controller"&gt;When would you run a script in VuGen and when would you run it in Controller?&lt;/h3&gt;
&lt;p&gt;VuGen is short for Virtual User Generator, and it’s where the actual scripting is done. Running in VuGen is good for writing or debugging a script, where you can quickly see where a script fails, what the response is, and what you need to change. You can also step through the code line by line (F10) to more accurately see, for example, variable values changing throughout your script. It’s really only for shaking out scripts with a single user. Running in VuGen also only runs from your local machine. Once you’re ready to run a load test, you’d switch to Controller.&lt;/p&gt;
&lt;p&gt;The Controller is like the command center in LoadRunner: from the Controller, you can actually ramp up the number of users and choose from different scenario configuration settings in order to tailor your workload model to the scenario you’re trying to test. Controller also runs the scripts headlessly; it won’t open up a separate instance of VuGen for every user, so it’s a lot more resource intensive. Controller will also allow you to configure remote load generators and run scripts on them.&lt;/p&gt;
&lt;h3 id="how-would-you-set-up-loadrunner-to-run-certain-transactions-a-certain-percentage-of-the-time-for-example-for-every-100-users-that-browses-to-a-site-you-want-25-of-them-visiting-each-of-the-about-catalog-contact-and-reviews-pages"&gt;How would you set up LoadRunner to run certain transactions a certain percentage of the time? For example, for every 100 users that browses to a site, you want 25 of them visiting each of the About, Catalog, Contact, and Reviews pages.&lt;/h3&gt;
&lt;p&gt;You can write the code to visit each page in separate Actions. Then, in Runtime Settings, you can modify the run logic, create an Action Block that has all four actions, and assign a percentage to them (25%).&lt;/p&gt;
&lt;p&gt;Of course, you can also hard code this in C within the actions, if you’d prefer, but moving these values to Runtime Settings makes it easier to maintain and reuse by other testers.&lt;/p&gt;
&lt;h3 id="how-is-loadrunner-pacing-different-from-how-its-implemented-in-other-tools"&gt;How is LoadRunner pacing different from how it’s implemented in other tools?&lt;/h3&gt;
&lt;p&gt;Most test tools allow you to set a fixed or variable pacing that adds onto however long one iteration takes to complete.&lt;/p&gt;
&lt;p&gt;LoadRunner has a pacing feature that allows you to set a specific time and then adds a variable amount of time to your test &lt;em&gt;depending on response times for the included transactions&lt;/em&gt;. So if you set pacing to 5 minutes and one iteration takes 3 minutes to finish, LoadRunner will automatically wait 2 minutes before starting the next one. If it takes 6 minutes, it will not add any more wait time and proceed instead to the next iteration. This comes in handy because you can more accurately predict how many transactions the script will do in a certain amount of time.&lt;/p&gt;
&lt;h3 id="why-would-the-traffic-from-a-load-test-on-loadrunner-not-be-seen-in-google-analytics"&gt;Why would the traffic from a load test on LoadRunner not be seen in Google Analytics?&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://marketingplatform.google.com/about/analytics/"&gt;Google Analytics&lt;/a&gt; runs when the browser of a user downloads and executes a javascript file that then sends information to Google to increment the site statistics for the current visit. However, most traditional load test tools work on the protocol level; that is, they send requests directly to the application server and download resources from a page to simulate users. This means that while they download the Google Analytics script, they don’t execute it, which means the scripted visits aren’t counted.&lt;/p&gt;
&lt;p&gt;In order to use Google Analytics to view statistics from a load test, you’ll need to use a browser-level load test tool. LoadRunner actually has this covered with their &lt;a href="https://marketplace.microfocus.com/appdelivery/content/truclient"&gt;TruClient&lt;/a&gt; protocol, which interacts with elements on the page like a user would. It will also work for testing single-page applications that use &lt;a href="https://en.wikipedia.org/wiki/Ajax_(programming)"&gt;AJAX&lt;/a&gt; to change the data displayed on a page instead of reloading new pages.&lt;/p&gt;
&lt;p&gt;Of course, for open source alternatives to TruClient, we at Flood prefer &lt;a href="http://element.flood.io/"&gt;Element&lt;/a&gt; or &lt;a href="https://flood.io/blog/load-testing-guide-selenium/"&gt;Selenium&lt;/a&gt; load testing, both of that will actually open the site in a browser and executed scripts like a real user.&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 2: JMeter</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-2/</link><pubDate>Thu, 20 Dec 2018 14:47:18 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-2/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-2-jmeter-interview-questions"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-2-jmeter-interview-questions"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In this part, we’ll go over some questions that are commonly asked in technical interviews about the use of the most popular open-source load testing tool, &lt;a href="http://jmeter.apache.org/"&gt;Apache JMeter&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="using-jmeter-you-record-a-key-business-process-upon-playing-it-back-however-you-notice-an-error-on-the-first-page-what-could-have-gone-wrong-and-how-would-you-fix-this"&gt;Using JMeter, you record a key business process. Upon playing it back, however, you notice an error on the first page. What could have gone wrong and how would you fix this?&lt;/h3&gt;
&lt;p&gt;While recorders have gone a long way towards making scripting easier, modern security measures like the implementation of viewstates have also made scripting more complicated to record. Some more complicated applications will pass dynamic values in responses that it expects to see in the succeeding request, otherwise the request is blocked. This is great for security, but it also means that you will need to manually extract these values in your script.&lt;/p&gt;
&lt;p&gt;In JMeter, you would do this by adding a response extractor to your sample that will extract the dynamic string according to rules you set, and then save the string to a parameter. This parameter must then be used in the next request that you send.&lt;/p&gt;
&lt;p&gt;While running your test plan, you get the error: &lt;code&gt;java.lang.OutOfMemoryError: Java heap space&lt;/code&gt;. How do you fix it?
The easy fix is to edit &lt;code&gt;jmeter.bat&lt;/code&gt; and increase the heap memory (search for &lt;code&gt;HEAP&lt;/code&gt;) and increase heap space allocated like this:
&lt;code&gt;HEAP=&amp;quot;-Xms512m -Xmx2048m&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;The part in bold increases the heap space to 2 GB.&lt;/p&gt;
&lt;p&gt;However, it’s also worthwhile looking at your test plan and removing any obvious memory hogs. One of the things we see a lot is enabled listeners that aren’t even being used. Listeners are great while debugging, but should be disabled when running a load test. Writing too many lines to the log is another culprit here that should also be commented out when running important tests. And of course, you should always run JMeter in non-GUI mode during load tests!&lt;/p&gt;
&lt;h3 id="after-running-a-load-test-the-results-show-that-300-transactions-were-executed-with-a-passed-status-and-returning-responses-of-http-200-however-the-dba-tells-you-that-there-were-no-records-written-to-the-database-as-a-result-of-the-transactions-how-would-you-troubleshoot-this"&gt;After running a load test, the results show that 300 transactions were executed with a PASSED status and returning responses of HTTP 200. However, the DBA tells you that there were no records written to the database as a result of the transactions. How would you troubleshoot this?&lt;/h3&gt;
&lt;p&gt;I see this happening with clients all the time, so I think this makes a great technical interview question. This is also why I said earlier that you shouldn’t count on a test tool to tell you a test has passed. It’s possible for a transaction to have the status PASSED and return an HTTP 200 but still be hiding an error.&lt;/p&gt;
&lt;p&gt;This is mainly due to poor scripting that does not include validations that check whether the script has gotten to the right page. For example, you could use a Response Assertion as a child of your home page sample with the words “Welcome, Nicole” to determine whether the user Nicole has logged in successfully.&lt;/p&gt;
&lt;p&gt;This is a critical step, because without it, it’s possible for a server to return a nice error page, or an incorrect one, such as the home page, with an HTTP 200.&lt;/p&gt;
&lt;h3 id="how-do-you-use-a-data-file-to-read-user-account-details-from-a-csv-in-jmeter"&gt;How do you use a data file to read user account details from a CSV in JMeter?&lt;/h3&gt;
&lt;p&gt;JMeter has a &lt;a href="https://jmeter.apache.org/usermanual/component_reference.html#CSV_Data_Set_Config"&gt;CSV Data Set Config Element&lt;/a&gt; built specifically for this purpose. You can simply add one to your test plan, browse to the CSV file that you’d like to use, and select the options for how to share that data among the threads in your JMeter script.&lt;/p&gt;
&lt;h3 id="how-would-you-go-about-testing-a-website-that-uses-http2-on-jmeter"&gt;How would you go about testing a website that uses HTTP/2 on JMeter?&lt;/h3&gt;
&lt;p&gt;There is a JMeter plugin called HTTP/2 Sampler that accomplishes just this. My colleague Jason just wrote &lt;a href="https://flood.io/blog/jmeter-tutorial-http2-test/"&gt;a blog post&lt;/a&gt; on this very topic, but basically the plugin adds new HTTP/2 versions to the standard HTTP request and request defaults samplers as well as the Simple Data Writer and View Results Tree listener. These elements will need to be used in order to test an application using HTTP/2.&lt;/p&gt;
&lt;h3 id="what-can-you-do-to-synchronise-the-execution-of-multiple-jmeter-instances-on-different-load-generators"&gt;What can you do to synchronise the execution of multiple JMeter instances on different load generators?&lt;/h3&gt;
&lt;p&gt;Apache JMeter has released &lt;a href="https://jmeter.apache.org/usermanual/jmeter_distributed_testing_step_by_step.pdf"&gt;this handy PDF file&lt;/a&gt; to describe the steps necessary to run JMeter in distributed mode. This involves installing Java and JMeter on all machines and setting them up in a master and slave configuration so that one machine controls the rest. On the master, you’ll need to add remote hosts to the jmeter.properties file. When everything is set up, you should be able to open up JMeter on the master and do a a remote start of your current test plan on any or all slaves that you choose.&lt;/p&gt;
&lt;p&gt;The problem with this setup is the clunkiness of working with different machines and essentially having to set them up the same way. After the test, there’s the daunting task of logging back onto each machine, gathering the data, and transferring them back into a central repository. Then you’re faced with consolidating the data from each injector in order to see a picture of the whole test. You can see that this set up quickly goes from time-consuming to a nightmare, especially when potentially thousands of different machines are involved.&lt;/p&gt;
&lt;p&gt;If only there were &lt;a href="https://flood.io/"&gt;an easier way&lt;/a&gt;&amp;hellip;&lt;/p&gt;</description></item><item><title>Performance Testing Interview Questions, Part 1: General</title><link>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-1-general/</link><pubDate>Thu, 20 Dec 2018 12:41:40 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181220-performance-testing-interview-questions-part-1-general/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/performance-testing-interview-questions-part-1-general"&gt;
&lt;p&gt;&lt;em&gt;Originally published &lt;a href="https://www.flood.io/blog/performance-testing-interview-questions-part-1-general"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="preparation-is-key-for-the-perfect-interview"&gt;Preparation is Key for the Perfect Interview&lt;/h2&gt;
&lt;p&gt;Performance testing interviews can be a nerve wracking experience. We all understand it’s necessary, but we dread it anyway. Each company has its own style of interview, so you may need to prepare differently for each opportunity. This interview series will cover some general sample questions and scenarios as well as my answers to them to help you nail that performance testing interview!&lt;/p&gt;
&lt;p&gt;I’ve broken down the potential questions into the most popular categories, so you can prepare easily for your all-important interview:&lt;/p&gt;
&lt;h3 id="what-is-performance-testing--what-is-load-testing--what-is-stress-testing"&gt;What is Performance Testing? What is Load testing? What is Stress Testing?&lt;/h3&gt;
&lt;p&gt;Performance testing is the process of systematically determining, quantifying and improving the speed, reliability, and efficiency of an application with the aim of improving user experience. This includes both front-end and back-end performance testing.&lt;/p&gt;
&lt;p&gt;Load testing is a specific type of back-end performance testing where automated scripts are written to send requests in an attempt to simulate the peak user load expected on the application servers.&lt;/p&gt;
&lt;p&gt;Stress testing takes that one step further and applies load in excess of what is expected in order to determine the maximum capacity of the system under test.&lt;/p&gt;
&lt;h3 id="what-is-the-difference-between-front-end-and-back-end-performance-testing-which-one-is-more-important"&gt;What is the difference between front-end and back-end performance testing? Which one is more important?&lt;/h3&gt;
&lt;p&gt;Both front-end and back-end performance testing measure how fast an application responds, but they measure different components of that overall user response time.&lt;/p&gt;
&lt;p&gt;Front-end performance is concerned with how quickly text, images, and other page elements are displayed on a user’s browser page. Back-end performance is concerned with how quickly these elements are processed by the site’s servers and sent to the user’s machine upon request. Front-end performance is the part of the iceberg above the water line, and back-end performance is everything underneath that you can’t see.&lt;/p&gt;
&lt;p&gt;Both are important because they can both determine whether a user continues to use your application. Front-end performance tends to be easier to test and can provide some quick wins due to the large amount of optimisation tweaks that can be done without writing code. Back-end performance tends to be more difficult to test because it often uncovers problems with the underlying infrastructure and hardware that are of a more technical nature.&lt;/p&gt;
&lt;h3 id="why-does-performance-testing-matter"&gt;Why does performance testing matter?&lt;/h3&gt;
&lt;p&gt;Performance testing matters because application performance has a significant impact on user experience. A site that is unreachable or slow to load due to an inability to cope with unexpected load will cause users to browse to competitor’s sites and tarnish the brand’s reputation.&lt;/p&gt;
&lt;h3 id="how-do-you-know-when-a-load-test-has-passed"&gt;How do you know when a load test has passed?&lt;/h3&gt;
&lt;p&gt;Ideally, you would have discussed your nonfunctional requirements with key stakeholders before load testing begins. This means that you set your own pass criteria before you even run the tests. You would ideally have a list of specific transactions (selected based on criticality or complexity according to the business) whose response time needs to fall under a threshold you’ve predetermined. “Fast” is not specific enough&amp;ndash; a number is better. Depending on what kind of tests you’re running (soak, stress, volume, etc) you may have other nonfunctional requirements about duration, resource utilisation on the server side, or specific outcomes to scenarios you’d like to test.&lt;/p&gt;
&lt;p&gt;As a general rule, don’t rely on a load test tool to determine whether your load test has passed. Rely on it to report your results, but always compare the results to the requirements to determine successes or failures.&lt;/p&gt;
&lt;h3 id="what-would-you-advise-to-clients-who-say-they-cant-afford-to-performance-test-because-they-dont-have-the-resources-to-maintain-several-load-generators-on-site"&gt;What would you advise to clients who say they can’t afford to performance test because they don’t have the resources to maintain several load generators on site?&lt;/h3&gt;
&lt;p&gt;This is the main reason that performance testing has for so long been considered a luxury that only big companies can afford. Luckily technology moves on, and in 2018 we’re at a point where everyone can load test. The big innovation here has been the cloud and the ability to spin up thousands of virtual machines with a few mouse clicks. Services like Amazon AWS, Microsoft Azure and Google Cloud make it so that every budding entrepreneur can “borrow” the computing hardware necessary to do cloud load testing with thousands of users and then give them back after the test, without the hassle and cost of maintaining them. I would advise the clients to look for a a cloud load testing solution that utilizes virtual machines on the cloud to run their tests affordably.&lt;/p&gt;
&lt;h3 id="you-run-a-load-test-against-a-server-with-4gb-ram-and-the-results-show-an-average-response-time-of-30-seconds-for-a-particular-request-the-production-server-has-been-allocated-8gb-ram-what-would-you-expect-the-average-response-time-of-the-same-request-to-be-in-production-given-the-same-load"&gt;You run a load test against a server with 4GB RAM and the results show an average response time of 30 seconds for a particular request. The production server has been allocated 8GB RAM. What would you expect the average response time of the same request to be in production given the same load?&lt;/h3&gt;
&lt;p&gt;Trick question! While you may be tempted to answer that the response time would be halved to 15 seconds, reality is rarely that convenient. Response times are a factor of so much more than memory. Things like CPU utilisation, network throughput, latency, load balancing configuration, and just application logic are always going to influence load tests. You can’t assume a linear progression in response time just because you’ve upgraded one part of the hardware. This is why it’s important to load test against an environment that is as production-like as possible.&lt;/p&gt;
&lt;h3 id="what-is-a-percentile-and-why-would-you-look-at-percentile-response-times-when-you-already-have-average-response-times"&gt;What is a percentile and why would you look at percentile response times when you already have average response times?&lt;/h3&gt;
&lt;p&gt;A percentile is a statistical measure that describes a value that a certain percentage of the sample either meets or falls under. For example, a 90th percentile response time of 5 seconds means that 90% of the responses took 5 seconds or less to be returned. It can be an important measure because they soften the impact that outliers have on more inclusive measures such as averages. A transaction with an average response time of 2.5 seconds may seem perfectly acceptable to the business, but when the 90th percentile response time is 20 seconds, this is a good reason to investigate further.&lt;/p&gt;
&lt;h3 id="what-are-some-trends-in-performance-testing-that-you-think-will-continue-in-2019-and-beyond"&gt;What are some trends in performance testing that you think will continue in 2019 and beyond?&lt;/h3&gt;
&lt;p&gt;Cloud is an easy answer, as the cloud brings some compelling benefits in terms of reduced cost and just ease of use. However, I already touched on that in a previous question, so I’ll talk about another trend: open source.&lt;/p&gt;
&lt;p&gt;There’s a reason that open source is still around: it works. The main advantage of open source tools is not that they are free, although that is a big part of the appeal. The real advantage is that open source tools are community-based and community-led, which means features get built for it faster than sometimes commercial tools can keep up with, and they’re built by users of the tool themselves. Open source tools like &lt;a href="http://jmeter.apache.org/"&gt;JMeter&lt;/a&gt;, &lt;a href="http://gatling.io/"&gt;Gatling&lt;/a&gt; and &lt;a href="http://seleniumhq.org/"&gt;Selenium&lt;/a&gt; have revolutionized the industry due to their impressive feature sets, built by a growing community that has developed plugins for everything you can think of. More and more, even big companies with big budgets choose to go open source simply because of the wealth of knowledge of these tools that are already available for free.&lt;/p&gt;
&lt;p&gt;We’re huge proponents of open source tools at Flood, which is why we recently open-sourced our very own tool, &lt;a href="https://element.flood.io/"&gt;Element&lt;/a&gt;. We will continue to support all things open source, because we firmly believe that the future is open source.&lt;/p&gt;</description></item><item><title>Tips and Tricks for Using Flood Element</title><link>https://nicolevanderhoeven.com/blog/20181123-tips-and-tricks-for-using-flood-element/</link><pubDate>Fri, 23 Nov 2018 23:07:24 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181123-tips-and-tricks-for-using-flood-element/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/tips-and-tricks-for-using-flood-element"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/tips-and-tricks-for-using-flood-element"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;In case you missed it, there’s a new performance test tool on the block, and it’s called &lt;a href="https://element.flood.io/"&gt;Flood Element&lt;/a&gt;. It’s a scalable browser-based tool that allows you to write scripts in javascript that interact with web pages like a real user.&lt;/p&gt;
&lt;p&gt;Using Browser Level Users is a &lt;a href="https://flood.io/blog/why-you-should-load-test-with-browsers/"&gt;newer approach to load testing&lt;/a&gt; that overcomes a lot of the common challenges we hear about traditional methods of testing:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Easier scripting that is akin to common functional tools like Selenium and easier to learn&lt;/li&gt;
&lt;li&gt;More realistic results that are based on true browser performance rather than API responses&lt;/li&gt;
&lt;li&gt;Ability to test against all components of your web app, including things like Javascript that is rendered via the browser&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Given the above benefits, it’s a no brainer to check out Flood Element for your web load testing, especially if you have struggled with the existing tools on the market like JMeter or HP LoadRunner.&lt;/p&gt;
&lt;p&gt;Pairing Element with &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt; turns it into a pretty powerful load test tool. We have a &lt;a href="https://help.flood.io/getting-started-with-load-testing/step-by-step-guide-flood-element"&gt;great guide here&lt;/a&gt; that you can follow if you’d like to get started with it. As you can imagine, I’ve been using and testing Element for several months now and I thought I’d share some tips I’ve learned along the way.&lt;/p&gt;
&lt;h2 id="initialising-your-script"&gt;Initialising your script&lt;/h2&gt;
&lt;p&gt;You can always start from scratch, but the quickest way to get started is to type&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element init myfirstelementtest&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;from your terminal, filling in the project name you’d prefer.&lt;/p&gt;
&lt;p&gt;You’ll then be asked to type in the title of your test as well as the URL you’d like to script against. After a minute, you’ll see that a new directory has been created:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-01.png" alt="New directory in Flood Element" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Element will automatically create a file called &lt;code&gt;test.ts&lt;/code&gt;. This file will contain the skeleton of a script, along with some sample code to help you find a button and then click on it. But before you open it, let’s move on to…&lt;/p&gt;
&lt;h2 id="choosing-the-right-text-editor"&gt;Choosing the right text editor&lt;/h2&gt;
&lt;p&gt;Scripting in Element is already pretty simple, but I’ve found two things that really help while scripting are syntax highlighting and code completion. Syntax highlighting will greatly improve your experience when first learning a new test tool like Element, and code completion will make your scripting lightning fast as you become more experienced in the process. My text editor of choice is &lt;a href="https://code.visualstudio.com/"&gt;Visual Studio Code&lt;/a&gt;, which has both of those features. It’s slick and clean, and it does the job.&lt;/p&gt;
&lt;p&gt;Syntax highlighting is when the text editor intelligently changes the font colour of your code according to its role in the programming language you’re using. Here’s a screenshot of the test.ts file we generated earlier in VS Code to show you what I mean:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-02.png" alt="Generated sample Flood Element script" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;This makes it easier to make sense of the code at a glance: comments are in green, values and labels are in orange, etc.&lt;/p&gt;
&lt;p&gt;Code completion is when you start to type something, and VS Code helpfully opens a context menu with suggestions for methods you can use.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-03.gif" alt="Auto-completion in VSCode" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;I love this because it means I don’t have to remember the exact name of the method. It also suggests names of variables you’ve already defined and highlights code that doesn’t make sense. This will help to make your tests more maintainable and readable for others, which is a great benefit as you look to scale your testing out in the future.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-04.gif" alt="Suggestions in VSCode" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="taking-screenshots"&gt;Taking screenshots&lt;/h2&gt;
&lt;p&gt;One of the most powerful features of Element is its ability to take screenshots. I find it immensely useful when debugging because sometimes it’s just easier to see what’s going on visually. With protocol based tools, debugging can often be a much more involved and technical process.&lt;/p&gt;
&lt;p&gt;There are two ways to take screenshots in Element:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Add a setting to automatically take a screenshot when an error is encountered. You can do this by setting screenshotOnFailure to true in TestSettings:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;device&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Device&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;iPadLandscape&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;userAgent&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;flood-chrome-test&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Explicitly take a screenshot at a particular point in the script. You can do this by adding&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;to your code.&lt;/p&gt;
&lt;h2 id="viewing-screenshots"&gt;Viewing Screenshots&lt;/h2&gt;
&lt;p&gt;Once you’ve taken screenshots within your tests, you will likely want to view them and know that they will be stored for future safekeeping. Whether you are running your test locally on have uploaded it to Flood to run with increased concurrency, Flood Element has you covered.&lt;/p&gt;
&lt;h3 id="locally-run-tests"&gt;Locally Run Tests&lt;/h3&gt;
&lt;p&gt;Screenshots will be saved as jpg files in a timestamped folder corresponding to your run. It should look something like: &lt;code&gt;...myfirstelementtest/tmp/element-results/test/2018-11-20T135700.595Z/flood/screenshots/&lt;/code&gt; and the screenshots will be uniquely named so that new screenshots, even for the same step, don’t overwrite older ones.&lt;/p&gt;
&lt;p&gt;However, I rarely have to look up the screenshots in that folder because I prefer to see them in iTerm2 for macOS. iTerm is an alternative to the terminal that works particularly well with Element. When you take a screenshot, iTerm actually shows it in-line:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-05.png" alt="Screenshots shown inline with iTerm" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;h3 id="tests-run-in-flood"&gt;Tests Run in Flood&lt;/h3&gt;
&lt;p&gt;Running an Element script on Flood is ideal when you need larger concurrency. Rather than accessing your screenshot locally, Flood will centralize the images into your account so the images remain even after the cloud load injectors are destroyed. You can get to the screenshot files by downloading Archived Results:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-06.png" alt="Archived Results in Flood" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Or you can also choose to click on a step on the dashboard to see a film strip of your test:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-07.png" alt="Seeing screenshots during a test with Flood" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="using-logs"&gt;Using Logs&lt;/h2&gt;
&lt;p&gt;You may need to check out the logs for more technical debugging, especially when the screenshots don’t tell the whole story. Whether you are running your test locally on have uploaded it to Flood to run with increased concurrency, Flood Element has you covered.&lt;/p&gt;
&lt;h3 id="locally-run-tests-1"&gt;Locally Run Tests&lt;/h3&gt;
&lt;p&gt;You can print to the console by typing, for example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;console.log('orderValues = ' + orderValues)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;This will print the value of the variable orderValues at that point in the script. You would see this in your terminal if you’re running Element locally.&lt;/p&gt;
&lt;h3 id="tests-run-in-flood-1"&gt;Tests Run in Flood&lt;/h3&gt;
&lt;p&gt;If you’re running the script on Flood, you can either download the log (in the same Archived Results zipped file as mentioned earlier) or you can click on the Logs tab:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181123-08.png" alt="Test logs on Flood" loading="lazy" decoding="async"&gt;
‍&lt;/p&gt;
&lt;h2 id="fun-with-flags"&gt;Fun with Flags&lt;/h2&gt;
&lt;p&gt;Element comes with a few flags that give you more control over how the script is run locally. Here are a few of my favourites!&lt;/p&gt;
&lt;h3 id="headless-flag"&gt;Headless Flag&lt;/h3&gt;
&lt;p&gt;When in doubt, run Element in non-headless mode to see the script actually opening the web app on Chrome and interacting with the page. This is only possible locally, but there’s nothing like actually seeing for yourself what’s happening in real time instead of relying on screenshots and logs after the fact. To enable this mode, add the flag when running your test:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run myfirstelementtest.ts --no-headless&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="watch-flag"&gt;Watch Flag&lt;/h3&gt;
&lt;p&gt;Element will automatically close the browser window when it encounters an error or finishes the iteration. Adding &lt;code&gt;--watch&lt;/code&gt; will leave the browser window open and then will monitor the script. As soon as the script is saved, it will automatically run it in the same window from the beginning. Simply add this flag like the above example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run myfirstelement.ts --watch&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="dev-tools-flag"&gt;Dev Tools Flag&lt;/h3&gt;
&lt;p&gt;This opens a browser instance and runs the script with the Chrome Dev Tools open, allowing you to find locators for the next action you want to script. Simply add this flag like the first example:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;--dev-tools&lt;/code&gt;&lt;/p&gt;
&lt;h3 id="more-flags"&gt;More Flags&lt;/h3&gt;
&lt;p&gt;For more flags, use:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run --help&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="try-element"&gt;Try Element&lt;/h2&gt;
&lt;p&gt;You’ve just gotten a crash course on Flood Element. You’re all set! If you haven’t already, download Element &lt;a href="https://element.flood.io/"&gt;here&lt;/a&gt; to start writing functional test scripts and reusing them as load test scripts on Flood. If you don’t have a Flood account, you can easily sign up for a free trial here.&lt;/p&gt;
&lt;p&gt;We’re extremely proud to have been able to contribute to the open-source community and can’t wait to have you try this new addition to the Flood line!&lt;/p&gt;</description></item><item><title>Prepare for Viral Videos With Flood Element</title><link>https://nicolevanderhoeven.com/blog/20181108-prepare-for-viral-videos-with-flood-element/</link><pubDate>Thu, 08 Nov 2018 23:24:31 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20181108-prepare-for-viral-videos-with-flood-element/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/prepare-for-viral-videos-with-flood-element"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/prepare-for-viral-videos-with-flood-element"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;One of the more interesting things to load test is video. You see, traditional load test tools are protocol-based, which means that their approach to load testing video is to capture and simulate the traffic that the browser generates under the covers, sending the same requests to the application. This approach can still be successful&amp;ndash; in fact, one of our favourite clients here at Flood recently &lt;a href="https://blog.hotstar.com/millons-scale-simulations-1602befe1ce5"&gt;used Gatling to simulate 6 million concurrent users&lt;/a&gt; streaming video from their application. However, for some use cases, testing at the protocol level can’t simulate everything that happens in a real world use case.&lt;/p&gt;
&lt;h2 id="the-challenge"&gt;The Challenge&lt;/h2&gt;
&lt;p&gt;If you’re a video creator, the ultimate goal is often a simple goal: creating a viral video. Unfortunately, preparing for and simulating this all-important use case is typically impossible with protocol based tools. The same feature that makes them so efficient &amp;ndash; not using a browser to send the requests &amp;ndash; is the same thing that prevents them from being used to simulate the needed browser level events. You see, things like view counts on a video are normally tracked by scripts running on the page. Traditional tools download these scripts along with other page resources, but the scripts themselves are not executed. Enter Flood Element.&lt;/p&gt;
&lt;h2 id="a-solution-flood-element"&gt;A Solution: Flood Element&lt;/h2&gt;
&lt;p&gt;Flood Element represents a new way of looking at load testing. It is a browser-based tool, which means that it actually drives an instance of the browser to test an application. Rather than telling it what requests to send to simulate a user like you would do with a protocol-based tool, you tell Element which buttons to click or which elements on a page to interact with just as a real user would. Essentially Element IS a user, using your application the way it was meant to be used. This means that it also executes any scripts that would run on the browser side. It’s so realistic that you could even use Element to make your YouTube video viral* by scripting up users to view your content… hypothetically speaking.&lt;/p&gt;
&lt;h2 id="simulating-real-user-views"&gt;Simulating Real User Views&lt;/h2&gt;
&lt;p&gt;Testing video with Flood Element is actually pretty easy, especially if you are familiar with open source testing tools like Selenium. If you haven’t yet begun using Element, go through the installation guide &lt;a href="https://element.flood.io/"&gt;here&lt;/a&gt;. You can download the full script used for this tutorial &lt;a href="https://github.com/flood-io/element/blob/master/examples/youtube.ts"&gt;here&lt;/a&gt;. In this example, we’re going to be using a YouTube video of the opening credits the classical cartoon Top Cat (the indisputable leader of the gang) from Warner Bros.&lt;/p&gt;
&lt;h3 id="step-1-navigate-to-the-video-page"&gt;Step 1. Navigate to the video page&lt;/h3&gt;
&lt;p&gt;Let’s start with a basic script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;const&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;settings&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;loopCount&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;clearCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;disableCache&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;actionDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;stepDelay&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;screenshotOnFailure&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;userAgent&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;flood-element-test&amp;#39;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;export&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;default&lt;/span&gt; () =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;01_Home&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;visit&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;https://www.youtube.com/watch?v=6fvhLlrBrPQI&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is the bones of a basic script in Flood Element. It consists of a single step that involves doing two things: visiting the starting URL, which in this case is the direct link to the YouTube video, and then taking a screenshot once loading the page. Taking screenshots is particularly useful when testing video because screenshots give you a way to check that your script is doing what you want it to do. It’s good to take periodic screenshots as well, to measure progress.&lt;/p&gt;
&lt;p&gt;To help you validate that the script runs well locally before scaling to hundreds or thousands of users, you can use our Element CLI. If you save the above code as youtube.ts, open up your terminal in that directory and then type:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;element run youtube.ts&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Assuming you’ve got Element set up correctly, you should see something like this: (Note that screenshots are only available when using iTerm as your shell. They are also saved as files under &lt;code&gt;.../tmp/element-results/youtube&lt;/code&gt; .)
‍
&lt;img src="https://nicolevanderhoeven.com/assets/20181108-01.png" alt="Screenshots shown while running Element in iTerm" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Oops! It looks like our script does navigate to the page, but it doesn’t play the video. We’ll need to click on that play button. Let’s add that to our script.&lt;/p&gt;
&lt;h3 id="step-2-click-the-play-button"&gt;Step 2. Click the Play button&lt;/h3&gt;
&lt;p&gt;We’ll need to add some lines to click the play button after visiting the page but before we take the screenshot, so that we can verify later whether or not the play button was clicked.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;02_ClickPlay&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Click on Play button
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;let&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;playBtn&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;findElement&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;xpath&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;//button[@aria-label=&amp;#34;Play&amp;#34;]&amp;#39;&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;playBtn&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;click&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example I used Xpath, but you do have the option to select based on partial text, CSS selector, etc. A tool I like to use to get these is Chrome Developer Tools’ Elements tab, which allows you to get the selectors for a particular element.&lt;/p&gt;
&lt;h3 id="step-3-take-periodic-screenshots"&gt;Step 3. Take periodic screenshots&lt;/h3&gt;
&lt;p&gt;To make sure that the video is really playing, we’ll need to take a screenshot a few seconds after the initial screenshot in order to visually confirm that the video has progressed. Even better, we can get Element to take screenshots at regular intervals. So let’s add a third step:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#39;03_Play&amp;#39;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;async&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt; =&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//Take a screenshot every 5 seconds until video finishes
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;‍&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;60&lt;/span&gt;; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt;&lt;span style="color:#f92672"&gt;++&lt;/span&gt;) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;takeScreenshot&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;await&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;browser&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;wait&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; })
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To use &lt;code&gt;i&lt;/code&gt;, we&amp;rsquo;ll also need to declare it earlier in the script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;import&lt;/span&gt; { &lt;span style="color:#a6e22e"&gt;step&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;TestSettings&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;By&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;Until&lt;/span&gt; } &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;@flood/element&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;‍&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;i&lt;/span&gt; &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this step, &lt;code&gt;i&lt;/code&gt; will correspond to every 5 seconds of playtime for the video, so we&amp;rsquo;ll need to make sure that the limit of &lt;code&gt;i&lt;/code&gt; that we set is sufficient time for the entire video to play. Every 5 seconds, Element will take a screenshot, which will help us verify that the video is progressing after the test.&lt;/p&gt;
&lt;p&gt;Click &lt;a href="https://github.com/flood-io/element/blob/master/examples/youtube.ts"&gt;here&lt;/a&gt; to download the script before moving on to the next step, unless you’ve been following along at home.&lt;/p&gt;
&lt;h3 id="step-4-run-it-on-flood"&gt;Step 4. Run it on Flood!&lt;/h3&gt;
&lt;p&gt;The final step is to upload it to Flood and run the test. Click &lt;a href="https://guides.flood.io/scripting-and-tools/flood-element/getting-started-with-element"&gt;here&lt;/a&gt; to see a step-by-step guide for how to do just that. You can choose how many users you’d like to run on Flood and across how many nodes. New users will be given 5 node hours which will allow them to run a test with up to 250 users for 1 hour. Each node will have a different IP address, so plan for that accordingly if your application takes that into account.&lt;/p&gt;
&lt;p&gt;One of the things I love about running it this way is that if you click on the arrow to the right of the sole transaction, you can see screenshots taken along the way to prove that the video is being played:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20181108-02.jpg" alt="Screenshots during test execution in Flood" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h2 id="some-considerations-for-load-testing-video-with-flood-element"&gt;Some Considerations for Load Testing Video with Flood Element&lt;/h2&gt;
&lt;h3 id="taking-screenshots-and-using-logs-are-necessary-for-debugging"&gt;Taking screenshots and using logs are necessary for debugging.&lt;/h3&gt;
&lt;p&gt;Because the page elements while a video is streaming are static, we’re not going to be able to use those as clues as to where we are in our scenario. To compensate, it’s a good idea to take screenshots and use console.log() to determine progress, especially while debugging. Be careful not to go overboard on these when actually running the load test though, as they will consume system resources.&lt;/p&gt;
&lt;h3 id="videos-may-behave-differently-in-headless-mode"&gt;Videos may behave differently in headless mode.&lt;/h3&gt;
&lt;p&gt;While writing this tutorial, I realised that YouTube auto-plays videos when on non-headless mode (aka, when opening a video link manually on a browser or with the &lt;code&gt;--no-headless&lt;/code&gt; flag in Element). When it’s executed in headless mode via Flood Element, it requires a click on the play button to begin. Again, use screenshots to aid you in spotting these differences.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Element’s browser-level scripting capabilities allow it to simulate users that interact with pages just like human users would. Element and Flood are a powerhouse combo, providing the flexibility to test with thousands of users across the world within a few minutes.&lt;/p&gt;
&lt;p&gt;Element seeks to reduce the gap between a scripted user and a real user &amp;ndash; and it’s so realistic that it’s hard to tell the difference. We encourage you to take advantage of our free trial offer and run some real world load tests today!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;*We don’t advise or condone the use of Element to artificially inflate views on YouTube in any way which may violate its &lt;a href="https://www.youtube.com/static?template=terms"&gt;Terms of Service&lt;/a&gt;. The purpose of this article is to showcase Element and how realistically it recreates real users.&lt;/em&gt;&lt;/p&gt;</description></item><item><title>Manufactured Chaos: How Netflix Does Performance Testing</title><link>https://nicolevanderhoeven.com/blog/20180328-manufactured-chaos/</link><pubDate>Wed, 28 Mar 2018 23:35:52 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20180328-manufactured-chaos/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/manufactured-chaos-how-netflix-does-performance-testing"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/manufactured-chaos-how-netflix-does-performance-testing"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;It’s always ideal to run performance tests against an environment that’s production-like. That way, you can ensure that your tests aren&amp;rsquo;t being influenced by factors that are not present in production - such as sub-optimal specifications, or the configurations of a test server. So, what does a good performance tester do? They compare their machine specifications and request production-sized boxes to run their tests against. But is that really enough?&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s the reality: despite our planning, we still sometimes see things in production that we don’t see, and can’t reproduce, in the test environment. It&amp;rsquo;s hard to predict every possible failure. Even if you do recognize the danger, it’s still difficult to recreate the perfect storm of circumstances that could potentially lead to its occurrence. The more complex your network architecture is, the more likely it is that these failures will occur. As a result, there’s something of a “don’t breathe or it might break” feeling that comes with deploying to production. So how do you test your application to get the maximum degree of confidence in its performance?&lt;/p&gt;
&lt;p&gt;If you’re Netflix, your answer would be to &lt;strong&gt;lean into the chaos&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Chaos theory, in a nutshell, tells us that what looks random actually contains patterns that, while unpredictable, are recognizable and thus manageable. Far from representing disorder, chaos is our word for events that may be infinitely complex and interconnected in ways that aren’t immediately apparent. Chaos engineering takes this principle and applies it to software. Developers can code to reduce the occurrence of chaos as much as possible, but they can also code to make sure applications can withstand chaos if it does occur. As testers, one way we can test the latter is to manufacture chaos.&lt;/p&gt;
&lt;p&gt;Netflix’s testing strategy puts a lot of emphasis on manufacturing chaos because their business model involves streaming gigabits of data to customers on demand, from anywhere in the world, at a consistently fast enough speed that people aren’t annoyed by buffering in the middle of a rousing speech by the Mother of Dragons. In 2015, Netflix accounted for 36% of traffic in &lt;a href="http://fortune.com/2015/10/08/netflix-bandwith/"&gt;North America&lt;/a&gt;. Netflix customers stream 125 million hours of video &lt;a href="https://www.wired.com/2016/03/netflixs-grand-maybe-crazy-plan-conquer-world/"&gt;every day&lt;/a&gt;. Netflix used to serve the content from their own private data centers but moved to the cloud in 2008 after a database corruption disrupted their business for three days. Today, Netflix is 100% in the cloud, which provides tangible benefits such as architecture that can scale on demand thanks to their use of Amazon Web Services (AWS) - incidentally, the same CDN that we use here at Flood IO. However, even the cloud isn’t invulnerable to chaos. Enter the Simian Army.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180328-01.png" alt="The Simian Army at Netflix" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Conjuring up the humorous image of a squadron of monkeys wreaking havoc in a data center, the Simian Army is a series of tools developed by Netflix that code chaos into their tests - on purpose. At Netflix, every build has to pass not just the standard suite of functional and nonfunctional tests, but also the chaotic-but-programmable tests of the Simian Army, all of which Netflix have made available as open-source tools on Github. Each monkey is a real-world manufactured-chaos test that the application under test must pass in order to be deployed into production with a high degree of confidence in its stability and continued performance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Chaos Monkey&lt;/strong&gt; selects a node or container within a node at random and terminates it unexpectedly, forcing Netflix engineers to adapt their code to deal with this behavior by quickly rerouting requests to backup nodes and containers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Janitor Monkey&lt;/strong&gt; detects unused resources (instances, volumes) in the cloud and terminates them. Ideally, all resources no longer used should be shut down, but in practice this doesn’t always happen. People forget to delete things they’re not using anymore. Applications are changed to use new volumes, and old ones are forgotten. While it’s a good idea to make sure everyone is aware of the need to clean up after themselves, Janitor Monkey assumes that things will fall through the cracks and automatically comes to the rescue. Janitor Monkey also sends a notification to the owner of the resource with enough time to mark the resource as an exception before deletion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Conformity Monkey&lt;/strong&gt; scans instances and determines whether they conform to a set of rules specified by the organization. If an instance is not configured the right way, Conformity Monkey sends the owner a notification. It can detect things like an instance being created without the appropriate security groups or tags.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Security Monkey&lt;/strong&gt; monitors your entire public or private cloud to look for policy changes or incorrectly configured instances that could lead to serious security breaches. It even provides a UI so that you can see a history of changes to important policies and whom they were made by.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The Simian Army&lt;/strong&gt; is a marked departure from traditional software testing techniques, which are very much procedural and based on predetermined flows. The assumption is that people behave logically, are all experts in their field, forget nothing, and always follow best practices. But is this actually realistic?&lt;/p&gt;
&lt;p&gt;Netflix’s approach to testing is innovative in that they don’t assume that everyone involved knows exactly what they’re doing, from the developers to the infrastructure engineers to the testers. Neither do they assume that it is always possible to know the exact cause of failures in production. Sometimes bad stuff just hits the fan and nobody sees it coming. The very nature of our work in technology requires constant change, and it can be difficult to keep up with all the ways in which applications are becoming increasingly more integrated with each other. This will only become more apparent as the Internet of Things becomes more popular.&lt;/p&gt;
&lt;p&gt;At &lt;a href="https://flood.io/"&gt;Flood&lt;/a&gt;, we often see our customers targeting production environments, and there are some strong arguments for doing this. Testing later in the lifecycle means we can start to tackle production-sized problems around availability, scalability and reliability that would have otherwise been difficult to reproduce. Let’s face it. We all sometimes see monkeys in our data centers. Maybe it’s time we started planning for it.&lt;/p&gt;
&lt;h2 id="references"&gt;References:&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://media.netflix.com/en/company-blog/completing-the-netflix-cloud-migration."&gt;Completing the Netflix cloud migration&lt;/a&gt;
&lt;a href="http://fractalfoundation.org/resources/what-is-chaos-theory/"&gt;What is chaos theory?&lt;/a&gt;
&lt;a href="http://principlesofchaos.org/"&gt;Principles of chaos engineering&lt;/a&gt;
&lt;a href="https://medium.com/netflix-techblog/the-netflix-simian-army-16e57fbab116"&gt;The Netflix Simian Army&lt;/a&gt;
&lt;a href="https://medium.com/becloudy/chaos-engineering-surviving-the-failures-in-distributed-systems-5688c6905dbb"&gt;Chaos engineering - surviving the failures in distributed systems&lt;/a&gt;
&lt;a href="https://www.linkedin.com/pulse/chaos-engineering-series-part-i-deep-dive-sathiya-shunmugasundaram/"&gt;Chaos engineering series - Part 1: chaos engineering deep dive&lt;/a&gt;
&lt;a href="https://github.com/Netflix/SimianArmy/wiki"&gt;What is Simian Army?&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Why AirBNB Plus Could Make or Break AirBNB</title><link>https://nicolevanderhoeven.com/blog/20180224-why-airbnb-plus/</link><pubDate>Sat, 24 Feb 2018 23:24:00 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20180224-why-airbnb-plus/</guid><description>&lt;p&gt;Originally published on &lt;a href="https://medium.com/@n_vanderhoeven/why-airbnb-plus-could-make-or-break-airbnb-36c39a2c1669"&gt;Medium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;“We’ve done the anywhere part,” Brian Chesky announced a few days ago, “but AirBNB is still, for some, an alternative way of travelling… until today.”&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.airbnb.com/plus"&gt;AirBNB Plus&lt;/a&gt; is a new tier of service that AirBNB have introduced for homes and hosts that go beyond the Superhost standard.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180224-01.jpg" alt="" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here’s what an AirBNB Plus listing means:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The home has been verified by an AirBNB representative in person to have passed a 100-point checklist of quality. AirBNB has not yet publicly released the contents of the checklist.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The home comes with a list of extra amenities, such as a fully-stocked kitchen, wireless internet, and even paintings on the wall.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The host has received an average rating of at least 4.8 out of 5 stars.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You will be able to check in reliably at any time of the day. This could be due to an electronic keypad, safe lockbox or simply a host that’s willing to come out and let you in when you’re ready.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;You automatically get premium support from a designated AirBNB Plus team in case anything goes wrong.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;AirBNB has indicated that for now, only those who are already Superhosts will be eligible to request AirBNB Plus status.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;According to &lt;a href="https://www.theverge.com/2018/2/22/17040684/airbnb-plus-hotels-standard-amenities-service-loyalty-program"&gt;the Verge&lt;/a&gt;, the host needs to pay $149 to apply to be considered for AirBNB Plus status.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;AirBNB Plus listings are already available in several cities around the world: Austin, Barcelona, Cape Town, Chicago, Los Angeles, London, Melbourne, Milan, Rome, San Francisco, Shanghai, Sydney and Toronto, so you can &lt;a href="https://www.airbnb.com/s/select_homes"&gt;go check them out yourself&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On the surface, this sounds like a great idea. I almost always travel with AirBNB, and when I’ve chosen to book a typical hotel, it’s always because I couldn’t find a Superhost listing to book. I’ve had bad experiences with AirBNB in the past, and have since decided to only book with Superhosts. However, even that is not a real guarantee of quality — in contrast to AirBNB Plus, becoming a Superhost has much less stringent rules.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Here’s what a Superhost listing means:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;The host has received an average of at least a 4.8-star rating for all stays.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The host reponds to messages within 24 hours at least 90% of the time.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;At least 10 guests have stayed at the property in the last year.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The host has never cancelled a reservation.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;It’s almost entirely review-based: the requirement to maintain at least a 4.8-star rating is the most difficult hurdle. There are otherwise no quality requirements that the listing must maintain. In effect, Superhosts are community-selected, which is tricky because a string of teenagers used to hostels and leaving glowing reviews on a listing could make it appear more attractive than it actually is. I’ve stayed with Superhosts that had faulty showers, unstable internet and a kitchen that consisted of a sink and a kettle.&lt;/p&gt;
&lt;p&gt;So I really like the idea of a higher class of accommodations that have been independently inspected. This is the first time they have ever offered anything like a guarantee for the quality of their things. Previously there was still a bit of a risk with booking an AirBNB, but this should dispel all doubt. AirBNB is doing what every company does after its initial growth spurt: it’s bunkering down, standardising its product… and, in effect, increasing some of its prices.&lt;/p&gt;
&lt;p&gt;While price increases are not explicitly mentioned, it seems reasonable to expect that listings in this new category would fetch higher prices. After all, it costs more labour on AirBNB’s part to inspect these listings and it also costs the host at least $149, not to mention extra costs spent to meet the 100-point checklist. AirBNB Plus is no doubt a premium offering, catered towards a wealthier clientele.&lt;/p&gt;
&lt;p&gt;Another concern is that the line between AirBNBs and hotels are blurring, and not necessarily in a good way. The original appeal of an AirBNB was that it was someone’s personal home, with all the quirks and defects that come with it. AirBNB’s overwhelming success then brought about a new class of landlords who buy properties with the specific intention to rent them via the platform. Already there are several boutique hotels that have been allowed to list accommodations as well.&lt;/p&gt;
&lt;p&gt;The new Plus tier seems to narrow the gap between corporate hotel chains and spare rooms owned by real locals substantially. This feels less like a disruption of the hotel industry and more like a return to the status quo. I remain a huge fan of the brand, and I worry that AirBNB will lose that disruptive “plucky startup” charm — because they’re no longer a startup. They’re a major player, and if this announcement is anything to go by, they’re about to get even bigger.&lt;/p&gt;</description></item><item><title>Should I Upgrade to JMeter 4.0? 5 Reasons to Upgrade</title><link>https://nicolevanderhoeven.com/blog/20180223-should-i-upgrade-to-jmeter-4/</link><pubDate>Fri, 23 Feb 2018 23:43:25 +0100</pubDate><guid>https://nicolevanderhoeven.com/blog/20180223-should-i-upgrade-to-jmeter-4/</guid><description>
&lt;link rel="canonical" href="https://www.flood.io/blog/should-i-upgrade-to-jmeter-4-0-5-reasons-to-upgrade"&gt;
&lt;p&gt;&lt;em&gt;Originally posted &lt;a href="https://www.flood.io/blog/should-i-upgrade-to-jmeter-4-0-5-reasons-to-upgrade"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Apache has just launched &lt;a href="http://jmeter.apache.org/download_jmeter.cgi"&gt;JMeter 4.0&lt;/a&gt;, a big step up from their previous release, 3.3, which was only released in September last year. Apache seems to be stepping up the frequency of it’s releases, and we’re not complaining. JMeter is an amazing open source load testing tool and the most popular one used at &lt;a href="http://flood.io/"&gt;Tricentis Flood&lt;/a&gt; by far.&lt;/p&gt;
&lt;p&gt;The big question is: Should you upgrade? Are the new features worth the leap? Will the new black UI make you a better load tester? While this choice should be made on a case-by-case basis and we certainly can’t pretend to give one-size-fits-all advice, here are some good arguments to do it:&lt;/p&gt;
&lt;h3 id="1-java-9-support"&gt;#1: Java 9 support&lt;/h3&gt;
&lt;p&gt;JDK 9 was released back in September 2017, and if you were one of the people who upgraded to it when prompted, you would have noticed to your frustration that JMeter 3.3 did not play well with it, yielding the error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: Java version -- 9.0.1 -- is too low to run JMeter. Needs a Java version greater than or equal to 1.8.0 errorlevel&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Good news! This is now fixed. JMeter 4.0 runs smoothly on JDK 9. We&amp;rsquo;ll continue running on JDK 8 at Flood for consistency amongst all our open source load testing tools.&lt;/p&gt;
&lt;h3 id="2-new-boundary-extractor"&gt;#2: New Boundary Extractor&lt;/h3&gt;
&lt;p&gt;Previously, my preferred way to extract dynamic values in JMeter was to use a regular expression extractor, but there’s no doubt that it can sometimes be tricky to get just the right text out of a response. Enter the &lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#Boundary_Extractor"&gt;Boundary Extractor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The boundary extractor allows you to simply set the text immediately before and after the text you want to extract. This saves you wondering whether you should have used a + or a * in your regular expression, and is also easier to validate.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-01.png" alt="Boundary Extractor in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="3-new-json-assertion-element"&gt;#3: New JSON assertion element&lt;/h3&gt;
&lt;p&gt;While XPath assertion was great, there was previously no counterpart for JSON. The &lt;a href="http://jmeter.apache.org/usermanual/component_reference.html#JSON_Assertion"&gt;JSON Assertion&lt;/a&gt; element fills that void nicely, using &lt;a href="https://github.com/json-path/JsonPath"&gt;JsonPath&lt;/a&gt; to quickly assert the existence (or non-existence, with the Invert assertion option ticked) of a particular element.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-02.png" alt="JSON Assertion element in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;h3 id="4-new-throughput-timer"&gt;#4: New throughput timer&lt;/h3&gt;
&lt;p&gt;We have a new throughput timer to play with, and it’s called &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/usermanual/component_reference.html#Precise_Throughput_Timer"&gt;Precise Throughput Timer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://nicolevanderhoeven.com/assets/20180223-03.png" alt="Precise Throughput Timer in JMeter" loading="lazy" decoding="async"&gt;
&lt;/p&gt;
&lt;p&gt;Whereas the Constant Throughput Timer also had the disadvantage of constant pacing of requests, the Precise Throughput Timer is based on the &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/usermanual/component_reference.html#Poisson_Random_Timer"&gt;Poisson Random Timer&lt;/a&gt; and randomly generates the delay between each request. The implementation seems to be well thought out, with the component reference section listing a lot of scenarios they’ve tested for that the previous Constant Throughput Timer might have struggled with. Throughput timers are one of my favourite JMeter features, and still rather unique in the industry.&lt;/p&gt;
&lt;h3 id="5-test-plan-autosave"&gt;#5: Test Plan Autosave&lt;/h3&gt;
&lt;p&gt;This one’s more of a usability tweak, but it’s a good one. JMeter now automatically saves your script when you run a test, saving you from those all-too-familiar “Wait… did I CTRL+S before I hit CTRL+R?” moments.&lt;/p&gt;
&lt;p&gt;Click &lt;a href="http://home.apache.org/~milamber/jmeter-4.0RC4/docs/changes.html"&gt;here&lt;/a&gt; to see the full release notes for version.&lt;/p&gt;
&lt;h3 id="bonus-reason-tricentis-flood-support"&gt;BONUS reason: Tricentis Flood support&lt;/h3&gt;
&lt;p&gt;You can now upload JMeter 4.0 scripts to flood.io and be up and running with your first test hosted on one of our grid nodes around the world. Our customer support team is always happy to help you make the switch to 4.0.&lt;/p&gt;</description></item><item><title>How I Became Financially Independent in 5 Years</title><link>https://nicolevanderhoeven.com/blog/20180222-how-i-became-financially-independent-in-5-years/</link><pubDate>Thu, 22 Feb 2018 11:40:32 +0000</pubDate><guid>https://nicolevanderhoeven.com/blog/20180222-how-i-became-financially-independent-in-5-years/</guid><description>&lt;p&gt;Here’s my secret: I’m 32 years old and I am financially independent. And my husband and I did it all, from $0 to where we’re at now, in 5 years.&lt;/p&gt;
&lt;h2 id="what-is-financial-independence"&gt;What is financial independence?&lt;/h2&gt;
&lt;p&gt;But let’s back up. Financial independence means I no longer &lt;em&gt;need&lt;/em&gt; to work to support myself and my husband. This does not mean I’m filthy rich; this means only that if I stopped working right now, we would be able to continue living a simple life without needing to worry about paying the bills. If you actually do the calculations, that number is not as high as you might think.&lt;/p&gt;
&lt;p&gt;Still, it’s a huge financial milestone that gives me a lot of freedom. Think about it: if you have enough money to cover my basic living expenses, why would you choose a job you don’t like? Why would you spend 8+ hours of my day, 5 days a week, with people whose company you don’t genuinely enjoy? It’s called financial &lt;em&gt;independence&lt;/em&gt; because it’s the end of slavery — slavery to the rat race and to the whims of the corporate world. Financial independence gives you the freedom to design and pursue the life you actually want.&lt;/p&gt;
&lt;h2 id="where-we-started"&gt;Where we started&lt;/h2&gt;
&lt;p&gt;When my husband Rob and I moved in together, we had a negative net worth. We had his three teenage children living with us and neither of us had a job. We lived in a small town that didn’t have many job opportunities in his industry and I, with my Australian permanent residency still in progress, was not allowed to work in Australia. Finally Rob found a job in Melbourne, and we moved the entire family there. We signed the lease on a ridiculously expensive rental house in order to get the kids in the right zone for the best high school we could afford. Despite Rob’s income, we struggled, borrowing from credit cards to finance expenses we just couldn’t seem to get on top of.&lt;/p&gt;
&lt;p&gt;Eventually I got my permanent residency and a job. Even though my income could just barely cover the rent, that money made us feel rich. As the years went by and my salary increased, so did our expenses. We had lunch out nearly every day while we threw out spoiled groceries at home. We went to several concerts and theatres, some of them twice or thrice. We bought a car — on loan, of course. Almost our entire paychecks were immediately spent paying off the credit card bills from the last month; then we’d use the same credit cards to pay off this month’s expenses. In short, we were incredibly irresponsible. Still, thanks to dual higher-than-average IT incomes, we managed to convince a bank to give us a mortgage. Despite our incomes we could only afford a laughable 2% downpayment on the house — while we still owed money on credit cards.&lt;/p&gt;
&lt;p&gt;Year 0 actually begins the day Rob’s current project ended. He was a contractor, so no project meant no job. Knowing we’d have to live tight on just my salary to meet the mortgage and our monthly living expenses, I started to search for budgeting tips online. What I found would eventually lead us down the road to financial independence. I took control of our finances and changed them around. Here’s what I did.&lt;/p&gt;
&lt;h2 id="what-we-did"&gt;What we did&lt;/h2&gt;
&lt;h3 id="i-consolidated-all-our-accounts"&gt;I consolidated all our accounts**.&lt;/h3&gt;
&lt;p&gt;We had several transaction accounts, savings account and credit cards, and the first step was to have fewer buckets for our money. Having fewer accounts made it easier to keep track of everything, especially in the beginning, and it also meant it was easier to calculate our (then negative) net worth and track changes to it.&lt;/p&gt;
&lt;h3 id="i-used-the-envelope-system-for-budgeting-to-keep-a-lid-on-our-daily-expenses"&gt;I used the envelope system for budgeting to keep a lid on our daily expenses.&lt;/h3&gt;
&lt;p&gt;Specifically, I used an app called You Need a Budget (YNAB — and that’s an affiliate link), but you don’t need to buy it (although I personally think it’s more than worth it). I tracked every single cent then, and in fact I still do that today. Instead of having one account and one balance to look at, I created categories for every conceivable expense. Before I found YNAB, I just used an Excel spreadsheet. A big shift in habit was when I started to look at the category balance instead of the account balance. If we wanted to buy something that cost more than the budget for its category, we would look to see what other categories we could take the money out of. This helped us understand that every time we said yes to buying something, we were saying no to buying something else. Even if we paid using the credit card, that money still went out of the category balance so that we could at least make sure we weren’t adding to our credit card debt.&lt;/p&gt;
&lt;h3 id="i-automated-transfers-to-pay-back-credit-card-debt-and-to-our-savings-account"&gt;I automated transfers to pay back credit card debt and to our savings account.&lt;/h3&gt;
&lt;p&gt;I discussed with Rob an amount that we would save out of my salary every month for emergencies and I set up an automatic transfer from our normal transaction account to our separate savings account with another bank the day after payday. The automatic part is important — you don’t want to give yourself the chance to self-sabotage. This made sure that even if we went over budget, we would not touch our savings. I did the same for extra debt payments towards credit cards and our car loan until they were competely paid off. I also saved one month’s worth of household expenses as an emergency fund.&lt;/p&gt;
&lt;h2 id="the-waiting-game"&gt;The waiting game&lt;/h2&gt;
&lt;p&gt;By the time Rob found a job again, we were debt free except for our mortgage. We suddenly had a lot of cash to spare, both from his salary and from paying off debts. As soon as that happened, rather than increasing our expenses again, I automated transfers to investment accounts instead. For us in Australia, this meant talking to our employers to salary sacrifice into our superannuation funds, for you, this could be contributing to your 401k. We started salary sacrificing as much as we could per year (at the time, that was $30,000 for me and $35,000 for Rob including employer contributions, but check the current limits with the ATO as they have changed). This was a huge deal because we never even saw the money as it was garnished from our wages. It also saved us heaps of tax (one year I calculated it to be about $8000 in savings for Rob alone). At this point we were saving 70% of our income.&lt;/p&gt;
&lt;p&gt;When we got unexpected income increases or tax refunds, we put it towards investments. As our incomes grew, we maxed out our super contributions and started to look for something else to invest in. I invested our money into a low cost index fund, available from any stock broker. In our case, we used Vanguard’s VAS for Australian shares. Again, those payments were automated and transferred regardless of whether the stock market was doing well or not.&lt;/p&gt;
&lt;p&gt;Then, we waited.&lt;/p&gt;
&lt;h2 id="the-result"&gt;The result&lt;/h2&gt;
&lt;p&gt;Within five years we had nearly enough to meet our subsistence-level figure. Some surprise financial windfalls finally pushed us over the edge.&lt;/p&gt;
&lt;p&gt;I’m sharing this story not to brag about my successes but to let people know that financial independence is not just possible but SIMPLE.&lt;/p&gt;
&lt;p&gt;Let me break down the steps again for you:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Calculate your financial net worth.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Revisit and optimise all your accounts.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Track every single expense for at least a month.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Make a budget.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate transfers to improve your net worth: first towards your debt, then savings towards an emergency fund and then to an investment account.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Wait.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Now I’m not saying that everyone can do this in five years. My husband and I were lucky enough to have dual high incomes. But the point is not to do all of this in five years. The point is to start now.&lt;/p&gt;</description></item></channel></rss>