<?xml version="1.0" encoding="UTF-8"?>
<!-- name="generator" content="pyblosxom/1.4.1 7/27/2007" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
<channel>
<title>Блогчетање   </title>
<link>https://danilo.segan.org/blog</link>
<description>Данилово блогче</description>
<language>en</language>
<item>
  <title>How much memory overhead does your Docker container really have?</title>
  <link>https://danilo.segan.org/blog/razvoj/docker-memory-usage</link>
  <description><![CDATA[

<p>TL/DR:</p>
<ul>
  <li>Each container had around 7.4MiB of host memory overhead for Docker shim and proxy services.</li>
  <li>Binding only IPv4 port got that down to 6.2MiB per container by running half the proxies.</li>
  <li>Configuring Docker with <code>userland-proxy: false</code> avoids the proxy altogether and gets overhead down to 4.3MiB</li>
  <li>Memory usage between Ubuntu and Alpine was mostly the same other than a few exceptions.</li>
  <li>Rust (1MiB) beats Go (1.5MiB), with Python in the middle (9.4/10.9MiB), followed by TypeScript (~15MiB) and C# last (18.5MiB).</li>
  <li>Measuring after 200 requests and 15s of settling afterwards, keeps the order but TypeScript and C# fall further behind: Rust (1MiB), Go (3/5MiB), Python (9.7-11MiB), TypeScript (20/26MiB) and finally C# (30/31MiB).</li>
  <li>dockerd at ~70MiB and containerd at ~50MiB were relatively stable between runs.</li>
  <li>Ubuntu surprisingly beat Alpine variants in Go (2.9MiB vs 4.9MiB) and Python (9.7MiB vs 11.1MiB) while losing in TypeScript (26.2MiB vs 20.1MiB).</li>
</ul>

<h2>Scope</h2>
<p>
  I was looking to understand overhead of using Docker to run simple network services (basic "Hello World" API service) in different language runtimes and using different base OSes (Alpine Linux and Ubuntu 26.04), and any simple systemic options to optimize that a bit.
</p>
<p>
  The five languages I wanted to compare were Go, Rust, TypeScript, Python and C#.
</p>

<h2>Methodology</h2>
<p>
  The benchmark was really simple: a basic API handler returning "Hello World" string using whatever the Claude Code/Codex thought made sense as the simplest web framework for the language: Tokio for Rust, ThreadingHTTPServer for Python, node:http for TypeScript, net/http for GoLang and WebApplication for C#.  This is not representative of production loads and is mostly to understand the overhead before you start adding actual business logic inside.
</p>

<p>
  Early on, Claude Code mentioned 2 proxy processes for each container: one to bind to IPv4 port, and another to bind to IPv6 port.  This made me check: in the idle state (containers stopped and then restarted), baseline memory usage was around 7.4MiB when both IPv4 and IPv6 were proxied, and 6.2MiB with just IPv4 (down by about 1.2MiBper container).  From there on, I focused on running with only IPv4 assuming you can always choose which one you prefer for your internal docker communication.
</p>

<p>
  For every run of the benchmarks, I'd stop the docker services (docker compose stop), restart them and only then run the benchmark script with sudo to collect PSS data as RSS was double-counting.  Claude Code and OpenAI Codex both contributed to the benchmark scripts which are pushed to <a href="https://github.com/dsegan/docker-memory-overhead">git@github.com:dsegan/docker-memory-overhead.git</a>.
</p>

<p>
  To gather idle data, I did <code>sudo scripts/report.sh report --requests 0 --settle 15 --samples 1</code>, and for warm data I did <code>sudo scripts/report.sh report --requests 200 --settle 15 --samples 5</code>.
</p>

<h2>Idle Results for both IPv4 and IPv6 being served</h2>

<!--
| service           | current |   WS | anon | file | kernel | swap | peak | tasks | host tax | estimate | endpoint |
|:------------------|--------:|-----:|-----:|-----:|-------:|-----:|-----:|------:|---------:|---------:|:---------|
| csharp-alpine     |    18.1 | 18.1 |  8.4 |  7.9 |    1.6 |  0.0 | 18.5 |    22 |      7.4 |     25.5 | ok       |
| csharp-ubuntu     |    18.5 | 18.5 |  8.9 |  7.9 |    1.8 |  0.0 | 19.3 |    22 |      7.4 |     25.9 | ok       |
| go-alpine         |     1.6 |  1.6 |  1.1 |  0.0 |    0.5 |  0.0 |  4.9 |     5 |      7.3 |      8.9 | ok       |
| go-ubuntu         |     1.6 |  1.6 |  1.2 |  0.0 |    0.5 |  0.0 |  4.7 |     5 |      7.6 |      9.2 | ok       |
| python-alpine     |    10.9 | 10.9 | 10.4 |  0.0 |    0.5 |  0.0 | 13.5 |     1 |      7.4 |     18.3 | ok       |
| python-ubuntu     |     9.4 |  9.4 |  8.8 |  0.0 |    0.6 |  0.0 | 10.1 |     1 |      7.7 |     17.1 | ok       |
| rust-alpine       |     0.8 |  0.8 |  0.2 |  0.0 |    0.6 |  0.0 |  5.2 |     9 |      7.4 |      8.1 | ok       |
| rust-ubuntu       |     1.0 |  1.0 |  0.4 |  0.0 |    0.6 |  0.0 |  5.2 |     9 |      7.4 |      8.4 | ok       |
| typescript-alpine |    13.0 | 13.0 | 11.9 |  0.0 |    1.1 |  0.0 | 16.7 |     7 |      7.3 |     20.3 | ok       |
| typescript-ubuntu |    17.6 | 17.6 | 16.4 |  0.0 |    1.2 |  0.0 | 21.8 |     7 |      7.4 |     25.1 | ok       |
  -->

<table>
  <thead>
    <tr>
      <th>service</th><th>current</th><th>WS</th><th>anon</th>
      <th>file</th><th>kernel</th><th>swap</th><th>peak</th>
      <th>tasks</th><th>host tax</th><th>estimate</th><th>endpoint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>csharp-alpine</td><td>18.1</td><td>18.1</td><td>8.4</td>
      <td>7.9</td><td>1.6</td><td>0.0</td><td>18.5</td>
      <td>22</td><td>7.4</td><td>25.5</td><td>ok</td>
    </tr>
    <tr>
      <td>csharp-ubuntu</td><td>18.5</td><td>18.5</td><td>8.9</td>
      <td>7.9</td><td>1.8</td><td>0.0</td><td>19.3</td>
      <td>22</td><td>7.4</td><td>25.9</td><td>ok</td>
    </tr>
    <tr>
      <td>go-alpine</td><td>1.6</td><td>1.6</td><td>1.1</td>
      <td>0.0</td><td>0.5</td><td>0.0</td><td>4.9</td>
      <td>5</td><td>7.3</td><td>8.9</td><td>ok</td>
    </tr>
    <tr>
      <td>go-ubuntu</td><td>1.6</td><td>1.6</td><td>1.2</td>
      <td>0.0</td><td>0.5</td><td>0.0</td><td>4.7</td>
      <td>5</td><td>7.6</td><td>9.2</td><td>ok</td>
    </tr>
    <tr>
      <td>python-alpine</td><td>10.9</td><td>10.9</td><td>10.4</td>
      <td>0.0</td><td>0.5</td><td>0.0</td><td>13.5</td>
      <td>1</td><td>7.4</td><td>18.3</td><td>ok</td>
    </tr>
    <tr>
      <td>python-ubuntu</td><td>9.4</td><td>9.4</td><td>8.8</td>
      <td>0.0</td><td>0.6</td><td>0.0</td><td>10.1</td>
      <td>1</td><td>7.7</td><td>17.1</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-alpine</td><td>0.8</td><td>0.8</td><td>0.2</td>
      <td>0.0</td><td>0.6</td><td>0.0</td><td>5.2</td>
      <td>9</td><td>7.4</td><td>8.1</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-ubuntu</td><td>1.0</td><td>1.0</td><td>0.4</td>
      <td>0.0</td><td>0.6</td><td>0.0</td><td>5.2</td>
      <td>9</td><td>7.4</td><td>8.4</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-alpine</td><td>13.0</td><td>13.0</td><td>11.9</td>
      <td>0.0</td><td>1.1</td><td>0.0</td><td>16.7</td>
      <td>7</td><td>7.3</td><td>20.3</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-ubuntu</td><td>17.6</td><td>17.6</td><td>16.4</td>
      <td>0.0</td><td>1.2</td><td>0.0</td><td>21.8</td>
      <td>7</td><td>7.4</td><td>25.1</td><td>ok</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">Sum</th><td>92.5</td><td>92.5</td><td>67.7</td>
      <td>15.8</td><td>9.0</td><td>0.0</td><td>119.9</td>
      <td>88</td><td>74.3</td><td>166.8</td><td>10/10 ok</td>
    </tr>
  </tfoot>
</table>


<h2>Idle Results with just IPv4</h2>

<!--
| service           | current |   WS | anon | file | kernel | swap | peak | tasks | host tax | estimate | endpoint |
|:------------------|--------:|-----:|-----:|-----:|-------:|-----:|-----:|------:|---------:|---------:|:---------|
| csharp-alpine     |    21.3 | 18.5 |  8.4 | 10.9 |    1.6 |  0.0 | 21.6 |    22 |      6.0 |     24.5 | ok       |
| csharp-ubuntu     |    21.9 | 18.7 |  8.8 | 11.3 |    1.8 |  0.0 | 22.5 |    23 |      6.3 |     25.0 | ok       |
| go-alpine         |     3.7 |  1.5 |  1.0 |  2.2 |    0.5 |  0.0 |  5.4 |     5 |      6.4 |      7.9 | ok       |
| go-ubuntu         |     1.7 |  1.6 |  1.1 |  0.1 |    0.5 |  0.0 |  4.7 |     5 |      6.0 |      7.6 | ok       |
| python-alpine     |    12.3 | 10.9 | 10.4 |  1.3 |    0.5 |  0.0 | 14.7 |     1 |      6.3 |     17.2 | ok       |
| python-ubuntu     |    10.6 |  9.4 |  8.8 |  1.1 |    0.6 |  0.0 | 11.7 |     1 |      6.4 |     15.8 | ok       |
| rust-alpine       |     0.8 |  0.8 |  0.2 |  0.0 |    0.6 |  0.0 |  5.5 |     9 |      6.2 |      7.0 | ok       |
| rust-ubuntu       |     1.1 |  1.0 |  0.4 |  0.1 |    0.6 |  0.0 |  5.4 |     9 |      6.1 |      7.1 | ok       |
| typescript-alpine |    14.7 | 13.1 | 11.9 |  1.6 |    1.2 |  0.0 | 17.8 |     7 |      6.3 |     19.4 | ok       |
| typescript-ubuntu |    19.2 | 17.7 | 16.4 |  1.5 |    1.2 |  0.0 | 23.2 |     7 |      6.3 |     23.9 | ok       |
  -->

<table>
  <thead>
    <tr>
      <th>service</th><th>current</th><th>WS</th><th>anon</th>
      <th>file</th><th>kernel</th><th>swap</th><th>peak</th>
      <th>tasks</th><th>host tax</th><th>estimate</th><th>endpoint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>csharp-alpine</td><td>21.3</td><td>18.5</td><td>8.4</td>
      <td>10.9</td><td>1.6</td><td>0.0</td><td>21.6</td>
      <td>22</td><td>6.0</td><td>24.5</td><td>ok</td>
    </tr>
    <tr>
      <td>csharp-ubuntu</td><td>21.9</td><td>18.7</td><td>8.8</td>
      <td>11.3</td><td>1.8</td><td>0.0</td><td>22.5</td>
      <td>23</td><td>6.3</td><td>25.0</td><td>ok</td>
    </tr>
    <tr>
      <td>go-alpine</td><td>3.7</td><td>1.5</td><td>1.0</td>
      <td>2.2</td><td>0.5</td><td>0.0</td><td>5.4</td>
      <td>5</td><td>6.4</td><td>7.9</td><td>ok</td>
    </tr>
    <tr>
      <td>go-ubuntu</td><td>1.7</td><td>1.6</td><td>1.1</td>
      <td>0.1</td><td>0.5</td><td>0.0</td><td>4.7</td>
      <td>5</td><td>6.0</td><td>7.6</td><td>ok</td>
    </tr>
    <tr>
      <td>python-alpine</td><td>12.3</td><td>10.9</td><td>10.4</td>
      <td>1.3</td><td>0.5</td><td>0.0</td><td>14.7</td>
      <td>1</td><td>6.3</td><td>17.2</td><td>ok</td>
    </tr>
    <tr>
      <td>python-ubuntu</td><td>10.6</td><td>9.4</td><td>8.8</td>
      <td>1.1</td><td>0.6</td><td>0.0</td><td>11.7</td>
      <td>1</td><td>6.4</td><td>15.8</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-alpine</td><td>0.8</td><td>0.8</td><td>0.2</td>
      <td>0.0</td><td>0.6</td><td>0.0</td><td>5.5</td>
      <td>9</td><td>6.2</td><td>7.0</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-ubuntu</td><td>1.1</td><td>1.0</td><td>0.4</td>
      <td>0.1</td><td>0.6</td><td>0.0</td><td>5.4</td>
      <td>9</td><td>6.1</td><td>7.1</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-alpine</td><td>14.7</td><td>13.1</td><td>11.9</td>
      <td>1.6</td><td>1.2</td><td>0.0</td><td>17.8</td>
      <td>7</td><td>6.3</td><td>19.4</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-ubuntu</td><td>19.2</td><td>17.7</td><td>16.4</td>
      <td>1.5</td><td>1.2</td><td>0.0</td><td>23.2</td>
      <td>7</td><td>6.3</td><td>23.9</td><td>ok</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">Total</th><td>107.3</td><td>93.2</td><td>67.4</td>
      <td>30.1</td><td>9.1</td><td>0.0</td><td>132.5</td>
      <td>89</td><td>62.3</td><td>155.4</td><td>10/10 ok</td>
    </tr>
  </tfoot>
</table>


<h2>Warm results with both IPv4 and IPv6</h2>

<!--
| service           | current |   WS | anon | file | kernel | swap | peak | tasks | host tax | estimate | endpoint |
|:------------------|--------:|-----:|-----:|-----:|-------:|-----:|-----:|------:|---------:|---------:|:---------|
| csharp-alpine     |    50.5 | 30.1 | 11.1 | 37.3 |    1.9 |  0.0 | 50.9 |    24 |      7.7 |     37.8 | ok       |
| csharp-ubuntu     |    48.7 | 31.5 | 11.6 | 35.1 |    1.9 |  0.0 | 49.2 |    23 |      7.8 |     39.2 | ok       |
| go-alpine         |     4.9 |  4.9 |  2.1 |  2.3 |    0.5 |  0.0 |  6.1 |     6 |      7.7 |     12.7 | ok       |
| go-ubuntu         |     4.9 |  2.9 |  2.1 |  2.3 |    0.5 |  0.0 |  6.2 |     5 |      7.8 |     10.7 | ok       |
| python-alpine     |    17.7 | 11.1 | 10.4 |  6.6 |    0.6 |  0.0 | 20.0 |     1 |      7.8 |     18.9 | ok       |
| python-ubuntu     |    13.9 |  9.7 |  8.9 |  4.3 |    0.7 |  0.0 | 15.6 |     1 |      7.8 |     17.5 | ok       |
| rust-alpine       |     1.3 |  0.9 |  0.2 |  0.5 |    0.6 |  0.0 |  5.1 |     9 |      7.7 |      8.6 | ok       |
| rust-ubuntu       |     1.5 |  1.1 |  0.4 |  0.4 |    0.6 |  0.0 |  5.2 |     9 |      7.7 |      8.8 | ok       |
| typescript-alpine |    44.9 | 20.1 | 14.1 | 29.4 |    1.4 |  0.0 | 47.1 |     7 |      7.9 |     28.0 | ok       |
| typescript-ubuntu |    58.9 | 26.2 | 20.2 | 37.2 |    1.5 |  0.0 | 59.6 |     7 |      8.0 |     34.3 | ok       |
-->
<table>
  <thead>
    <tr>
      <th>service</th><th>current</th><th>WS</th><th>anon</th>
      <th>file</th><th>kernel</th><th>swap</th><th>peak</th>
      <th>tasks</th><th>host tax</th><th>estimate</th><th>endpoint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>csharp-alpine</td><td>50.5</td><td>30.1</td><td>11.1</td>
      <td>37.3</td><td>1.9</td><td>0.0</td><td>50.9</td>
      <td>24</td><td>7.7</td><td>37.8</td><td>ok</td>
    </tr>
    <tr>
      <td>csharp-ubuntu</td><td>48.7</td><td>31.5</td><td>11.6</td>
      <td>35.1</td><td>1.9</td><td>0.0</td><td>49.2</td>
      <td>23</td><td>7.8</td><td>39.2</td><td>ok</td>
    </tr>
    <tr>
      <td>go-alpine</td><td>4.9</td><td>4.9</td><td>2.1</td>
      <td>2.3</td><td>0.5</td><td>0.0</td><td>6.1</td>
      <td>6</td><td>7.7</td><td>12.7</td><td>ok</td>
    </tr>
    <tr>
      <td>go-ubuntu</td><td>4.9</td><td>2.9</td><td>2.1</td>
      <td>2.3</td><td>0.5</td><td>0.0</td><td>6.2</td>
      <td>5</td><td>7.8</td><td>10.7</td><td>ok</td>
    </tr>
    <tr>
      <td>python-alpine</td><td>17.7</td><td>11.1</td><td>10.4</td>
      <td>6.6</td><td>0.6</td><td>0.0</td><td>20.0</td>
      <td>1</td><td>7.8</td><td>18.9</td><td>ok</td>
    </tr>
    <tr>
      <td>python-ubuntu</td><td>13.9</td><td>9.7</td><td>8.9</td>
      <td>4.3</td><td>0.7</td><td>0.0</td><td>15.6</td>
      <td>1</td><td>7.8</td><td>17.5</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-alpine</td><td>1.3</td><td>0.9</td><td>0.2</td>
      <td>0.5</td><td>0.6</td><td>0.0</td><td>5.1</td>
      <td>9</td><td>7.7</td><td>8.6</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-ubuntu</td><td>1.5</td><td>1.1</td><td>0.4</td>
      <td>0.4</td><td>0.6</td><td>0.0</td><td>5.2</td>
      <td>9</td><td>7.7</td><td>8.8</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-alpine</td><td>44.9</td><td>20.1</td><td>14.1</td>
      <td>29.4</td><td>1.4</td><td>0.0</td><td>47.1</td>
      <td>7</td><td>7.9</td><td>28.0</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-ubuntu</td><td>58.9</td><td>26.2</td><td>20.2</td>
      <td>37.2</td><td>1.5</td><td>0.0</td><td>59.6</td>
      <td>7</td><td>8.0</td><td>34.3</td><td>ok</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">Total</th><td>247.2</td><td>138.5</td><td>81.1</td>
      <td>155.4</td><td>10.2</td><td>0.0</td><td>265.0</td>
      <td>92</td><td>77.9</td><td>216.5</td><td>10/10 ok</td>
    </tr>
  </tfoot>
</table>

<h2>Warm results with just IPv4</h2>

<!--
| service           | current |   WS | anon | file | kernel | swap | peak | tasks | host tax | estimate | endpoint |
|:------------------|--------:|-----:|-----:|-----:|-------:|-----:|-----:|------:|---------:|---------:|:---------|
| csharp-alpine     |    38.1 | 25.7 | 11.1 | 24.8 |    1.8 |  0.0 | 43.3 |    24 |      6.5 |     32.2 | ok       |
| csharp-ubuntu     |    39.0 | 25.3 | 12.3 | 24.5 |    1.9 |  0.0 | 45.0 |    24 |      6.3 |     31.6 | ok       |
| go-alpine         |     2.7 |  2.2 |  2.0 |  0.5 |    0.5 |  0.1 |  4.9 |     5 |      6.5 |      8.7 | ok       |
| go-ubuntu         |     3.7 |  2.6 |  2.1 |  1.2 |    0.5 |  0.0 |  5.5 |     5 |      6.3 |      8.8 | ok       |
| python-alpine     |    12.1 | 10.8 | 10.4 |  1.2 |    0.4 |  0.0 | 19.0 |     1 |      6.3 |     17.1 | ok       |
| python-ubuntu     |    10.8 |  9.3 |  8.9 |  1.6 |    0.4 |  0.0 | 14.1 |     1 |      6.4 |     15.6 | ok       |
| rust-alpine       |     1.3 |  0.8 |  0.2 |  0.5 |    0.6 |  0.0 |  5.2 |     9 |      6.2 |      7.0 | ok       |
| rust-ubuntu       |     1.5 |  1.0 |  0.4 |  0.4 |    0.6 |  0.0 |  4.9 |     9 |      6.3 |      7.3 | ok       |
| typescript-alpine |    19.8 | 15.9 | 14.4 |  4.2 |    1.2 |  0.0 | 40.5 |     7 |      6.4 |     22.4 | ok       |
| typescript-ubuntu |    26.2 | 21.6 | 20.1 |  4.8 |    1.3 |  0.0 | 51.8 |     7 |      6.4 |     28.0 | ok       |

  -->
<table>
  <thead>
    <tr>
      <th>service</th><th>current</th><th>WS</th><th>anon</th>
      <th>file</th><th>kernel</th><th>swap</th><th>peak</th>
      <th>tasks</th><th>host tax</th><th>estimate</th><th>endpoint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>csharp-alpine</td><td>38.1</td><td>25.7</td><td>11.1</td>
      <td>24.8</td><td>1.8</td><td>0.0</td><td>43.3</td>
      <td>24</td><td>6.5</td><td>32.2</td><td>ok</td>
    </tr>
    <tr>
      <td>csharp-ubuntu</td><td>39.0</td><td>25.3</td><td>12.3</td>
      <td>24.5</td><td>1.9</td><td>0.0</td><td>45.0</td>
      <td>24</td><td>6.3</td><td>31.6</td><td>ok</td>
    </tr>
    <tr>
      <td>go-alpine</td><td>2.7</td><td>2.2</td><td>2.0</td>
      <td>0.5</td><td>0.5</td><td>0.1</td><td>4.9</td>
      <td>5</td><td>6.5</td><td>8.7</td><td>ok</td>
    </tr>
    <tr>
      <td>go-ubuntu</td><td>3.7</td><td>2.6</td><td>2.1</td>
      <td>1.2</td><td>0.5</td><td>0.0</td><td>5.5</td>
      <td>5</td><td>6.3</td><td>8.8</td><td>ok</td>
    </tr>
    <tr>
      <td>python-alpine</td><td>12.1</td><td>10.8</td><td>10.4</td>
      <td>1.2</td><td>0.4</td><td>0.0</td><td>19.0</td>
      <td>1</td><td>6.3</td><td>17.1</td><td>ok</td>
    </tr>
    <tr>
      <td>python-ubuntu</td><td>10.8</td><td>9.3</td><td>8.9</td>
      <td>1.6</td><td>0.4</td><td>0.0</td><td>14.1</td>
      <td>1</td><td>6.4</td><td>15.6</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-alpine</td><td>1.3</td><td>0.8</td><td>0.2</td>
      <td>0.5</td><td>0.6</td><td>0.0</td><td>5.2</td>
      <td>9</td><td>6.2</td><td>7.0</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-ubuntu</td><td>1.5</td><td>1.0</td><td>0.4</td>
      <td>0.4</td><td>0.6</td><td>0.0</td><td>4.9</td>
      <td>9</td><td>6.3</td><td>7.3</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-alpine</td><td>19.8</td><td>15.9</td><td>14.4</td>
      <td>4.2</td><td>1.2</td><td>0.0</td><td>40.5</td>
      <td>7</td><td>6.4</td><td>22.4</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-ubuntu</td><td>26.2</td><td>21.6</td><td>20.1</td>
      <td>4.8</td><td>1.3</td><td>0.0</td><td>51.8</td>
      <td>7</td><td>6.4</td><td>28.0</td><td>ok</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">Total</th><td>155.2</td><td>115.2</td><td>81.9</td>
      <td>63.7</td><td>9.2</td><td>0.1</td><td>234.2</td>
      <td>92</td><td>63.6</td><td>178.7</td><td>10/10 ok</td>
    </tr>
  </tfoot>
</table>

<h2>userland-proxy: false</h2>

<!--
| service           | current |   WS | anon | file | kernel | swap | peak | tasks | host tax | estimate | endpoint |
|:------------------|--------:|-----:|-----:|-----:|-------:|-----:|-----:|------:|---------:|---------:|:---------|
| csharp-alpine     |    47.1 | 33.9 |  9.2 | 35.8 |    1.7 |  0.0 | 49.1 |    23 |      4.4 |     38.3 | ok       |
| csharp-ubuntu     |    50.6 | 38.4 | 13.6 | 35.2 |    1.8 |  0.0 | 51.3 |    22 |      4.3 |     42.7 | ok       |
| go-alpine         |     4.8 |  3.6 |  2.1 |  2.3 |    0.5 |  0.0 |  6.2 |     5 |      4.3 |      7.9 | ok       |
| go-ubuntu         |     5.1 |  3.8 |  2.3 |  2.3 |    0.5 |  0.0 |  6.1 |     5 |      4.5 |      8.3 | ok       |
| python-alpine     |    17.3 | 12.4 | 10.4 |  6.3 |    0.5 |  0.0 | 19.8 |     1 |      4.3 |     16.7 | ok       |
| python-ubuntu     |    15.4 | 10.9 |  8.9 |  5.9 |    0.6 |  0.0 | 17.3 |     1 |      4.2 |     15.1 | ok       |
| rust-alpine       |     1.3 |  1.1 |  0.2 |  0.5 |    0.6 |  0.0 |  5.1 |     9 |      4.5 |      5.6 | ok       |
| rust-ubuntu       |     1.5 |  1.3 |  0.4 |  0.4 |    0.6 |  0.0 |  5.4 |     9 |      4.3 |      5.6 | ok       |
| typescript-alpine |    44.1 | 19.3 | 14.4 | 28.4 |    1.2 |  0.0 | 46.3 |     7 |      4.5 |     23.8 | ok       |
| typescript-ubuntu |    51.9 | 25.5 | 20.3 | 30.3 |    1.3 |  0.0 | 52.6 |     7 |      4.3 |     29.8 | ok       |
-->
<table>
  <thead>
    <tr>
      <th>service</th><th>current</th><th>WS</th><th>anon</th>
      <th>file</th><th>kernel</th><th>swap</th><th>peak</th>
      <th>tasks</th><th>host tax</th><th>estimate</th><th>endpoint</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>csharp-alpine</td><td>47.1</td><td>33.9</td><td>9.2</td>
      <td>35.8</td><td>1.7</td><td>0.0</td><td>49.1</td>
      <td>23</td><td>4.4</td><td>38.3</td><td>ok</td>
    </tr>
    <tr>
      <td>csharp-ubuntu</td><td>50.6</td><td>38.4</td><td>13.6</td>
      <td>35.2</td><td>1.8</td><td>0.0</td><td>51.3</td>
      <td>22</td><td>4.3</td><td>42.7</td><td>ok</td>
    </tr>
    <tr>
      <td>go-alpine</td><td>4.8</td><td>3.6</td><td>2.1</td>
      <td>2.3</td><td>0.5</td><td>0.0</td><td>6.2</td>
      <td>5</td><td>4.3</td><td>7.9</td><td>ok</td>
    </tr>
    <tr>
      <td>go-ubuntu</td><td>5.1</td><td>3.8</td><td>2.3</td>
      <td>2.3</td><td>0.5</td><td>0.0</td><td>6.1</td>
      <td>5</td><td>4.5</td><td>8.3</td><td>ok</td>
    </tr>
    <tr>
      <td>python-alpine</td><td>17.3</td><td>12.4</td><td>10.4</td>
      <td>6.3</td><td>0.5</td><td>0.0</td><td>19.8</td>
      <td>1</td><td>4.3</td><td>16.7</td><td>ok</td>
    </tr>
    <tr>
      <td>python-ubuntu</td><td>15.4</td><td>10.9</td><td>8.9</td>
      <td>5.9</td><td>0.6</td><td>0.0</td><td>17.3</td>
      <td>1</td><td>4.2</td><td>15.1</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-alpine</td><td>1.3</td><td>1.1</td><td>0.2</td>
      <td>0.5</td><td>0.6</td><td>0.0</td><td>5.1</td>
      <td>9</td><td>4.5</td><td>5.6</td><td>ok</td>
    </tr>
    <tr>
      <td>rust-ubuntu</td><td>1.5</td><td>1.3</td><td>0.4</td>
      <td>0.4</td><td>0.6</td><td>0.0</td><td>5.4</td>
      <td>9</td><td>4.3</td><td>5.6</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-alpine</td><td>44.1</td><td>19.3</td><td>14.4</td>
      <td>28.4</td><td>1.2</td><td>0.0</td><td>46.3</td>
      <td>7</td><td>4.5</td><td>23.8</td><td>ok</td>
    </tr>
    <tr>
      <td>typescript-ubuntu</td><td>51.9</td><td>25.5</td><td>20.3</td>
      <td>30.3</td><td>1.3</td><td>0.0</td><td>52.6</td>
      <td>7</td><td>4.3</td><td>29.8</td><td>ok</td>
    </tr>
  </tbody>
  <tfoot>
    <tr>
      <th scope="row">Total</th><td>239.1</td><td>150.2</td><td>81.8</td>
      <td>147.4</td><td>9.3</td><td>0.0</td><td>259.2</td>
      <td>89</td><td>43.6</td><td>193.8</td><td>10/10 ok</td>
    </tr>
  </tfoot>
</table>

<h2>Options & Alternatives</h2>

<p>
  If getting the overhead down is the goal, there are tools which you can leverage which may or may not be suitable:
</p>
<ul>
  <li>Drop the userland-proxy from Docker Daemon.</li>
  <li>Avoid languages which aggressively use up your memory: Rust and Go are clear winners, with a surprising show from Python staying mostly stable, and bad results from NodeJS and C#.</li>
  <li>Podman is daemonless and might avoid the overhead altogether.</li>
  <li>LXD/Incus might be worth exploring, but they provide system containers vs application containers.</li>
  <li>Systemd units with sandboxing (but without filesystem isolation) between services should get the overhead down to zero.</li>
  <li>Snaps to add filesystem isolation to a feature-set similar to systemd units — but not designed for this type of use-case.</li>
  <li>...</li>
</ul>

<h2>Conclusions</h2>
<p>
  Docker is not well suited to running on low-memory platforms as always-running daemons take around 100MiB of memory, on top of 4-6-8MiB of additional memory per container: a system with 20 containers will use up 220MiB of RAM just to orchestrate containers, and that's without any service actually operating.  With 20 Rust or Go services you might just about fit into 256MiB of RAM, but you'll be looking OOMs in the face.  If you are using anything else, 512MiB is going to be low as well.
</p>

<p>
  <strong>Finally, take the above results with a (big) grain of salt: benchmark code has been built by LLMs, and it is not representative of any production loads.</strong>
</p>

]]></description>
</item>

<item>
  <title>Postscriptum on LLMs: pelicans on bicycles with a twist</title>
  <link>https://danilo.segan.org/blog/llm/postscript-pelicans-on-bicycles</link>
  <description><![CDATA[

<h2>
  Judge Dread? Or welcome to my first LLM-related post.
</h2>
<p>
  As LLMs and especially coding agents became part of our daily workflows,
  we started relying more on actual <em>judgement</em> of models
  we use — judgement, to me, is any decision they default to based on
  their training and pre-processing without humans actually directing
  them with prompts or skills.
</p>

<p>
  It might be a simple decision about using tabs or spaces, or
  a more complex one about how to structure your tests and test
  fixtures, but you can already get a lot done by offloading
  <em>decision-making</em> as well.
</p>

<p>
  While this is fast improving, I wanted to test <em>my</em>
  understanding by asking them to do an extremely common test by
  Simon Willison of generating a vector image of a
  <a href="https://simonwillison.net/tags/pelican-riding-a-bicycle/
           ">pelican riding a bicycle</a>,
  but <strong>with a twist</strong>: instead of asking for an SVG,
  ask for a conceptually different vector format
  <a href="https://paulbourke.net/dataformats/postscript/"
     >PostScript</a> (really, a programming language), which is
  closer to the plotting/printing model from 80s, with instructions
  like <code>moveto</code>, Y-axis actually going upwards, for loops,
  matrix transformations etc — enough difference in semantic
  interpretation and less training data to throw a frontier model off :)
</p>

<p>
  My expectation was that they would be a generation or two behind
  compared to what Simon is getting with SVGs.
</p>

<p>
  I'll let you be the judge if my foresight was right or not.
</p>

<p style="font-size: 2em;">
  Prompt: <em>Generate a native PostScript image of a pelican riding a bicycle.</em>
</p>

<div style="
            display: flex;
            flex-wrap: wrap;
            align-items: flex-start;
            gap: 16px;
            line-height: 200px;
            ">

  <a href="pelican-riding-bicycle-chatgpt-5.6-sol-extra-high.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-chatgpt-5.6-sol-extra-high.ps.png"
        alt="PS Pelican riding a bicycle with ChatGPT 5.6 Sol Extra-High"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        ChatGPT 5.6 Sol Extra-High
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-claude-fable-5-high.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-claude-fable-5-high.ps.png"
        alt="PS Pelican riding a bicycle with Claude Fable 5 High"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Claude Fable 5 High
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-claude-opus-5-extra.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-claude-opus-5-extra.ps.png"
        alt="PS Pelican riding a bicycle with Claude Opus 5 Extra"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Claude Opus 5 Extra
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-gemini-3.1-pro-high.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-gemini-3.1-pro-high.ps.png"
        alt="PS Pelican riding a bicycle with Gemini 3.1 Pro High"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Gemini 3.1 Pro High
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-gemini-3.7-flash-thinking-v2.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-gemini-3.7-flash-thinking-v2.ps.png"
        alt="PS Pelican riding a bicycle with Gemini 3.7 Flash Thinking v2"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Gemini 3.7 Flash Thinking v2 (v1 had a syntax error which required fixing)
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-qwen-3.7-plus-thinking.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-qwen-3.7-plus-thinking.ps.png"
        alt="PS Pelican riding a bicycle with Qwen 3.7 Plus Thinking"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Qwen 3.7 Plus Thinking
      </figcaption>
    </figure>
  </a>

  <a href="pelican-riding-bicycle-qwen-3.8-max-thinking.ps">
    <figure style="margin: 0; padding: 8px; border: 1px solid #bbb; border-radius: 6px;">
      <img
        src="/slike/ps-pelicans/pelican-riding-bicycle-qwen-3.8-max-thinking.ps.png"
        alt="PS Pelican riding a bicycle with Qwen 3.8 Max  Thinking"
        style="display: block; width: auto; height: 360px;"
      >
      <figcaption style="margin-top: 8px; text-align: center;">
        Qwen 3.8 Max Thinking
      </figcaption>
    </figure>
  </a>

</div>

<h2>Some quick notes</h2>

<ul>
  <li>I tried converting PostScript files with ImageMagick first, but after seeing it miss a few things during conversion, decided to use GhostScript loader from within Inkscape instead and export a PNG out.</li>
  <li>Gemini 3.7 Flash had a broken first version which it was able to fix with the Ghostscript error message passed back (I think it was wrong parameters for ellipse command).</li>
  <li>Opus 5 took around 4 iterations of rendering to a raster image and reviewing (also hitting a PS syntax error), but managed to improve with each cycle.  I did not check the costs, but it was probably expensive :)</li>
  <li>My first few attempts were with a slightly different prompt of "Make an PS or EPS (PostScript) of a pelican riding a bicycle" ("an" typo included — I probably went for EPS first and never corrected the language). This resulted in <em>greyscale</em> images in ChatGPT confirming that this might be worth looking into.  I did not approach it scientifically at all, but switching to "Generate" to match Simon's version always produced a colorized version.</li>
  <li>All of the text in this post was hand-typed, including the em-dashes.</li>

</ul>


]]></description>
</item>

<item>
  <title>Трајање ауторских права у Србији</title>
  <link>https://danilo.segan.org/blog/os/%D1%82%D1%80%D0%B0%D1%98%D0%B0%D1%9A%D0%B5-%D0%B0%D1%83%D1%82%D0%BE%D1%80%D1%81%D0%BA%D0%B8%D1%85-%D0%BF%D1%80%D0%B0%D0%B2%D0%B0-%D1%83-%D0%A1%D1%80%D0%B1%D0%B8%D1%98%D0%B8</link>
  <description><![CDATA[

<h2>Ауторска права у Србији пре 21. века</h2>

<p>
  Почетком двадесетог века, у Србији је на снази био Аустроугарски Закон о ауторским правима на дела књижевности, уметности и фотографије [1895] од 26. децембра 1895. са изменама од 26. фебруара 1907. који је опште трајање ауторских права на заштићена дела ограничавао на 30 година од смрти аутора.
</p>

<p>
  Али, током двадесетог века, ауторска права у Србији (Краљевини Србији, Краљевини Срба, Хрвата и Словенаца, те Краљевини па Федеративној народној, Социјалистичкој федеративној и коначно Савезној републици Југославији) су регулисана са више закона:
</p>

<ul>
  <li>27. децембар 1929. — Закон о заштити ауторског права[1929] — ступио на снагу даном објаве са ретроактивним важењем</li>
  <li>6. јул 1931. — Закон о изменама и допунама у Закону о заштити ауторског права [1931] — од објаве</li>
  <li>4. јун 1946. — Закон о заштити ауторског права [1946] — од објаве, ретроактиван</li>
  <li>28. август 1957. — Закон о ауторском праву[1957] — три месеца од објављивања, ретроактиван</li>
  <li>24. јул 1968. — Закон о ауторском праву[1968] — двадесет дана од објављивања</li>
  <li>14. јул 1978. — Закон о ауторском праву[1978] — три месеца од објављивања</li>
  <li>15. мај 1998. — Закон о ауторском и сродним правима[1998] — осам дана од објављивања</li>
</ul>

<p>
  Но, осим закона из 1946. године, сви они су трајање ауторских права одређивали на 50 година након смрти аутора (тј. 50 година од смрти последњег аутора, ако је у питању више аутора, или 50 година од издавања дела ако је аутор анониман или непознат, односно ако је дело издато од стране правног лица). [1946] је, са друге стране, ауторска права ограничио на животни век аутора, и животни век његове жене у случају његове смрти, те њихову децу до навршених 25 година старости (у нарочитим околностима и на родитеље и унуке): очигледна је намера да ауторска права обезбеде „зараду“ самим ауторима за живота и њиховој деци до завршетка школовања, тј. „осамостаљења“.  Да не улазимо у то што би у случају смрти жене аутора, муж остао ускраћен за уживање ауторских права на њеним делима :-)
</p>

<p>
  Ипак, у складу са међународним конвенцијама, то се враћа на уобичајени облик већ у [1957], и то „ретроактивно“: закон важи и на она дела чија су ауторска права законом [1946] можда истекла (нпр. аутори без супружника и потомака преминули до доношења закона 1957. пошто је и ранији био ретроактиван).
</p>

<p>
  Законом из 1957. први пут се раздвајају морална и имовинска права аутора, док је важна промена у закону из 1998. године то што престаје да постоји правно лице као носилац ауторских права.
</p>

<p>
  Важно је приметити и да су неки од горњих закона били и „ретроактивни“ — осим што су продужавали рокове и опсег заштите за дела чија заштита још није истекла (ја чак и то сматрам ретроактивним, али у правном речнику се изгледа тај израз другачије користи), такође су продужавали рокове и проширивали опсег заштите за дела којима би по ранијем закону заштита истекла, а по новом није.
</p>

<h2>Ауторска права у Србији у овом веку</h2>

<p>
  Нови век доноси са собом и ново време.  Живи се све брже, и ауторска дела имају све краћи рок „трајања“, а рок заштите ауторских дела је... све дужи.
</p>

<p>
  Тако први закон о ауторским и сродним правима новог века у Србији (тј. Србији и Црној Гори), Закон о ауторским и сродним правима[2004] продужава трајање заштите на 70 година (од смрти аутора или од издавања ако је аутор непознат или правно лице). Новији, последњи Закон о ауторским и сродним правима[2009] не доноси значајне измене у погледу трајања основних ауторских права.  Оба су ступила на снагу осам дана од објављивања у Службеном гласнику СЦГ, односно Србије.
</p>

<p>
  Занимљиво, у изменама закона[2011] се враћа појам „колективног дела“ код којих ауторска права трају 70 година од објављивања (где су колективна дела она настала „спајањем већег броја прилога у једну целину“ одређена у [2009], а дати примери су енциклопедије, антологије, рачунарски програми, базе података).
</p>

<h2>Трајање ауторских права по законима</h2>

<table>
  <thead><tr><th>Закон</th><th>Аутор</th><th>Заштитни рок</th><th>Ретроактиван?</th></tr></thead>
  <tbody>
    <tr><td rowspan="2">1929.</td><td>познат</td><td>50 год од смрти</td><td rowspan="2">да</td></tr>
    <tr><td>непознат или правно лице</td><td>50 год од објављивања</td></tr>

    <tr><td>1946.</td><td>није одређено</td><td>до смрти или смрти/преудаје супружника („жене“), односно до навршене 25. године ауторове деце</td><td>да</td></tr>

    <tr><td rowspan="2">1957.</td><td>познат</td><td>50 год од смрти</td><td rowspan="2">да</td></tr>
    <tr><td>непознат или правно лице</td><td>50 год од објављивања</td></tr>

    <tr><td rowspan="2">1968.</td><td>познат</td><td>50 год од смрти</td><td rowspan="2">не</td></tr>
    <tr><td>непознат или правно лице</td><td>50 год од објављивања</td></tr>

    <tr><td rowspan="2">1978.</td><td>познат</td><td>50 год од смрти</td><td rowspan="2">не</td></tr>
    <tr><td>непознат или правно лице</td><td>50 год од објављивања</td></tr>

    <tr><td rowspan="2">1998.</td><td>познат</td><td>50 год од смрти</td><td rowspan="2">не</td></tr>
    <tr><td>непознат</td><td>50 год од објављивања</td></tr>

    <tr><td rowspan="2">2004.</td><td>познат</td><td>70 год од смрти</td><td rowspan="2">не</td></tr>
    <tr><td>непознат</td><td>70 год од објављивања</td></tr>

    <tr><td rowspan="2">2009.</td><td>познат</td><td>70 год од смрти</td><td rowspan="2">не</td></tr>
    <tr><td>непознат</td><td>70 год од објављивања</td></tr>

    <tr><td>2011.</td><td>колектив</td><td>70 год од објављивања</td><td>не</td></tr>
 </tbody>
</table>

<h2>Шта више није заштићено?</h2>

<p>
  Да бисмо утврдили шта од ауторских дела издатих у Србији више не подлеже заштити ауторских (имовинских) права, морамо узети неколико ствари у обзир:
</p>

<ul>
  <li>Неки од закона су ретроактивни (важе и на дела чија су права можда истекла пре њиховог доношења)</li>
  <li>Законски рок почиње да тече од 1. јануара наредне године од године у којој је ауторско дело издато</li>
  <li>У случају познатих појединачних аутора, смрт оног који је најкасније умро одређује почетак тока заштитног рока, док у случају дела чији су „аутори“ правна лица или непознати (анонимни или под псеудонимом без познатог грађанског имена аутора)</li>
  <li>Сваки закон је важио до дана који претходни дану ступања на снагу наредног закона</li>
</ul>

<table>
  <thead>
    <tr><th>Закон</th><th>Објављен</th><th>Ступио на снагу</th><th>Важио до</th><th>Трајање заштите</th><th>Истекла заштита</th></tr>
  </thead>
  <tbody>
    <tr><td>[1895]</td><td>26. дец 1895.</td><td>26. дец 1895.</td><td>26. дец 1929.</td><td>30</td><td>31. дец 1898.</td></tr>
    <tr><td>[1929]</td><td>27. дец 1929.</td><td>27. дец 1929.</td><td>03. јун 1946.</td><td>50</td><td>31. дец 1895.</td></tr>
    <tr><td>[1946]</td><td>04. јун 1946.</td><td>04. јун 1946.</td><td>27. нов 1957.</td><td>0</td><td>27. нов 1957.</td></tr>
    <tr><td>[1957]</td><td>28. авг 1957.</td><td>28. нов 1957.</td><td>12. авг 1968.</td><td>50</td><td>31. дец 1917.</td></tr>
    <tr><td>[1968]</td><td>24. јул 1968.</td><td>13. авг 1968.</td><td>13. окт 1978.</td><td>50</td><td>31. дец 1927.</td></tr>
    <tr><td>[1978]</td><td>14. јул 1978.</td><td>14. окт 1978.</td><td>22. мај 1998.</td><td>50</td><td><strong>31. дец 1947.</strong></td></tr>
    <tr><td>[1998]</td><td>15. мај 1998.</td><td>23. мај 1998.</td><td>31. дец 2004.</td><td>50</td><td><strong>31. дец 1953.</strong></td></tr>
    <tr><td>[2004]</td><td>24. дец 2004.</td><td>01. јан 2005.</td><td>18. дец 2009.</td><td>70</td><td>31. дец 1938.</td></tr>
    <tr><td>[2009]</td><td>11. дец 2009.</td><td>19. дец 2009.</td><td>...</td><td>70</td><td><em>31. дец 1946.</em></td></tr>
    <tr><td>[2011]</td><td>26. дец 2011.</td><td>03. јан 2012.</td><td>...</td><td>70</td><td><em>31. дец 1946.</em></td></tr>
  </tbody>
</table>
<p>
  Напомена: за дела објављена 1954. године, могуће је да су њихова права такође „истекла“.  Пошто је [2004] почео да важи тек од 1. јануара 2005. то би сва дела чији је рок од 50 година почео да тече 1. јануара 1955. истекао до 31. децембра 2004. 23:59:59.9999... Но, пошто не знам какав је правни третман у овом граничном случају, ограничио сам се на оно што је сигурно истекло.
</p>

<p>
  Најзначајнији су „масни“ датуми, те тако имовинска права више нису заштићена:
</p>

<ul>
  <li>Свим делима чији су сви аутори преминули до 31. децембра 1953. године</li>
  <li>Свим делима непознатих аутора (непотписаних или под псеудонимима за које се не знају грађанска имена) објављених до 31. децембра 1953. године</li>
  <li>Свим делима објављених до 31. децембра 1947. године чији је носилац ауторских права правно лице</li>
</ul>

<p>
  Значајно је приметити да, од продужења трајања заштите на 70 година [2004] ниједно ауторско дело није остало без заштите: почетком 2017. године, по актуелном закону, тек би дела објављена 1946. године постала слободна за употребу, односно, мораћемо сачекати још две године (до 2019.) да би се напокон нека нова дела нашла у „јавном власништву“, и то би се односило само на „колективна дела“ која изменама из [2011] уживају заштиту само од дана објаве, а не од смрти последњег аутора.  За остала дела, мораћемо сачекати још додатних 5 година (почетак 2024.), па ће коначно и дела објављена 1954. године бити слободна за употребу.
</p>

<h2>Додатна појашењења</h2>

<p>
  Ваљда је од почетка јасно да <strong>нисам правник</strong>, те да се овде записано мора узети са резервом. Шта год да радите што се тиче ауторских права, пре свега се обратите својој савести, а потом и неком правнику.
<p>
  Пошто ме превасходно занима употребљивост давно објављених књижевних дела, нисам се дотицао оних врста ауторских дела на које у одређеним законима важе другачији рокови заштите (по правилу краћи, а ту нарочито спадају фотографије у старијим законима, односно базе података у новијим).  На тај начин сам поједноставио анализу, али за сваку врсту грађе се, помоћу горње табеле и употребом истог обрачуна уз другачији рок може добити жељени резултат.
</p>

<p>
  Повремено чак и текст поједностављујем тако што кажем само „од дана издавања“, а то може, у зависности од актуелног закона, значити разне ствари (нпр. „од дана издавања ако је издато за живота аутора, а иначе од дана његове смрти“; или, „од дана када је последњи наставак објављен“...).  Ако сте у дилеми, не верујте ничему што пишем: нити сам правник, нити ћу прихватити одговорност за било какво туђе деловање на основу мог мишљења.
</p>

<h2>Библиографија</h2>

<ul>
  <li>[1895] Gesetz, betreffend das Urheberrecht an Werken der bildenden Künste und der Photographie, 26. децембар 1895.</li>
  <li>[1929] Закон о заштити ауторског права, Службене новине Краљевине Југославије, Година XI — 1929. број 304—CXXIX, 27. децембар, 1929.</li>
  <li>[1931] Закон о изменама и допунама у Закону о заштити ауторског права од 26 децембра 1929 године, Службене новине Краљевине Југославије, Година XIII — 1931 — број 150, 6. јул 1931.</li>
  <li>[1946] Закон о заштити ауторског права, Службени лист Федеративне Народне Републике Југославије, број 45, 4. јун 1946.</li>
  <li>[1957] Закон о ауторском праву, Службени лист ФНРЈ, број 36, година XIII, 28. август 1957.</li>
  <li>[1968] Закон о ауторском праву, Службени лист СФРЈ, број 30, година XXIV, 24. јул 1968.</li>
  <li>[1978] Закон о ауторском праву, Службени лист СФРЈ, број 19/78 са допунама у 24/86 и 21/90, 14. јул 1978.</li>
  <li>[1998] Закон о ауторском и сродним правима, Службени лист СРЈ, 24/98, 15. мај 1998.</li>
  <li>[2004] Закон о ауторском и сродним правима, Службени лист СЦГ, 61/04, 24. децембар 2004.</li>
  <li>[2009] Закон о ауторском и сродним правима, Службени гласник РС, 104/09, 11. децембар 2009.</li>
  <li>[2011] Закон о изменама и допунама Закона о ауторском и сродним правима, Службени гласник РС, 99/11, 26. децембар 2011.</li>
</ul>

]]></description>
</item>

<item>
  <title>You don&apos;t have to pick your battles. You just need to accept losing.</title>
  <link>https://danilo.segan.org/blog/zivot/battles</link>
  <description><![CDATA[

<p>(Oh yes, I know about the positive stance of "you should not accept losing", but if you believe in that, you haven't engaged in enough battles yet :)</p>

]]></description>
</item>

<item>
  <title>Routing git clone over &quot;dumb&quot; HTTP?</title>
  <link>https://danilo.segan.org/blog/razno/git-clones</link>
  <description><![CDATA[
<p>
  Doing 'git clone' over either of <code>git://</code> or <code>http://</code> backed by git-http-backend results in big memory usage for big repositories (mostly in 'compressing objects' phase).  This means that you can usually kill any git server hosting big repos by doing concurrent 'git clone' runs of those repos at the same time.
</p>

<p>
  Instead of doing that, I'd like to keep benefits of the git-http-backend for all users except those using 'git clone'.  Anyone has any ideas on how to do that?
</p>

<p>
  OTOH, maybe I am looking for the wrong solution.  git supposedly does mmap() of the pack files, and the only thing I need to do is ensure packs are suitably small so they could me "swapped-out" (which equals to being discarded from memory with mmaped files).  Or, since git does a mmap() of uncompressed temporary file, maybe I can get git to store uncompressed data instead, allowing it to mmap them directly?
</p>

<p>
  I wouldn't be surprised if I am entirely on the wrong track here.  If anybody has ideas on what to do to run a git server with big repositories without needing gazilions of memory, please direct me in the comments section below.
</p>

]]></description>
</item>

<item>
  <title>intltool 0.50 released</title>
  <link>https://danilo.segan.org/blog/gnome/intltool-0.50</link>
  <description><![CDATA[

<p>
 So, with a few patches already in <a href="https://launchpad.net/intltool">lp:intltool</a>, I've had some time today to go through all the existing patches attached to bugs and see if I can get them into landable state.
</p>

<p>
 The result is an <a href="https://launchpad.net/intltool/trunk/0.50.0">intltool 0.50.0</a> release, which has a few reasonably sized changes.
</p>

<p>
 The biggest changes are:
</p>
<ul>
 <li><a href="https://launchpad.net/bugs/580526">#580526</a>: Finally, support for gsettings gschema.xml files is merged in, which should enable maintainers to get a slightly simpler build setup (i.e. no need to use NOMERGE rule anymore, and you can have intltool directly extract translations from .gschema.xml files).</li>
 <li><a href="https://launchpad.net/bugs/790574">#790574</a>: Let xgettext extract Scheme strings out, and add support for <code>intltool-update -m</code> to find files with marked strings.</li>
 <li><a href="https://launchpad.net/bugs/806006">#806006</a>: Improve handling of quotes in <code>intltool-update -m</code> so you get less (no?) warnings about mismatched quotes, and Python processing doesn't get messed up with docstrings and similar.</li>
 <li><a href="https://launchpad.net/bugs/520986">#520986</a>: one for the translators—messages are extracted in the order they appear in original files now, thus allowing translators to infer more of the context from the ordering.</li>
</ul>

<p>
 There are a few other bug fixes, but listed above are those with the highest risk factor. Please test and <a href="https://launchpad.net/intltool/+filebug">file bugs</a>!
</p>


]]></description>
</item>

</channel>
</rss>
