<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Home on Igor Kupczyński</title><link>https://kupczynski.info/</link><description>Recent content in Home on Igor Kupczyński</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Mon, 02 Feb 2026 12:00:00 +0100</lastBuildDate><atom:link href="https://kupczynski.info/index.xml" rel="self" type="application/rss+xml"/><item><title>YOLO Mode in a Vagrant Box</title><link>https://kupczynski.info/posts/yolo-sandbox/</link><pubDate>Mon, 02 Feb 2026 12:00:00 +0100</pubDate><guid>https://kupczynski.info/posts/yolo-sandbox/</guid><description>&lt;p&gt;A Vagrant-based sandbox for running AI coding agents in full autonomous mode—without risking your host machine.&lt;/p&gt;

&lt;h2 id="the-problem"&gt;The problem &lt;a href="#the-problem" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;AI coding agents work best when they can run autonomously. Claude Code&amp;rsquo;s &lt;code&gt;claude --dangerously-skip-permissions&lt;/code&gt; and Codex&amp;rsquo;s &lt;code&gt;codex --full-auto&lt;/code&gt; let agents execute commands without asking for approval at each step. But this is scary for good reason—agents have &lt;a href="https://news.ycombinator.com/item?id=46268222"&gt;deleted home directories&lt;/a&gt;, &lt;a href="https://github.com/anthropics/claude-code/issues/4331"&gt;wiped working directories&lt;/a&gt;, and &lt;a href="https://github.com/anthropics/claude-code/issues/3109"&gt;destroyed files while misreporting what happened&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="solution-disposable-vms"&gt;Solution: disposable VMs &lt;a href="#solution-disposable-vms" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;People use &lt;a href="https://code.claude.com/docs/en/devcontainer"&gt;devcontainers&lt;/a&gt;, Docker, or &lt;a href="https://fly.io/blog/code-and-let-live/"&gt;remote VMs&lt;/a&gt; to isolate their agents. I wanted something I can blow away and recreate in seconds. Vagrant is a bit of an overkill, but it works.&lt;/p&gt;</description></item><item><title>Pattern Spotting: Hatchet</title><link>https://kupczynski.info/posts/pattern-spotting-hatchet/</link><pubDate>Tue, 13 Jan 2026 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/pattern-spotting-hatchet/</guid><description>&lt;p&gt;&lt;a href="https://github.com/hatchet-dev/hatchet"&gt;Hatchet&lt;/a&gt; is a durable task orchestration platform, built on PostgreSQL. Competitors include Celery or Temporal. Hatchet &lt;a href="https://news.ycombinator.com/item?id=43572733"&gt;scaled from 20k tasks/month to 1B+/month&lt;/a&gt; without abandoning Postgres.&lt;/p&gt;
&lt;p&gt;Some patterns caught my attention.&lt;/p&gt;

&lt;h2 id="postgresql-as-the-universal-backend"&gt;PostgreSQL as the Universal Backend &lt;a href="#postgresql-as-the-universal-backend" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Conventional wisdom says separate your queue (Redis/RabbitMQ) from your state (PostgreSQL). Different access patterns, different tools. Hatchet bets against this using Postgres for everything.&lt;/p&gt;
&lt;p&gt;The queue implementation relies on &lt;a href="https://github.com/hatchet-dev/hatchet/blob/584ba47044ee8e20ccefe8d85ca972db77828475/pkg/repository/sqlcv1/queue.sql"&gt;&lt;code&gt;FOR UPDATE SKIP LOCKED&lt;/code&gt;&lt;/a&gt;, a Postgres feature that lets workers claim rows without blocking each other.&lt;/p&gt;</description></item><item><title>GCP Live-Migrates, AWS Reboots: How Cloud Providers Handle Host Maintenance</title><link>https://kupczynski.info/posts/cloud-host-maintenance/</link><pubDate>Tue, 13 Jan 2026 12:00:00 +0100</pubDate><guid>https://kupczynski.info/posts/cloud-host-maintenance/</guid><description>&lt;p&gt;&lt;em&gt;The following incident is fictional, but the architecture lessons are real.&lt;/em&gt;&lt;/p&gt;

&lt;h2 id="the-incident"&gt;The incident &lt;a href="#the-incident" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Monday morning. You&amp;rsquo;re reviewing last week&amp;rsquo;s metrics and notice a gap in the graphs — your staging environment was down for about 5 minutes on Thursday afternoon. The AWS console shows the instance is healthy, but uptime is only 4 days.&lt;/p&gt;
&lt;p&gt;Digging into the EC2 console, you find it: AWS had sent a &lt;strong&gt;Scheduled Event&lt;/strong&gt; notification two weeks prior. The instance was due for host maintenance. The notification sat in the console unread. The instance rebooted, dropping connections and clearing the in-memory cache.&lt;/p&gt;</description></item><item><title>TCP connection limiting in Go: Blocking Accept vs Active Load Shedding</title><link>https://kupczynski.info/posts/tcp-proxy-concurrency-limits/</link><pubDate>Wed, 19 Nov 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/tcp-proxy-concurrency-limits/</guid><description>&lt;p&gt;I recently reviewed a Go codebase that implemented connection limiting in a TCP proxy. The goal was to protect the backend from being overwhelmed by too many concurrent connections.&lt;/p&gt;
&lt;p&gt;The initial implementation used a semaphore to gatekeep the &lt;code&gt;Accept()&lt;/code&gt; call. While this seems intuitive, it relies on the kernel&amp;rsquo;s backlog behavior in ways that can cause significant operational issues.&lt;/p&gt;

&lt;h2 id="tldr"&gt;TL;DR &lt;a href="#tldr" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Don&amp;rsquo;t block before calling &lt;code&gt;Accept()&lt;/code&gt;. If you do, the OS continues to complete TCP handshakes and queues connections in the kernel backlog. Clients believe they are connected, but your application is not processing them.&lt;/p&gt;</description></item><item><title>AGENTS.md: A Standard for AI Coding Agents</title><link>https://kupczynski.info/posts/agents-md-a-standard-for-ai-coding-agents/</link><pubDate>Sun, 05 Oct 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/agents-md-a-standard-for-ai-coding-agents/</guid><description>&lt;p&gt;If you&amp;rsquo;re using AI coding agents—and who isn&amp;rsquo;t these days—you&amp;rsquo;ve probably noticed each tool wants its own configuration file. Cursor reads &lt;code&gt;.cursor/rules&lt;/code&gt;, Claude looks for &lt;code&gt;CLAUDE.md&lt;/code&gt;, and every new agent seems to invent yet another convention. This proliferation of tool-specific files is annoying.&lt;/p&gt;
&lt;p&gt;Enter &lt;code&gt;AGENTS.md&lt;/code&gt;: a unified standard that consolidates project context for AI agents in one predictable location.&lt;/p&gt;

&lt;h2 id="the-problem"&gt;The Problem &lt;a href="#the-problem" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Modern development environments are heterogeneous. You might use Cursor for rapid prototyping, your buddy uses Claude for architectural discussions, and open-source contributors prefer Aider or GitHub Copilot. Each agent needs to understand your project structure, build commands, coding conventions, and architectural decisions. Maintaining separate configuration files for each tool means duplicating content and inevitably letting some documentation drift out of sync.&lt;/p&gt;</description></item><item><title>Why AI Agents Hit the Wall</title><link>https://kupczynski.info/posts/why-ai-agents-hit-the-wall/</link><pubDate>Tue, 29 Jul 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/why-ai-agents-hit-the-wall/</guid><description>&lt;p&gt;I found this excellent article by Utkarsh Kanwat: &lt;a href="https://utkarshkanwat.com/writing/betting-against-agents/"&gt;&lt;em&gt;Betting Against Agents&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2 id="compounding-works-both-ways"&gt;Compounding Works Both Ways &lt;a href="#compounding-works-both-ways" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;We usually talk about compounding in positive terms&amp;mdash;interest accumulates, wealth grows, skills build on skills. But with AI agents, compounding works against you: &lt;strong&gt;the failure rate of an agentic process compounds with each step&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This framing really clicked for me. I&amp;rsquo;ve noticed that I need to break problems into small steps and have agents implement incrementally, verifying each step. The article gives intuition into why: even with 95% reliability per step, you&amp;rsquo;re down to 36% success rate after just 20 steps. Not good enough for production systems.&lt;/p&gt;</description></item><item><title>Effective Prompt Engineering in 2025</title><link>https://kupczynski.info/posts/prompt-engineering-in-2025/</link><pubDate>Fri, 16 May 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/prompt-engineering-in-2025/</guid><description>&lt;p&gt;I recently gave a talk at an internal Elastic conference about prompt engineering techniques in 2025, accompanied by live demonstrations using Mistral via Ollama, VS Code Copilot, and Windsurf. Here&amp;rsquo;s a brief overview of the key topics covered.&lt;/p&gt;

&lt;h2 id="why-prompt-engineering-matters"&gt;Why Prompt Engineering Matters &lt;a href="#why-prompt-engineering-matters" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Prompt engineering dramatically improves output quality, enables structured responses, and allows the use of smaller, more cost-effective models. The economic impact is substantial:&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;Model&lt;/th&gt;
 &lt;th&gt;Input (per 1M tokens)&lt;/th&gt;
 &lt;th&gt;Output (per 1M tokens)&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;GPT-4.1&lt;/td&gt;
 &lt;td&gt;$2.00&lt;/td&gt;
 &lt;td&gt;$8.00&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Mistral Small 3&lt;/td&gt;
 &lt;td&gt;$0.10&lt;/td&gt;
 &lt;td&gt;$0.30&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

&lt;h2 id="core-concepts-covered"&gt;Core Concepts Covered &lt;a href="#core-concepts-covered" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;My presentation explored several key areas:&lt;/p&gt;</description></item><item><title>Raycast browser switcher: a vibe coding rabbit hole</title><link>https://kupczynski.info/posts/vibe-coding-raycast/</link><pubDate>Sat, 03 May 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/vibe-coding-raycast/</guid><description>&lt;p&gt;I often change my default browser. I use Chrome for work and Safari for personal.&lt;/p&gt;
&lt;p&gt;It would be nice to have this in Raycast. Raycast is a Spotlight-like app launcher for macOS. Ideal UX: type &lt;code&gt;chbr&lt;/code&gt;, get a list of browsers, pick the one you want to be the default, and hit &lt;code&gt;return&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sounds simple enough. The problem? I&amp;rsquo;m neither a TypeScript nor a macOS developer.&lt;/p&gt;

&lt;h2 id="vibe-coding-to-the-rescue"&gt;Vibe coding to the rescue &lt;a href="#vibe-coding-to-the-rescue" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;In the age of LLMs this shouldn&amp;rsquo;t be a problem. I can vibe-code the solution&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>Principal Engineer Roles Framework</title><link>https://kupczynski.info/posts/principal-engineer-roles/</link><pubDate>Wed, 22 Jan 2025 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/principal-engineer-roles/</guid><description>&lt;p&gt;I came across an interesting article by Mai-Lan Tomsen Bukovec, AWS Vice President of Technology, about &lt;a href="https://www.linkedin.com/pulse/principal-engineer-roles-framework-mai-lan-tomsen-bukovec-142df/"&gt;a framework for Principal Engineer roles&lt;/a&gt;. The framework originated from their observations of how Principal Engineers work at AWS, particularly in the S3 team. I&amp;rsquo;m summarizing it here for easier reference.&lt;/p&gt;

&lt;h2 id="the-six-principal-engineer-roles"&gt;The Six Principal Engineer Roles &lt;a href="#the-six-principal-engineer-roles" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The framework defines six distinct roles that Principal Engineers can play:&lt;/p&gt;

&lt;h3 id="1-sponsor"&gt;1. Sponsor &lt;a href="#1-sponsor" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h3&gt;

&lt;p&gt;A project/program lead spanning multiple teams. They drive project success by ensuring decisions are made and removing obstacles. Sponsors own all aspects of project delivery, including technical direction, product definition, and organizational alignment. They need to:&lt;/p&gt;</description></item><item><title>DNS failover: When zero-weight records strike back</title><link>https://kupczynski.info/posts/zero-weight-dns-records/</link><pubDate>Wed, 27 Nov 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/zero-weight-dns-records/</guid><description>&lt;p&gt;Recently, I encountered a fascinating incident where some API endpoints received unexpected traffic. Services were getting requests they weren&amp;rsquo;t configured to handle, which shouldn&amp;rsquo;t have been possible with our ALB routing rules. Here&amp;rsquo;s what I learned.&lt;/p&gt;
&lt;p&gt;Details of this incident and the service involved are anonymized to not distract from the key learning.&lt;/p&gt;

&lt;h2 id="tldr"&gt;TL;DR &lt;a href="#tldr" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;When all weighted DNS records with weight &amp;gt; 0 become unhealthy, Route53 falls back to considering zero-weighted records. This can unexpectedly activate legacy request flow with different routing behaviors. Always fully decommission legacy infrastructure rather than leaving it in DNS with zero weights.&lt;/p&gt;</description></item><item><title>Chain of Density: An LLM summarization technique</title><link>https://kupczynski.info/posts/chain-of-density/</link><pubDate>Tue, 17 Sep 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/chain-of-density/</guid><description>&lt;p&gt;I came across an interesting method called &amp;ldquo;Chain of Density&amp;rdquo; that promises to generate increasingly concise and information-rich summaries. Let me share what I&amp;rsquo;ve learned.&lt;/p&gt;
&lt;p&gt;Chain of Density is an iterative summarization technique that aims to create progressively denser summaries of a given text. The process involves repeating two key steps multiple times:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Identify 1-3 informative entities from the original text that are missing from the previous summary.&lt;/li&gt;
&lt;li&gt;Write a new summary of identical length that incorporates all the information from the previous summary plus the newly identified entities.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What makes this method particularly interesting is its focus on maintaining a consistent word count while increasing information density. This constraint forces the summarization process to become more efficient with each iteration, resulting in highly compact yet comprehensive summaries.&lt;/p&gt;</description></item><item><title>Founder Mode</title><link>https://kupczynski.info/posts/founder-mode/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/founder-mode/</guid><description>&lt;h1 id="paul-grahams-founder-mode"&gt;Paul Graham&amp;rsquo;s &amp;ldquo;Founder Mode&amp;rdquo;&lt;/h1&gt;

&lt;p&gt;Paul Graham&amp;rsquo;s essay &lt;a href="https://paulgraham.com/foundermode.html"&gt;&lt;em&gt;Founder Mode&lt;/em&gt;&lt;/a&gt; is doing the rounds in social media:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In effect there are two different ways to run a company: founder mode and manager mode. Till now most people even in Silicon Valley have implicitly assumed that scaling a startup meant switching to manager mode.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;There are as far as I know no books specifically about founder mode. Business schools don&amp;rsquo;t know it exists. All we have so far are the experiments of individual founders who&amp;rsquo;ve been figuring it out for themselves.&lt;/p&gt;</description></item><item><title>Amazon S3 now supports conditional writes</title><link>https://kupczynski.info/posts/amazon-s3/</link><pubDate>Tue, 27 Aug 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/amazon-s3/</guid><description>&lt;h1 id="til-s3-supports-conditional-writes"&gt;TIL S3 supports conditional writes&lt;/h1&gt;

&lt;p&gt;Check out the &lt;a href="https://aws.amazon.com/about-aws/whats-new/2024/08/amazon-s3-conditional-writes/"&gt;official AWS announcement&lt;/a&gt; and the more detailed &lt;a href="https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html"&gt;S3 Conditional requests guide&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Amazon S3 adds support for conditional writes that can check for the existence of an object before creating it. (&amp;hellip;) You can perform conditional writes using PutObject or CompleteMultipartUpload API requests in both general purpose and directory buckets.&lt;/p&gt;
&lt;p&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;To use conditional writes, you can add the HTTP if-none-match conditional header along with PutObject and CompleteMultipartUpload API requests.&lt;/p&gt;</description></item><item><title>Amp It Up</title><link>https://kupczynski.info/posts/amp-it-up/</link><pubDate>Sat, 11 May 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/amp-it-up/</guid><description>&lt;p&gt;Great book by the star CEO of Snowflake.&lt;/p&gt;
&lt;p&gt;Amp It Up by Frank Slootman was highly recommended on &lt;del&gt;Twitter&lt;/del&gt; X and Hacker News.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Frank Slootman&lt;/strong&gt; was the CEO of a couple of high-profile companies that he took to IPO: Snowflake, Service Now, and Data Domain. In the book, he shares his management philosophy and supporting stories.&lt;/p&gt;
&lt;p&gt;The main pillars are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Raise your standards&lt;/li&gt;
&lt;li&gt;Align your people and culture&lt;/li&gt;
&lt;li&gt;Sharpen your focus&lt;/li&gt;
&lt;li&gt;Pick up the pace&lt;/li&gt;
&lt;li&gt;Transform your strategy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;⠀
Common motifs that run through the stories are:&lt;/p&gt;</description></item><item><title>Make Go application container resource limits aware</title><link>https://kupczynski.info/posts/go-container-aware/</link><pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/go-container-aware/</guid><description>&lt;p&gt;Go binaries are not inherently container-aware, specifically in that they do not account for memory and CPU limits.&lt;/p&gt;

&lt;h1 id="tldr"&gt;TL;DR&lt;/h1&gt;

&lt;p&gt;When running a Go application in a container with set CPU or memory limits, you should inform the Go runtime of these limits using the &lt;code&gt;GOMAXPROCS&lt;/code&gt; and &lt;code&gt;GOMEMLIMIT&lt;/code&gt; environment variables.&lt;/p&gt;
&lt;p&gt;For example, if you run your application as follows:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --cpus&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;4.0&amp;#34;&lt;/span&gt; --memory&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2000m&amp;#34;&lt;/span&gt; my-go-app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Inform the Go runtime as follows:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run --cpus&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;4.0&amp;#34;&lt;/span&gt; --memory&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2000m&amp;#34;&lt;/span&gt; -e GOMAXPROCS&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt; -e GOMEMLIMIT&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1800m my-go-app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1 id="memory"&gt;Memory&lt;/h1&gt;

&lt;p&gt;Docker and Kubernetes &lt;a href="https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/#how-pods-with-resource-limits-are-run"&gt;use cgroups to enforce memory limits&lt;/a&gt;, which means that if a process requests more memory from the OS than its assigned limit, it may be terminated by the oom-killer (which is the out-of-memory subsystem of the Linux kernel):&lt;/p&gt;</description></item><item><title>Golang 1.20 upgrade failed due to GLIBC_2.34 not found</title><link>https://kupczynski.info/posts/glibc-not-found/</link><pubDate>Mon, 07 Aug 2023 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/glibc-not-found/</guid><description>&lt;p&gt;Remember that Java slogan, &lt;a href="https://en.wikipedia.org/wiki/Write_once,_run_anywhere"&gt;&lt;em&gt;Write once, run anywhere&lt;/em&gt;&lt;/a&gt;? Go compiles directly to binaries, which target specific architectures. There&amp;rsquo;s no intermediate byte code. You cross-compile, and once you produce a binary for the target architecture: &lt;code&gt;GOOS=linux GOARCH=amd64 go build&lt;/code&gt;, it just works. Well, at least usually.&lt;/p&gt;
&lt;p&gt;With &lt;a href="https://pkg.go.dev/cmd/cgo"&gt;Cgo&lt;/a&gt;, go can interop with C code. There&amp;rsquo;s some magic involved, the toolchain behaves differently depending on your path (see below), but you usually don&amp;rsquo;t need to worry about it at all.&lt;/p&gt;</description></item><item><title>Negotiate your salary</title><link>https://kupczynski.info/posts/negotiate-your-salary/</link><pubDate>Sun, 01 May 2022 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/negotiate-your-salary/</guid><description>&lt;p&gt;Bookmarks on salary negotiation:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Classic from Patrick McKenzie
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.kalzumeus.com/2012/01/23/salary-negotiation/"&gt;Salary Negotiation: Make More Money, Be More Valued&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;101 on offer negotiation from Rishi Taparia
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://taps.substack.com/p/negotiation"&gt;Negotiating your startup job offer&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other links in no particular order
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/ten-rules-for-negotiating-a-job-offer-ee17cccbdab6/"&gt;Ten Rules for Negotiating a Job Offer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hbr.org/2014/04/15-rules-for-negotiating-a-job-offer"&gt;15 Rules for Negotiating a Job Offer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://fearlesssalarynegotiation.com/salary-negotiation-guide/"&gt;How to negotiate salary: 9 tips from a pro salary negotiator&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Books:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;My favorite is &lt;a href="https://www.goodreads.com/book/show/123857637-never-split-the-difference"&gt;Never Split the Difference&lt;/a&gt; by Chris Voss&lt;/li&gt;
&lt;li&gt;Timeless classic &lt;a href="https://www.goodreads.com/book/show/4865.How_to_Win_Friends_and_Influence_People"&gt;How to Win Friends and Influence People&lt;/a&gt; by Dale Carnegie&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Private Link is the IP filtering of the cloud</title><link>https://kupczynski.info/posts/private-link/</link><pubDate>Sun, 30 Jan 2022 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/private-link/</guid><description>&lt;p&gt;Use cases for Private Link and differences in its implementation across the major Cloud Providers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Changelog&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;November 27, 2024&lt;/strong&gt;: Updated to reflect &lt;a href="https://aws.amazon.com/about-aws/whats-new/2024/11/aws-privatelink-across-region-connectivity/"&gt;AWS PrivateLink&amp;rsquo;s new cross-region connectivity support&lt;/a&gt;. This feature brings AWS PrivateLink&amp;rsquo;s capabilities more in line with Azure and GCP&amp;rsquo;s offerings.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;January 30, 2022&lt;/strong&gt;: Original post published.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="private-link"&gt;Private Link &lt;a href="#private-link" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Private Link allows secure connectivity to services hosted on different Cloud provider accounts.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Private Link allows you to connect to a service in a different VPC—and that VPC can be owned by a different account.&lt;/li&gt;
&lt;li&gt;The connection is secure&lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;:
&lt;ul&gt;
&lt;li&gt;It doesn&amp;rsquo;t leave the cloud provider&amp;rsquo;s network.&lt;/li&gt;
&lt;li&gt;Data exchanged over Private Link is encrypted (I wasn&amp;rsquo;t able to find much on the encryption in the documentation—it makes sense to run secure the connection with TLS).&lt;/li&gt;
&lt;li&gt;You can use native features, such as IAM and security policies, to limit who can access the connection.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;The connection is unidirectional.
&lt;ul&gt;
&lt;li&gt;Resources in the source VPC can access a dedicated service in the target VPC.&lt;/li&gt;
&lt;li&gt;Other resources in the target VPC are not exposed.&lt;/li&gt;
&lt;li&gt;Resources in the source VPC are not exposed.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2022-01-private-link-basic.png" alt="Private Link"&gt;&lt;/p&gt;</description></item><item><title>The Phoenix Project</title><link>https://kupczynski.info/posts/the-phoenix-project/</link><pubDate>Fri, 30 Apr 2021 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/the-phoenix-project/</guid><description>&lt;p&gt;Theory of constraints applied to IT operations.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2021-04-phoenix.png" alt="The Phoenix Project Logo"&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve read &lt;a href="https://www.amazon.com/Phoenix-Project-DevOps-Helping-Business/dp/0988262592"&gt;&lt;em&gt;The Phoenix Project: A Novel about IT, DevOps, and Helping Your Business Win&lt;/em&gt;&lt;/a&gt; by Gene Kim, Kevin Behr, George Spafford. This book is amazing. If you follow the lean manufacturing practices, or enjoyed &lt;em&gt;The Goal&lt;/em&gt; (see &lt;a href="https://kupczynski.info/2019/02/23/slowest-hiker.html"&gt;The Slowest Hiker&lt;/a&gt;), or simply want to improve the way IT operations work with the rest of the org (and improve the org in the process!) you&amp;rsquo;ll enjoy the book.&lt;/p&gt;</description></item><item><title>Fun with docker networks</title><link>https://kupczynski.info/posts/fun-with-docker-networks/</link><pubDate>Mon, 22 Mar 2021 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/fun-with-docker-networks/</guid><description>&lt;p&gt;How to find out a container responsible for a given open port on a host.&lt;/p&gt;
&lt;p&gt;Recently, I&amp;rsquo;ve debugged an issue with a server running multiple docker containers. They interact with each other by exposing TCP ports on the host and communicating over these ports.&lt;/p&gt;
&lt;p&gt;In this post:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I describe a surprising discovery about &lt;a href="https://docs.docker.com/network/host/"&gt;&lt;em&gt;host network mode&lt;/em&gt; containers&lt;/a&gt; (spoiler: they don&amp;rsquo;t show under &lt;code&gt;PORTS&lt;/code&gt; in &lt;code&gt;docker ps&lt;/code&gt;),&lt;/li&gt;
&lt;li&gt;Show to find a container responsible for a given port on the host,&lt;/li&gt;
&lt;li&gt;Link to a repo where I investigate docker networking in much more detail.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="the-story"&gt;The story &lt;a href="#the-story" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Let&amp;rsquo;s say we have the container exposing &lt;code&gt;:32080&lt;/code&gt; on the host:&lt;/p&gt;</description></item><item><title>Notes on creating a telegram bot</title><link>https://kupczynski.info/posts/notes-on-personal-telegram-bot/</link><pubDate>Sat, 28 Nov 2020 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/notes-on-personal-telegram-bot/</guid><description>&lt;p&gt;I&amp;rsquo;ve created a telegram bot to give me a daily updates to a webpage I was tracking. This is a hobby project and the hosting price is an important concern.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#the-problem"&gt;The problem&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#context"&gt;Context&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-solution"&gt;The solution&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#why-not-open-source-the-code"&gt;Why not open-source the code?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#notes-on-the-project"&gt;Notes on the project&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#telegram-bot-api-is-really-good-for-experimentation"&gt;Telegram bot API is really good for experimentation&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#anyone-can-chat-to-your-bot"&gt;Anyone can chat to your bot&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#google-app-engine"&gt;Google App Engine&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#secrets-are-hard-to-manage"&gt;Secrets are hard to manage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#if-you-dont-know-gae-start-with-the-concepts"&gt;If you don&amp;rsquo;t know GAE start with the &lt;em&gt;concepts&lt;/em&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#run-it-for-cheap-"&gt;Run it for cheap :)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#old-versions-of-the-app-may-be-still-running"&gt;Old versions of the app may be still running&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-app-is-not-guaranteed-to-scale-up-from-0-to-1-after-deployment"&gt;The app is not guaranteed to scale up from 0 to 1 after deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#dont-forget-to-clean-up-the-lingering-images"&gt;Don&amp;rsquo;t forget to clean up the lingering images!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#the-built-in-observability-tools-are-really-good-at-least-for-a-personal-project"&gt;The built-in observability tools are really good (at least for a personal project)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#structuring-the-app"&gt;Structuring the app&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#go-concurrency-patterns-are-not-that-useful"&gt;Go concurrency patterns are not that useful&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#protecting-the-internal-endpoints"&gt;Protecting the internal endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#use-firestore-to-store-the-state-of-the-app"&gt;Use firestore to store the state of the app&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#evaluate-faas-as-an-alternative"&gt;Evaluate FaaS as an alternative&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#summary"&gt;Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id="the-problem"&gt;The problem &lt;a href="#the-problem" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;I want to be notified about new real estate ads from my neighborhood.&lt;/p&gt;</description></item><item><title>Remote debug your go code</title><link>https://kupczynski.info/posts/remote-debug-go-code/</link><pubDate>Sun, 17 May 2020 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/remote-debug-go-code/</guid><description>&lt;p&gt;This post has a companion github repo &lt;a href="https://github.com/igor-kupczynski/remote-debug-example"&gt;github.com/igor-kupczynski/remote-debug-example&lt;/a&gt; &amp;ndash; check the repo for a simple example.&lt;/p&gt;
&lt;p&gt;Coming to go from the JVM background I often find myself looking for analogs of the features I rely on the JVM ecosystem. One example of such a feature is remote debugging &amp;ndash; which is built into JVMs. Read on to find out how to accomplish this in go.&lt;/p&gt;

&lt;h2 id="remote-debug"&gt;Remote debug &lt;a href="#remote-debug" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Remote debug is a very useful feature. You start your application with special options and then you can connect to it with a debugger from your IDE. This is very useful if you want to debug an environmental issue (e.g. that manifests itself only on Google Cloud Platform, or only in QA, but you can&amp;rsquo;t easily reproduce on your laptop). Maybe even more common nowadays &amp;ndash; you may want to debug an application which is running in a docker container.&lt;/p&gt;</description></item><item><title>Natural project planning</title><link>https://kupczynski.info/posts/natural-project-planning/</link><pubDate>Sat, 08 Feb 2020 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/natural-project-planning/</guid><description>&lt;p&gt;&lt;strong&gt;Natural project planning&lt;/strong&gt; is a project planning method described by David Allen in his bestseller &lt;a href="https://gettingthingsdone.com/what-is-gtd/"&gt;&lt;em&gt;Getting Things Done&lt;/em&gt;&lt;/a&gt;. In this post, I describe the method.&lt;/p&gt;
&lt;p&gt;Natural project planning consists of a couple of steps:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Define purpose and principles.&lt;/li&gt;
&lt;li&gt;Visualize goals and outcomes.&lt;/li&gt;
&lt;li&gt;Brainstorm.&lt;/li&gt;
&lt;li&gt;Organize the ideas.&lt;/li&gt;
&lt;li&gt;Define next actions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;What are the goals of natural project planning?&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Help clarify the steps needed to complete the project.&lt;/li&gt;
&lt;li&gt;Visualize the endgame — the outcome of the project.&lt;/li&gt;
&lt;li&gt;Identify next actions needed to move the project forward, and people responsible to complete them.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is not a strict process and you should not follow it religiously. Follow it only as much as it makes you feel you have the project under control. You can always redo any of the steps later — or zoom in as needed.&lt;/p&gt;</description></item><item><title>FIPS compliant crypto in golang</title><link>https://kupczynski.info/posts/fips-golang/</link><pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/fips-golang/</guid><description>&lt;p&gt;&lt;strong&gt;Updated: 2022-09-29.&lt;/strong&gt; To reflect that BoringCrypto is now part of the main branch.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated: 2022-11-20.&lt;/strong&gt; To add a section on TLS 1.3 and FIPS.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated: 2023-01-07.&lt;/strong&gt; To add a section on &lt;em&gt;automatic&lt;/em&gt; configuration at compile time: &lt;em&gt;Force FIPS-compliant crypto at compile time&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Updated: 2023-08-07.&lt;/strong&gt; To add a note of &lt;a href="https://github.com/microsoft/go"&gt;microsoft/go&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you work with US government entities or corporations in regulated markets the subject of FIPS compliance may come up. &lt;a href="https://en.wikipedia.org/wiki/FIPS_140-2"&gt;FIPS 140-2&lt;/a&gt; is a set of cryptographic standards that your application may need to adhere to.&lt;/p&gt;</description></item><item><title>Zero to One</title><link>https://kupczynski.info/posts/zero-to-one/</link><pubDate>Tue, 08 Oct 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/zero-to-one/</guid><description>&lt;p&gt;I&amp;rsquo;ve read &lt;a href="https://www.amazon.com/Zero-One-Notes-Startups-Future/dp/0804139296"&gt;&lt;em&gt;Zero to One: Notes on Startups, or How to Build the Future&lt;/em&gt;&lt;/a&gt; by Peter Thiel. Here are my notes on the book.&lt;/p&gt;

&lt;h2 id="background"&gt;Background &lt;a href="#background" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Peter Thiel is a well known Silicon Valley founder and investor. He is often portrait as a contrarian and is quite a controversial figure. He is a founder of PayPal and Plantir. I&amp;rsquo;ve heard very good reviews of the book and it was on my list for quite some time.&lt;/p&gt;</description></item><item><title>Elastic Management Philosophy</title><link>https://kupczynski.info/posts/elastic-management-philosophy/</link><pubDate>Sat, 25 May 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elastic-management-philosophy/</guid><description>&lt;p&gt;How to build a great engineering organization — advice from Elastic&amp;rsquo;s SVP Engineering.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;Update 2019-11-29:&lt;/strong&gt; Kevin published &lt;a href="https://www.elastic.co/blog/leadership-elastic-kevin-kluge-distributed-for-the-better?blade=tw&amp;amp;hulk=social"&gt;Leadership @ Elastic&lt;/a&gt; blogpost. Kevin&amp;rsquo;s post is more of high-level and strategical than the content here.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve recently come back from Elastic&amp;rsquo;s Global All Hands 2019 (or simply GAH 2019). It is a conference-style internal Elastic event. The goal is to facilitate cross-team communication, better understand the company strategy, and to simply chat with your colleagues. This post contains notes from Kevin Kluge&amp;rsquo;s Management Philosophy session.&lt;/p&gt;</description></item><item><title>Server Name Indication with Traefik and Go</title><link>https://kupczynski.info/posts/traefik-sni/</link><pubDate>Tue, 21 May 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/traefik-sni/</guid><description>&lt;p&gt;How to setup Server Name Indication with Traefik.&lt;/p&gt;
&lt;p&gt;In this blog post we discuss briefly what an SNI is, show a simple example of setting up SNI with Traefik &amp;mdash; a popular reverse proxy written in go &amp;mdash; and then show some options for implementing it in &amp;ldquo;plain&amp;rdquo; go. This blog has a companion repo &lt;a href="https://github.com/igor-kupczynski/traefik-tls-demo"&gt;traefik-tls-demo&lt;/a&gt;, be sure to check it if you want to try the example.&lt;/p&gt;

&lt;h2 id="server-name-indication-sni"&gt;Server Name Indication (SNI) &lt;a href="#server-name-indication-sni" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;To establish an https connection the server presents its certificate to clients as part of the TLS handshake. Since the connection is not established yet, the server doesn&amp;rsquo;t see the http request &amp;mdash; neither the request line, not its headers. We&amp;rsquo;re not at the application level yet. Therefore, the server has to make the decision on which certificate to present based on the target IP of the connection. In practice, this limits the server to a single certificate per public IP address.&lt;/p&gt;</description></item><item><title>The Slowest Hiker</title><link>https://kupczynski.info/posts/slowest-hiker/</link><pubDate>Sat, 23 Feb 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/slowest-hiker/</guid><description>&lt;p&gt;How to improve any process.&lt;/p&gt;
&lt;p&gt;One of the two &lt;a href="https://blog.golang.org/survey2017-results#TOC_3."&gt;most often requested features of
Go&lt;/a&gt; is the support for
generics. Arguably, generics are super important and they are taken for granted
in most of the modern programming languages. In fact, Go developers get a lot of
flak from their Haskell-minded colleagues being forced to use a language with
such a poor feature set. And yet, Go is one of the &lt;a href="https://octoverse.github.com/projects#languages"&gt;fastest growing languages on
Github&lt;/a&gt;. It seems like it
became the &lt;em&gt;lingua franca&lt;/em&gt; of the cloud, with more and more distributed systems
being written (or rewritten) in Go.&lt;/p&gt;</description></item><item><title>Set up AWS Lambda with terraform</title><link>https://kupczynski.info/posts/aws-lambda-terraform/</link><pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/aws-lambda-terraform/</guid><description>&lt;p&gt;In &lt;a href="https://kupczynski.info/2019/01/09/invalidate-cloudfront-with-lambda-s3.html"&gt;the previous post&lt;/a&gt;,
we&amp;rsquo;ve presented an AWS Lambda function to automatically invalidate resources in
CloudFront distribution when underlying objects in an S3 bucket change.&lt;/p&gt;
&lt;p&gt;Instead of clicking and copy-pasting in the AWS Console, we can use
&lt;a href="https://www.terraform.io/"&gt;terraform&lt;/a&gt; to set this function up. In fact, I&amp;rsquo;ve
already made it a part of my &lt;a href="https://github.com/igor-kupczynski/terraform_static_aws_website"&gt;terraform static aws
website&lt;/a&gt; &amp;mdash;
terraform module which sets up an S3 bucket to host a static website and
CloudFront as a cache; it also handles a redirect &lt;code&gt;www.domain.com --&amp;gt; domain.com&lt;/code&gt; and, provided with an AWS generated https cert, the &lt;code&gt;https://&lt;/code&gt; bit.&lt;/p&gt;</description></item><item><title>AWS Lambda to invalidate CloudFront when S3 object changes</title><link>https://kupczynski.info/posts/invalidate-cloudfront-with-lambda-s3/</link><pubDate>Wed, 09 Jan 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/invalidate-cloudfront-with-lambda-s3/</guid><description>&lt;blockquote&gt;
&lt;p&gt;There are only two hard things in Computer Science: cache invalidation and naming things.&lt;/p&gt;
&lt;p&gt;– Phil Karlton&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post we will focus on cache invalidation.&lt;/p&gt;

&lt;h2 id="problem-statement"&gt;Problem statement &lt;a href="#problem-statement" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;This blog is a static site hosted on S3 with CloudFront being used as a CDN /
cache. &lt;a href="https://kupczynski.info/2017/03/06/terraform-cloudfront-s3-static-hosting.html"&gt;Blog post about this
setup&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2019-01-lambda-context.jpg" alt="Problem diagram"&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;UserAgent&lt;/strong&gt; &lt;em&gt;requests&lt;/em&gt; &lt;code&gt;kupczynski.info/posts/abc.html&lt;/code&gt; from
&lt;strong&gt;CloudFront&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;If this is not in the &lt;strong&gt;CloudFront&lt;/strong&gt; cache, then we have a &lt;em&gt;miss&lt;/em&gt; &amp;mdash;
&lt;strong&gt;CloudFront&lt;/strong&gt; consults &lt;strong&gt;S3 bucket&lt;/strong&gt; for an up-to-date version.&lt;/li&gt;
&lt;li&gt;On next requests to this resource it is in the &lt;strong&gt;CloudFront&lt;/strong&gt; cache, so we
have a &lt;em&gt;hit&lt;/em&gt;. No need to consult &lt;strong&gt;S3 bucket&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Occasionally, a post is &lt;em&gt;updated&lt;/em&gt; by my &lt;strong&gt;Continuous Integration&lt;/strong&gt;
infrastructure.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The problem is how to serve an up-to-date version of a post. And make sure that
we hit the cache most of the time.&lt;/p&gt;</description></item><item><title>OpenVPN and DNSes on Ubuntu</title><link>https://kupczynski.info/posts/openvpn-dns-ubuntu/</link><pubDate>Wed, 09 Jan 2019 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/openvpn-dns-ubuntu/</guid><description>&lt;p&gt;One of the VPNs I connect to sets the DNS server for the link. It is an OpenVPN with &lt;code&gt;DNS&lt;/code&gt; option. The problem is that is doesn&amp;rsquo;t really work out of the box in Ubuntu (at least 18.04 and 18.10) — the VPN DNS is not consulted.&lt;/p&gt;
&lt;p&gt;At the time of writing, I&amp;rsquo;m on 18.10, and I write it from that perspective. Ubuntu uses &lt;a href="https://www.freedesktop.org/wiki/Software/systemd/resolved/"&gt;systemd-resolved&lt;/a&gt; service to provide a local DNS resolution. We need to &amp;ldquo;push&amp;rdquo; the VPN DNS address to this service. We can do it using &lt;a href="https://github.com/jonathanio/update-systemd-resolved"&gt;jonathanio/update-systemd-resolved&lt;/a&gt; helper script.&lt;/p&gt;</description></item><item><title>Fire and Motion</title><link>https://kupczynski.info/posts/fire-and-motion/</link><pubDate>Sat, 08 Dec 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/fire-and-motion/</guid><description>&lt;p&gt;Today I&amp;rsquo;ve rediscovered &lt;a href="https://www.joelonsoftware.com/2002/01/06/fire-and-motion/"&gt;&lt;em&gt;Fire and Motion&lt;/em&gt;
blogpost&lt;/a&gt; by Joel
Spolsky. I recommend you to read it.&lt;/p&gt;
&lt;p&gt;It start with how you can get only a couple of productive hours per day. And
this is OK. Joel mentions a colleague, who worked only from 12 to 5, and still
had more done than the average other team member. These productive hours are
called &lt;em&gt;the flow&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;One of the tricks to put yourself in the flow is to start. Starting is often the
hardest thing. This is way better understood now, than in 2002. With a lot of
articles and books on the importance of &lt;em&gt;deep work&lt;/em&gt;, the cost of
&lt;em&gt;multi-tasking&lt;/em&gt;, etc.&lt;/p&gt;</description></item><item><title>Change the maximum number of open files in ubuntu 18.10</title><link>https://kupczynski.info/posts/ubuntu-18-10-ulimits/</link><pubDate>Sat, 24 Nov 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/ubuntu-18-10-ulimits/</guid><description>&lt;p&gt;The procedure changed on recent ubuntu compared to what I used to do. I used
&lt;a href="https://underyx.me/2015/05/18/raising-the-maximum-number-of-file-descriptors"&gt;change
/etc/security/limits.conf&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The procedure on ubuntu 18.10 that worked for me is this.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Go to &lt;code&gt;/etc/systemd/system.conf&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Uncomment &lt;code&gt;DefaultLimitNOFILE&lt;/code&gt; and set your limit there, e.g.&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ grep NOFILE /etc/systemd/system.conf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;DefaultLimitNOFILE&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;65535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Restart&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Profit&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Before:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -Sn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1024&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -Hn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;1048576&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;65535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -Sn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;65535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ ulimit -Hn
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#ae81ff"&gt;65535&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The limits can be controlled by systemd and this is what we do here &amp;mdash; instruct
systemd to set it to 65k. Note that this setting will apply to all users, which
is OK for a laptop or a workstation. On a server you may need a finer grained
settings and you should look for a different method.&lt;/p&gt;</description></item><item><title>Nvidia on Ubuntu 18.10 requires lightdm</title><link>https://kupczynski.info/posts/ubuntu-1810-nvidia-lightdm/</link><pubDate>Sun, 18 Nov 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/ubuntu-1810-nvidia-lightdm/</guid><description>&lt;p&gt;After a upgrade from 18.04 my external monitor stopped working. Installing lightdm was the solution.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; 2020-11-10. &lt;a href="https://disqus.com/by/abishvj/"&gt;Abish Vijayan&lt;/a&gt; posted a solution for Ubuntu 20.10 in the comments below.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Made it to work. Disabled Wayland in gdm3.
&lt;a href="https://askubuntu.com/questions/975094/how-to-disable-wayland-in-17-10-in-gdm3-login-screen"&gt;https://askubuntu.com/questions/975094/how-to-disable-wayland-in-17-10-in-gdm3-login-screen&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; 2019-11-15 on Ubuntu 19.10 I still need the lightdm to support multiple monitors.&lt;/p&gt;

&lt;h2 id="problem"&gt;Problem &lt;a href="#problem" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve recently updated Ubuntu from 18.04 to 18.10 on work-issued Thinkpad p51.
The laptop has &lt;strong&gt;nvidia quatro m2200&lt;/strong&gt; graphics it also has a 4k display and I use
an external 4k monitor most of the time.&lt;/p&gt;</description></item><item><title>Use wine to run windows JDK on linux</title><link>https://kupczynski.info/posts/wine-windows-jdk-on-linux/</link><pubDate>Sun, 11 Nov 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/wine-windows-jdk-on-linux/</guid><description>&lt;p&gt;I&amp;rsquo;ve got a &lt;strong&gt;legacy windows app&lt;/strong&gt; that I need to run from time to time. The app
is written in &lt;strong&gt;java&lt;/strong&gt;, but uses some &lt;strong&gt;32 bit JNI dll&lt;/strong&gt;s. I&amp;rsquo;ve used to keep a
windows VM around to run it, but recently I was able to &amp;ldquo;port&amp;rdquo; it to
&lt;a href="https://www.winehq.org/"&gt;wine&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In short, you need install wine on ubuntu:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# I&amp;#39;ve needed a 32 bit version&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo dpkg --add-architecture i386
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ sudo apt-get -y update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt-get install wine32
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then get the 32bit JDK from Oracle. It needs to be JDK, JRE wasn&amp;rsquo;t working for
me (and some folks on the internet). As of time of writing I&amp;rsquo;ve got &lt;a href="https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html"&gt;JDK
8u192&lt;/a&gt;
and this is what I&amp;rsquo;ve tested with.&lt;/p&gt;</description></item><item><title>Diagnose SSD failures</title><link>https://kupczynski.info/posts/ssd-failure/</link><pubDate>Fri, 02 Nov 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/ssd-failure/</guid><description>&lt;p&gt;How to minitor health of SSD drives, case study on my failed Kingston SUV500MS480G.&lt;/p&gt;
&lt;p&gt;I use my old Samsung Series 7 ultrabook for some personal tasks. It originally
had 120 GB SSD, but I&amp;rsquo;ve upgraded it recently to Kingston 480GB SSD.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve first installed Ubuntu 18.04, but then upgraded to 18.10. Everything seem
fine, but after few hours of usage and a restart it started complaining about
invalid file permissions. I don&amp;rsquo;t have logs, as at this point I though —
ok, a botched upgrade — we can reinstall, no big deal. Reinstalling is
not a big deal, because most of the data is in the cloud already, and I maintain
a collection of scripts to setup the software I need.&lt;/p&gt;</description></item><item><title>Ubuntu 18.04 on Thinkpad P51</title><link>https://kupczynski.info/posts/thinkpad-p51/</link><pubDate>Sun, 30 Sep 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/thinkpad-p51/</guid><description>&lt;p&gt;Back to Linux after almost 3 year hiatus.&lt;/p&gt;
&lt;p&gt;Switching back from MacBook to Thinkapad and Ubuntu as the main work machine.&lt;/p&gt;
&lt;p&gt;My MBP 13&amp;rsquo;&amp;rsquo; aged quite nicely, but compiling large scala codebases and running
VMs / containers became quite frustrating. I was eligible for a refresher at
Elastic and I&amp;rsquo;ve decided to try Thinkpad P51 + Ubuntu. This is a 15&amp;rsquo;&amp;rsquo; beast with
64 GB of RAM. It is quite heavy, but working remotely I don&amp;rsquo;t need to carry it to
the office every day, while still being able to travel if needed. I consider the
trade off acceptable.&lt;/p&gt;</description></item><item><title>Zoom and Kubuntu 18.04</title><link>https://kupczynski.info/posts/zoom-and-kubuntu/</link><pubDate>Sat, 08 Sep 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/zoom-and-kubuntu/</guid><description>&lt;p&gt;Fix annoying issues with Zoom and HiDPI on Kubuntu 18.04.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got a new laptop for my work for Elastic recently. This time I&amp;rsquo;ve opted for
a Thinkpad and not for a MacBook. I&amp;rsquo;ve installed Kubuntu 18.04. Linux on desktop
or laptop gives you a lot of opportunities to blog about something you&amp;rsquo;ve fixed.
Here comes a first one.&lt;/p&gt;
&lt;p&gt;How to make &lt;a href="https://zoom.us/"&gt;zoom&lt;/a&gt; — the conferencing software
— play nicely with kubntu?&lt;/p&gt;</description></item><item><title>JMH - Java Microbenchmark Harness</title><link>https://kupczynski.info/posts/java-microbenchmarking-harness/</link><pubDate>Thu, 12 Jul 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/java-microbenchmarking-harness/</guid><description>&lt;p&gt;Notes I&amp;rsquo;ve took while doing a microbenchmark of some code. Not really structured, but maybe useful for future me.&lt;/p&gt;
&lt;p&gt;Webpage: &lt;a href="http://openjdk.java.net/projects/code-tools/jmh/"&gt;http://openjdk.java.net/projects/code-tools/jmh/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a id="org34d64d0"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="getting-started"&gt;Getting started &lt;a href="#getting-started" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Use an archetype:&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;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn archetype:generate &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DinteractiveMode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DarchetypeGroupId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;org.openjdk.jmh &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DarchetypeArtifactId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jmh-java-benchmark-archetype &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DgroupId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;info.kupczynski &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DartifactId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jmh-playground &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dversion&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1.0
&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;// Or &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; scala
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mvn archetype:generate &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DinteractiveMode&lt;span style="color:#f92672"&gt;=&lt;/span&gt;false &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DarchetypeGroupId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;org.openjdk.jmh &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DarchetypeArtifactId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jmh-scala-benchmark-archetype &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DgroupId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;info.kupczynski &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -DartifactId&lt;span style="color:#f92672"&gt;=&lt;/span&gt;jmh-scala-playground &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; -Dversion&lt;span style="color:#f92672"&gt;=&lt;/span&gt;1.0
&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;mvn clean install
&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;java -jar target/benchmarks.jar
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Recommended approach:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;setup a standalone project and depend on your jars&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Some hints from the scala community &lt;a href="https://github.com/ktoso/sbt-jmh"&gt;https://github.com/ktoso/sbt-jmh&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Who's Got the Monkey?</title><link>https://kupczynski.info/posts/whos-got-the-monkey/</link><pubDate>Wed, 27 Jun 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/whos-got-the-monkey/</guid><description>&lt;p&gt;Classic advice on time management.&lt;/p&gt;
&lt;p&gt;A colleague of mine (thanks Stu!) recently recommended me a classic article
&lt;a href="https://hbr.org/1999/11/management-time-whos-got-the-monkey"&gt;Management Time: Who&amp;rsquo;s Got the
Monkey?&lt;/a&gt; It is
classic indeed &amp;mdash; published in 1974 . Some of the wording is in need of
modernizing (e.g. the boss-subordinate hierarchy changed into much more flat
organizations), but I think it aged quite well. I&amp;rsquo;ve enjoyed it and I
recommend it to you, my reader :)&lt;/p&gt;
&lt;p&gt;Here are my notes if you want to skim the article quickly.&lt;/p&gt;</description></item><item><title>JVM Class Data Sharing</title><link>https://kupczynski.info/posts/jvm-class-data-sharing/</link><pubDate>Tue, 29 May 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/jvm-class-data-sharing/</guid><description>&lt;p&gt;This post describes how to enable Class Data Sharing (CDS) for a java app and what are the benefits of doing so.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve recently seen a talk about CDS by &lt;a href="https://simonis.github.io/GeeCON2018/CDS/cds.xhtml#/"&gt;Volker
Simonis&lt;/a&gt; which was
the inspiration to write this blogpost.&lt;/p&gt;
&lt;!-- markdown-toc start - Don't edit this section. Run M-x markdown-toc-refresh-toc --&gt;
&lt;p&gt;&lt;strong&gt;Table of Contents&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#what-is-class-data-sharing"&gt;What is Class Data Sharing?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#prepare-cds"&gt;Prepare CDS&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#intro--we-need-openjdk-10"&gt;Intro — we need OpenJDK 10&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#makefile"&gt;Makefile&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#create-a-list-of-classes-used-by-elasticsearch"&gt;Create a list of classes used by Elasticsearch&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#jvm-error"&gt;JVM error&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#prepopulate-the-class-cache"&gt;Prepopulate the class cache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#package-it-with-the-container"&gt;Package it with the container&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#convenience-targets-to-run-elasticsearch"&gt;Convenience targets to run elasticsearch&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#experiment"&gt;Experiment&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#lets-see-how-the-classes-are-loaded"&gt;Let&amp;rsquo;s see how the classes are loaded&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#memory-usage"&gt;Memory usage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#recap"&gt;Recap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#conclusions"&gt;Conclusions&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#ideas-for-future-posts"&gt;Ideas for future posts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- markdown-toc end --&gt;

&lt;h2 id="what-is-class-data-sharing"&gt;What is Class Data Sharing? &lt;a href="#what-is-class-data-sharing" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Class Data Sharing is a JVM feature, which allows multiple JVMs to share
loaded classes (and some other things) via shared memory.&lt;/p&gt;</description></item><item><title>Notes from Geecon 2018</title><link>https://kupczynski.info/posts/geecon-2018/</link><pubDate>Sun, 13 May 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/geecon-2018/</guid><description>&lt;p&gt;Conference notes.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://2018.geecon.com"&gt;Geecon 2018&lt;/a&gt; was an important event in Center- and
Eastern- European JVM conference agenda. It was over a year since I&amp;rsquo;ve attended
my last non-elastic related event so I thought it is a great venue to pick up
some ideas and look where the industry is heading nowadays. And what a great
venue it was!&lt;/p&gt;
&lt;p&gt;In this pots I&amp;rsquo;ll present mostly raw notes I&amp;rsquo;ve took during the talks. If some
of the ideas stick with me, I may explore and refine them later on. Oh, there
where 4 concurrent talks at most of the slots, so I can cover only a subset. So
the notes are uncomplete and &lt;strong&gt;may&lt;/strong&gt; be misleading. Proceed at your own risk :)&lt;/p&gt;</description></item><item><title>Learning VIM with Spacemacs</title><link>https://kupczynski.info/posts/spacemacs/</link><pubDate>Wed, 18 Apr 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/spacemacs/</guid><description>&lt;p&gt;I just don&amp;rsquo;t grok the vi (yet).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2018-04-spacemacs.png" alt="Spacemacs"&gt;&lt;/p&gt;
&lt;p&gt;Three weeks ago, I&amp;rsquo;ve ditched most of my emacs config and installed
&lt;a href="http://spacemacs.org"&gt;spacemacs&lt;/a&gt;. The main driver was that I wanted to try
modal editing instead of emacs key chords. I could&amp;rsquo;ve tried vim of course, but
I&amp;rsquo;m already invested in emacs and feel at home there.&lt;/p&gt;

&lt;h2 id="evil-mode"&gt;Evil-mode&lt;a id="sec-1"&gt;&lt;/a&gt; &lt;a href="#evil-mode" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Luckily, there is a brilliant vim emulation in emacs, called &lt;a href="https://github.com/emacs-evil/evil"&gt;evil
mode&lt;/a&gt;. I didn&amp;rsquo;t want to spend too much time
configuring it though plus I have no idea which vim plugins ported to emacs are
worth looking at, so I&amp;rsquo;ve given spacemacs a go. Spacemacs is a distribution of
emacs preconfigured with evil and with an extensive documentation.&lt;/p&gt;</description></item><item><title>12 Rules For Life</title><link>https://kupczynski.info/posts/12-rules-of-life/</link><pubDate>Mon, 02 Apr 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/12-rules-of-life/</guid><description>&lt;p&gt;I&amp;rsquo;ve read &lt;a href="https://www.amazon.com/12-Rules-Life-Antidote-Chaos/dp/0345816021"&gt;&lt;em&gt;12 Rules for Life: An Antidote to
Chaos&lt;/em&gt;&lt;/a&gt; by
Jordan Peterson.&lt;/p&gt;

&lt;h2 id="background"&gt;Background &lt;a href="#background" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;I&amp;rsquo;ve heard about Professor Jordan Peterson because of my colleague, who is a fan
of him. I&amp;rsquo;ve watched the famous BBC interview with Cathy Newman. The interview
itself is fun to watch as a lesson in debating. Feel free to google it, there
are a plenty of recording and analysis of the interview on youtube. I&amp;rsquo;ve got
intrigued and decided to give Peterson&amp;rsquo;s latest book a shot.&lt;/p&gt;</description></item><item><title>IT Career Options</title><link>https://kupczynski.info/posts/back-to-highschool/</link><pubDate>Fri, 09 Mar 2018 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/back-to-highschool/</guid><description>&lt;p&gt;Talk about career options for pupils of my old highschool&lt;/p&gt;
&lt;p&gt;I was asked to do a short talk on the career options in IT for Henryk
Sienkiewicz grammar school. I agreed without hesitation. It went quite well, I
hope it helped some of the folks to made their mind.&lt;/p&gt;
&lt;p&gt;It started with an interview (to be publish at schools website), and then a
talk in a classroom format. For posterity, I&amp;rsquo;m attaching the slides
below.&lt;/p&gt;</description></item><item><title>Shell in Emacs - Performance</title><link>https://kupczynski.info/posts/mxshell-performance/</link><pubDate>Thu, 07 Dec 2017 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/mxshell-performance/</guid><description>&lt;p&gt;Some of my coworkers use
&lt;a href="https://www.gnu.org/software/emacs/manual/html_mono/eshell.html"&gt;Eshell&lt;/a&gt;
inside emacs as their main &lt;em&gt;terminal emulator&lt;/em&gt;. I had a little bit of envy, so
I decided to give it a try. Unfortunately, I&amp;rsquo;m not going to use it as my main
shell. At least not yet.&lt;/p&gt;

&lt;h2 id="how-fast-can-you-print"&gt;How fast can you print? &lt;a href="#how-fast-can-you-print" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;What is the issue then? &amp;mdash; performance. I&amp;rsquo;ve run a build which outputs a lot
of, mostly useless, warnings to the terminal. And boy, it took ages.&lt;/p&gt;</description></item><item><title>Insanely Simple: The Obsession That Drives Apple's Success</title><link>https://kupczynski.info/posts/insanely-simple/</link><pubDate>Fri, 20 Oct 2017 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/insanely-simple/</guid><description>&lt;p&gt;I&amp;rsquo;ve recently read &lt;em&gt;Insanely Simple: The Obsession That Drives Apple Success&lt;/em&gt;
by Ken Segall. This post summarizes my notes taken while reading the book.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.goodreads.com/book/show/13383957-insanely-simple"&gt;&lt;img src="https://kupczynski.info/archive/2017-10-insanely-simple-cover.jpg" alt="Insanely Simple"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2 id="background"&gt;Background &lt;a href="#background" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;Ken Segall is a marketing director who worked with Steve Jobs at Apple and
NeXT for 10 years or so. He also worked with Dell, Intel, IBM and other tech
companies. In the book he offers a lot of stories on how Apple and Steve Jobs
(or &lt;em&gt;Steve&lt;/em&gt;) did things. He contrasts it with the other tech companies. They
are centered around few topics like &lt;em&gt;think brutal&lt;/em&gt; or &lt;em&gt;Think small&lt;/em&gt;. The book
depicts Steve Jobs as a man devoted to simplicity and it suggests that
simplicity is the key ingredient of the Apple&amp;rsquo;s success.&lt;/p&gt;</description></item><item><title>Elasticsearch and absolute_form in HTTP/1.1 request line</title><link>https://kupczynski.info/posts/elasticsearch-abolute-form-request/</link><pubDate>Fri, 08 Sep 2017 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elasticsearch-abolute-form-request/</guid><description>&lt;p&gt;Elasticsearch doesn&amp;rsquo;t accept some of the HTTP/1.1 incompliant clients for a security reason.&lt;/p&gt;
&lt;p&gt;Described on &lt;a href="https://discuss.elastic.co/t/http-request-and-rfc/84056"&gt;the elasticsearch
forum&lt;/a&gt;.
Elasticsearch complains when &lt;code&gt;absolute_form&lt;/code&gt;, i.e. host + path, is present in
the request line.&lt;/p&gt;
&lt;p&gt;For example this request works &lt;code&gt;(1)&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST /_search HTTP/1.1
host: localhost:9200
date: Fri, 28 Apr 2017 19:30:04 GMT
content-length: 42
content-type: application/json

{&amp;quot;query&amp;quot;:{&amp;quot;match&amp;quot;:{&amp;quot;_all&amp;quot;:&amp;quot;Hello World&amp;quot;}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;But this one doesn&amp;rsquo;t &lt;code&gt;(2)&lt;/code&gt;. Notice the &lt;code&gt;http://localhost:9200&lt;/code&gt; after &lt;code&gt;POST&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;POST http://localhost:9200/_search HTTP/1.1
host: localhost:9200
date: Fri, 28 Apr 2017 19:30:04 GMT
content-length: 42
content-type: application/json

{&amp;quot;query&amp;quot;:{&amp;quot;match&amp;quot;:{&amp;quot;_all&amp;quot;:&amp;quot;Hello World&amp;quot;}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;It fails with&lt;/p&gt;</description></item><item><title>Encrypt the traffic between nodes in your elasticsearch cluster</title><link>https://kupczynski.info/posts/elasticsearch-fun-with-tls/</link><pubDate>Sun, 02 Apr 2017 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elasticsearch-fun-with-tls/</guid><description>&lt;p&gt;Encrypting the traffic between elasticsearch nodes using X-Pack security.&lt;/p&gt;
&lt;p&gt;In my opinion, it is quite important to encrypt the traffic between the backend services. Especially, if you don&amp;rsquo;t
control your infrastructure (or don&amp;rsquo;t trust your infra provider). Let&amp;rsquo;s see how to encrypt the elasticsearch cluster
transport traffic with X-Pack.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.elastic.co/guide/en/x-pack/current/xpack-security.html"&gt;X-Pack&lt;/a&gt; uses TLS to encrypt the traffic between
nodes in the cluster and between clients and the cluster. Additionally, a hostname verification can be performed as
well. The prerequisite for internal TLS is to assign a &lt;a href="https://en.wikipedia.org/wiki/X.509"&gt;X.509 certificate&lt;/a&gt; to each
node. The certificates should be sign by a trusted certificate authority, or CA.&lt;/p&gt;</description></item><item><title>How to put AWS Cloudfront in front of S3 hosting a static website</title><link>https://kupczynski.info/posts/terraform-cloudfront-s3-static-hosting/</link><pubDate>Mon, 06 Mar 2017 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/terraform-cloudfront-s3-static-hosting/</guid><description>&lt;p&gt;Some AWS API quirks make it hard to use folder level index documents via terraform.&lt;/p&gt;
&lt;p&gt;If you use a static blogging software
like &lt;a href="https://jekyllrb.com"&gt;jekyll&lt;/a&gt; or &lt;a href="https://gohugo.io"&gt;hugo&lt;/a&gt; you
may be tempted to host them on S3. It is simple, cheap and has a great
availability (lets
ignore
&lt;a href="https://news.ycombinator.com/item?id=13755673"&gt;the recent us-east-1 incident&lt;/a&gt; for
now).&lt;/p&gt;
&lt;p&gt;The static blogging software relies on the fact that you can use
&lt;code&gt;index.html&lt;/code&gt; as a folder root resource. For example if you want to
check the articles tagged as &lt;code&gt;elasticsearch&lt;/code&gt; on this blog under the
&lt;code&gt;/tag/elasticsearch/&lt;/code&gt; url you are in fact viewing
&lt;code&gt;/tag/elasticsearch/index.html&lt;/code&gt; generated by jekyll. Lucikly for us it
is easy to set up S3 in a &lt;em&gt;website&lt;/em&gt; mode which does just that.&lt;/p&gt;</description></item><item><title>Elastic Cloud Architecture</title><link>https://kupczynski.info/posts/elastic-cloud-meetup/</link><pubDate>Wed, 25 May 2016 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elastic-cloud-meetup/</guid><description>&lt;p&gt;My talk at ElasticNL meetup in Nieuwegein.&lt;/p&gt;
&lt;p&gt;I had a great opportunity to talk about &lt;a href="https://www.elastic.co/cloud"&gt;Elastic Cloud&lt;/a&gt; architecture together with &lt;a href="https://twitter.com/mortenin"&gt;Morten Ingebrigtsen&lt;/a&gt;. This was an &lt;a href="http://www.meetup.com/Elastic-NL/"&gt;ElasticNL meetup&lt;/a&gt;. This time in a new venue at Nieuwegein.&lt;/p&gt;
&lt;p&gt;The audience was great and we had a log of good questions. Thanks folks for attending.&lt;/p&gt;
&lt;p&gt;You can &lt;a href="https://kupczynski.info/t/2016-05-24_ElasticNL_meetup.pdf"&gt;grab the slides&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2016-05-meetup1.jpg" alt="Morten demoing Elastic Cloud UI"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2016-05-meetup2.jpg" alt="Igor deep diving into the architecture"&gt;&lt;/p&gt;</description></item><item><title>Chamberconf 2016</title><link>https://kupczynski.info/posts/chamberconf/</link><pubDate>Mon, 07 Mar 2016 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/chamberconf/</guid><description>&lt;p&gt;The only fixed item on the schedule is the time of the diner!&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve just came back from &lt;a href="http://chamberconf.pl"&gt;Chamberconf 2016&lt;/a&gt;. It
is quite an unusual conference on the Polish Java scene. It is small &amp;mdash;
around 80 people total. It is held in a palace, this year in
&lt;a href="http://www.palac-lagow.pl/index.php?option=com_content&amp;amp;view=article&amp;amp;id=14&amp;amp;Itemid=16"&gt;Pałac Łagów&lt;/a&gt;. But
most importantly, there are no sponsors and the form is not very
strict.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2016-03-07-chamber.jpg" alt="Pałac Łagów"&gt;&lt;/p&gt;
&lt;p&gt;The idea is to promote and facilitate informal discussions around the
topics covered by speakers or any other JVM or CS related topcis. I
think this year they met the expectations. There where some nice talks
and tons of good discussions.&lt;/p&gt;</description></item><item><title>You Know, for Search...</title><link>https://kupczynski.info/posts/elastic-cloud/</link><pubDate>Sun, 06 Mar 2016 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elastic-cloud/</guid><description>&lt;p&gt;Year 2016 brings new challenges. I joined Elastic to work on the Cloud team.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve talked and blogged about elasticsearch quite a few times last
year. At Egnyte, we&amp;rsquo;ve built a search engine which allowed us to offer
great search experience to Egnyte&amp;rsquo;s customers. It was based
elasticsearch and
&lt;a href="https://www.egnyte.com/blog/2015/06/scaling-elasticsearch-at-egnyte/"&gt;we&amp;rsquo;ve successfully scaled it up&lt;/a&gt;
to billions of documents and dozens of terabytes of data. I had a lot
of fun learning elasticsearch and working through proof-of-concept,
implementation and then production deployment and scaling.&lt;/p&gt;</description></item><item><title>Elasticsearch in Production</title><link>https://kupczynski.info/posts/pjug-workshop/</link><pubDate>Tue, 05 May 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/pjug-workshop/</guid><description>&lt;p&gt;Lessons Learned from Deploying and Managing Multi Billion Document Search Engine at Egnyte - my talk at Poznan Java User Group.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Elasticsearch in Production, Lessons Learned from Deploying and
Managing Multi Billion Document Search Engine at Egnyte&lt;/em&gt;. I gave this
talk on our search engine at &lt;a href="http://www.jug.poznan.pl/"&gt;Poznan Java User Group&lt;/a&gt;. You can
find the slides here:
&lt;a href="https://kupczynski.info/t/2015-05-05-jug-elasticsearch-in-production/slides.html"&gt;https://kupczynski.info/t/2015-05-05-jug-elasticsearch-in-production/slides.html&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This was a very good event followed by a small chamber
discussion. Thanks to all the folks who attended and asked very good
questions :-) This was the first PJUG talk at the Egnyte office, I
hope there will be more to follow.&lt;/p&gt;</description></item><item><title>Elasticsearch Caches - Fielddata</title><link>https://kupczynski.info/posts/fielddata/</link><pubDate>Mon, 06 Apr 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/fielddata/</guid><description>&lt;p&gt;Exploring elasticsearch caches and memory usage - fielddata.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt; this blogpost was written for elasticsearch 1.6 and it is no longer up-to-date.&lt;/p&gt;
&lt;p&gt;One of my production clusters got recently hit by the
&lt;code&gt;CircuitBreakerException Data too large&lt;/code&gt; exception. In this post we&amp;rsquo;ll
explore the &lt;code&gt;Fielddata&lt;/code&gt; cache, &lt;em&gt;Circuit Breakers&lt;/em&gt; and what we can do
to avoid &lt;code&gt;Fielddata&lt;/code&gt; eating all of our precious heap space. This a
first article in a short series on
&lt;a href="https://kupczynski.info/tag/es-mem/"&gt;elasticsearch memory usage&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Elasticsearch Workshop at Poznań University of Technology</title><link>https://kupczynski.info/posts/put-workshops/</link><pubDate>Thu, 26 Mar 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/put-workshops/</guid><description>&lt;p&gt;I&amp;rsquo;ve conducted an Elasticsearch workshop at my university Career Fairs&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve conducted an intro workshop to Elasticsearch at Poznań University
of Technology today. I was there because of Career Fairs where my
employer wanted to attract young talents and make our brand more
recognizable among students and graduates of technical majors.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2015-03-workshop.jpg" alt="Workshop group at Poznań University of Technology"&gt;&lt;/p&gt;
&lt;p&gt;The workshop group was very small - four students, but this allowed us
to keep a good pace and we covered a lot of material. The interaction
was also quite dynamic.&lt;/p&gt;</description></item><item><title>Make Me a Cluster</title><link>https://kupczynski.info/posts/make-me-a-cluster/</link><pubDate>Mon, 23 Mar 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/make-me-a-cluster/</guid><description>&lt;p&gt;Easily provision an Elasticsearch cluster for fun, experimentation and profit.&lt;/p&gt;
&lt;p&gt;If you followed my blog you may known than I&amp;rsquo;m responsible for
changing my employer&amp;rsquo;s in-house search appliance to a new one backed
by Elasticsearch. We had a huge data volume, even though we are not
fully migrated to Elasticsearch yet. During our day to day operations
we see a lot of interesting cases. I think we reached that point where
reading documentation, news groups and blogs is simply not enough to
explain everything we see in the trenches. I often feel a need to
experiment with an Elasticsearch cluster.&lt;/p&gt;</description></item><item><title>Profiling Python Scripts</title><link>https://kupczynski.info/posts/profiling-python-scripts/</link><pubDate>Fri, 16 Jan 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/profiling-python-scripts/</guid><description>&lt;p&gt;Run snake, run! How to profile python scripts with ease.&lt;/p&gt;
&lt;p&gt;I have a python script which is responsible for a long running
migration. The script communicates with three other systems - it reads
some data from &lt;em&gt;systems #1&lt;/em&gt; and &lt;em&gt;#2&lt;/em&gt;, merges them and then pushes them
to the &lt;em&gt;system #3&lt;/em&gt;. This is depicted below. The problem was that the
migration run at a pace I wasn&amp;rsquo;t happy with. Since most of the work
the script does it communication with external systems I wanted to
know which is slow. Python has a great built-in profiler to answer
this kind of questions. Follow this post to learn on how to use it.&lt;/p&gt;</description></item><item><title>Delaying Proxy in NodeJS</title><link>https://kupczynski.info/posts/latent-proxy-in-nodejs/</link><pubDate>Thu, 08 Jan 2015 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/latent-proxy-in-nodejs/</guid><description>&lt;p&gt;It is about time to add a new tool to your toolbox.&lt;/p&gt;
&lt;p&gt;During the Christmas holiday season I had some time to learn
NodeJS. In this post I&amp;rsquo;ll show how to create a simple (but useful!)
proxy server in less than 30 lines of code. I&amp;rsquo;ll also give some hints
on how to start with JavaScript with no prior experience.&lt;/p&gt;

&lt;h1 id="delaying-proxy"&gt;Delaying Proxy&lt;/h1&gt;

&lt;p&gt;To give some background. I have a piece of code calling elasticsearch
via its REST api and I wanted to test how it behaves in case of
various network delays. I decide to create a simple proxy to simulate
it. The idea is depicted below.&lt;/p&gt;</description></item><item><title>How do High Frequency Traders Make Their Money?</title><link>https://kupczynski.info/posts/high-frequency-trading/</link><pubDate>Sat, 06 Dec 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/high-frequency-trading/</guid><description>&lt;p&gt;Michael Lewis offers a good story plus a layman introduction to high-frequency trading.&lt;/p&gt;
&lt;p&gt;High Frequency Trading is quite a hot topic nowadays. It is a form of
algorithmic trading where you gain an advantage by being faster than
the other market participants. But how do high frequency traders make
their money? The book &lt;em&gt;Flash Boys&lt;/em&gt; by Michael Lewis, that I’ve
recently read, is a good introduction to the topic. In this post I&amp;rsquo;ll
summarize what I&amp;rsquo;ve learned from it.&lt;/p&gt;</description></item><item><title>Accessing Elasticsearch Cluster over https</title><link>https://kupczynski.info/posts/elasticsearch-over-https/</link><pubDate>Wed, 26 Nov 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elasticsearch-over-https/</guid><description>&lt;p&gt;Access your cluster securely in python or in java.&lt;/p&gt;
&lt;p&gt;Elasticsearch offers no security out-of-the box. The connections are
over http or their &lt;a href="http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_talking_to_elasticsearch.html"&gt;native protocol&lt;/a&gt;, both unencrypted, for all
the world to see. This is not a problem if your cluster is in the same
datacenter as the rest of your infrastructure - safely behind a
firewall. Quite often this is not the case. You can put the cluster in
Amazon EC2 or Google Compute Engine or something similar. If you do
this, then need to encrypt the connection. Arguably, the easiest
solution is to use https. There are various ways to configure the
cluster, usually through some third-party proxy like nginx (please see
the &lt;a href="https://github.com/elasticsearch/elasticsearch/issues/664"&gt;discussion&lt;/a&gt;). Recently, we&amp;rsquo;ve decided to spin a new
cluster in Google Compute Engine and to allow only https access. I was
curious if my existing java and python client code will work
out-of-the box.&lt;/p&gt;</description></item><item><title>Searching for Product Name in Elasticsearch</title><link>https://kupczynski.info/posts/search-for-product-name/</link><pubDate>Wed, 22 Oct 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/search-for-product-name/</guid><description>&lt;p&gt;How to implement good search on product name in Elasticsearch.&lt;/p&gt;
&lt;p&gt;A lot of elasticsearch clusters will have a usecase of searching for
product name. It doesn&amp;rsquo;t really matter if the products are consumer
goods, articles or files. The important thing is that users what to
search by product name and find matching items. The products should be
found if a user types their exact name or just type something close
enough. In the post I&amp;rsquo;ll describe a possible implementation of this
usecase.&lt;/p&gt;</description></item><item><title>Elasticsearch Refresh</title><link>https://kupczynski.info/posts/elasticsearch-refresh/</link><pubDate>Mon, 20 Oct 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elasticsearch-refresh/</guid><description>&lt;p&gt;The problem with near-realtime search and &lt;em&gt;update-by-query&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;In the startup I work for we&amp;rsquo;re evaluating the usage of elasticsearch
to search for file metadata. Recently, when writing an integration
test I&amp;rsquo;ve found an interesting bug, which I missed when designing the
solution. We use the &lt;a href="https://github.com/yakaz/elasticsearch-action-updatebyquery"&gt;update-by-query&lt;/a&gt; plugin to bulk update
docs. In test I wrote I added a document and immediately updated
it. The thing is that the document was not being update. What
happened? Read on&amp;hellip;&lt;/p&gt;</description></item><item><title>Two Recently Discovered Emacs Plugins</title><link>https://kupczynski.info/posts/emacs-plugins/</link><pubDate>Tue, 30 Sep 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/emacs-plugins/</guid><description>&lt;p&gt;Edit your gmail messages with emacs and make http requests from your favorite editor&lt;/p&gt;
&lt;p&gt;I recently found two interesting emacs plusing which can be applied
for many usecases.&lt;/p&gt;

&lt;h1 id="gmail-message-mode"&gt;Gmail Message Mode&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://github.com/Bruce-Connor/gmail-mode/"&gt;&lt;code&gt;gmail-message-mode&lt;/code&gt;&lt;/a&gt; lets you invoke an emacs editor straight
from the compose screen in gmail. You need to click on an icon or you
can use a keyboard shortcut - &lt;code&gt;alt + enter&lt;/code&gt; (this key chord is not
customizable, its just on/off, what a misery for emacs geeks ;-)).&lt;/p&gt;</description></item><item><title>Standing Desk at Home</title><link>https://kupczynski.info/posts/standing-desk/</link><pubDate>Thu, 31 Jul 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/standing-desk/</guid><description>&lt;p&gt;Use a laptop tray to create a standing desk at home with (almost) no effort.&lt;/p&gt;
&lt;p&gt;Looks like this standing desk is not a niche anymore. There are lot of
articles on-line about its benefits and issues the people are facing
(like &lt;a href="http://www.washingtonpost.com/national/health-science/standing-up-at-your-desk-may-energize-you-but-it-also-may-be-tough-on-your-legs/2013/11/22/4d166d9a-0f46-11e3-8cdd-bcdc09410972_story.html"&gt;this&lt;/a&gt; or &lt;a href="http://www.nytimes.com/2012/12/02/business/stand-up-desks-gaining-favor-in-the-workplace.html"&gt;this&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Anyways, I decided the last year that I want to try it. A dedicated
desk for standing can be quite expensive and also you may need to
ditch your current desk if your home office is small. Of course, this
was to be an experiment, so I wanted to try it with minimal effort and
cost.&lt;/p&gt;</description></item><item><title>Host Gitlab on DigitalOcean</title><link>https://kupczynski.info/posts/host-gitlab-on-digitalocean/</link><pubDate>Tue, 08 Jul 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/host-gitlab-on-digitalocean/</guid><description>&lt;p&gt;Building own github in the cloud.&lt;/p&gt;
&lt;p&gt;I recently migrated my private repos to digital ocean and gitlab. This
post is a walk through on how to do it and summarizes my experience.&lt;/p&gt;

&lt;h1 id="intro"&gt;Intro&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/?refcode=649b18bb5e59"&gt;Digital Ocean&lt;/a&gt; is a VPS provider. They have their data centers
in NY, SF, Amsterdam and Singapore. Their servers are provisioned with
SSD drives and have a very competitive pricing. They are a new kid in
the block (launched in 2013), but they gained a lot of traction over
the internet and there are a lot of success stories posted by
different people. I think this is because they offer a good service, a
simple UI and a competitive pricing.&lt;/p&gt;</description></item><item><title>CAP Theorem and Elasticsearch</title><link>https://kupczynski.info/posts/elastic-cap/</link><pubDate>Thu, 26 Jun 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/elastic-cap/</guid><description>&lt;p&gt;Will it fail together with the network?&lt;/p&gt;
&lt;p&gt;Let us check the Elasticsearch behavior in context of the CAP theorem.&lt;/p&gt;

&lt;h1 id="cap-theorem"&gt;CAP Theorem&lt;/h1&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/CAP_theorem"&gt;CAP theorem&lt;/a&gt; stays that a
distributed system communicating over an asynchronous network can&amp;rsquo;t
provide these three properties at once:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;Consistency&lt;/dt&gt;
&lt;dd&gt;A read sees all previous writes;&lt;/dd&gt;
&lt;dt&gt;Availability&lt;/dt&gt;
&lt;dd&gt;Reads and writes succeed on all nodes;&lt;/dd&gt;
&lt;dt&gt;Partition tolerance&lt;/dt&gt;
&lt;dd&gt;These properties stay intact even in case of a network failure of
some of the communication links between nodes.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;This theorem is often used (and misused), but luckily there are some
good clarifications over the Internet (see e.g. &lt;a href="https://foundationdb.com/key-value-store/white-papers/the-cap-theorem"&gt;1&lt;/a&gt;, &lt;a href="http://codahale.com/you-cant-sacrifice-partition-tolerance/"&gt;2&lt;/a&gt;
or even
&lt;a href="http://ksat.me/a-plain-english-introduction-to-cap-theorem/"&gt;plain english, yet sexist and overly simplified explanation&lt;/a&gt;).&lt;/p&gt;</description></item><item><title>MapDB</title><link>https://kupczynski.info/posts/mapdb/</link><pubDate>Tue, 20 May 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/mapdb/</guid><description>&lt;p&gt;Fast, off-heap java database with a collection interface.&lt;/p&gt;
&lt;p&gt;The problem statement is this - you have a set of text files. Each row
in the file represents a row from the database. The rows can belong to
one of two tables (they can represent one of two distinct
entities). There is a parent-child, one-to-many relationship between
the entities. The parent always comes before its children, but you do
not know how many children there are left. You need to denormalize the
parent data into child entities and dump the data back to a text
file. See the dumbed-down example below.&lt;/p&gt;</description></item><item><title>Samsung Fail</title><link>https://kupczynski.info/posts/samsung-fail/</link><pubDate>Thu, 24 Apr 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/samsung-fail/</guid><description>&lt;p&gt;How not to update firmware + solution.&lt;/p&gt;
&lt;p&gt;I own a Galaxy S3 smartphone, which I&amp;rsquo;m quite happy with. Android has
its issues but the hardware is very good and samsung rolled a few apps
to compensate for the OS shortcomings. However today I was really
disappointed. They rolled out a new update. &lt;em&gt;Updated 2014-05-06 with a
solution&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2014-04-24-samsung-fail.png" alt="Update change-log"&gt;&lt;/p&gt;
&lt;p&gt;Take a look at the change log:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Added new feature.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Really? Is this worth 50+mb of firmware update to add &lt;strong&gt;a&lt;/strong&gt; feature?
And then, take a look at the incentive for me to update:&lt;/p&gt;</description></item><item><title>Near real-time analytics</title><link>https://kupczynski.info/posts/bigdata-bigfail/</link><pubDate>Tue, 15 Apr 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/bigdata-bigfail/</guid><description>&lt;p&gt;Big data = big fail?&lt;/p&gt;
&lt;p&gt;Martin Fowler recently summarized a &amp;ldquo;Reporting Database&amp;rdquo; pattern. The
core idea behind this pattern is to split analytical and transactional
processing by providing a separate database for the former. A separate
database for reporting purposes is nothing new and this pattern is
widespread in the &lt;em&gt;enterprise&lt;/em&gt; space. What caught my interest though
was his opinion on near real-time analytics.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;These days the desire seems to be for near-real time analytics. I&amp;rsquo;m
skeptical of the value of this. Often when analyzing data trends you don&amp;rsquo;t
need to react right away, and your thinking improves when you give it time
for a proper mulling. Reacting too quickly leads to a form of information
hysteresis, where you react badly to data that&amp;rsquo;s changing too rapidly to get
a proper picture of what&amp;rsquo;s going on.
&lt;a href="http://martinfowler.com/bliki/ReportingDatabase.html"&gt;Source&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Java 8 Released</title><link>https://kupczynski.info/posts/java-8/</link><pubDate>Sun, 30 Mar 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/java-8/</guid><description>&lt;p&gt;Whats new in Java 8? Where to start learning?&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html"&gt;Last week we saw the new release of Java&lt;/a&gt;. Version
8 brings a lot of new features into the language. I think the most
important are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lambda expressions,&lt;/li&gt;
&lt;li&gt;default method implementations in interfaces,&lt;/li&gt;
&lt;li&gt;new datetime api.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;There is also a lot of smaller improvements and additions in the
standard library.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://kupczynski.info/archive/2014-03-30-lambda.jpg" alt="Lamdas FTW!"&gt; &lt;em&gt;Image from &lt;a href="http://www.jamesiliff.com/speechless-protagonists-spatial-storytelling-and-immersive-worlds-half-life-game-narrative-review-at-gdc-2012"&gt;http://www.jamesiliff.com/speechless-protagonists-spatial-storytelling-and-immersive-worlds-half-life-game-narrative-review-at-gdc-2012&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m a huge fan of the functional programming paradigm and of course
I&amp;rsquo;m very excited about the release. Hope it will be quickly and widely
adopted in production. Also the library improvements will make a
compelling alternative to popular external libraries like
&lt;a href="http://www.joda.org/joda-time/"&gt;JodaTime&lt;/a&gt; and
&lt;a href="https://code.google.com/p/guava-libraries/"&gt;Guava&lt;/a&gt;. This is good,
because I think everybody were including them, even for small
projects.&lt;/p&gt;</description></item><item><title>Project Lombok</title><link>https://kupczynski.info/posts/lombok/</link><pubDate>Thu, 20 Mar 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/lombok/</guid><description>&lt;p&gt;Never write your getters again!&lt;/p&gt;
&lt;p&gt;My college recently introduced
&lt;a href="http://projectlombok.org/"&gt;Project Lombok&lt;/a&gt; to our java code
base. This is a great tool, which aims to make java source code less
verbose by using a compile time
&lt;a href="http://deors.wordpress.com/2011/10/08/annotation-processors/"&gt;annotation processor&lt;/a&gt;. In
this post I give you a basic example of usage of Lombok and a
description on how to configure IntelliJ Idea to use it.&lt;/p&gt;

&lt;h1 id="basic-usage"&gt;Basic usage&lt;/h1&gt;

&lt;p&gt;To give a quick example (&lt;a href="http://jnb.ociweb.com/jnb/jnbJan2010.html#data"&gt;src&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;This piece of code (notice &lt;code&gt;@Data&lt;/code&gt; annotation) with Project Lombok&lt;/p&gt;</description></item><item><title>A Note on MongoDB for Java Developers Course</title><link>https://kupczynski.info/posts/mongodb-101-finished/</link><pubDate>Fri, 28 Feb 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/mongodb-101-finished/</guid><description>&lt;p&gt;A study of a scandal with MongoDB.&lt;/p&gt;
&lt;p&gt;The on-line course - &lt;em&gt;MongoDB for Java Developers&lt;/em&gt; - I&amp;rsquo;d attended
recently is finished. According to the course dashboard&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Certification of completion will be available for download through
your MongoDB Dashboard on or before March 10th.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This was a great experience, kudos for all the guys at 10gen who made
it happened. I really liked the final exam, especially the first few
questions. The dataset they operated on was the
&lt;a href="http://en.wikipedia.org/wiki/Enron_Corpus"&gt;Enron Corpus&lt;/a&gt;. This is&lt;/p&gt;</description></item><item><title>Second Week of Mongo M101J Course</title><link>https://kupczynski.info/posts/mongodb/</link><pubDate>Sun, 19 Jan 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/mongodb/</guid><description>&lt;p&gt;First impressions on MongoDB and M101J course.&lt;/p&gt;
&lt;p&gt;I finished the second week of the MOOC &lt;a href="https://education.mongodb.com/courses/10gen/M101J/2014_January/about"&gt;MongoDB for Java Developers&lt;/a&gt;
which I advertised in my latest post. I really like the course and I think its
worth to spend some time learning Mongo.&lt;/p&gt;
&lt;p&gt;MongoDB itself is an example of a NoSQL database and you can learn more during
the course. In this post I want to highlight some features presented in first
two weeks which I feel are inconsistent and surprised me a bit.&lt;/p&gt;</description></item><item><title>M101J - MongoDB for Java Developers</title><link>https://kupczynski.info/posts/mongodb-101/</link><pubDate>Mon, 06 Jan 2014 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/mongodb-101/</guid><description>&lt;p&gt;Free MongodDB course for Java Developers starts today.&lt;/p&gt;
&lt;p&gt;10gen, the company behind &lt;a href="http://www.mongodb.com/"&gt;MongoDB&lt;/a&gt; offers a free
on-line &lt;a href="https://education.mongodb.com/courses/10gen/M101J/2014_January/about"&gt;course&lt;/a&gt;, which ends with a certificate. It&amp;rsquo;s a great
opportunity if you want to get quickly up to speed with MongoDB. The
course starts today and you can still sign-in.&lt;/p&gt;
&lt;p&gt;The course is available here:
&lt;a href="https://education.mongodb.com/courses/10gen/M101J/2014_January/about"&gt;https://education.mongodb.com/courses/10gen/M101J/2014_January/about&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn everything you need to know to get started building a
MongoDB-based app.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This course will go over basic installation,
JSON, schema design, querying, insertion of data, indexing and
working with language drivers. In the course, you will build a
blogging platform, backed by MongoDB. Our code examples will be in
Java.&lt;/p&gt;</description></item><item><title>Metaprogramming in Groovy</title><link>https://kupczynski.info/posts/groovy-method-resolution/</link><pubDate>Sat, 07 Dec 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/groovy-method-resolution/</guid><description>&lt;p&gt;&lt;a href="http://groovy.codehaus.org/"&gt;Groovy&lt;/a&gt; the language offers neat metaprogramming features. To
&lt;em&gt;metaprogram&lt;/em&gt; means to write programs manipulating other
programs. In context of groovy this enables us to synthesize methods
and classes, intercept calls and make objects behave like instances of
different types. All of these manipulations happen at runtime. Groovy
also offers compile-time AST (Abstract Syntax Tree) manipulation.&lt;/p&gt;
&lt;p&gt;Before we move out to the features themselves, let&amp;rsquo;s start with
figuring out how Groovy can change behavior of various classes of
objects.&lt;/p&gt;</description></item><item><title>Personal Kanban</title><link>https://kupczynski.info/posts/personal-kanban/</link><pubDate>Thu, 29 Aug 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/personal-kanban/</guid><description>&lt;p&gt;Productivity system inspired by lean and agile ideas which helps you focus on what is important.&lt;/p&gt;
&lt;p&gt;Recently I&amp;rsquo;ve read an interesting book by &lt;a href="http://www.personalkanban.com/pk/jim-benson/"&gt;Jim Benson&lt;/a&gt; &amp;amp; &lt;a href="http://www.personalkanban.com/pk/author/tonianne-demaria-barry/"&gt;Tonianne DeMaria
Barry&lt;/a&gt; - &lt;a href="http://www.amazon.com/Personal-Kanban-Mapping-Work-Navigating/dp/1453802266"&gt;Personal Kanban&lt;/a&gt;. This book not only promises to be 100%
new age free, but also not to focus on doing more. Sounds unorthodox for a
productivity book? Well, it surely does sound interesting. This post is
intended to be a short description of the Personal Kanban (PK) process - it
should contain enough information to get you started. Please bear in mind that
it is also an enthusiastic description - I decided to summarize PK and not
review it, yet. However, in a few weeks I plan to write a companion post to
describe my experience with implementing PK at home and in the office and
evaluate it it more details.&lt;/p&gt;</description></item><item><title>Markdown in the (Browser) Box</title><link>https://kupczynski.info/posts/markdown-here/</link><pubDate>Tue, 13 Aug 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/markdown-here/</guid><description>&lt;p&gt;Clean and good looking emails including code &amp;amp; math. Write them using markdown and render to html within your browser.&lt;/p&gt;
&lt;p&gt;You need to write a long email. With all the sections, sub-section, lists,
etc. You need to put some code there (or just let anybody know what &lt;a href="http://en.wikipedia.org/wiki/Maxwell%27s_equations#Conventional_formulation_in_SI_units"&gt;God said
to make the light&lt;/a&gt;). Luckily for you, html emails were invented - you
can open the gmail UI and start typing&amp;hellip; Wait. Did I mean &lt;em&gt;gmail html
editor&lt;/em&gt;? The one that needs three clicks to monospace a piece of code? There
has to be a better way. And there is - use &lt;a href="http://markdown-here.com/"&gt;Markdown Here&lt;/a&gt;. A plugin to
your browser which lets you write emails in &lt;a href="http://daringfireball.net/projects/markdown/"&gt;Markdown&lt;/a&gt; and then render it
with a key stroke.&lt;/p&gt;</description></item><item><title>Remote Debug Junit Tests Run From Ant</title><link>https://kupczynski.info/posts/remote-debug-junit-tests-run-from-ant/</link><pubDate>Thu, 08 Aug 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/remote-debug-junit-tests-run-from-ant/</guid><description>&lt;p&gt;How to turn on remote debugging for junit testrunner in ant.&lt;/p&gt;
&lt;p&gt;Sometimes you want to run a testset in an isolated environment. Be it a
different box, a virtual machine, a different user or just a console and not
an IDE. Reasons may vary, e.g. you need a special setup for the integration
tests or you have a fancy build configuration which is hard to reproduce in
the IDE. Still, no matter what your reasons are, you want to debug such tests.
In this post I&amp;rsquo;ll show how to use a remote debugger to connect to a test
environment using IntelliJ Idea or Eclipse. I assume you have an ant build.&lt;/p&gt;</description></item><item><title>Ubuntu on Samsung Series 7 Ultrabook 730U</title><link>https://kupczynski.info/posts/ubuntu-on-samsung-series-7/</link><pubDate>Mon, 22 Jul 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/ubuntu-on-samsung-series-7/</guid><description>&lt;p&gt;Is it possible to install Xubuntu 12.04 on Samsung NP730U3E?&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve got a new laptop - Samsung 7 Series NP 730U 3E. It&amp;rsquo;s 13.3&amp;rsquo;&amp;rsquo; ultrabook
with a quite decent hardware under the hood:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Intel Core i7-3537U,&lt;/li&gt;
&lt;li&gt;10 GB of RAM,&lt;/li&gt;
&lt;li&gt;13,3&amp;rsquo;&amp;rsquo; Full HD Display (1920x1080),&lt;/li&gt;
&lt;li&gt;128 GB SSD drive,&lt;/li&gt;
&lt;li&gt;Two graphic cards: AMD Radeon HD 8570M + Intel HD Graphics 4000.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This machine comes with a preinstalled Windows 8. It is a bit of an issue for
me - I heavily rely on linux both for work and for my other projects.&lt;/p&gt;</description></item><item><title>Be Your Own Certificate Authority</title><link>https://kupczynski.info/posts/creating-your-own-certificates/</link><pubDate>Sun, 21 Apr 2013 00:00:00 +0000</pubDate><guid>https://kupczynski.info/posts/creating-your-own-certificates/</guid><description>How to create a Certificate Authority and use it to generate SSL certificates.
&lt;p&gt;
There are many reasons why you may need to create your own CA. Although you
are advised to sign internet facing services with a certificate from a trusted
root entity you have much more freedom when it comes to your intranet or vpn
infrastructure. The other use cases may include a WPA2 enterprise access point
or an https connection to a private wiki page.
&lt;/p&gt;</description></item><item><title>Legal</title><link>https://kupczynski.info/legal/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://kupczynski.info/legal/</guid><description>&lt;h2 id="licence"&gt;Licence &lt;a href="#licence" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;&lt;a
rel="license"
href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;
&lt;img
alt="Creative Commons License"
style="border-width:0"
src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;All the content of &lt;a href=""&gt;https://kupczynski.info&lt;/a&gt; is licensed under a
&lt;a rel="license"
href="http://creativecommons.org/licenses/by-sa/4.0/"&gt;Creative Commons
Attribution-ShareAlike 4.0 International License&lt;/a&gt;
unless stated otherwise.&lt;/p&gt;

&lt;h2 id="disclaimer"&gt;Disclaimer &lt;a href="#disclaimer" class="anchor-link"&gt;#&lt;/a&gt;&lt;/h2&gt;

&lt;p&gt;The views and opinions with stated on this blog represent my own and not those
of people, institutions or organizations I am affiliated with unless stated
explicitly. Especially my blog is not affiliated with, neither does it
represent the views, position or attitudes of my employer(s), their clients,
or any of their affiliated companies.&lt;/p&gt;</description></item></channel></rss>