<?xml version='1.0' encoding='UTF-8'?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><atom:link href="https://gamlor.info/" rel="self" type="application/rss+xml"/><title>Gamlor's Blog</title><link>https://gamlor.info/</link><description>Roman's ramblings</description><lastBuildDate>Fri, 24 Apr 2026 21:58:21 +0200</lastBuildDate><generator>clj-rss</generator><item><guid>https://gamlor.info/posts-output/2026-04-24-good-error-reduces-debugging/kr/</guid><link>https://gamlor.info/posts-output/2026-04-24-good-error-reduces-debugging/kr/</link><title>좋은 오류 메시지가 시간을 절약하다</title><description>(이 글은 영어로 또 있어요.)개발자는 자주 오류를 보고 오류의 메시지를 읽어야 해요.
그래서 나쁜 오류 메시지 시간 많이 필요할 수 있잖아요.
오류의 안내가 없으면 사람들 추측하기 시작해야 돼요.나쁜 오류 예:
- 프로세스는 비정상 종료 코드만 하하지마! 제발, 표준 에러에 오류를 설명해주세요!
- 파일을 못 찾았다고요. 끝. 무슨 파일!, 무슨 파일 못 차았어요?
- 등근데 진짜 좋은 예도 있어요: Babashka HTTP client.REPL에서:근데, 오류 정보를 더 잘 살펴보면 정보 많이 생기다:</description><pubDate>Fri, 24 Apr 2026 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2026-04-24-good-error-reduces-debugging/en/</guid><link>https://gamlor.info/posts-output/2026-04-24-good-error-reduces-debugging/en/</link><title>Good Error Messages Save Time</title><description>Developers often face errors and will read error messages.
So, a bad error message will use a lot of time.
If there is no good information, people have to start guessing.Bad error examples:
- Do not a process with only an error code. Please explain the error in the error standard out.
- "File not found error." End. What file! WHAT file was not found
- etcHowever, a good example is Babashka HTTP client.In the REPL:Not much, but you can ask for the full error information in the REPL:</description><pubDate>Fri, 24 Apr 2026 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2026-01-02-redirect-ports-via-firewall/kr/</guid><link>https://gamlor.info/posts-output/2026-01-02-redirect-ports-via-firewall/kr/</link><title>루트 없는 포트 80/443 사용하기 방법: 방화벽으로</title><description>(이 글은 영어로 또 있어요.)유닉스는 루트만 1024이한 포트를 사용할 수 있어요.
근데 인터넷 듣기 위험해요: 이 프러그램이 보안 취약 있으면
나쁜 넘들이 루트 권한을 받을 수 있어요.
그래서 비루트로 1024이한 포트를 사용한 방법 필요해요.잘 아는 방법은:`setuid`과 `setgid`로 포트 바인딩 하기 후에 일반 사용자 바꼬기 보텅 권한 해제해요.자근 유틸리티 privbind는
모든 프로그램 1024이한 포트를 사용 권한으로 비루트로 시작해요.리눅스의 CAP_NET_BIND_SERVICE capability 프로그램에게 권한을 해요.Docker 아니면 다른 컨테이너는 포트과 사용자 옵션이 있어요.</description><pubDate>Mon, 29 Dec 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2026-01-02-redirect-ports-via-firewall/en/</guid><link>https://gamlor.info/posts-output/2026-01-02-redirect-ports-via-firewall/en/</link><title>Using Port 80/443 without root: Via the Firewall</title><description>In Unix/Linux only the root can use ports below 1024.
However, listening to the internet is dangerous:
If that program has a vulnerability, the bad guys can get root permissions.
Therefore, you want to use a way to run the app without root and listen to the below 1024 ports.There are well known methods:Use setuid and setgid to change the user after binding to the ports.Using a small utility like ttps://github.com/JiriHorky/privbind[privbind] to launch
any program non-root but allow it to bind ports.In Linux, grant the CAP_NET_BIND_SERVICE capability to a program.Use Docker or other container systems to bind the port and run under a different user.</description><pubDate>Mon, 29 Dec 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-12-21-out-of-memory-java/en/</guid><link>https://gamlor.info/posts-output/2025-12-21-out-of-memory-java/en/</link><title>OutOfMemoryError: Exit Immediately</title><description>TLDR: I highly recommend to use -XX:+ExitOnOutOfMemoryError or -XX:+CrashOnOutOfMemoryError
for Java apps, combined with -XX:HeapDumpPath=path-to-crash-dumps -XX:+HeapDumpOnOutOfMemoryError.
This stops the JVM from trying to limp on when it runs out of memory and provides dumps to analyze
the issue later.</description><pubDate>Sun, 21 Dec 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-12-02-just-in-time-types-and-cecilifier/en/</guid><link>https://gamlor.info/posts-output/2025-12-02-just-in-time-types-and-cecilifier/en/</link><title>Create Types on Demand and Cecilifier</title><description>This post is part of C# Advent Calendar 2025. Visit it for all the awesome upcoming posts!The traditional C# Advent is here. Usually I give some daily and practical advice.
Like testing tips
[1]
or some outsider view approach to C#
[2]
here.
This time its more about fun with very niche applications.Provide 'Just In Time' Types &amp; Code?In dotNet there are facilities to create types at Runtime. This exists of two things:A callback that is called when a type isn’t found.Loading and generating Assemblies at runtime.</description><pubDate>Tue, 02 Dec 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-11-16-learned-this-week/en/</guid><link>https://gamlor.info/posts-output/2025-11-16-learned-this-week/en/</link><title>Learned/Discovered this week: bpftrace, Windows in Docker, Testcontainers &amp; Docker upgrade, Debugging-Tips</title><description>A short list of things I’ve learned or discovered this week.bpftrace: DTrace for LinuxI discovered that bpftrace exists for Linux.
It is similar to DTrace, where you instrument your system to debug it.
That is great news (to me), because DTrace never made really to mainstream Linux. (Even Windows has it).
bpftrace compiles things to eBPF programs to do the tracing, so it works on must Linux flavors.Found via Brendan Gregg.
Its one of the best resources for performance debugging.</description><pubDate>Sun, 16 Nov 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-11-05-mill-build-caching-bitbucket/en/</guid><link>https://gamlor.info/posts-output/2025-11-05-mill-build-caching-bitbucket/en/</link><title>Use Mill Build Caching in CI-Builds</title><description>Mill build is still my favorite least-hated build tool.
(Here is my outdated introduction to it.)
In this blog post I show how to use the Mill build to speed up builds on branches.I am using Bitbucket pipelines
in this post. And I’m a  newcomer at that =).</description><pubDate>Wed, 05 Nov 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-04-29-run-ie6-on-win11/en/</guid><link>https://gamlor.info/posts-output/2025-04-29-run-ie6-on-win11/en/</link><title>Yes, Internet Explorer still runs on Win11, with some help</title><description>Yes, you still can run Internet Explorer, even the all might Internet Explorer 6, on Windows 11!
Disclosure: I did work years ago on the mentioned product. I am biased.Here are the steps:</description><pubDate>Tue, 29 Apr 2025 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2025-03-28-stack-heap-debugging/en/</guid><link>https://gamlor.info/posts-output/2025-03-28-stack-heap-debugging/en/</link><title>Debug Hanging Programs with Thread- and Heap-Dumps</title><description>I used this technique a surprising amount of times to find out an issue.
It all starts with a hanging Java program: a build tool, some Java based server, etc.The first thing I do in this case is to take a stack trace. For example with jstack</description><pubDate>Fri, 28 Mar 2025 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-12-11-csharp-testing-stuff/en/</guid><link>https://gamlor.info/posts-output/2024-12-11-csharp-testing-stuff/en/</link><title>More Testing Tips With C#</title><description>This post is part of C# Advent Calendar 2024. Visit it for all the awesome upcoming posts!
It was released on 11 December as a substitution for the 8th December spot, as another blogger couldn’t make it.The traditional C# Advent is here. It also seems tradition I talk about
some testing aspect
[1]
or some outsider view approach to C#
[2]
here.
Let’s not break this tradition and I share some more testing tips.</description><pubDate>Wed, 11 Dec 2024 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-09-27-downsides-mill/en/</guid><link>https://gamlor.info/posts-output/2024-09-27-downsides-mill/en/</link><title>Pitfalls with Mill Build</title><description>Here are some challenges and pitfalls I ran into when using Mill.</description><pubDate>Fri, 27 Sep 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-09-11-scala-circe-use-json-object/en/</guid><link>https://gamlor.info/posts-output/2024-09-11-scala-circe-use-json-object/en/</link><title>Circe JSON: Use JsonObject instead of cursors</title><description>I’m using the Circe JSON library at work.
I am not a fan of it. I recommend to stay away from it.
Luckily I rarely have to touch JSON parsing code paths.What makes my blood boil the most with Circe is small ad-hoc JSON parsing,
where I need to extra some values from JSON, without going to create boiler plate class for it.
[1]My expectation for something like that I get a Map, maybe an extended
map with some convenience functions. However, the Circe documentation
guides you towards their cursor API
for that. That API is (censored/insert swearwords/rant here).</description><pubDate>Wed, 11 Sep 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-08-31-mill-for-java/en/</guid><link>https://gamlor.info/posts-output/2024-08-31-mill-for-java/en/</link><title>Mill Build for Java Devs</title><description>Mill has its origin in the Scala world. However, it is well suited to build Java projects.
Recently the official Mill documentation gained a growing Java section
with many examples. So, I’m keeping this post short, as the official documentation has more information than I can cover.</description><pubDate>Mon, 05 Aug 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-07-22-questions-answered/en/</guid><link>https://gamlor.info/posts-output/2024-07-22-questions-answered/en/</link><title>Build Questions answered by Mill builds</title><description>I’ve started this series with a list of questions you will encounter in non trivial builds.
I claimed that Mill had great at answering most of these questions, but left the actual answers
open. Well, after showing Mill for a bit, it is time to answer them.</description><pubDate>Mon, 22 Jul 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-07-15-mill-basics/en/</guid><link>https://gamlor.info/posts-output/2024-07-15-mill-basics/en/</link><title>Mill Basic Building Blocks</title><description>Lets explore the Mill building blocks. We start with a hello world:Then we build it:That works. Note that we used T.dest to give each target its own directory to write to disk
without trampling over other targets. The location in the 'out' directory is always the task names with a .dest suffix.</description><pubDate>Mon, 15 Jul 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-06-10-mill-whirlwind-tour/en/</guid><link>https://gamlor.info/posts-output/2024-06-10-mill-whirlwind-tour/en/</link><title>Whirlwind Tour of Mill Build</title><description>Lets start a whirlwind tour.
Last time we stopped at a basic Java app.
Yes, Mill does of course support building Scala projects as well, but Mill works well for other builds as well.</description><pubDate>Mon, 10 Jun 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-06-05-mill-build/en/</guid><link>https://gamlor.info/posts-output/2024-06-05-mill-build/en/</link><title>Intro to Mill Build: Pleasant Complex Builds</title><description>I’ve experienced a few build tools over time:
Apache Ant, Apache Maven,
Gradle, SBT,
MSBuild, make
and probably some more I’ve forgotten about.
Recently I’ve experimented with the Mill build tool and it is one of the best
ones I’ve worked so far.</description><pubDate>Wed, 22 May 2024 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-02-04-jquery-ajax-call-with-datatype/en/</guid><link>https://gamlor.info/posts-output/2024-02-04-jquery-ajax-call-with-datatype/en/</link><title>JQuery: Always use dataType for $.ajax</title><description>I recently investigated a XSS vulnerability reported via Bugcrowd.
I could reproduce the issue, I just didn’t understand it. The vulnerability looked like this:Attacker uploads a JavaScript file onto Confluence as attachmentManipulate a Confluence macro via REST API to have invalid parameters.Now, when the macro is edited/used, the code in the uploaded JavaScript is executed.The code snipped looked something like this:</description><pubDate>Sun, 04 Feb 2024 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2024-01-12-one-billion-row-challenge/en/</guid><link>https://gamlor.info/posts-output/2024-01-12-one-billion-row-challenge/en/</link><title>One Billion Row Challenge: Learned So Far</title><description>Last Update 2024-02-04, see belowI participate in the One Billion Row Challenge by Gunnar Morling:
Parse one billion rows of CSV, in plain Java, and be fast at it.
It is a friendly completion and learning experience.I had three goals:Be faster than the 'naive' reference solution.Experiment a bit more with the new Memory access API’sExperiment the first time with the new SIMD APIs.</description><pubDate>Fri, 12 Jan 2024 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2023-12-02-paste-and-edit-to-csharp/en/</guid><link>https://gamlor.info/posts-output/2023-12-02-paste-and-edit-to-csharp/en/</link><title>Copy, Paste and Edit Java to C# after 20 years</title><description>This post is part of C# Advent Calendar 2023. Visit it for all the awesome upcoming posts!Basic ClassAttributes / AnnotationsStreams to LINQGenerics and wrapper typesAuto Translation: ChatGPT &amp; CoAuto Translation, Pricise MethodsConclusionC# and .NET have an awesome ecosystem, with tons of libraries and code snippets out there.But sometimes you get that rare snippet of code in another language.
In this blog post, we copy, paste, and edit some example snippets
from Java languages to C#. When C# started back in 2001, Java and C# were similar languages.
But in the last 20 years, C# has quickly evolved in its unique way.
So, let’s if that similarity still helps you:</description><pubDate>Sat, 02 Dec 2023 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2023-05-15-native-memory/en/</guid><link>https://gamlor.info/posts-output/2023-05-15-native-memory/en/</link><title>Java: Native Memory Handling is Getting Easier</title><description>JDK 19, 20, 21 has a new preview API called 'Foreign Function &amp; Memory API'
that makes interacting with native memory and native libraries way easier.
Before you had to use JNI,
JNA or JNR
to interact with native libraries.Further, interacting with 'native' memory was clunky. You either used ByteBuffers,
which have a clunky/dated API, max addressable size 2GByte plus 'freeing' relying on
the GC, unless you do ugly reflection hacks. Or you went down the Unsafe route.Anyway, if your projects allows, I would heavily recommend to the new APIs.
If it is a project you deploy in your backend, you can control the JDK.
If it is a new library, I would still think about starting/consider the new APIs, so that
the library can be kick ass by the time it is mature.</description><pubDate>Mon, 15 May 2023 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2023-04-15-mysterious-hang/en/</guid><link>https://gamlor.info/posts-output/2023-04-15-mysterious-hang/en/</link><title>Mysterious Hanging Java Process</title><description>I recently had a Java (Bamboo Dev Instance) app just hanging when it started up.
Since it was a dev setup, which sometimes has other issues, I did the usual things, like:Turn it on and off again, aka restart it.Clean up the working directory, like a mvn clean, make clean or what ever.Check out a stable branch.Run against different sets of dependency versionsThe app kept on being stuck. So, I was forced to debug it =).</description><pubDate>Sat, 15 Apr 2023 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-12-22-test-containers/en/</guid><link>https://gamlor.info/posts-output/2022-12-22-test-containers/en/</link><title>Test Containers for C#/.NET</title><description>This post is part of C# Advent Calendar 2022.Many applications lean heavily on relation database.
Your application uses complex queries,
constrains on data and all more of the wonderful features of a relation database.
That means that a lot of your applications behavior depends on how the database acts.Therefore, I try to test an against actual database system.
Years ago this used to be a challenge, as most database systems where hard to setup and automate.
Today it is easy.
Use TestContainers!Test ContainersTestContainers is a library which starts up Docker containers
for your tests. More, it provides many pre-configured setups for databases.</description><pubDate>Thu, 22 Dec 2022 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-09-13-reducing-memory-usage/en/</guid><link>https://gamlor.info/posts-output/2022-09-13-reducing-memory-usage/en/</link><title>Redis Clone: Reducing Memory Pressure</title><description>After the taking a look at the original naive implementation,
I wanted to try reducing the memory churn.
By accident the IO optimizations already reduced the memory usage.
Let’s go a bit further, trimming down some memory usage.I often look out for two things:
- Object allocations of objects which are immediately thrown away again. Yes, the JVM allocator
and GC do an amazing job handling short-lived objects. However, it’s not magic and the memory bandwidth
is limited. So, removing unnecessary short-lived objects is often easy and gives you more memory bandwidth headroom.
- Ensuring long-lived objects are in a compact form and a useful format for the purpose.Anyway, I’m trying to shave off some allocations in this blog post.
Note, as I reduce allocations the code becomes less Java-y and I introduce C-like fragility, where life-time of memory matters.
In a real-world app I would only use such optimizations only if you really need more performance.</description><pubDate>Tue, 13 Sep 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-08-29-using-tmux-for-pty-scripts/en/</guid><link>https://gamlor.info/posts-output/2022-08-29-using-tmux-for-pty-scripts/en/</link><title>Creating Pseudo Terminals for Test Scripts with tmux</title><description>I recently tried to automate a test setup,
where the program I tried to automate insisted on having a TTY.
Oh no, yet another TTY adventure (previous one) for me ;).</description><pubDate>Mon, 29 Aug 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-08-27-redis-clone-optmize-io/en/</guid><link>https://gamlor.info/posts-output/2022-08-27-redis-clone-optmize-io/en/</link><title>Redis Clone: Improved IO Control</title><description>We left with unsuccessful attempts to improve the IO by only using Virtual Threads and the classing blocking
IO classes in the  previous post.This time we are using the NIO network API
to get more fined grained control to the IO pattern.
As a recap: We try to avoid blocking while flushing each individual response.
This way we take advantage of the pipelined requests: We get a bunch of requests from the client,
answer all of them and amortize the flush over multiple responses.</description><pubDate>Sat, 27 Aug 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-08-12-redis-clone-virtual-threads-aka-project-loom/en/</guid><link>https://gamlor.info/posts-output/2022-08-12-redis-clone-virtual-threads-aka-project-loom/en/</link><title>Redis Clone: Virtual Threads (Project Loom)</title><description>In the last post we profiled the naive Redis Clone.
One of thing showing up was the flushing of the response.In this post we try out Virtual Threads and Structured Concurrency
from the JDK 19 preview, and see if we can use it to improve on the flushing.
This is certainly not a primary use case for these feature, but let’s try it out anyway.</description><pubDate>Fri, 12 Aug 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-07-29-redis-clone-profiling/en/</guid><link>https://gamlor.info/posts-output/2022-07-29-redis-clone-profiling/en/</link><title>Profiling the Naive Redis Clone</title><description>In the last post we ran a benchmark on our naive Redis clone.
It performed already impressively.
To improve its performance, the first step is to understand where the time goes in the program.</description><pubDate>Fri, 29 Jul 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-07-04-java-redis-clone/en/</guid><link>https://gamlor.info/posts-output/2022-07-04-java-redis-clone/en/</link><title>Building a (Java-) Redis Clone, naively</title><description>Oren Eini (Ayende) has a wonderful
blog series
where he builds a small Redis clone in C#,
and then investigates performance issues and improves on it.
I got tempted to do a Java version, out of curiosity. I probably won’t go as far as Oren Eini with the profiling
and optimization, but I’ll try to do at least some iterations.</description><pubDate>Mon, 04 Jul 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-06-01-java-advanced-enums/en/</guid><link>https://gamlor.info/posts-output/2022-06-01-java-advanced-enums/en/</link><title>Model Results/States with Java 17's Records</title><description>I often want to represent a set of possible results or states with different possible values.
For example a processing result:A successful full resultAnd expect error with some error codeAn unexpected error with some exceptionSome other rare edge case I need special handling for.</description><pubDate>Tue, 24 May 2022 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2022-02-20-your-own-clojure-atoms/en/</guid><link>https://gamlor.info/posts-output/2022-02-20-your-own-clojure-atoms/en/</link><title>Implement your own Clojure Atoms</title><description>Let’s implement our own Clojure atoms for fun and educational purpose.
Do not use it for your actual application =).</description><pubDate>Sun, 20 Feb 2022 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-12-19-extended-clojure-atoms/en/</guid><link>https://gamlor.info/posts-output/2021-12-19-extended-clojure-atoms/en/</link><title>Advanced Features of Clojure Atoms</title><description>Most Clojure apps use atoms for managing state,
changing state with the swap! or reset! functions:In my Java/C# mind, an atom is an
AtomicReference
/ Interlocked.CompareExchange.
However, atoms do have more high-level features.
Let’s take a look.</description><pubDate>Sun, 19 Dec 2021 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-12-13-my-common-testing-advice/en/</guid><link>https://gamlor.info/posts-output/2021-12-13-my-common-testing-advice/en/</link><title>Automated Tests Advice, C# Edition</title><description>This post is part of C# Advent Calendar 2021.I do like writing automated tests, for two reasons.
First, it gives me a fast feedback loop.
Testing on the fully running app is usually time-consuming compared to running a test.
Second, over time it gives some confidence that changes in the code didn’t break your application in unexpected ways.</description><pubDate>Mon, 13 Dec 2021 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-07-18-prog-fs/en/</guid><link>https://gamlor.info/posts-output/2021-07-18-prog-fs/en/</link><title>Basic Process information via /proc</title><description>When you need information about a process in Linux,
there are tons of command lines tools, like ps, htop,  lsof etc.
I often do not remember the flags to get the information I want.
Luckily, Linux has the /proc file system which gives details on every process.
Most Unix-like operation systems have it, but the formats differ.
I only take a look at the Linux version here.</description><pubDate>Sun, 18 Jul 2021 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-06-13-tests-not-running/en/</guid><link>https://gamlor.info/posts-output/2021-06-13-tests-not-running/en/</link><title>Tests Not Running: JUnit 5, Maven and Spring Boot Magic</title><description>I recently worked on an existing Spring Boot based codebase.
Everything looked fine and kept adding new features and improving the codebase.
I wrote my tests and run the test suite in my IDE.
My changes got into production and everything looked fine.A few weeks later I took a look at the Continues Integration Servers logs
of that project and noticed that the tests are not running.
That is no good. My local setup is not a reliable environment, for example,
I can forget to check in a file into version control.
And I usually run a reduced set of tests and rely on the CI system to run the whole tests suite.</description><pubDate>Sun, 13 Jun 2021 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-05-29-tty-in-java/en/</guid><link>https://gamlor.info/posts-output/2021-05-29-tty-in-java/en/</link><title>When a Pipe isn't enough: TTYs in Java</title><description>I needed to launch Docker containers in Java and pipe the result pack
to some other place. This included interacting with that container directly
via standard in/out. Nothing easier than that, you can do this with docker
like this:Ok, then lets launch it via Java:Unfortunately, you get this error back from the process:Event when you ignore this error, interactive apps like a shell,
text editors etc won’t work properly.
So, what is this TTY anyway?</description><pubDate>Sat, 29 May 2021 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-05-04-linux-on-to-fly-users/en/</guid><link>https://gamlor.info/posts-output/2021-05-04-linux-on-to-fly-users/en/</link><title>On Linux (Unix?) You Can Make Up a User ID On The Fly</title><description>Recently I’ve been working with Docker, launching non-root containers.
Mostly because I mounted files into the container I didn’t want every file to be owned by root.
I use commands like this:
docker run --user="$(id --user):$(id --group) -v $PWD:/mounted-directory &lt;image> &lt;comand>.
This way the processes inside the container use the same user id as the current user,
so any file created inside the container on the mounted directory can easily be read and changed.What happens if you pick a random user id, one which doesn’t exist? Try it:</description><pubDate>Tue, 04 May 2021 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-04-18-let-tests-fail/en/</guid><link>https://gamlor.info/posts-output/2021-04-18-let-tests-fail/en/</link><title>Make a Test Fail First</title><description>When I write tests and I exactly know what I need I write a test first. Other times I experiment with the implementation and
then write some tests after the code exists.
And for some code the effort to write a automated tests is not worth it.However, there is one advice I need to remind myself from time to time:
Write a failing test first. Or, when you write the test afterward, make the test fail by screwing the implementation.
Why? Let’s look at small test example:</description><pubDate>Sun, 18 Apr 2021 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2021-02-07-clojure-java-reloading/en/</guid><link>https://gamlor.info/posts-output/2021-02-07-clojure-java-reloading/en/</link><title>Adding an Extra Indirection to Enable Code Reloading in Clojure/Java Interop Code</title><description>One of the killer features of Clojure is its ability to reload code and incrementally develop in a
running environment. Another strength of Clojure/Clojure script is that it is deliberately a hosted language,
leveraging the broader Java/Javascript ecosystem for libraries, frameworks, etc.However, the dynamic code reloading and interacting with Java libraries can create some friction.
Adding another layer of indirection sometimes reduces that friction.
Let’s look at an example. Let’s assume we have a large Java library
to which you provide a callback functions/object.
Like an HTTP-server, network- or some other library.
Easy, you implement the interface of the library.
Note that the library instance is preserved with defonce.</description><pubDate>Sun, 14 Feb 2021 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-12-05-csharp-for-the-absent/en/</guid><link>https://gamlor.info/posts-output/2020-12-05-csharp-for-the-absent/en/</link><title>C# Updates for the Absent C# Developer (C# 6.0 and newer overview)</title><description>This post is part of C# Advent Calendar 2020.Update 6. December 2020: Some good small discussion on
Reddit.comIt has been a while since I actively developed in C#.
I mostly worked with C# and .NET during the 3.0 to 4.5 days and I did async/await work very early on,
so I skip over that as well. After a job change, I didn’t touch C# for actual work.
I mostly just watched the development from the sidelines via news.
Today, I take a short look at some features.
I will skip a lot and just add some of my highlights tour.</description><pubDate>Sat, 05 Dec 2020 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-09-26-local-ips/en/</guid><link>https://gamlor.info/posts-output/2020-09-26-local-ips/en/</link><title>127.0.0.0/8 IP Range Is All Loopback</title><description>That the 127.0.0.1 IP is a loopback/localhost is widely known.
It is used daily by many developers for testing of programs talking over the network.
However, did you know that the whole 127.0.0.0/8 IP range are loopback addresses?
You have a few million IP addresses reserved on each machine to talk to itself.</description><pubDate>Sat, 26 Sep 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-06-06-java-time/en/</guid><link>https://gamlor.info/posts-output/2020-06-06-java-time/en/</link><title>Time is Complicated: java.time</title><description>Time is complicated, really complicated. We have historically grown calendar systems, historical units,
timezones, limelight savings times, etc. On top of that, we have precise atomic clocks and astronomical time definitions
drifting apart and need periodical corrections, like with leap seconds.</description><pubDate>Sun, 12 Jul 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-05-24-time-stamps-are-not-simple/en/</guid><link>https://gamlor.info/posts-output/2020-05-24-time-stamps-are-not-simple/en/</link><title>Time Does Not Flow Evenly</title><description>You are working on some system and you need some kind of timestamp in milli- or nanoseconds. Nothing easier than that.
In Unix you might use clock_gettime and in Java System.currentTimeMillis() and of your go.</description><pubDate>Sun, 31 May 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-05-16-unixy-tools/en/</guid><link>https://gamlor.info/posts-output/2020-05-16-unixy-tools/en/</link><title>Terminal Utilities I Often Use</title><description>In this blog post, I just list a few Unixy terminal utilities I often use. If you are
a terminal veteran this will be boring for you. If you rarely use the terminal, it might
have a utility or two you are not aware of yet.I’m not giving a tutorial on the commands. Google for more details or read the man pages =).
It is just to let you know that these tools exist.</description><pubDate>Sun, 17 May 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-05-03-slack-api-and-data-non-problem/en/</guid><link>https://gamlor.info/posts-output/2020-05-03-slack-api-and-data-non-problem/en/</link><title>Slack Java API and the Data Non Problem</title><description>Recently I had the "joy" to work with the Slack Java API.
I felt that this Java API is tedious and an example of an API which create busy work for little benefit.
Let me show first how the API is used:</description><pubDate>Sat, 09 May 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2020-05-01-keep-time-explicit/en/</guid><link>https://gamlor.info/posts-output/2020-05-01-keep-time-explicit/en/</link><title>Keep Time Explicit</title><description>In a lot of software is operations are depending on time. For example creating invoices, statistics,
showing the latest news so on so forth. In this blog post, I use an example summing up bought items in the
last week. We might have multiple layers in our system, like database access, places to do extra processing, and
a web interface. I’m using C# here, but it applies to most mainstream languages. As you can see, to get the right
database records the cure uses the current time.</description><pubDate>Sat, 02 May 2020 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-12-11-csharp-structural-pattern/en/</guid><link>https://gamlor.info/posts-output/2019-12-11-csharp-structural-pattern/en/</link><title>C# Loves Code Patterns</title><description>This post is part of the third annual C# Advent.
Check out the home page for up to 50 C# blog posts in December 2019!
Thanks, Matthew D. Groves for organizing it.You might recall that LINQ has two forms. The first way is to call LINQ methods and the second is the special LINQ syntax.
Here’s an example of the LINQ syntax.</description><pubDate>Wed, 11 Dec 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-11-27-write-coordination/en/</guid><link>https://gamlor.info/posts-output/2019-11-27-write-coordination/en/</link><title>Synchronizing File Writes</title><description>Assuming we have a simple task to write events to a file, one event after another. Events can be written from
multiple threads.</description><pubDate>Wed, 27 Nov 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-11-13-file-channel-closes-when-interrupted/en/</guid><link>https://gamlor.info/posts-output/2019-11-13-file-channel-closes-when-interrupted/en/</link><title>FileChannel Closes When Interrupted</title><description>Recently I worked on some threaded IO where a control thread interrupts the IO threads once in a while.
Periodically the app started to fail with a java.nio.channels.ClosedChannelException.</description><pubDate>Tue, 12 Nov 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-11-06-mv-store-old-versions/en/</guid><link>https://gamlor.info/posts-output/2019-11-06-mv-store-old-versions/en/</link><title>MVStore: Accessing Old Versions</title><description>A while back I blogged about MVStore basics.
Let’s look at the way MVStore keeps old revisions around. First, MVStore maps have a .getVersion() method
and a .openVersion() method pair. With that, you can access old
version previous values. A new version of the map is created on (auto-) commit.</description><pubDate>Wed, 06 Nov 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-11-05-introducing-bastel-proxy/en/</guid><link>https://gamlor.info/posts-output/2019-11-05-introducing-bastel-proxy/en/</link><title>Bastel Proxy: HTTPS and reverse proxy for development environments</title><description>I tend to work on web applications and services which are interconnected. Different parts of the website and the
services run as separate processes. In production something like NGINX does the HTTPS termination
and unifies the services to a single domain. I found it useful to have HTTPS and a reverse proxy in my development environment too. Browsers complain about plain HTTPS sites and even disable certain features. Further, if your website is split across different processes
and one part runs on http://localhost:8080 and other on http://localhost:8081, you can run into cross-domain issues. Also, I found it less error-prone to mirror the domain structure than having tons of localhost:{port} pointing to each other.One option is to run a production reverse proxy like NGINX. However, it requires quite a bit of configuration and you have to provide it the HTTPS certificates etc. I wanted a solution specific for developments which tries to minimize setup time.</description><pubDate>Tue, 05 Nov 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-11-03-openjdk-mission-control/en/</guid><link>https://gamlor.info/posts-output/2019-11-03-openjdk-mission-control/en/</link><title>OpenJDK's Flight-Recorder and Mission Control</title><description>Flight Recorder is a low overhead profiler and diagnostics events recorder for the Hotspot JVM. Java Mission Control is
a software to visualize these events. It has been included for years in the Oracle JDK but used to be a commercial
feature. To use it you needed to add -XX:+UnlockCommercialFeatures -XX:+FlightRecorder flags and you were not allowed
to use it in production unless you paid a license.Oracle donated the code to the OpenJDK project and it is now included in OpenJDK 11 or newer builds. However, if you
look at your JDK there is no Mission Control, so where it is? It is part of the
OpenJDK but is built separately.
You can download binaries from AdoptOpenJDK or Azul, which rebranded it as
Zulu Mission Control.</description><pubDate>Mon, 04 Nov 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-30-jetty-mystery-threads/en/</guid><link>https://gamlor.info/posts-output/2019-10-30-jetty-mystery-threads/en/</link><title>Mystery Jetty Threads Due To Failed Startup</title><description>Yesterday I had an app with an embedded Jetty Server which didn’t shut down properly. The main thread exited and the
app had called .stop() on the Jetty server. However, the app kept running.</description><pubDate>Wed, 30 Oct 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-29-java-create-certs-bouncy/en/</guid><link>https://gamlor.info/posts-output/2019-10-29-java-create-certs-bouncy/en/</link><title>Create HTTPS Certificates in Java with Bouncy Castle</title><description>Multiple times I needed to create HTTPS certificates programmatically. For example to create test certificates for HTTPS in development without complicated setup. There is surprisingly little information out there about how to create certificates programmatically in Java.
Most guides OpenSSL or another command-line tool. I wanted to avoid to run an external program but wanted to do it programmatically.In the past, I used a hacky way to do in Java by using JDK internals. However, as I moved to Java 11+ I needed
a better way, since the API’s changed and are now inaccessible due to the module system.</description><pubDate>Tue, 29 Oct 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-28-java-create-certs-unsafe/en/</guid><link>https://gamlor.info/posts-output/2019-10-28-java-create-certs-unsafe/en/</link><title>Create HTTPS Certificates in Java: The unsafe way</title><description>TLDR: I recommend using Bouncy Castle instead of this method.
I used this method in the past but I’m using Bouncy Castle now to support Java 11+.Multiple times I needed to create HTTPS certificates programmatically. For example to create test certificates for HTTPS
in development without complicated setup. There is surprisingly little information out there about how to create
certificates programmatically in Java. Most guides OpenSSL or another command-line tool. I wanted to avoid to run an
external program but wanted to do it programmatically.</description><pubDate>Mon, 28 Oct 2019 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-27-secret-weapon-indexed-views/en/</guid><link>https://gamlor.info/posts-output/2019-10-27-secret-weapon-indexed-views/en/</link><title>Secret SQL Weapon: Indexed (or Materialized) Views</title><description>A few months backs I implemented logic which needs to lookup entries in a big existing table, but the lookup wasn’t easy
indexable. Here’s a guide on one approach you can take. I’m using SQL Server for this example.
Let’s assume we have a table with guests, something like this</description><pubDate>Sun, 27 Oct 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-25-clojure-defonce/en/</guid><link>https://gamlor.info/posts-output/2019-10-25-clojure-defonce/en/</link><title>Clojure defonce: Keep Your Apps State</title><description>One of the great strengths of Clojure is interactive development. Usually, you run a REPL and an editor that
interacts with that REPL. You try out small things in the REPL, send pieces of code from the editor to the REPL, reload modified files, etc. You rarely restart the app, but keep going editing code. I’m missing that in other programming environments.It works for Clojure due to many factors. The Lispy-ness with a distinct REPL at your disposal and tools taking advantage of it.
Then the Clojure pushes you toward functional programming with immutable data structures, which then leads
to a culture where the app state is usually held in very few places and the app mostly consists of functions operating on it. So when code is swapped the immutable state can be kept and be used with the new code.</description><pubDate>Fri, 25 Oct 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-24-compile-java-with-clojure-deps/en/</guid><link>https://gamlor.info/posts-output/2019-10-24-compile-java-with-clojure-deps/en/</link><title>Compiling Java Classes with Clojure Deps</title><description>In the past, I used Leinigen for Clojure projects. It downloads dependencies, compiles, handles
the classpath, runs tests etc. Clojure 1.9 introduced the clj command line and
the deps tooling. You can specify a deps.edn file and declare the dependencies in there. Deps not a build tool by
design. it only downloads dependencies from Maven- and git repositories and builds the Java classpath. It doesn’t have
other build features. However, for smaller Clojure projects that is enough and you can go without an extra build tool.So, I started to use Deps as the starting point and it serves me well so far. Recently I wanted to add a Java class to
my project. I do that when using Clojure-Java interop gets complex and it is just easier to have a few helper Java
classes. However, how do I compile these classes? Leiningen has the  lein javac command, but Deps doesn’t do builds.</description><pubDate>Thu, 24 Oct 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-10-15-java-file-descriptor-rant/en/</guid><link>https://gamlor.info/posts-output/2019-10-15-java-file-descriptor-rant/en/</link><title>Java, Let me use the damn FileDescriptor!</title><description>Last Update 2024-01-30, see belowRecently I hacked on some utility in Java which should be able to bind low ports like 80 or 443 on demand
without running as root. When I needed to bind these port I wanted to execute an external process as root which opens
the ports for the main process and then sends the ports via Unix domain socket.</description><pubDate>Tue, 15 Oct 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-09-23-mv-store-intro/en/</guid><link>https://gamlor.info/posts-output/2019-09-23-mv-store-intro/en/</link><title>Intro to MVStore, an embedded key value store</title><description>MVStore is the backend storage for the popular embedded H2 relational database. If you don’t
need a relational database, but a lower level storage MVStore is maybe an option. The MVStore has a good nice range of
features. The documentation isn’t as detailed, but the intro documentation
gives a decent overview. Anyway, this post is another small intro.</description><pubDate>Wed, 25 Sep 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-09-05-java-client-sni/en/</guid><link>https://gamlor.info/posts-output/2019-09-05-java-client-sni/en/</link><title>Missing SNI with Java's HTTPS client</title><description>Recently I got strange exceptions connection to HTTPS while developing a Java app. The app connected to my local machine
using it’s host name with the Apache HTTP client:</description><pubDate>Fri, 06 Sep 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2019-09-04-good-bye-turbonet/en/</guid><link>https://gamlor.info/posts-output/2019-09-04-good-bye-turbonet/en/</link><title>Good Bye Turbo.net</title><description>I left my work at https://turbo.net this month, taking a break before looking
for a new opportunity. Some reflection of over 6 years working there.Turbo-lent Years: Heavy Evolution of the ProductWhen I joined Turbo.net it was known as Spoon.net. It could launch sandboxed Windows apps and provided a Dropbox liked sync
service. During my time we introduced Turbo.net application containers. Think of Docker containers for Windows desktop apps.After the Desktop containers system was running, we started to implement cloud remote applications. That allows you to
launch Windows apps on your iPad, Mac, Windows and any HTML5 capable browser. Turbo.net provisions and manages
Windows machines for you to run the apps on and uses the app containers to move apps onto the blank Windows machines.
Your organization doesn’t need to manage Windows machines. You launch the app and use it.</description><pubDate>Wed, 04 Sep 2019 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2018-05-06-hangeul-not-working/en/</guid><link>https://gamlor.info/posts-output/2018-05-06-hangeul-not-working/en/</link><title>Korean Hangul Stopped Working After IBus Update to 1.5.18? A Work Around</title><description>When I’m using Linux I use IBus to write Korean. A few days ago when I updated my Manjaro installation writing Korean
stopped working. After booting everything looked fine. The IBus tray icon was there,
switching languages with Win+Space seemed to work.Tray icon looks OK:</description><pubDate>Sun, 06 May 2018 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2018-05-06-hangeul-not-working/kr/</guid><link>https://gamlor.info/posts-output/2018-05-06-hangeul-not-working/kr/</link><title>IBus 1.5.18 업데이트 후에는 한글 멈췄어요? 임시 해결이 있어요</title><description>저는 Linux 사용하면 한글 쓰기 위해 IBus 사용해요. 몇일 전에 Manjaro Linux 업데이트했어요. 이 업데이트 호에 한글 쓰는데 갑자기 멈췄어요. 부팅후에 다 괜찮게 보였어요. IBus의 아이콘
보이고, Win-Space 키보드 키로 언어 바꿀 수 있고 다 괜찮은 것 같았어요.OK:</description><pubDate>Sat, 05 May 2018 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-10-24-adbcj-on-jcenter/en/</guid><link>https://gamlor.info/posts-output/2017-10-24-adbcj-on-jcenter/en/</link><title>Async Database Connector for Java (ADBCJ) on JCenter</title><description>Due to lack of time and interest, ADBCJ is in ‘maintenance’ mode. However, I still improve it from time to time =).</description><pubDate>Tue, 24 Oct 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-10-06-edgemesh-cdn/en/</guid><link>https://gamlor.info/posts-output/2017-10-06-edgemesh-cdn/en/</link><title>Need a CDN? Try out edgemesh.com</title><description>Do you need a CDN for your website? Maybe you want to try edgemesh.com. The basic subscription is free!StartFirst sign up on https://edgemesh.com. Then embed this script into your website:Done. Really!</description><pubDate>Fri, 06 Oct 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-10-06-edgemesh-cdn/kr/</guid><link>https://gamlor.info/posts-output/2017-10-06-edgemesh-cdn/kr/</link><title>CDN 필요하면 edgemesh.com 사용해보세요 </title><description>콘텐츠 전송 네트워크 (CDN) 필요할까요? 아마 edgemesh.com 사용해보세요. 기본 구독이 무료예요!시작먼저 https://edgemesh.com에 회원가입해야 되고 당신의 웹사이트 이 JavaScript를 추가해요:완전했어요. 진짜요!</description><pubDate>Thu, 05 Oct 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-09-27-add-timestamps-on-logs/en/</guid><link>https://gamlor.info/posts-output/2017-09-27-add-timestamps-on-logs/en/</link><title>Adding Timestamp to Logs</title><description>How many small script or process do you have which just log to stdout/stderr? A few, dozens?
Their running as cronjobs or service?
Stashing the logs somewhere, like:</description><pubDate>Wed, 27 Sep 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-08-31-java-enum-hidden-allocation/en/</guid><link>https://gamlor.info/posts-output/2017-08-31-java-enum-hidden-allocation/en/</link><title>Java’s Enum.values() Hidden Allocations </title><description>I recently profiled an app of mine. During profiling, I’ve noticed tons of array allocations. Something like:</description><pubDate>Thu, 31 Aug 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-04-25-jvm-in-containers/en/</guid><link>https://gamlor.info/posts-output/2017-04-25-jvm-in-containers/en/</link><title>Deploying JVM in tiny containers, be careful! </title><description>I`ve deployed my https://rohrli.gamlor.info service into the smallest possible 2017-04-25-jvm-in-containers[Triton]
container. Except me, noone is going to use it anyway -. This container has 128Mbyte of memory, and 1/16th CPU time.
The OpenJDK JVM is known for consuming tons of memory. And it is somewhat true. However, the JVM also runs in a small
container. In this blog post I give some recommendations. The problems exists in small Docker and Triton containers. I
show everything for both.</description><pubDate>Tue, 25 Apr 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-04-25-jvm-in-containers/kr/</guid><link>https://gamlor.info/posts-output/2017-04-25-jvm-in-containers/kr/</link><title>JVM는 작은 컨테이너 안에 배포하면 주의!</title><description>저는 저의 https://rohrli.gamlor.info 서비스가 재일 작은 트리톤(Triton) 컨테이너 안에 배포됐어요. 저 말고 아무도 사용해서 괜찮아요 -. 이 컨테이너는
128MB 메모리만 있고, 1/16CPU만 있어요. OpenJDK JVM은 메모리를 많이 사용하기 잘 알려져요. 부분적으로 사실이에요. 근데 JVM이 작은 컨테이너 안에 도 작동해요.
이 글에는 조언을 제공할 거예요. 모은 작은 도커(Docker)와 트리톤 컨테이너가 이 문제 있어요. 제가 둘 다 보여줄 거예요 =)</description><pubDate>Mon, 24 Apr 2017 00:00:00 +0200</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-02-12-manta-store-and-compute/en/</guid><link>https://gamlor.info/posts-output/2017-02-12-manta-store-and-compute/en/</link><title>Joyent’s Manta. Store and Compute</title><description>Until now we only used Joyent’s Triton. We deployed Docker container with
Triton. Probably we want to store date somewhere. Manta is a Amazon S3 like storage service. However, Manta also can
compute on your data. Let’s start!</description><pubDate>Sun, 12 Feb 2017 00:00:00 +0100</pubDate></item><item><guid>https://gamlor.info/posts-output/2017-02-12-manta-store-and-compute/kr/</guid><link>https://gamlor.info/posts-output/2017-02-12-manta-store-and-compute/kr/</link><title>Joyent의 만타 (Manta): 저장하고 계산하다</title><description>이제까지 우리는 Joyent의 Triton 사용했어요. 트리툰으로 Docker 컨테이너를 배포했어요. 아마 데이터를 저장하고 싶어요. 만타는 아마존 S3
같은 스토리지 서비스예요. 근데 만다는 계산도 할 수 있어요. 시작하자!</description><pubDate>Sat, 11 Feb 2017 00:00:00 +0100</pubDate></item></channel></rss>